aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/accessory
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/accessory')
-rw-r--r--drivers/accessory/30pin_con.c32
-rw-r--r--drivers/accessory/sec_keyboard.c20
-rw-r--r--drivers/accessory/sec_keyboard.h2
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,