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