static ssize_t g19_name_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long irq_flags; struct gcommon_data *gdata = dev_get_gdata(dev); size_t limit = count; char *end; spin_lock_irqsave(&gdata->lock, irq_flags); if (gdata->name != NULL) { kfree(gdata->name); gdata->name = NULL; } end = strpbrk(buf, "\n\r"); if (end != NULL) limit = end - buf; if (end != buf) { if (limit > 100) limit = 100; gdata->name = kzalloc(limit+1, GFP_ATOMIC); strncpy(gdata->name, buf, limit); } spin_unlock_irqrestore(&gdata->lock, irq_flags); return count; }
static int g15_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *raw_data, int size) { /* * On initialization receive a 258 byte message with * data = 6 0 255 255 255 255 255 255 255 255 ... */ unsigned long irq_flags; struct gcommon_data *gdata = dev_get_gdata(&hdev->dev); struct g15_data *g15data = gdata->data; spin_lock_irqsave(&gdata->lock, irq_flags); if (unlikely(g15data->need_reset)) { g15_msg_send(hdev, 4, ~g15data->led, 0); g15data->need_reset = 0; spin_unlock_irqrestore(&gdata->lock, irq_flags); return 1; } if (unlikely(g15data->ready_stages != G15_READY_STAGE_3)) { switch (report->id) { case 6: if (!(g15data->ready_stages & G15_READY_SUBSTAGE_1)) g15data->ready_stages |= G15_READY_SUBSTAGE_1; else if (g15data->ready_stages & G15_READY_SUBSTAGE_4 && !(g15data->ready_stages & G15_READY_SUBSTAGE_5) ) g15data->ready_stages |= G15_READY_SUBSTAGE_5; else if (g15data->ready_stages & G15_READY_SUBSTAGE_6 && raw_data[1] >= 0x80) g15data->ready_stages |= G15_READY_SUBSTAGE_7; break; case 1: if (!(g15data->ready_stages & G15_READY_SUBSTAGE_2)) g15data->ready_stages |= G15_READY_SUBSTAGE_2; else g15data->ready_stages |= G15_READY_SUBSTAGE_3; break; } if (g15data->ready_stages == G15_READY_STAGE_1 || g15data->ready_stages == G15_READY_STAGE_2 || g15data->ready_stages == G15_READY_STAGE_3) complete_all(&g15data->ready); spin_unlock_irqrestore(&gdata->lock, irq_flags); return 1; } spin_unlock_irqrestore(&gdata->lock, irq_flags); if (likely(report->id == 2)) { g15_raw_event_process_input(hdev, gdata, raw_data); return 1; } return 0; }
ssize_t gcore_minor_show(struct device *dev, struct device_attribute *attr, char *buf) { struct gcore_data *gdata = dev_get_gdata(dev); return sprintf(buf, "%d\n", gdata->hdev->minor); }
ssize_t gcore_name_show(struct device *dev, struct device_attribute *attr, char *buf) { unsigned long irq_flags; struct gcore_data *gdata = dev_get_gdata(dev); int result; spin_lock_irqsave(&gdata->lock, irq_flags); result = sprintf(buf, "%s", gdata->name); spin_unlock_irqrestore(&gdata->lock, irq_flags); return result; }
static ssize_t g19_name_show(struct device *dev, struct device_attribute *attr, char *buf) { unsigned long irq_flags; struct gcommon_data *gdata = dev_get_gdata(dev); int result; if (gdata->name == NULL) { buf[0] = 0x00; return 1; } spin_lock_irqsave(&gdata->lock, irq_flags); result = sprintf(buf, "%s", gdata->name); spin_unlock_irqrestore(&gdata->lock, irq_flags); return result; }