static irqreturn_t touchkey_interrupt_thread(int irq, void *touchkey_devdata) { u8 data = 0; int i; int ret; int scancode; struct cypress_touchkey_devdata *devdata = touchkey_devdata; ret = i2c_touchkey_read_byte(devdata, &data); if (ret || (data & ESD_STATE_MASK)) { ret = recovery_routine(devdata); if (ret) { dev_err(&devdata->client->dev, "%s: touchkey recovery " "failed!\n", __func__); goto err; } } if (devdata->has_legacy_keycode) { scancode = (data & SCANCODE_MASK) - 1; if (scancode < 0 || scancode >= devdata->pdata->keycode_cnt) { dev_err(&devdata->client->dev, "%s: scancode is out of " "range\n", __func__); goto err; } input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], !(data & UPDOWN_EVENT_MASK)); #ifdef CONFIG_BLD if (!(data & UPDOWN_EVENT_MASK)) touchkey_pressed(); #endif } else { for (i = 0; i < devdata->pdata->keycode_cnt; i++) input_report_key(devdata->input_dev, devdata->pdata->keycode[i], !!(data & (1U << i))); #ifdef CONFIG_BLD for (i = 0; i < devdata->pdata->keycode_cnt; i++) { if(!!(data & (1U << i))) { touchkey_pressed(); break; } } #endif } input_sync(devdata->input_dev); err: return IRQ_HANDLED; }
static void bld_late_resume(struct early_suspend * h) { device_suspended = false; backlight_dimmed = false; touchkey_pressed(); return; }
static void bld_enable_backlights(void) { if (bld_imp) { bld_imp->enable(); } backlight_dimmed = false; mutex_unlock(&lock); touchkey_pressed(); return; }
static ssize_t backlightdimmer_delay_write(struct device * dev, struct device_attribute * attr, const char * buf, size_t size) { unsigned int data; if(sscanf(buf, "%u\n", &data) == 1) { dimmer_delay = data; pr_info("BLD delay set to %u\n", dimmer_delay); touchkey_pressed(); } else { pr_info("%s: invalid input\n", __FUNCTION__); } return size; }
static ssize_t backlightdimmer_status_write(struct device * dev, struct device_attribute * attr, const char * buf, size_t size) { unsigned int data; if(sscanf(buf, "%u\n", &data) == 1) { pr_devel("%s: %u \n", __FUNCTION__, data); if (data == 1) { pr_info("%s: BLD function enabled\n", __FUNCTION__); bld_enabled = true; touchkey_pressed(); } else if (data == 0) { pr_info("%s: BLD function disabled\n", __FUNCTION__); bld_enabled = false; cancel_delayed_work(&dimmer_work); flush_scheduled_work(); if (backlight_dimmed) { bld_enable_backlights(); } } else { pr_info("%s: invalid input range %u\n", __FUNCTION__, data); } } else { pr_info("%s: invalid input\n", __FUNCTION__); } return size; }
static irqreturn_t touchkey_interrupt_thread(int irq, void *touchkey_devdata) { u8 data; int i; int ret; int scancode; struct cypress_touchkey_devdata *devdata = touchkey_devdata; ret = i2c_touchkey_read_byte(devdata, &data); if (ret || (data & ESD_STATE_MASK)) { ret = recovery_routine(devdata); if (ret) { dev_err(&devdata->client->dev, "%s: touchkey recovery " "failed!\n", __func__); goto err; } } if (devdata->has_legacy_keycode) { scancode = (data & SCANCODE_MASK) - 1; if (scancode < 0 || scancode >= devdata->pdata->keycode_cnt) { dev_err(&devdata->client->dev, "%s: scancode is out of " "range\n", __func__); goto err; } #ifdef CONFIG_SCREEN_DIMMER #ifdef CONFIG_TOUCH_WAKE if (!device_is_suspended() && !screen_is_dimmed()) #else if (!screen_is_dimmed()) #endif #else #ifdef CONFIG_TOUCH_WAKE if (!device_is_suspended()) #endif #endif { input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], !(data & UPDOWN_EVENT_MASK)); } #if defined(CONFIG_TOUCH_WAKE) || defined(CONFIG_SCREEN_DIMMER) || defined(CONFIG_BLD) if (!(data & UPDOWN_EVENT_MASK)) { #ifdef CONFIG_BLD touchkey_pressed(); #endif #ifdef CONFIG_SCREEN_DIMMER touchscreen_pressed(); #endif #ifdef CONFIG_TOUCH_WAKE touch_press(); #endif } #endif } else { #ifdef CONFIG_SCREEN_DIMMER #ifdef CONFIG_TOUCH_WAKE if (!device_is_suspended() && !screen_is_dimmed()) #else if (!screen_is_dimmed()) #endif #else #ifdef CONFIG_TOUCH_WAKE if (!device_is_suspended()) #endif #endif { for (i = 0; i < devdata->pdata->keycode_cnt; i++) input_report_key(devdata->input_dev, devdata->pdata->keycode[i], !!(data & (1U << i))); } #if defined(CONFIG_TOUCH_WAKE) || defined(CONFIG_SCREEN_DIMMER) || defined(CONFIG_BLD) for (i = 0; i < devdata->pdata->keycode_cnt; i++) { if(!!(data & (1U << i))) { #ifdef CONFIG_BLD touchkey_pressed(); #endif #ifdef CONFIG_SCREEN_DIMMER touchscreen_pressed(); #endif #ifdef CONFIG_TOUCH_WAKE touch_press(); #endif break; } } #endif } input_sync(devdata->input_dev); err: return IRQ_HANDLED; }