diff options
author | Chanwoo Choi <cw00.choi@samsung.com> | 2014-05-28 14:21:55 +0900 |
---|---|---|
committer | Chanwoo Choi <cw00.choi@samsung.com> | 2014-07-23 10:22:35 +0900 |
commit | e1954452f500cb21c09ea401f6f431ab55b35ba3 (patch) | |
tree | b57000888eec8eaa33e4185af482eeac4eaa82a6 /drivers | |
parent | 914b881f9452fd615cc597b434fd8c0e12a7dae2 (diff) | |
download | op-kernel-dev-e1954452f500cb21c09ea401f6f431ab55b35ba3.zip op-kernel-dev-e1954452f500cb21c09ea401f6f431ab55b35ba3.tar.gz |
extcon: sm5502: Detect cable state after completing platform booting
This patch detect whether cable is connected or not and the cable type
after completing kernel/platform booting using system_power_efficient_wq.
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/extcon/extcon-sm5502.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c index 9f318c2..a32d40f 100644 --- a/drivers/extcon/extcon-sm5502.c +++ b/drivers/extcon/extcon-sm5502.c @@ -28,6 +28,8 @@ #include <linux/extcon.h> #include <linux/extcon/sm5502.h> +#define DELAY_MS_DEFAULT 17000 /* unit: millisecond */ + struct muic_irq { unsigned int irq; const char *name; @@ -59,6 +61,14 @@ struct sm5502_muic_info { unsigned int num_reg_data; struct mutex mutex; + + /* + * Use delayed workqueue to detect cable state and then + * notify cable state to notifiee/platform through uevent. + * After completing the booting of platform, the extcon provider + * driver should notify cable state to upper layer. + */ + struct delayed_work wq_detcable; }; /* Default value of SM5502 register to bring up MUIC device. */ @@ -341,6 +351,8 @@ static int sm5502_muic_cable_handler(struct sm5502_muic_info *info, case SM5502_MUIC_ADC_OPEN_USB_OTG: idx = EXTCON_CABLE_USB_HOST; break; + case SM5502_MUIC_ADC_GROUND: + break; default: dev_dbg(info->dev, "cannot handle this cable_type (0x%x)\n", cable_type); @@ -433,6 +445,18 @@ static irqreturn_t sm5502_muic_irq_handler(int irq, void *data) return IRQ_HANDLED; } +static void sm5502_muic_detect_cable_wq(struct work_struct *work) +{ + struct sm5502_muic_info *info = container_of(to_delayed_work(work), + struct sm5502_muic_info, wq_detcable); + int ret; + + /* Notify the state of connector cable or not */ + ret = sm5502_muic_cable_handler(info, true); + if (ret < 0) + dev_warn(info->dev, "failed to detect cable state\n"); +} + static void sm5502_init_dev_type(struct sm5502_muic_info *info) { unsigned int reg_data, vendor_id, version_id; @@ -546,6 +570,18 @@ static int sm5022_muic_i2c_probe(struct i2c_client *i2c, return ret; } + /* + * Detect accessory after completing the initialization of platform + * + * - Use delayed workqueue to detect cable state and then + * notify cable state to notifiee/platform through uevent. + * After completing the booting of platform, the extcon provider + * driver should notify cable state to upper layer. + */ + INIT_DELAYED_WORK(&info->wq_detcable, sm5502_muic_detect_cable_wq); + queue_delayed_work(system_power_efficient_wq, &info->wq_detcable, + msecs_to_jiffies(DELAY_MS_DEFAULT)); + /* Initialize SM5502 device and print vendor id and version id */ sm5502_init_dev_type(info); |