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