]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/extcon/extcon-max77693.c
extcon: Unify the dock device names on max8997/77693
[karo-tx-linux.git] / drivers / extcon / extcon-max77693.c
1 /*
2  * extcon-max77693.c - MAX77693 extcon driver to support MAX77693 MUIC
3  *
4  * Copyright (C) 2012 Samsung Electrnoics
5  * Chanwoo Choi <cw00.choi@samsung.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  */
17
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/i2c.h>
21 #include <linux/slab.h>
22 #include <linux/input.h>
23 #include <linux/interrupt.h>
24 #include <linux/err.h>
25 #include <linux/platform_device.h>
26 #include <linux/mfd/max77693.h>
27 #include <linux/mfd/max77693-private.h>
28 #include <linux/extcon.h>
29 #include <linux/regmap.h>
30 #include <linux/irqdomain.h>
31
32 #define DEV_NAME                        "max77693-muic"
33 #define DELAY_MS_DEFAULT                20000           /* unit: millisecond */
34
35 /*
36  * Default value of MAX77693 register to bring up MUIC device.
37  * If user don't set some initial value for MUIC device through platform data,
38  * extcon-max77693 driver use 'default_init_data' to bring up base operation
39  * of MAX77693 MUIC device.
40  */
41 static struct max77693_reg_data default_init_data[] = {
42         {
43                 /* STATUS2 - [3]ChgDetRun */
44                 .addr = MAX77693_MUIC_REG_STATUS2,
45                 .data = STATUS2_CHGDETRUN_MASK,
46         }, {
47                 /* INTMASK1 - Unmask [3]ADC1KM,[0]ADCM */
48                 .addr = MAX77693_MUIC_REG_INTMASK1,
49                 .data = INTMASK1_ADC1K_MASK
50                         | INTMASK1_ADC_MASK,
51         }, {
52                 /* INTMASK2 - Unmask [0]ChgTypM */
53                 .addr = MAX77693_MUIC_REG_INTMASK2,
54                 .data = INTMASK2_CHGTYP_MASK,
55         }, {
56                 /* INTMASK3 - Mask all of interrupts */
57                 .addr = MAX77693_MUIC_REG_INTMASK3,
58                 .data = 0x0,
59         }, {
60                 /* CDETCTRL2 */
61                 .addr = MAX77693_MUIC_REG_CDETCTRL2,
62                 .data = CDETCTRL2_VIDRMEN_MASK
63                         | CDETCTRL2_DXOVPEN_MASK,
64         },
65 };
66
67 enum max77693_muic_adc_debounce_time {
68         ADC_DEBOUNCE_TIME_5MS = 0,
69         ADC_DEBOUNCE_TIME_10MS,
70         ADC_DEBOUNCE_TIME_25MS,
71         ADC_DEBOUNCE_TIME_38_62MS,
72 };
73
74 struct max77693_muic_info {
75         struct device *dev;
76         struct max77693_dev *max77693;
77         struct extcon_dev *edev;
78         int prev_cable_type;
79         int prev_cable_type_gnd;
80         int prev_chg_type;
81         int prev_button_type;
82         u8 status[2];
83
84         int irq;
85         struct work_struct irq_work;
86         struct mutex mutex;
87
88         /*
89          * Use delayed workqueue to detect cable state and then
90          * notify cable state to notifiee/platform through uevent.
91          * After completing the booting of platform, the extcon provider
92          * driver should notify cable state to upper layer.
93          */
94         struct delayed_work wq_detcable;
95
96         /* Button of dock device */
97         struct input_dev *dock;
98
99         /*
100          * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
101          * h/w path of COMP2/COMN1 on CONTROL1 register.
102          */
103         int path_usb;
104         int path_uart;
105 };
106
107 enum max77693_muic_cable_group {
108         MAX77693_CABLE_GROUP_ADC = 0,
109         MAX77693_CABLE_GROUP_ADC_GND,
110         MAX77693_CABLE_GROUP_CHG,
111         MAX77693_CABLE_GROUP_VBVOLT,
112 };
113
114 enum max77693_muic_charger_type {
115         MAX77693_CHARGER_TYPE_NONE = 0,
116         MAX77693_CHARGER_TYPE_USB,
117         MAX77693_CHARGER_TYPE_DOWNSTREAM_PORT,
118         MAX77693_CHARGER_TYPE_DEDICATED_CHG,
119         MAX77693_CHARGER_TYPE_APPLE_500MA,
120         MAX77693_CHARGER_TYPE_APPLE_1A_2A,
121         MAX77693_CHARGER_TYPE_DEAD_BATTERY = 7,
122 };
123
124 /**
125  * struct max77693_muic_irq
126  * @irq: the index of irq list of MUIC device.
127  * @name: the name of irq.
128  * @virq: the virtual irq to use irq domain
129  */
130 struct max77693_muic_irq {
131         unsigned int irq;
132         const char *name;
133         unsigned int virq;
134 };
135
136 static struct max77693_muic_irq muic_irqs[] = {
137         { MAX77693_MUIC_IRQ_INT1_ADC,           "muic-ADC" },
138         { MAX77693_MUIC_IRQ_INT1_ADC_LOW,       "muic-ADCLOW" },
139         { MAX77693_MUIC_IRQ_INT1_ADC_ERR,       "muic-ADCError" },
140         { MAX77693_MUIC_IRQ_INT1_ADC1K,         "muic-ADC1K" },
141         { MAX77693_MUIC_IRQ_INT2_CHGTYP,        "muic-CHGTYP" },
142         { MAX77693_MUIC_IRQ_INT2_CHGDETREUN,    "muic-CHGDETREUN" },
143         { MAX77693_MUIC_IRQ_INT2_DCDTMR,        "muic-DCDTMR" },
144         { MAX77693_MUIC_IRQ_INT2_DXOVP,         "muic-DXOVP" },
145         { MAX77693_MUIC_IRQ_INT2_VBVOLT,        "muic-VBVOLT" },
146         { MAX77693_MUIC_IRQ_INT2_VIDRM,         "muic-VIDRM" },
147         { MAX77693_MUIC_IRQ_INT3_EOC,           "muic-EOC" },
148         { MAX77693_MUIC_IRQ_INT3_CGMBC,         "muic-CGMBC" },
149         { MAX77693_MUIC_IRQ_INT3_OVP,           "muic-OVP" },
150         { MAX77693_MUIC_IRQ_INT3_MBCCHG_ERR,    "muic-MBCCHG_ERR" },
151         { MAX77693_MUIC_IRQ_INT3_CHG_ENABLED,   "muic-CHG_ENABLED" },
152         { MAX77693_MUIC_IRQ_INT3_BAT_DET,       "muic-BAT_DET" },
153 };
154
155 /* Define supported accessory type */
156 enum max77693_muic_acc_type {
157         MAX77693_MUIC_ADC_GROUND = 0x0,
158         MAX77693_MUIC_ADC_SEND_END_BUTTON,
159         MAX77693_MUIC_ADC_REMOTE_S1_BUTTON,
160         MAX77693_MUIC_ADC_REMOTE_S2_BUTTON,
161         MAX77693_MUIC_ADC_REMOTE_S3_BUTTON,
162         MAX77693_MUIC_ADC_REMOTE_S4_BUTTON,
163         MAX77693_MUIC_ADC_REMOTE_S5_BUTTON,
164         MAX77693_MUIC_ADC_REMOTE_S6_BUTTON,
165         MAX77693_MUIC_ADC_REMOTE_S7_BUTTON,
166         MAX77693_MUIC_ADC_REMOTE_S8_BUTTON,
167         MAX77693_MUIC_ADC_REMOTE_S9_BUTTON,
168         MAX77693_MUIC_ADC_REMOTE_S10_BUTTON,
169         MAX77693_MUIC_ADC_REMOTE_S11_BUTTON,
170         MAX77693_MUIC_ADC_REMOTE_S12_BUTTON,
171         MAX77693_MUIC_ADC_RESERVED_ACC_1,
172         MAX77693_MUIC_ADC_RESERVED_ACC_2,
173         MAX77693_MUIC_ADC_RESERVED_ACC_3,
174         MAX77693_MUIC_ADC_RESERVED_ACC_4,
175         MAX77693_MUIC_ADC_RESERVED_ACC_5,
176         MAX77693_MUIC_ADC_CEA936_AUDIO,
177         MAX77693_MUIC_ADC_PHONE_POWERED_DEV,
178         MAX77693_MUIC_ADC_TTY_CONVERTER,
179         MAX77693_MUIC_ADC_UART_CABLE,
180         MAX77693_MUIC_ADC_CEA936A_TYPE1_CHG,
181         MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF,
182         MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON,
183         MAX77693_MUIC_ADC_AV_CABLE_NOLOAD,
184         MAX77693_MUIC_ADC_CEA936A_TYPE2_CHG,
185         MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF,
186         MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON,
187         MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE,
188         MAX77693_MUIC_ADC_OPEN,
189
190         /* The below accessories have same ADC value so ADCLow and
191            ADC1K bit is used to separate specific accessory */
192                                                 /* ADC|VBVolot|ADCLow|ADC1K| */
193         MAX77693_MUIC_GND_USB_HOST = 0x100,     /* 0x0|      0|     0|    0| */
194         MAX77693_MUIC_GND_USB_HOST_VB = 0x104,  /* 0x0|      1|     0|    0| */
195         MAX77693_MUIC_GND_AV_CABLE_LOAD = 0x102,/* 0x0|      0|     1|    0| */
196         MAX77693_MUIC_GND_MHL = 0x103,          /* 0x0|      0|     1|    1| */
197         MAX77693_MUIC_GND_MHL_VB = 0x107,       /* 0x0|      1|     1|    1| */
198 };
199
200 /*
201  * MAX77693 MUIC device support below list of accessories(external connector)
202  */
203 enum {
204         EXTCON_CABLE_USB = 0,
205         EXTCON_CABLE_USB_HOST,
206         EXTCON_CABLE_TA,
207         EXTCON_CABLE_FAST_CHARGER,
208         EXTCON_CABLE_SLOW_CHARGER,
209         EXTCON_CABLE_CHARGE_DOWNSTREAM,
210         EXTCON_CABLE_MHL,
211         EXTCON_CABLE_MHL_TA,
212         EXTCON_CABLE_JIG,
213         EXTCON_CABLE_DOCK,
214
215         _EXTCON_CABLE_NUM,
216 };
217
218 static const char *max77693_extcon_cable[] = {
219         [EXTCON_CABLE_USB]                      = "USB",
220         [EXTCON_CABLE_USB_HOST]                 = "USB-Host",
221         [EXTCON_CABLE_TA]                       = "TA",
222         [EXTCON_CABLE_FAST_CHARGER]             = "Fast-charger",
223         [EXTCON_CABLE_SLOW_CHARGER]             = "Slow-charger",
224         [EXTCON_CABLE_CHARGE_DOWNSTREAM]        = "Charge-downstream",
225         [EXTCON_CABLE_MHL]                      = "MHL",
226         [EXTCON_CABLE_MHL_TA]                   = "MHL-TA",
227         [EXTCON_CABLE_JIG]                      = "JIG",
228         [EXTCON_CABLE_DOCK]                     = "DOCK",
229
230         NULL,
231 };
232
233 /*
234  * max77693_muic_set_debounce_time - Set the debounce time of ADC
235  * @info: the instance including private data of max77693 MUIC
236  * @time: the debounce time of ADC
237  */
238 static int max77693_muic_set_debounce_time(struct max77693_muic_info *info,
239                 enum max77693_muic_adc_debounce_time time)
240 {
241         int ret;
242
243         switch (time) {
244         case ADC_DEBOUNCE_TIME_5MS:
245         case ADC_DEBOUNCE_TIME_10MS:
246         case ADC_DEBOUNCE_TIME_25MS:
247         case ADC_DEBOUNCE_TIME_38_62MS:
248                 /*
249                  * Don't touch BTLDset, JIGset when you want to change adc
250                  * debounce time. If it writes other than 0 to BTLDset, JIGset
251                  * muic device will be reset and loose current state.
252                  */
253                 ret = regmap_write(info->max77693->regmap_muic,
254                                   MAX77693_MUIC_REG_CTRL3,
255                                   time << CONTROL3_ADCDBSET_SHIFT);
256                 if (ret) {
257                         dev_err(info->dev, "failed to set ADC debounce time\n");
258                         return ret;
259                 }
260                 break;
261         default:
262                 dev_err(info->dev, "invalid ADC debounce time\n");
263                 return -EINVAL;
264         }
265
266         return 0;
267 };
268
269 /*
270  * max77693_muic_set_path - Set hardware line according to attached cable
271  * @info: the instance including private data of max77693 MUIC
272  * @value: the path according to attached cable
273  * @attached: the state of cable (true:attached, false:detached)
274  *
275  * The max77693 MUIC device share outside H/W line among a varity of cables
276  * so, this function set internal path of H/W line according to the type of
277  * attached cable.
278  */
279 static int max77693_muic_set_path(struct max77693_muic_info *info,
280                 u8 val, bool attached)
281 {
282         int ret = 0;
283         unsigned int ctrl1, ctrl2 = 0;
284
285         if (attached)
286                 ctrl1 = val;
287         else
288                 ctrl1 = CONTROL1_SW_OPEN;
289
290         ret = regmap_update_bits(info->max77693->regmap_muic,
291                         MAX77693_MUIC_REG_CTRL1, COMP_SW_MASK, ctrl1);
292         if (ret < 0) {
293                 dev_err(info->dev, "failed to update MUIC register\n");
294                 return ret;
295         }
296
297         if (attached)
298                 ctrl2 |= CONTROL2_CPEN_MASK;    /* LowPwr=0, CPEn=1 */
299         else
300                 ctrl2 |= CONTROL2_LOWPWR_MASK;  /* LowPwr=1, CPEn=0 */
301
302         ret = regmap_update_bits(info->max77693->regmap_muic,
303                         MAX77693_MUIC_REG_CTRL2,
304                         CONTROL2_LOWPWR_MASK | CONTROL2_CPEN_MASK, ctrl2);
305         if (ret < 0) {
306                 dev_err(info->dev, "failed to update MUIC register\n");
307                 return ret;
308         }
309
310         dev_info(info->dev,
311                 "CONTROL1 : 0x%02x, CONTROL2 : 0x%02x, state : %s\n",
312                 ctrl1, ctrl2, attached ? "attached" : "detached");
313
314         return 0;
315 }
316
317 /*
318  * max77693_muic_get_cable_type - Return cable type and check cable state
319  * @info: the instance including private data of max77693 MUIC
320  * @group: the path according to attached cable
321  * @attached: store cable state and return
322  *
323  * This function check the cable state either attached or detached,
324  * and then divide precise type of cable according to cable group.
325  *      - MAX77693_CABLE_GROUP_ADC
326  *      - MAX77693_CABLE_GROUP_ADC_GND
327  *      - MAX77693_CABLE_GROUP_CHG
328  *      - MAX77693_CABLE_GROUP_VBVOLT
329  */
330 static int max77693_muic_get_cable_type(struct max77693_muic_info *info,
331                 enum max77693_muic_cable_group group, bool *attached)
332 {
333         int cable_type = 0;
334         int adc;
335         int adc1k;
336         int adclow;
337         int vbvolt;
338         int chg_type;
339
340         switch (group) {
341         case MAX77693_CABLE_GROUP_ADC:
342                 /*
343                  * Read ADC value to check cable type and decide cable state
344                  * according to cable type
345                  */
346                 adc = info->status[0] & STATUS1_ADC_MASK;
347                 adc >>= STATUS1_ADC_SHIFT;
348
349                 /*
350                  * Check current cable state/cable type and store cable type
351                  * (info->prev_cable_type) for handling cable when cable is
352                  * detached.
353                  */
354                 if (adc == MAX77693_MUIC_ADC_OPEN) {
355                         *attached = false;
356
357                         cable_type = info->prev_cable_type;
358                         info->prev_cable_type = MAX77693_MUIC_ADC_OPEN;
359                 } else {
360                         *attached = true;
361
362                         cable_type = info->prev_cable_type = adc;
363                 }
364                 break;
365         case MAX77693_CABLE_GROUP_ADC_GND:
366                 /*
367                  * Read ADC value to check cable type and decide cable state
368                  * according to cable type
369                  */
370                 adc = info->status[0] & STATUS1_ADC_MASK;
371                 adc >>= STATUS1_ADC_SHIFT;
372
373                 /*
374                  * Check current cable state/cable type and store cable type
375                  * (info->prev_cable_type/_gnd) for handling cable when cable
376                  * is detached.
377                  */
378                 if (adc == MAX77693_MUIC_ADC_OPEN) {
379                         *attached = false;
380
381                         cable_type = info->prev_cable_type_gnd;
382                         info->prev_cable_type_gnd = MAX77693_MUIC_ADC_OPEN;
383                 } else {
384                         *attached = true;
385
386                         adclow = info->status[0] & STATUS1_ADCLOW_MASK;
387                         adclow >>= STATUS1_ADCLOW_SHIFT;
388                         adc1k = info->status[0] & STATUS1_ADC1K_MASK;
389                         adc1k >>= STATUS1_ADC1K_SHIFT;
390
391                         vbvolt = info->status[1] & STATUS2_VBVOLT_MASK;
392                         vbvolt >>= STATUS2_VBVOLT_SHIFT;
393
394                         /**
395                          * [0x1|VBVolt|ADCLow|ADC1K]
396                          * [0x1|     0|     0|    0] USB_HOST
397                          * [0x1|     1|     0|    0] USB_HSOT_VB
398                          * [0x1|     0|     1|    0] Audio Video cable with load
399                          * [0x1|     0|     1|    1] MHL without charging cable
400                          * [0x1|     1|     1|    1] MHL with charging cable
401                          */
402                         cable_type = ((0x1 << 8)
403                                         | (vbvolt << 2)
404                                         | (adclow << 1)
405                                         | adc1k);
406
407                         info->prev_cable_type = adc;
408                         info->prev_cable_type_gnd = cable_type;
409                 }
410
411                 break;
412         case MAX77693_CABLE_GROUP_CHG:
413                 /*
414                  * Read charger type to check cable type and decide cable state
415                  * according to type of charger cable.
416                  */
417                 chg_type = info->status[1] & STATUS2_CHGTYP_MASK;
418                 chg_type >>= STATUS2_CHGTYP_SHIFT;
419
420                 if (chg_type == MAX77693_CHARGER_TYPE_NONE) {
421                         *attached = false;
422
423                         cable_type = info->prev_chg_type;
424                         info->prev_chg_type = MAX77693_CHARGER_TYPE_NONE;
425                 } else {
426                         *attached = true;
427
428                         /*
429                          * Check current cable state/cable type and store cable
430                          * type(info->prev_chg_type) for handling cable when
431                          * charger cable is detached.
432                          */
433                         cable_type = info->prev_chg_type = chg_type;
434                 }
435
436                 break;
437         case MAX77693_CABLE_GROUP_VBVOLT:
438                 /*
439                  * Read ADC value to check cable type and decide cable state
440                  * according to cable type
441                  */
442                 adc = info->status[0] & STATUS1_ADC_MASK;
443                 adc >>= STATUS1_ADC_SHIFT;
444                 chg_type = info->status[1] & STATUS2_CHGTYP_MASK;
445                 chg_type >>= STATUS2_CHGTYP_SHIFT;
446
447                 if (adc == MAX77693_MUIC_ADC_OPEN
448                                 && chg_type == MAX77693_CHARGER_TYPE_NONE)
449                         *attached = false;
450                 else
451                         *attached = true;
452
453                 /*
454                  * Read vbvolt field, if vbvolt is 1,
455                  * this cable is used for charging.
456                  */
457                 vbvolt = info->status[1] & STATUS2_VBVOLT_MASK;
458                 vbvolt >>= STATUS2_VBVOLT_SHIFT;
459
460                 cable_type = vbvolt;
461                 break;
462         default:
463                 dev_err(info->dev, "Unknown cable group (%d)\n", group);
464                 cable_type = -EINVAL;
465                 break;
466         }
467
468         return cable_type;
469 }
470
471 static int max77693_muic_dock_handler(struct max77693_muic_info *info,
472                 int cable_type, bool attached)
473 {
474         int ret = 0;
475         int vbvolt;
476         bool cable_attached;
477         char dock_name[CABLE_NAME_MAX];
478
479         dev_info(info->dev,
480                 "external connector is %s (adc:0x%02x)\n",
481                 attached ? "attached" : "detached", cable_type);
482
483         switch (cable_type) {
484         case MAX77693_MUIC_ADC_RESERVED_ACC_3:          /* Dock-Smart */
485                 /*
486                  * Check power cable whether attached or detached state.
487                  * The Dock-Smart device need surely external power supply.
488                  * If power cable(USB/TA) isn't connected to Dock device,
489                  * user can't use Dock-Smart for desktop mode.
490                  */
491                 vbvolt = max77693_muic_get_cable_type(info,
492                                 MAX77693_CABLE_GROUP_VBVOLT, &cable_attached);
493                 if (attached && !vbvolt) {
494                         dev_warn(info->dev,
495                                 "Cannot detect external power supply\n");
496                         return 0;
497                 }
498
499                 /*
500                  * Notify Dock/MHL state.
501                  * - Dock device include three type of cable which
502                  * are HDMI, USB for mouse/keyboard and micro-usb port
503                  * for USB/TA cable. Dock device need always exteranl
504                  * power supply(USB/TA cable through micro-usb cable). Dock
505                  * device support screen output of target to separate
506                  * monitor and mouse/keyboard for desktop mode.
507                  *
508                  * Features of 'USB/TA cable with Dock device'
509                  * - Support MHL
510                  * - Support external output feature of audio
511                  * - Support charging through micro-usb port without data
512                  *           connection if TA cable is connected to target.
513                  * - Support charging and data connection through micro-usb port
514                  *           if USB cable is connected between target and host
515                  *           device.
516                  * - Support OTG(On-The-Go) device (Ex: Mouse/Keyboard)
517                  */
518                 ret = max77693_muic_set_path(info, info->path_usb, attached);
519                 if (ret < 0)
520                         return ret;
521
522                 extcon_set_cable_state(info->edev, "DOCK", attached);
523                 extcon_set_cable_state(info->edev, "MHL", attached);
524                 goto out;
525         case MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE:       /* Dock-Desk */
526                 strcpy(dock_name, "DOCK");
527                 break;
528         case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:         /* Dock-Audio */
529                 strcpy(dock_name, "DOCK");
530                 if (!attached)
531                         extcon_set_cable_state(info->edev, "USB", false);
532                 break;
533         default:
534                 dev_err(info->dev, "failed to detect %s dock device\n",
535                         attached ? "attached" : "detached");
536                 return -EINVAL;
537         }
538
539         /* Dock-Car/Desk/Audio, PATH:AUDIO */
540         ret = max77693_muic_set_path(info, CONTROL1_SW_AUDIO, attached);
541         if (ret < 0)
542                 return ret;
543         extcon_set_cable_state(info->edev, dock_name, attached);
544
545 out:
546         return 0;
547 }
548
549 static int max77693_muic_dock_button_handler(struct max77693_muic_info *info,
550                 int button_type, bool attached)
551 {
552         struct input_dev *dock = info->dock;
553         unsigned int code;
554
555         switch (button_type) {
556         case MAX77693_MUIC_ADC_REMOTE_S3_BUTTON-1
557                 ... MAX77693_MUIC_ADC_REMOTE_S3_BUTTON+1:
558                 /* DOCK_KEY_PREV */
559                 code = KEY_PREVIOUSSONG;
560                 break;
561         case MAX77693_MUIC_ADC_REMOTE_S7_BUTTON-1
562                 ... MAX77693_MUIC_ADC_REMOTE_S7_BUTTON+1:
563                 /* DOCK_KEY_NEXT */
564                 code = KEY_NEXTSONG;
565                 break;
566         case MAX77693_MUIC_ADC_REMOTE_S9_BUTTON:
567                 /* DOCK_VOL_DOWN */
568                 code = KEY_VOLUMEDOWN;
569                 break;
570         case MAX77693_MUIC_ADC_REMOTE_S10_BUTTON:
571                 /* DOCK_VOL_UP */
572                 code = KEY_VOLUMEUP;
573                 break;
574         case MAX77693_MUIC_ADC_REMOTE_S12_BUTTON-1
575                 ... MAX77693_MUIC_ADC_REMOTE_S12_BUTTON+1:
576                 /* DOCK_KEY_PLAY_PAUSE */
577                 code = KEY_PLAYPAUSE;
578                 break;
579         default:
580                 dev_err(info->dev,
581                         "failed to detect %s key (adc:0x%x)\n",
582                         attached ? "pressed" : "released", button_type);
583                 return -EINVAL;
584         }
585
586         input_event(dock, EV_KEY, code, attached);
587         input_sync(dock);
588
589         return 0;
590 }
591
592 static int max77693_muic_adc_ground_handler(struct max77693_muic_info *info)
593 {
594         int cable_type_gnd;
595         int ret = 0;
596         bool attached;
597
598         cable_type_gnd = max77693_muic_get_cable_type(info,
599                                 MAX77693_CABLE_GROUP_ADC_GND, &attached);
600
601         switch (cable_type_gnd) {
602         case MAX77693_MUIC_GND_USB_HOST:
603         case MAX77693_MUIC_GND_USB_HOST_VB:
604                 /* USB_HOST, PATH: AP_USB */
605                 ret = max77693_muic_set_path(info, CONTROL1_SW_USB, attached);
606                 if (ret < 0)
607                         return ret;
608                 extcon_set_cable_state(info->edev, "USB-Host", attached);
609                 break;
610         case MAX77693_MUIC_GND_AV_CABLE_LOAD:
611                 /* Audio Video Cable with load, PATH:AUDIO */
612                 ret = max77693_muic_set_path(info, CONTROL1_SW_AUDIO, attached);
613                 if (ret < 0)
614                         return ret;
615                 extcon_set_cable_state(info->edev,
616                                 "Audio-video-load", attached);
617                 break;
618         case MAX77693_MUIC_GND_MHL:
619         case MAX77693_MUIC_GND_MHL_VB:
620                 /* MHL or MHL with USB/TA cable */
621                 extcon_set_cable_state(info->edev, "MHL", attached);
622                 break;
623         default:
624                 dev_err(info->dev, "failed to detect %s cable of gnd type\n",
625                         attached ? "attached" : "detached");
626                 return -EINVAL;
627         }
628
629         return 0;
630 }
631
632 static int max77693_muic_jig_handler(struct max77693_muic_info *info,
633                 int cable_type, bool attached)
634 {
635         int ret = 0;
636         u8 path = CONTROL1_SW_OPEN;
637
638         dev_info(info->dev,
639                 "external connector is %s (adc:0x%02x)\n",
640                 attached ? "attached" : "detached", cable_type);
641
642         switch (cable_type) {
643         case MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF:    /* ADC_JIG_USB_OFF */
644         case MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON:     /* ADC_JIG_USB_ON */
645                 /* PATH:AP_USB */
646                 path = CONTROL1_SW_USB;
647                 break;
648         case MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF:   /* ADC_JIG_UART_OFF */
649         case MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON:    /* ADC_JIG_UART_ON */
650                 /* PATH:AP_UART */
651                 path = CONTROL1_SW_UART;
652                 break;
653         default:
654                 dev_err(info->dev, "failed to detect %s jig cable\n",
655                         attached ? "attached" : "detached");
656                 return -EINVAL;
657         }
658
659         ret = max77693_muic_set_path(info, path, attached);
660         if (ret < 0)
661                 return ret;
662
663         extcon_set_cable_state(info->edev, "JIG", attached);
664
665         return 0;
666 }
667
668 static int max77693_muic_adc_handler(struct max77693_muic_info *info)
669 {
670         int cable_type;
671         int button_type;
672         bool attached;
673         int ret = 0;
674
675         /* Check accessory state which is either detached or attached */
676         cable_type = max77693_muic_get_cable_type(info,
677                                 MAX77693_CABLE_GROUP_ADC, &attached);
678
679         dev_info(info->dev,
680                 "external connector is %s (adc:0x%02x, prev_adc:0x%x)\n",
681                 attached ? "attached" : "detached", cable_type,
682                 info->prev_cable_type);
683
684         switch (cable_type) {
685         case MAX77693_MUIC_ADC_GROUND:
686                 /* USB_HOST/MHL/Audio */
687                 max77693_muic_adc_ground_handler(info);
688                 break;
689         case MAX77693_MUIC_ADC_FACTORY_MODE_USB_OFF:
690         case MAX77693_MUIC_ADC_FACTORY_MODE_USB_ON:
691         case MAX77693_MUIC_ADC_FACTORY_MODE_UART_OFF:
692         case MAX77693_MUIC_ADC_FACTORY_MODE_UART_ON:
693                 /* JIG */
694                 ret = max77693_muic_jig_handler(info, cable_type, attached);
695                 if (ret < 0)
696                         return ret;
697                 break;
698         case MAX77693_MUIC_ADC_RESERVED_ACC_3:          /* Dock-Smart */
699         case MAX77693_MUIC_ADC_AUDIO_MODE_REMOTE:       /* Dock-Desk */
700         case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:         /* Dock-Audio */
701                 /*
702                  * DOCK device
703                  *
704                  * The MAX77693 MUIC device can detect total 34 cable type
705                  * except of charger cable and MUIC device didn't define
706                  * specfic role of cable in the range of from 0x01 to 0x12
707                  * of ADC value. So, can use/define cable with no role according
708                  * to schema of hardware board.
709                  */
710                 ret = max77693_muic_dock_handler(info, cable_type, attached);
711                 if (ret < 0)
712                         return ret;
713                 break;
714         case MAX77693_MUIC_ADC_REMOTE_S3_BUTTON:      /* DOCK_KEY_PREV */
715         case MAX77693_MUIC_ADC_REMOTE_S7_BUTTON:      /* DOCK_KEY_NEXT */
716         case MAX77693_MUIC_ADC_REMOTE_S9_BUTTON:      /* DOCK_VOL_DOWN */
717         case MAX77693_MUIC_ADC_REMOTE_S10_BUTTON:     /* DOCK_VOL_UP */
718         case MAX77693_MUIC_ADC_REMOTE_S12_BUTTON:     /* DOCK_KEY_PLAY_PAUSE */
719                 /*
720                  * Button of DOCK device
721                  * - the Prev/Next/Volume Up/Volume Down/Play-Pause button
722                  *
723                  * The MAX77693 MUIC device can detect total 34 cable type
724                  * except of charger cable and MUIC device didn't define
725                  * specfic role of cable in the range of from 0x01 to 0x12
726                  * of ADC value. So, can use/define cable with no role according
727                  * to schema of hardware board.
728                  */
729                 if (attached)
730                         button_type = info->prev_button_type = cable_type;
731                 else
732                         button_type = info->prev_button_type;
733
734                 ret = max77693_muic_dock_button_handler(info, button_type,
735                                                         attached);
736                 if (ret < 0)
737                         return ret;
738                 break;
739         case MAX77693_MUIC_ADC_SEND_END_BUTTON:
740         case MAX77693_MUIC_ADC_REMOTE_S1_BUTTON:
741         case MAX77693_MUIC_ADC_REMOTE_S2_BUTTON:
742         case MAX77693_MUIC_ADC_REMOTE_S4_BUTTON:
743         case MAX77693_MUIC_ADC_REMOTE_S5_BUTTON:
744         case MAX77693_MUIC_ADC_REMOTE_S6_BUTTON:
745         case MAX77693_MUIC_ADC_REMOTE_S8_BUTTON:
746         case MAX77693_MUIC_ADC_REMOTE_S11_BUTTON:
747         case MAX77693_MUIC_ADC_RESERVED_ACC_1:
748         case MAX77693_MUIC_ADC_RESERVED_ACC_2:
749         case MAX77693_MUIC_ADC_RESERVED_ACC_4:
750         case MAX77693_MUIC_ADC_RESERVED_ACC_5:
751         case MAX77693_MUIC_ADC_CEA936_AUDIO:
752         case MAX77693_MUIC_ADC_PHONE_POWERED_DEV:
753         case MAX77693_MUIC_ADC_TTY_CONVERTER:
754         case MAX77693_MUIC_ADC_UART_CABLE:
755         case MAX77693_MUIC_ADC_CEA936A_TYPE1_CHG:
756         case MAX77693_MUIC_ADC_CEA936A_TYPE2_CHG:
757                 /*
758                  * This accessory isn't used in general case if it is specially
759                  * needed to detect additional accessory, should implement
760                  * proper operation when this accessory is attached/detached.
761                  */
762                 dev_info(info->dev,
763                         "accessory is %s but it isn't used (adc:0x%x)\n",
764                         attached ? "attached" : "detached", cable_type);
765                 return -EAGAIN;
766         default:
767                 dev_err(info->dev,
768                         "failed to detect %s accessory (adc:0x%x)\n",
769                         attached ? "attached" : "detached", cable_type);
770                 return -EINVAL;
771         }
772
773         return 0;
774 }
775
776 static int max77693_muic_chg_handler(struct max77693_muic_info *info)
777 {
778         int chg_type;
779         int cable_type_gnd;
780         int cable_type;
781         bool attached;
782         bool cable_attached;
783         int ret = 0;
784
785         chg_type = max77693_muic_get_cable_type(info,
786                                 MAX77693_CABLE_GROUP_CHG, &attached);
787
788         dev_info(info->dev,
789                 "external connector is %s(chg_type:0x%x, prev_chg_type:0x%x)\n",
790                         attached ? "attached" : "detached",
791                         chg_type, info->prev_chg_type);
792
793         switch (chg_type) {
794         case MAX77693_CHARGER_TYPE_USB:
795         case MAX77693_CHARGER_TYPE_DEDICATED_CHG:
796         case MAX77693_CHARGER_TYPE_NONE:
797                 /* Check MAX77693_CABLE_GROUP_ADC_GND type */
798                 cable_type_gnd = max77693_muic_get_cable_type(info,
799                                         MAX77693_CABLE_GROUP_ADC_GND,
800                                         &cable_attached);
801                 switch (cable_type_gnd) {
802                 case MAX77693_MUIC_GND_MHL:
803                 case MAX77693_MUIC_GND_MHL_VB:
804                         /*
805                          * MHL cable with MHL-TA(USB/TA) cable
806                          * - MHL cable include two port(HDMI line and separate
807                          * micro-usb port. When the target connect MHL cable,
808                          * extcon driver check whether MHL-TA(USB/TA) cable is
809                          * connected. If MHL-TA cable is connected, extcon
810                          * driver notify state to notifiee for charging battery.
811                          *
812                          * Features of 'MHL-TA(USB/TA) with MHL cable'
813                          * - Support MHL
814                          * - Support charging through micro-usb port without
815                          *   data connection
816                          */
817                         extcon_set_cable_state(info->edev, "MHL-TA", attached);
818                         if (!cable_attached)
819                                 extcon_set_cable_state(info->edev,
820                                                       "MHL", cable_attached);
821                         break;
822                 }
823
824                 /* Check MAX77693_CABLE_GROUP_ADC type */
825                 cable_type = max77693_muic_get_cable_type(info,
826                                         MAX77693_CABLE_GROUP_ADC,
827                                         &cable_attached);
828                 switch (cable_type) {
829                 case MAX77693_MUIC_ADC_AV_CABLE_NOLOAD:         /* Dock-Audio */
830                         /*
831                          * Dock-Audio device with USB/TA cable
832                          * - Dock device include two port(Dock-Audio and micro-
833                          * usb port). When the target connect Dock-Audio device,
834                          * extcon driver check whether USB/TA cable is connected
835                          * or not. If USB/TA cable is connected, extcon driver
836                          * notify state to notifiee for charging battery.
837                          *
838                          * Features of 'USB/TA cable with Dock-Audio device'
839                          * - Support external output feature of audio.
840                          * - Support charging through micro-usb port without
841                          *   data connection.
842                          */
843                         extcon_set_cable_state(info->edev, "USB", attached);
844
845                         if (!cable_attached)
846                                 extcon_set_cable_state(info->edev, "DOCK",
847                                                       cable_attached);
848                         break;
849                 case MAX77693_MUIC_ADC_RESERVED_ACC_3:          /* Dock-Smart */
850                         /*
851                          * Dock-Smart device with USB/TA cable
852                          * - Dock-Desk device include three type of cable which
853                          * are HDMI, USB for mouse/keyboard and micro-usb port
854                          * for USB/TA cable. Dock-Smart device need always
855                          * exteranl power supply(USB/TA cable through micro-usb
856                          * cable). Dock-Smart device support screen output of
857                          * target to separate monitor and mouse/keyboard for
858                          * desktop mode.
859                          *
860                          * Features of 'USB/TA cable with Dock-Smart device'
861                          * - Support MHL
862                          * - Support external output feature of audio
863                          * - Support charging through micro-usb port without
864                          *   data connection if TA cable is connected to target.
865                          * - Support charging and data connection through micro-
866                          *   usb port if USB cable is connected between target
867                          *   and host device
868                          * - Support OTG(On-The-Go) device (Ex: Mouse/Keyboard)
869                          */
870                         ret = max77693_muic_set_path(info, info->path_usb,
871                                                     attached);
872                         if (ret < 0)
873                                 return ret;
874
875                         extcon_set_cable_state(info->edev, "DOCK", attached);
876                         extcon_set_cable_state(info->edev, "MHL", attached);
877
878                         break;
879                 }
880
881                 /* Check MAX77693_CABLE_GROUP_CHG type */
882                 switch (chg_type) {
883                 case MAX77693_CHARGER_TYPE_NONE:
884                         /*
885                          * When MHL(with USB/TA cable) or Dock-Audio with USB/TA
886                          * cable is attached, muic device happen below two irq.
887                          * - 'MAX77693_MUIC_IRQ_INT1_ADC' for detecting
888                          *    MHL/Dock-Audio.
889                          * - 'MAX77693_MUIC_IRQ_INT2_CHGTYP' for detecting
890                          *    USB/TA cable connected to MHL or Dock-Audio.
891                          * Always, happen eariler MAX77693_MUIC_IRQ_INT1_ADC
892                          * irq than MAX77693_MUIC_IRQ_INT2_CHGTYP irq.
893                          *
894                          * If user attach MHL (with USB/TA cable and immediately
895                          * detach MHL with USB/TA cable before MAX77693_MUIC_IRQ
896                          * _INT2_CHGTYP irq is happened, USB/TA cable remain
897                          * connected state to target. But USB/TA cable isn't
898                          * connected to target. The user be face with unusual
899                          * action. So, driver should check this situation in
900                          * spite of, that previous charger type is N/A.
901                          */
902                         break;
903                 case MAX77693_CHARGER_TYPE_USB:
904                         /* Only USB cable, PATH:AP_USB */
905                         ret = max77693_muic_set_path(info, info->path_usb,
906                                                     attached);
907                         if (ret < 0)
908                                 return ret;
909
910                         extcon_set_cable_state(info->edev, "USB", attached);
911                         break;
912                 case MAX77693_CHARGER_TYPE_DEDICATED_CHG:
913                         /* Only TA cable */
914                         extcon_set_cable_state(info->edev, "TA", attached);
915                         break;
916                 }
917                 break;
918         case MAX77693_CHARGER_TYPE_DOWNSTREAM_PORT:
919                 extcon_set_cable_state(info->edev,
920                                 "Charge-downstream", attached);
921                 break;
922         case MAX77693_CHARGER_TYPE_APPLE_500MA:
923                 extcon_set_cable_state(info->edev, "Slow-charger", attached);
924                 break;
925         case MAX77693_CHARGER_TYPE_APPLE_1A_2A:
926                 extcon_set_cable_state(info->edev, "Fast-charger", attached);
927                 break;
928         case MAX77693_CHARGER_TYPE_DEAD_BATTERY:
929                 break;
930         default:
931                 dev_err(info->dev,
932                         "failed to detect %s accessory (chg_type:0x%x)\n",
933                         attached ? "attached" : "detached", chg_type);
934                 return -EINVAL;
935         }
936
937         return 0;
938 }
939
940 static void max77693_muic_irq_work(struct work_struct *work)
941 {
942         struct max77693_muic_info *info = container_of(work,
943                         struct max77693_muic_info, irq_work);
944         int irq_type = -1;
945         int i, ret = 0;
946
947         if (!info->edev)
948                 return;
949
950         mutex_lock(&info->mutex);
951
952         for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
953                 if (info->irq == muic_irqs[i].virq)
954                         irq_type = muic_irqs[i].irq;
955
956         ret = regmap_bulk_read(info->max77693->regmap_muic,
957                         MAX77693_MUIC_REG_STATUS1, info->status, 2);
958         if (ret) {
959                 dev_err(info->dev, "failed to read MUIC register\n");
960                 mutex_unlock(&info->mutex);
961                 return;
962         }
963
964         switch (irq_type) {
965         case MAX77693_MUIC_IRQ_INT1_ADC:
966         case MAX77693_MUIC_IRQ_INT1_ADC_LOW:
967         case MAX77693_MUIC_IRQ_INT1_ADC_ERR:
968         case MAX77693_MUIC_IRQ_INT1_ADC1K:
969                 /* Handle all of accessory except for
970                    type of charger accessory */
971                 ret = max77693_muic_adc_handler(info);
972                 break;
973         case MAX77693_MUIC_IRQ_INT2_CHGTYP:
974         case MAX77693_MUIC_IRQ_INT2_CHGDETREUN:
975         case MAX77693_MUIC_IRQ_INT2_DCDTMR:
976         case MAX77693_MUIC_IRQ_INT2_DXOVP:
977         case MAX77693_MUIC_IRQ_INT2_VBVOLT:
978         case MAX77693_MUIC_IRQ_INT2_VIDRM:
979                 /* Handle charger accessory */
980                 ret = max77693_muic_chg_handler(info);
981                 break;
982         case MAX77693_MUIC_IRQ_INT3_EOC:
983         case MAX77693_MUIC_IRQ_INT3_CGMBC:
984         case MAX77693_MUIC_IRQ_INT3_OVP:
985         case MAX77693_MUIC_IRQ_INT3_MBCCHG_ERR:
986         case MAX77693_MUIC_IRQ_INT3_CHG_ENABLED:
987         case MAX77693_MUIC_IRQ_INT3_BAT_DET:
988                 break;
989         default:
990                 dev_err(info->dev, "muic interrupt: irq %d occurred\n",
991                                 irq_type);
992                 mutex_unlock(&info->mutex);
993                 return;
994         }
995
996         if (ret < 0)
997                 dev_err(info->dev, "failed to handle MUIC interrupt\n");
998
999         mutex_unlock(&info->mutex);
1000 }
1001
1002 static irqreturn_t max77693_muic_irq_handler(int irq, void *data)
1003 {
1004         struct max77693_muic_info *info = data;
1005
1006         info->irq = irq;
1007         schedule_work(&info->irq_work);
1008
1009         return IRQ_HANDLED;
1010 }
1011
1012 static const struct regmap_config max77693_muic_regmap_config = {
1013         .reg_bits = 8,
1014         .val_bits = 8,
1015 };
1016
1017 static int max77693_muic_detect_accessory(struct max77693_muic_info *info)
1018 {
1019         int ret = 0;
1020         int adc;
1021         int chg_type;
1022         bool attached;
1023
1024         mutex_lock(&info->mutex);
1025
1026         /* Read STATUSx register to detect accessory */
1027         ret = regmap_bulk_read(info->max77693->regmap_muic,
1028                         MAX77693_MUIC_REG_STATUS1, info->status, 2);
1029         if (ret) {
1030                 dev_err(info->dev, "failed to read MUIC register\n");
1031                 mutex_unlock(&info->mutex);
1032                 return ret;
1033         }
1034
1035         adc = max77693_muic_get_cable_type(info, MAX77693_CABLE_GROUP_ADC,
1036                                         &attached);
1037         if (attached && adc != MAX77693_MUIC_ADC_OPEN) {
1038                 ret = max77693_muic_adc_handler(info);
1039                 if (ret < 0) {
1040                         dev_err(info->dev, "Cannot detect accessory\n");
1041                         mutex_unlock(&info->mutex);
1042                         return ret;
1043                 }
1044         }
1045
1046         chg_type = max77693_muic_get_cable_type(info, MAX77693_CABLE_GROUP_CHG,
1047                                         &attached);
1048         if (attached && chg_type != MAX77693_CHARGER_TYPE_NONE) {
1049                 ret = max77693_muic_chg_handler(info);
1050                 if (ret < 0) {
1051                         dev_err(info->dev, "Cannot detect charger accessory\n");
1052                         mutex_unlock(&info->mutex);
1053                         return ret;
1054                 }
1055         }
1056
1057         mutex_unlock(&info->mutex);
1058
1059         return 0;
1060 }
1061
1062 static void max77693_muic_detect_cable_wq(struct work_struct *work)
1063 {
1064         struct max77693_muic_info *info = container_of(to_delayed_work(work),
1065                                 struct max77693_muic_info, wq_detcable);
1066
1067         max77693_muic_detect_accessory(info);
1068 }
1069
1070 static int max77693_muic_probe(struct platform_device *pdev)
1071 {
1072         struct max77693_dev *max77693 = dev_get_drvdata(pdev->dev.parent);
1073         struct max77693_platform_data *pdata = dev_get_platdata(max77693->dev);
1074         struct max77693_muic_info *info;
1075         struct max77693_reg_data *init_data;
1076         int num_init_data;
1077         int delay_jiffies;
1078         int ret;
1079         int i;
1080         unsigned int id;
1081
1082         info = devm_kzalloc(&pdev->dev, sizeof(struct max77693_muic_info),
1083                                    GFP_KERNEL);
1084         if (!info)
1085                 return -ENOMEM;
1086
1087         info->dev = &pdev->dev;
1088         info->max77693 = max77693;
1089         if (info->max77693->regmap_muic) {
1090                 dev_dbg(&pdev->dev, "allocate register map\n");
1091         } else {
1092                 info->max77693->regmap_muic = devm_regmap_init_i2c(
1093                                                 info->max77693->muic,
1094                                                 &max77693_muic_regmap_config);
1095                 if (IS_ERR(info->max77693->regmap_muic)) {
1096                         ret = PTR_ERR(info->max77693->regmap_muic);
1097                         dev_err(max77693->dev,
1098                                 "failed to allocate register map: %d\n", ret);
1099                         return ret;
1100                 }
1101         }
1102
1103         /* Register input device for button of dock device */
1104         info->dock = devm_input_allocate_device(&pdev->dev);
1105         if (!info->dock) {
1106                 dev_err(&pdev->dev, "%s: failed to allocate input\n", __func__);
1107                 return -ENOMEM;
1108         }
1109         info->dock->name = "max77693-muic/dock";
1110         info->dock->phys = "max77693-muic/extcon";
1111         info->dock->dev.parent = &pdev->dev;
1112
1113         __set_bit(EV_REP, info->dock->evbit);
1114
1115         input_set_capability(info->dock, EV_KEY, KEY_VOLUMEUP);
1116         input_set_capability(info->dock, EV_KEY, KEY_VOLUMEDOWN);
1117         input_set_capability(info->dock, EV_KEY, KEY_PLAYPAUSE);
1118         input_set_capability(info->dock, EV_KEY, KEY_PREVIOUSSONG);
1119         input_set_capability(info->dock, EV_KEY, KEY_NEXTSONG);
1120
1121         ret = input_register_device(info->dock);
1122         if (ret < 0) {
1123                 dev_err(&pdev->dev, "Cannot register input device error(%d)\n",
1124                                 ret);
1125                 return ret;
1126         }
1127
1128         platform_set_drvdata(pdev, info);
1129         mutex_init(&info->mutex);
1130
1131         INIT_WORK(&info->irq_work, max77693_muic_irq_work);
1132
1133         /* Support irq domain for MAX77693 MUIC device */
1134         for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
1135                 struct max77693_muic_irq *muic_irq = &muic_irqs[i];
1136                 unsigned int virq = 0;
1137
1138                 virq = regmap_irq_get_virq(max77693->irq_data_muic,
1139                                         muic_irq->irq);
1140                 if (!virq)
1141                         return -EINVAL;
1142                 muic_irq->virq = virq;
1143
1144                 ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
1145                                 max77693_muic_irq_handler,
1146                                 IRQF_NO_SUSPEND,
1147                                 muic_irq->name, info);
1148                 if (ret) {
1149                         dev_err(&pdev->dev,
1150                                 "failed: irq request (IRQ: %d, error :%d)\n",
1151                                 muic_irq->irq, ret);
1152                         return ret;
1153                 }
1154         }
1155
1156         /* Initialize extcon device */
1157         info->edev = devm_extcon_dev_allocate(&pdev->dev,
1158                                               max77693_extcon_cable);
1159         if (IS_ERR(info->edev)) {
1160                 dev_err(&pdev->dev, "failed to allocate memory for extcon\n");
1161                 return -ENOMEM;
1162         }
1163         info->edev->name = DEV_NAME;
1164
1165         ret = devm_extcon_dev_register(&pdev->dev, info->edev);
1166         if (ret) {
1167                 dev_err(&pdev->dev, "failed to register extcon device\n");
1168                 return ret;
1169         }
1170
1171         /* Initialize MUIC register by using platform data or default data */
1172         if (pdata && pdata->muic_data) {
1173                 init_data = pdata->muic_data->init_data;
1174                 num_init_data = pdata->muic_data->num_init_data;
1175         } else {
1176                 init_data = default_init_data;
1177                 num_init_data = ARRAY_SIZE(default_init_data);
1178         }
1179
1180         for (i = 0; i < num_init_data; i++) {
1181                 enum max77693_irq_source irq_src
1182                                 = MAX77693_IRQ_GROUP_NR;
1183
1184                 regmap_write(info->max77693->regmap_muic,
1185                                 init_data[i].addr,
1186                                 init_data[i].data);
1187
1188                 switch (init_data[i].addr) {
1189                 case MAX77693_MUIC_REG_INTMASK1:
1190                         irq_src = MUIC_INT1;
1191                         break;
1192                 case MAX77693_MUIC_REG_INTMASK2:
1193                         irq_src = MUIC_INT2;
1194                         break;
1195                 case MAX77693_MUIC_REG_INTMASK3:
1196                         irq_src = MUIC_INT3;
1197                         break;
1198                 }
1199
1200                 if (irq_src < MAX77693_IRQ_GROUP_NR)
1201                         info->max77693->irq_masks_cur[irq_src]
1202                                 = init_data[i].data;
1203         }
1204
1205         if (pdata && pdata->muic_data) {
1206                 struct max77693_muic_platform_data *muic_pdata
1207                                                    = pdata->muic_data;
1208
1209                 /*
1210                  * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
1211                  * h/w path of COMP2/COMN1 on CONTROL1 register.
1212                  */
1213                 if (muic_pdata->path_uart)
1214                         info->path_uart = muic_pdata->path_uart;
1215                 else
1216                         info->path_uart = CONTROL1_SW_UART;
1217
1218                 if (muic_pdata->path_usb)
1219                         info->path_usb = muic_pdata->path_usb;
1220                 else
1221                         info->path_usb = CONTROL1_SW_USB;
1222
1223                 /*
1224                  * Default delay time for detecting cable state
1225                  * after certain time.
1226                  */
1227                 if (muic_pdata->detcable_delay_ms)
1228                         delay_jiffies =
1229                                 msecs_to_jiffies(muic_pdata->detcable_delay_ms);
1230                 else
1231                         delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
1232         } else {
1233                 info->path_usb = CONTROL1_SW_USB;
1234                 info->path_uart = CONTROL1_SW_UART;
1235                 delay_jiffies = msecs_to_jiffies(DELAY_MS_DEFAULT);
1236         }
1237
1238         /* Set initial path for UART */
1239          max77693_muic_set_path(info, info->path_uart, true);
1240
1241         /* Check revision number of MUIC device*/
1242         ret = regmap_read(info->max77693->regmap_muic,
1243                         MAX77693_MUIC_REG_ID, &id);
1244         if (ret < 0) {
1245                 dev_err(&pdev->dev, "failed to read revision number\n");
1246                 return ret;
1247         }
1248         dev_info(info->dev, "device ID : 0x%x\n", id);
1249
1250         /* Set ADC debounce time */
1251         max77693_muic_set_debounce_time(info, ADC_DEBOUNCE_TIME_25MS);
1252
1253         /*
1254          * Detect accessory after completing the initialization of platform
1255          *
1256          * - Use delayed workqueue to detect cable state and then
1257          * notify cable state to notifiee/platform through uevent.
1258          * After completing the booting of platform, the extcon provider
1259          * driver should notify cable state to upper layer.
1260          */
1261         INIT_DELAYED_WORK(&info->wq_detcable, max77693_muic_detect_cable_wq);
1262         queue_delayed_work(system_power_efficient_wq, &info->wq_detcable,
1263                         delay_jiffies);
1264
1265         return ret;
1266 }
1267
1268 static int max77693_muic_remove(struct platform_device *pdev)
1269 {
1270         struct max77693_muic_info *info = platform_get_drvdata(pdev);
1271
1272         cancel_work_sync(&info->irq_work);
1273         input_unregister_device(info->dock);
1274
1275         return 0;
1276 }
1277
1278 static struct platform_driver max77693_muic_driver = {
1279         .driver         = {
1280                 .name   = DEV_NAME,
1281         },
1282         .probe          = max77693_muic_probe,
1283         .remove         = max77693_muic_remove,
1284 };
1285
1286 module_platform_driver(max77693_muic_driver);
1287
1288 MODULE_DESCRIPTION("Maxim MAX77693 Extcon driver");
1289 MODULE_AUTHOR("Chanwoo Choi <cw00.choi@samsung.com>");
1290 MODULE_LICENSE("GPL");
1291 MODULE_ALIAS("platform:extcon-max77693");