diff options
Diffstat (limited to 'drivers/accessory')
-rw-r--r-- | drivers/accessory/30pin_con.c | 32 | ||||
-rw-r--r-- | drivers/accessory/sec_keyboard.c | 20 | ||||
-rw-r--r-- | drivers/accessory/sec_keyboard.h | 2 |
3 files changed, 48 insertions, 6 deletions
diff --git a/drivers/accessory/30pin_con.c b/drivers/accessory/30pin_con.c index 7052ed2..3ecaa62 100644 --- a/drivers/accessory/30pin_con.c +++ b/drivers/accessory/30pin_con.c @@ -15,6 +15,7 @@ #include <linux/wakelock.h> #include <plat/adc.h> #include <linux/earlysuspend.h> +#include <linux/power_supply.h> #include <asm/irq.h> #include <linux/mfd/tps6586x.h> @@ -314,6 +315,26 @@ static void acc_dock_uevent(struct acc_con_info *acc, bool connected) ACC_CONDEV_DBG("%s : %s", env_ptr, stat_ptr); } +/* power supply name for set state */ +#define PSY_NAME "battery" +static void acc_dock_psy(struct acc_con_info *acc) +{ + struct power_supply *psy = power_supply_get_by_name(PSY_NAME); + union power_supply_propval value; + +/* only support p4note(high current charging) */ +#ifndef CONFIG_MACH_P4NOTE + return; +#endif + + if (!psy || !psy->set_property) { + pr_err("%s: fail to get %s psy\n", __func__, PSY_NAME); + return; + } + + value.intval = acc->current_dock; + psy->set_property(psy, POWER_SUPPLY_PROP_ONLINE, &value); +} static void acc_check_dock_detection(struct acc_con_info *acc) { @@ -326,6 +347,12 @@ static void acc_check_dock_detection(struct acc_con_info *acc) #ifdef CONFIG_SEC_KEYBOARD_DOCK if (acc->pdata->check_keyboard && acc->pdata->check_keyboard(true)) { + if (DOCK_KEYBOARD == acc->current_dock) { + switch_set_state(&acc->dock_switch, + UEVENT_DOCK_NONE); + acc_dock_uevent(acc, false); + } + acc->current_dock = DOCK_KEYBOARD; ACC_CONDEV_DBG ("[30PIN] keyboard dock station attached!!!"); @@ -377,6 +404,8 @@ static void acc_check_dock_detection(struct acc_con_info *acc) acc_dock_uevent(acc, false); } + + acc_dock_psy(acc); } static irqreturn_t acc_dock_isr(int irq, void *ptr) @@ -405,7 +434,8 @@ static int acc_init_dock_int(struct acc_con_info *acc) int ret = 0; acc->accessory_irq = gpio_to_irq(acc->pdata->accessory_irq_gpio); ret = request_threaded_irq(acc->accessory_irq, NULL, acc_dock_isr, - IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING + | IRQF_NO_SUSPEND, "accessory_detect", acc); if (ret) ACC_CONDEV_DBG("request_irq(accessory_irq) return : %d\n", ret); diff --git a/drivers/accessory/sec_keyboard.c b/drivers/accessory/sec_keyboard.c index 1fbcc65..cc89c0c 100644 --- a/drivers/accessory/sec_keyboard.c +++ b/drivers/accessory/sec_keyboard.c @@ -152,8 +152,18 @@ static int check_keyboard_dock(struct sec_keyboard_callbacks *cb, bool val) int try_cnt = 0; int max_cnt = 14; - if (NULL == data->serio) - return 0; + if (NULL == data->serio) { + for (try_cnt = 0; try_cnt < max_cnt; try_cnt++) { + msleep(50); + if (data->tx_ready) + break; + + if (gpio_get_value(data->acc_int_gpio)) { + printk(KERN_DEBUG "[Keyboard] acc is disconnected.\n"); + return 0; + } + } + } if (!val) data->dockconnected = false; @@ -164,7 +174,6 @@ static int check_keyboard_dock(struct sec_keyboard_callbacks *cb, bool val) if (UNKOWN_KEYLAYOUT != data->pre_kl) { data->kl = data->pre_kl; data->acc_power(1, true); - forced_wakeup(data); printk(KERN_DEBUG "[Keyboard] kl : %d\n", data->pre_kl); return 1; @@ -198,7 +207,6 @@ static int check_keyboard_dock(struct sec_keyboard_callbacks *cb, bool val) } if (data->dockconnected) { - forced_wakeup(data); return 1; } else { if (data->pre_connected) { @@ -223,6 +231,9 @@ static int sec_keyboard_event(struct input_dev *dev, sec_keyboard_tx(data, 0xca); else sec_keyboard_tx(data, 0xcb); + + printk(KERN_DEBUG "[Keyboard] %s, capslock on led value=%d\n",\ + __func__, value); return 0; } return -1; @@ -292,6 +303,7 @@ static void keyboard_early_suspend(struct early_suspend *early_sus) sec_keyboard_tx(0xcb); msleep(20); */ + release_all_keys(data); sec_keyboard_tx(data, 0x10); /* the idle mode */ } } diff --git a/drivers/accessory/sec_keyboard.h b/drivers/accessory/sec_keyboard.h index 7a30b58..f5ccf5a 100644 --- a/drivers/accessory/sec_keyboard.h +++ b/drivers/accessory/sec_keyboard.h @@ -24,7 +24,7 @@ #define UK_KEYBOARD 0xec #define KEYBOARD_MIN 0x4 -#define KEYBOARD_MAX 0x7f +#define KEYBOARD_MAX 0x80 enum KEY_LAYOUT { UNKOWN_KEYLAYOUT = 0, |