static int backlight_init(void) { int status = 0; lcdd_handle = NULL; backlight = NULL; backlight_levels.count = 0; backlight_levels.values = NULL; status = acpi_get_handle(NULL, LENSL_LCDD, &lcdd_handle); if (ACPI_FAILURE(status)) { vdbg_printk(LENSL_ERR, "Failed to get ACPI handle for %s\n", LENSL_LCDD); return -EIO; } status = get_bcl(&backlight_levels); if (status || !backlight_levels.count) goto err; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34) backlight = backlight_device_register(LENSL_BACKLIGHT_NAME, NULL, NULL, &lensl_backlight_ops, NULL); #else backlight = backlight_device_register(LENSL_BACKLIGHT_NAME, NULL, NULL, &lensl_backlight_ops); #endif backlight->props.max_brightness = backlight_levels.count - 1; backlight->props.brightness = lensl_bd_get_brightness(backlight); vdbg_printk(LENSL_INFO, "Started backlight brightness control\n"); goto out; err: if (backlight_levels.count) { kfree(backlight_levels.values); backlight_levels.count = 0; } vdbg_printk(LENSL_ERR, "Failed to start backlight brightness control\n"); out: return status; }
static int hkey_poll_kthread(void *data) { unsigned long t = 0; int offset, level; unsigned int keycode; u8 scancode; mutex_lock(&hkey_poll_mutex); offset = hkey_ec_get_offset(); if (offset < 0) { vdbg_printk(LENSL_WARNING, "Failed to read hotkey register offset from EC\n"); hkey_ec_prev_offset = 0; } else hkey_ec_prev_offset = offset; while (!kthread_should_stop() && hkey_poll_hz) { if (t == 0) t = 1000/hkey_poll_hz; t = msleep_interruptible(t); if (unlikely(kthread_should_stop())) break; try_to_freeze(); if (t > 0) continue; offset = hkey_ec_get_offset(); if (offset < 0) { vdbg_printk(LENSL_WARNING, "Failed to read hotkey register offset from EC\n"); continue; } if (offset == hkey_ec_prev_offset) continue; if (ec_read(0x0A + offset, &scancode)) { vdbg_printk(LENSL_WARNING, "Failed to read hotkey code from EC\n"); continue; } keycode = ec_scancode_to_keycode(scancode); vdbg_printk(LENSL_DEBUG, "Got hotkey keycode %d (scancode %d)\n", keycode, scancode); /* Special handling for brightness keys. We do it here and not via an ACPI notifier in order to prevent possible conflicts with video.c */ if (keycode == KEY_BRIGHTNESSDOWN) { if (control_backlight && backlight) { level = lensl_bd_get_brightness(backlight); if (0 <= --level) lensl_bd_set_brightness_int(level); } else keycode = KEY_RESERVED; } else if (keycode == KEY_BRIGHTNESSUP) { if (control_backlight && backlight) { level = lensl_bd_get_brightness(backlight); if (backlight_levels.count > ++level) lensl_bd_set_brightness_int(level); } else keycode = KEY_RESERVED; } if (keycode != KEY_RESERVED) { input_report_key(hkey_inputdev, keycode, 1); input_sync(hkey_inputdev); input_report_key(hkey_inputdev, keycode, 0); input_sync(hkey_inputdev); } hkey_ec_prev_offset = offset; } mutex_unlock(&hkey_poll_mutex); return 0; }