From 86ad76439285842b3f0e8b5789b86e7a3e0547b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danijel=20Posilovi=C4=87?= Date: Fri, 26 Nov 2010 18:49:38 +0100 Subject: [PATCH] htcleo: new button backlight manager driver - Now button backlight is managed by this driver, also it is configurable by sysfs (number of secs. after backlight will be turned off after last key-press, enable/disable this auto_off feature) -When disabled auto_off, backlight will go off along with screen backlight. - Sysfs for num. of seconds : /sys/devices/platform/btn_backlight_manager/off_seconds (min: 5 sec, max: 60 sec) - Sysfs for turn on/off auto-off feature: /sys/devices/platform/btn_backlight_manager/auto_off (0 to disable auto-off, 1 to enable) --- arch/arm/configs/htcleo_defconfig | 1 + arch/arm/mach-msm/Kconfig | 7 + arch/arm/mach-msm/Makefile | 1 + arch/arm/mach-msm/board-htcleo-bl-led.c | 56 +----- .../board-htcleo-btn_backlight-manager.c | 188 ++++++++++++++++++ arch/arm/mach-msm/board-htcleo.c | 38 ++-- 6 files changed, 233 insertions(+), 58 deletions(-) create mode 100644 arch/arm/mach-msm/board-htcleo-btn_backlight-manager.c diff --git a/arch/arm/configs/htcleo_defconfig b/arch/arm/configs/htcleo_defconfig index 43b9e44f..7914da06 100644 --- a/arch/arm/configs/htcleo_defconfig +++ b/arch/arm/configs/htcleo_defconfig @@ -232,6 +232,7 @@ CONFIG_MSM_DEBUG_UART_NONE=y CONFIG_MACH_HTCLEO=y # CONFIG_USING_BRAVOS_DSP is not set # CONFIG_HTCLEO_BLINK_AT_BOOT is not set +CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER=y # CONFIG_MACH_PASSIONC is not set # CONFIG_MACH_BRAVOC is not set # CONFIG_MACH_INCREDIBLE is not set diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index d821e478..7c69be36 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -296,6 +296,13 @@ config HTCLEO_BLINK_AT_BOOT help Blink flash led during hardware init +config HTCLEO_BTN_BACKLIGHT_MANAGER + depends on MACH_HTCLEO + default y + bool "Use button backlight manager" + help + Use kernel button backlight manager to turn on/off backlight + config MACH_PASSIONC depends on ARCH_QSD8X50 default n diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 3720b181..504394d5 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -127,6 +127,7 @@ obj-$(CONFIG_MACH_HTCLEO) += board-htcleo-proximity.o board-htcleo-ls.o obj-$(CONFIG_MACH_HTCLEO) += clock-wince.o obj-$(CONFIG_HTCLEO_BACKLIGHT) += board-htcleo-bl.o obj-$(CONFIG_HTCLEO_BACKLIGHT_LED) += board-htcleo-bl-led.o +obj-$(CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER) += board-htcleo-btn_backlight-manager.o # MSM7x30 boards obj-$(CONFIG_ARCH_MSM7X30) += panel-samsungwvga-tl2796a.o panel-samsungwvga-s6e63m0.o panel-sonywvga-s6d16a0x21-7x30.o diff --git a/arch/arm/mach-msm/board-htcleo-bl-led.c b/arch/arm/mach-msm/board-htcleo-bl-led.c index a90a67b3..38ec9940 100644 --- a/arch/arm/mach-msm/board-htcleo-bl-led.c +++ b/arch/arm/mach-msm/board-htcleo-bl-led.c @@ -2,6 +2,7 @@ * * Copyright (c) 2010 Cotulla * Edited to Common Structure by Markinus + * Added support for Button backlight manager by Danijel Posilović (dan1j3l) * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -37,17 +38,15 @@ #endif #define HTCLEO_DEFAULT_BACKLIGHT_BRIGHTNESS 255 -int BUTTON_BACKLIGHT_GPIO = 48; + static struct led_trigger *htcleo_lcd_backlight; static int auto_bl_state=0; static DEFINE_MUTEX(htcleo_backlight_lock); -static int btn_backlight_control = 1; -static struct delayed_off -{ - struct delayed_work work; -} delayed_off_work; +#ifdef CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER +static int BUTTON_BACKLIGHT_GPIO = 48; +#endif static int htcleo_brightness_autobacklight(uint8_t value) { @@ -92,47 +91,16 @@ static ssize_t htcleo_auto_bl_set(struct device *dev, static DEVICE_ATTR(auto_bl, 0666, htcleo_auto_bl_get, htcleo_auto_bl_set); - -////////////////////////////////////////////////////// -// Button backlight control -////////////////////////////////////////////////////// -static void btn_delayed_off_function(struct work_struct *work){ - gpio_set_value(BUTTON_BACKLIGHT_GPIO, 0); -} -static ssize_t htcleo_btn_control_get(struct device *dev,struct device_attribute *attr, char *buf) -{ - int ret; - ret = sprintf(buf, "%d", btn_backlight_control); - return ret; -} - -static ssize_t htcleo_btn_control_set(struct device *dev,struct device_attribute *attr,const char *buf, size_t count) -{ - int set_state; - mutex_lock(&htcleo_backlight_lock); - sscanf(buf, "%d", &set_state); - if(set_state!=0 && set_state!=1) return -EINVAL; - btn_backlight_control = set_state; - gpio_set_value(BUTTON_BACKLIGHT_GPIO, set_state); - mutex_unlock(&htcleo_backlight_lock); - return count; -} -static DEVICE_ATTR(btn_control, 0666, htcleo_btn_control_get, htcleo_btn_control_set); - - static int htcleo_brightness_onoff_bkl(int enable) { int ret; uint8_t data[1]; - // If btn backlight control enabled then set it - if (btn_backlight_control){ - // Enable backlight - gpio_set_value(BUTTON_BACKLIGHT_GPIO, enable); - // Schedule timed off dan1j3l TODO !!! - //cancel_delayed_work_sync(&delayed_off_work.work); - //schedule_delayed_work(&delayed_off_work.work, msecs_to_jiffies(10000)); - } +#ifdef CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER + // Disable button backlight along with screen + if (!enable) + gpio_set_value(BUTTON_BACKLIGHT_GPIO, 0); +#endif data[0] = enable ? 1 : 0; ret = microp_i2c_write(MICROP_I2C_WCMD_BL_EN, data, 1); @@ -204,9 +172,6 @@ static int htcleo_backlight_probe(struct platform_device *pdev) rc = device_create_file(&pdev->dev, &dev_attr_auto_bl); printk(KERN_INFO "%s: HTCLeo Backlight connect with microP: " "Probe\n", __func__); - // Kernel button backlight control - rc = device_create_file(&pdev->dev, &dev_attr_btn_control); - INIT_DELAYED_WORK(&delayed_off_work.work, btn_delayed_off_function); led_trigger_register_simple("lcd-backlight-gate", &htcleo_lcd_backlight); rc = led_classdev_register(&pdev->dev, &htcleo_backlight_led); @@ -220,7 +185,6 @@ static int htcleo_backlight_probe(struct platform_device *pdev) static int htcleo_backlight_remove(struct platform_device *pdev) { device_remove_file(&pdev->dev, &dev_attr_auto_bl); - device_remove_file(&pdev->dev, &dev_attr_btn_control); return 0; } diff --git a/arch/arm/mach-msm/board-htcleo-btn_backlight-manager.c b/arch/arm/mach-msm/board-htcleo-btn_backlight-manager.c new file mode 100644 index 00000000..66444d52 --- /dev/null +++ b/arch/arm/mach-msm/board-htcleo-btn_backlight-manager.c @@ -0,0 +1,188 @@ +/* board-htcleo_btn_backlight-manager.c +* +* Driver for managing buttons backlight +* +* Copyright (C) 2010 Danijel Posilović (dan1j3l) +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + + +#include +#include +#include + +static int BUTTON_BACKLIGHT_GPIO = 48; +static int OFF_SEC = 10; +static int auto_off_enabled = 1; + +static struct delayed_off +{ + struct delayed_work work; +} btn_off_work; + +static DEFINE_MUTEX(htcleo_btn_manager_lock); + +//////////////////////////////////////////////////// + + +// off_sec sysfs +static ssize_t htcleo_manager_offsec_get(struct device *dev,struct device_attribute *attr, char *buf) +{ + int ret; + ret = sprintf(buf, "%d", OFF_SEC); + return ret; +} + +static ssize_t htcleo_manager_offsec_set(struct device *dev,struct device_attribute *attr,const char *buf, size_t count) +{ + int set_state; + + mutex_lock(&htcleo_btn_manager_lock); + + sscanf(buf, "%d", &set_state); + + if (set_state < 5) + set_state = 5; + + if (set_state > 60) + set_state=60; + + OFF_SEC = set_state; + + mutex_unlock(&htcleo_btn_manager_lock); + + return count; +} + +static DEVICE_ATTR(off_seconds, 0666, htcleo_manager_offsec_get, htcleo_manager_offsec_set); + + +// auto_off sysfs +static ssize_t htcleo_manager_auto_off_get(struct device *dev,struct device_attribute *attr, char *buf) +{ + int ret; + ret = sprintf(buf, "%d", auto_off_enabled); + return ret; +} + +static ssize_t htcleo_manager_auto_off_set(struct device *dev,struct device_attribute *attr,const char *buf, size_t count) +{ + int set_state; + + mutex_lock(&htcleo_btn_manager_lock); + + sscanf(buf, "%d", &set_state); + + if (set_state < 0) + set_state = 0; + + if (set_state > 1) + set_state=1; + + auto_off_enabled = set_state; + + mutex_unlock(&htcleo_btn_manager_lock); + + return count; +} + +static DEVICE_ATTR(auto_off, 0666, htcleo_manager_auto_off_get, htcleo_manager_auto_off_set); + + +static void btn_delayed_off_function(struct work_struct *work){ + gpio_set_value(BUTTON_BACKLIGHT_GPIO, 0); +} + +int buttons_notify(struct notifier_block *nblock, unsigned long code, void *_param) { + struct keyboard_notifier_param *param = _param; + int keycode; + + if (code == KBD_KEYCODE) { + + mutex_lock(&htcleo_btn_manager_lock); + + keycode = param->value; + + //printk(KERN_DEBUG "BTN-BCKM: KEYLOGGER %i %s\n", param->value, (param->down ? "down" : "up")); + + // Turn backlight on only if pressed = Dial, home, winkey, back, end button + if (keycode==231 || keycode==102 || keycode==139 || keycode==158 || keycode==107){ + + gpio_set_value(BUTTON_BACKLIGHT_GPIO, 1); + + // If auto off enabled then buttons will turn off after declared amount of time, else screen backlight will turn them off + if (auto_off_enabled){ + cancel_delayed_work_sync(&btn_off_work.work); + schedule_delayed_work(&btn_off_work.work, msecs_to_jiffies(OFF_SEC*1000)); + } + + } + + mutex_unlock(&htcleo_btn_manager_lock); + }; + + return 0; +} + +static struct notifier_block nb = { + .notifier_call = buttons_notify +}; + + +static int htcleo_btn_backlight_manager_probe(struct platform_device *pdev) +{ + int rc; + + printk("BTN-BCKM: Registering btn manager...\n"); + register_keyboard_notifier(&nb); + rc = device_create_file(&pdev->dev, &dev_attr_off_seconds); + rc = device_create_file(&pdev->dev, &dev_attr_auto_off); + INIT_DELAYED_WORK(&btn_off_work.work, btn_delayed_off_function); + + return 0; +} + +static int htcleo_btn_backlight_manager_remove(struct platform_device *pdev) +{ + printk("BTN-BCKM: Deactivating btn manager...\n"); + unregister_keyboard_notifier(&nb); + device_remove_file(&pdev->dev, &dev_attr_off_seconds); + device_remove_file(&pdev->dev,&dev_attr_auto_off); + return 0; +} + + +static struct platform_driver htcleo_btn_backlight_manager = { + .probe = htcleo_btn_backlight_manager_probe, + .remove= htcleo_btn_backlight_manager_remove, + .driver = { + .name = "btn_backlight_manager", + .owner = THIS_MODULE + }, +}; + +static int __init backlight_manager_init(void) +{ + return platform_driver_register(&htcleo_btn_backlight_manager); +} + +static void __exit backlight_manager_exit(void) +{ + platform_driver_unregister(&htcleo_btn_backlight_manager); +} + +module_init(backlight_manager_init); +module_exit(backlight_manager_exit); + +MODULE_AUTHOR("Danijel Posilović (dan1j3l) "); +MODULE_DESCRIPTION("Button Backlight Manager"); +MODULE_LICENSE("GPL"); diff --git a/arch/arm/mach-msm/board-htcleo.c b/arch/arm/mach-msm/board-htcleo.c index de80a013..bdacc205 100644 --- a/arch/arm/mach-msm/board-htcleo.c +++ b/arch/arm/mach-msm/board-htcleo.c @@ -63,7 +63,7 @@ #include "dex_comm.h" -#define ATAG_MAGLDR_BOOT 0x4C47414D +#define ATAG_MAGLDR_BOOT 0x4C47414D struct tag_magldr_entry { _Bool fNoNandBoot; @@ -80,7 +80,7 @@ static unsigned int nand_boot = 0; /////////////////////////////////////////////////////////////////////// int htcleo_is_nand_boot(void) { - return nand_boot; + return nand_boot; } static int __init parse_tag_nand_boot(const struct tag *tag) @@ -240,10 +240,10 @@ static struct platform_device microp_devices[] = { { .name = "leds-microp", .id = -1, - .dev = { + .dev = { .platform_data = µp_leds_data, }, - + }, { .name = "htcleo-lsensor", @@ -282,7 +282,7 @@ static struct i2c_board_info base_i2c_devices[] = }; /////////////////////////////////////////////////////////////////////// -// USB +// USB /////////////////////////////////////////////////////////////////////// static uint32_t usb_phy_3v3_table[] = @@ -706,7 +706,7 @@ static struct platform_device msm_kgsl_device = }; /////////////////////////////////////////////////////////////////////// -// Memory +// Memory /////////////////////////////////////////////////////////////////////// static struct android_pmem_platform_data mdp_pmem_pdata = { @@ -824,6 +824,17 @@ struct platform_device msm_device_rtc = { .name = "msm_rtc", .id = -1, }; + +#ifdef CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER +/////////////////////////////////////////////////////////////////////// +// Button backlight manager +/////////////////////////////////////////////////////////////////////// +struct platform_device btn_backlight_manager = { + .name = "btn_backlight_manager", + .id = -1, +}; +#endif + /////////////////////////////////////////////////////////////////////// // Platform Devices /////////////////////////////////////////////////////////////////////// @@ -854,6 +865,9 @@ static struct platform_device *devices[] __initdata = &qsd_device_spi, &htc_headset_mgr, &htc_headset_gpio, +#ifdef CONFIG_HTCLEO_BTN_BACKLIGHT_MANAGER + &btn_backlight_manager, +#endif }; /////////////////////////////////////////////////////////////////////// // Vibrator @@ -962,7 +976,7 @@ static void __init htcleo_init(void) do_sdc1_reset(); msm_acpu_clock_init(&htcleo_clock_data); - + perflock_init(&htcleo_perflock_data); init_dex_comm(); @@ -975,7 +989,7 @@ static void __init htcleo_init(void) bt_export_bd_address(); htcleo_audio_init(); - + msm_device_i2c_init(); /* set the gpu power rail to manual mode so clk en/dis will not @@ -985,7 +999,7 @@ static void __init htcleo_init(void) htcleo_kgsl_power(false); mdelay(100); htcleo_kgsl_power(true); - + platform_add_devices(devices, ARRAY_SIZE(devices)); htcleo_init_panel(); @@ -996,11 +1010,11 @@ static void __init htcleo_init(void) #ifdef CONFIG_USB_ANDROID htcleo_add_usb_devices(); #endif - + htcleo_init_mmc(0); platform_device_register(&htcleo_timed_gpios); - + /* Blink the camera LED shortly to show that we're alive! */ #ifdef CONFIG_HTCLEO_BLINK_AT_BOOT bank6_in = (unsigned int*)(MSM_GPIO1_BASE + 0x0864); @@ -1078,7 +1092,7 @@ static void __init htcleo_map_io(void) msm_map_common_io(); htcleo_allocate_memory_regions(); msm_clock_init(); - + #if defined(CONFIG_VERY_EARLY_CONSOLE) // Init our consoles _really_ early #if defined(CONFIG_HTC_FB_CONSOLE)