18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/i2c.h>
21 #include <linux/slab.h>
31 #define DEV_NAME "max77693-muic"
34 #define STATUS1_ADC_SHIFT (0)
35 #define STATUS1_ADCLOW_SHIFT (5)
36 #define STATUS1_ADCERR_SHIFT (6)
37 #define STATUS1_ADC1K_SHIFT (7)
38 #define STATUS1_ADC_MASK (0x1f << STATUS1_ADC_SHIFT)
39 #define STATUS1_ADCLOW_MASK (0x1 << STATUS1_ADCLOW_SHIFT)
40 #define STATUS1_ADCERR_MASK (0x1 << STATUS1_ADCERR_SHIFT)
41 #define STATUS1_ADC1K_MASK (0x1 << STATUS1_ADC1K_SHIFT)
43 #define STATUS2_CHGTYP_SHIFT (0)
44 #define STATUS2_CHGDETRUN_SHIFT (3)
45 #define STATUS2_DCDTMR_SHIFT (4)
46 #define STATUS2_DXOVP_SHIFT (5)
47 #define STATUS2_VBVOLT_SHIFT (6)
48 #define STATUS2_VIDRM_SHIFT (7)
49 #define STATUS2_CHGTYP_MASK (0x7 << STATUS2_CHGTYP_SHIFT)
50 #define STATUS2_CHGDETRUN_MASK (0x1 << STATUS2_CHGDETRUN_SHIFT)
51 #define STATUS2_DCDTMR_MASK (0x1 << STATUS2_DCDTMR_SHIFT)
52 #define STATUS2_DXOVP_MASK (0x1 << STATUS2_DXOVP_SHIFT)
53 #define STATUS2_VBVOLT_MASK (0x1 << STATUS2_VBVOLT_SHIFT)
54 #define STATUS2_VIDRM_MASK (0x1 << STATUS2_VIDRM_SHIFT)
56 #define STATUS3_OVP_SHIFT (2)
57 #define STATUS3_OVP_MASK (0x1 << STATUS3_OVP_SHIFT)
60 #define CDETCTRL1_CHGDETEN_SHIFT (0)
61 #define CDETCTRL1_CHGTYPMAN_SHIFT (1)
62 #define CDETCTRL1_DCDEN_SHIFT (2)
63 #define CDETCTRL1_DCD2SCT_SHIFT (3)
64 #define CDETCTRL1_CDDELAY_SHIFT (4)
65 #define CDETCTRL1_DCDCPL_SHIFT (5)
66 #define CDETCTRL1_CDPDET_SHIFT (7)
67 #define CDETCTRL1_CHGDETEN_MASK (0x1 << CDETCTRL1_CHGDETEN_SHIFT)
68 #define CDETCTRL1_CHGTYPMAN_MASK (0x1 << CDETCTRL1_CHGTYPMAN_SHIFT)
69 #define CDETCTRL1_DCDEN_MASK (0x1 << CDETCTRL1_DCDEN_SHIFT)
70 #define CDETCTRL1_DCD2SCT_MASK (0x1 << CDETCTRL1_DCD2SCT_SHIFT)
71 #define CDETCTRL1_CDDELAY_MASK (0x1 << CDETCTRL1_CDDELAY_SHIFT)
72 #define CDETCTRL1_DCDCPL_MASK (0x1 << CDETCTRL1_DCDCPL_SHIFT)
73 #define CDETCTRL1_CDPDET_MASK (0x1 << CDETCTRL1_CDPDET_SHIFT)
75 #define CDETCTRL2_VIDRMEN_SHIFT (1)
76 #define CDETCTRL2_DXOVPEN_SHIFT (3)
77 #define CDETCTRL2_VIDRMEN_MASK (0x1 << CDETCTRL2_VIDRMEN_SHIFT)
78 #define CDETCTRL2_DXOVPEN_MASK (0x1 << CDETCTRL2_DXOVPEN_SHIFT)
81 #define COMN1SW_SHIFT (0)
82 #define COMP2SW_SHIFT (3)
83 #define COMN1SW_MASK (0x7 << COMN1SW_SHIFT)
84 #define COMP2SW_MASK (0x7 << COMP2SW_SHIFT)
85 #define COMP_SW_MASK (COMP2SW_MASK | COMN1SW_MASK)
86 #define CONTROL1_SW_USB ((1 << COMP2SW_SHIFT) \
87 | (1 << COMN1SW_SHIFT))
88 #define CONTROL1_SW_AUDIO ((2 << COMP2SW_SHIFT) \
89 | (2 << COMN1SW_SHIFT))
90 #define CONTROL1_SW_UART ((3 << COMP2SW_SHIFT) \
91 | (3 << COMN1SW_SHIFT))
92 #define CONTROL1_SW_OPEN ((0 << COMP2SW_SHIFT) \
93 | (0 << COMN1SW_SHIFT))
95 #define CONTROL2_LOWPWR_SHIFT (0)
96 #define CONTROL2_ADCEN_SHIFT (1)
97 #define CONTROL2_CPEN_SHIFT (2)
98 #define CONTROL2_SFOUTASRT_SHIFT (3)
99 #define CONTROL2_SFOUTORD_SHIFT (4)
100 #define CONTROL2_ACCDET_SHIFT (5)
101 #define CONTROL2_USBCPINT_SHIFT (6)
102 #define CONTROL2_RCPS_SHIFT (7)
103 #define CONTROL2_LOWPWR_MASK (0x1 << CONTROL2_LOWPWR_SHIFT)
104 #define CONTROL2_ADCEN_MASK (0x1 << CONTROL2_ADCEN_SHIFT)
105 #define CONTROL2_CPEN_MASK (0x1 << CONTROL2_CPEN_SHIFT)
106 #define CONTROL2_SFOUTASRT_MASK (0x1 << CONTROL2_SFOUTASRT_SHIFT)
107 #define CONTROL2_SFOUTORD_MASK (0x1 << CONTROL2_SFOUTORD_SHIFT)
108 #define CONTROL2_ACCDET_MASK (0x1 << CONTROL2_ACCDET_SHIFT)
109 #define CONTROL2_USBCPINT_MASK (0x1 << CONTROL2_USBCPINT_SHIFT)
110 #define CONTROL2_RCPS_MASK (0x1 << CONTROL2_RCPS_SHIFT)
112 #define CONTROL3_JIGSET_SHIFT (0)
113 #define CONTROL3_BTLDSET_SHIFT (2)
114 #define CONTROL3_ADCDBSET_SHIFT (4)
115 #define CONTROL3_JIGSET_MASK (0x3 << CONTROL3_JIGSET_SHIFT)
116 #define CONTROL3_BTLDSET_MASK (0x3 << CONTROL3_BTLDSET_SHIFT)
117 #define CONTROL3_ADCDBSET_MASK (0x3 << CONTROL3_ADCDBSET_SHIFT)
228 [3] =
"Fast-charger",
229 [4] =
"Slow-charger",
230 [5] =
"Charge-downstream",
232 [7] =
"Audio-video-load",
233 [8] =
"Audio-video-noload",
254 dev_err(info->
dev,
"failed to set ADC debounce time\n");
257 dev_err(info->
dev,
"invalid ADC debounce time\n");
266 u8 val,
bool attached)
279 dev_err(info->
dev,
"failed to update MUIC register\n");
292 dev_err(info->
dev,
"failed to update MUIC register\n");
297 "CONTROL1 : 0x%02x, CONTROL2 : 0x%02x, state : %s\n",
298 ctrl1, ctrl2, attached ?
"attached" :
"detached");
308 int adc, adc1k, adclow;
323 type = ((0x1 << 8) | (adclow << 1) | adc1k);
346 "Audio-video-load", attached);
353 dev_err(info->
dev,
"failed to detect %s accessory\n",
354 attached ?
"attached" :
"detached");
355 dev_err(info->
dev,
"- adc:0x%x, adclow:0x%x, adc1k:0x%x\n",
366 int curr_adc,
bool attached)
380 "external connector is %s (adc:0x%02x, prev_adc:0x%x)\n",
381 attached ?
"attached" :
"detached", curr_adc, info->
prev_adc);
386 max77693_muic_adc_ground_handler(info, attached);
410 "Audio-video-noload", attached);
441 "accessory is %s but it isn't used (adc:0x%x)\n",
442 attached ?
"attached" :
"detached", adc);
446 "failed to detect %s accessory (adc:0x%x)\n",
447 attached ?
"attached" :
"detached", adc);
457 int curr_chg_type,
bool attached)
466 chg_type = curr_chg_type;
471 "external connector is %s(chg_type:0x%x, prev_chg_type:0x%x)\n",
472 attached ?
"attached" :
"detached",
484 "Charge-downstream", attached);
499 "failed to detect %s accessory (chg_type:0x%x)\n",
500 attached ?
"attached" :
"detached", chg_type);
513 int curr_adc, curr_chg_type;
516 bool attached =
true;
524 if (info->
irq == muic_irqs[i].
virq)
525 irq_type = muic_irqs[
i].
irq;
530 dev_err(info->
dev,
"failed to read MUIC register\n");
549 ret = max77693_muic_adc_handler(info, curr_adc, attached);
566 ret = max77693_muic_chg_handler(info, curr_chg_type, attached);
576 dev_err(info->
dev,
"muic interrupt: irq %d occurred\n",
582 dev_err(info->
dev,
"failed to handle MUIC interrupt\n");
599 static struct regmap_config max77693_muic_regmap_config = {
615 dev_err(info->
dev,
"failed to read MUIC register\n");
625 "external connector is attached (adc:0x%02x)\n", adc);
627 ret = max77693_muic_adc_handler(info, adc,
true);
629 dev_err(info->
dev,
"failed to detect accessory\n");
638 "external connector is attached (chg_type:0x%x)\n",
641 max77693_muic_chg_handler(info, chg_type,
true);
643 dev_err(info->
dev,
"failed to detect charger accessory\n");
662 dev_err(&pdev->
dev,
"failed to allocate memory\n");
669 dev_dbg(&pdev->
dev,
"allocate register map\n");
673 &max77693_muic_regmap_config);
674 if (IS_ERR(info->
max77693->regmap_muic)) {
675 ret = PTR_ERR(info->
max77693->regmap_muic);
677 "failed to allocate register map: %d\n", ret);
681 platform_set_drvdata(pdev, info);
697 max77693_muic_irq_handler,
701 "failed: irq request (IRQ: %d,"
705 for (i = i - 1; i >= 0; i--)
714 dev_err(&pdev->
dev,
"failed to allocate memory for extcon\n");
722 dev_err(&pdev->
dev,
"failed to register extcon device\n");
747 info->
max77693->irq_masks_cur[irq_src]
755 dev_err(&pdev->
dev,
"failed to read revision number\n");
764 max77693_muic_detect_accessory(info);
797 .probe = max77693_muic_probe,