aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/extcon/extcon-max77693.c2
-rw-r--r--drivers/extcon/extcon-max8997.c728
-rw-r--r--include/linux/mfd/max8997-private.h64
-rw-r--r--include/linux/mfd/max8997.h25
4 files changed, 567 insertions, 252 deletions
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c
index ad6e9a466855..b70e3815c459 100644
--- a/drivers/extcon/extcon-max77693.c
+++ b/drivers/extcon/extcon-max77693.c
@@ -185,7 +185,7 @@ enum {
185 _EXTCON_CABLE_NUM, 185 _EXTCON_CABLE_NUM,
186}; 186};
187 187
188const char *max77693_extcon_cable[] = { 188static const char *max77693_extcon_cable[] = {
189 [EXTCON_CABLE_USB] = "USB", 189 [EXTCON_CABLE_USB] = "USB",
190 [EXTCON_CABLE_USB_HOST] = "USB-Host", 190 [EXTCON_CABLE_USB_HOST] = "USB-Host",
191 [EXTCON_CABLE_TA] = "TA", 191 [EXTCON_CABLE_TA] = "TA",
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
index df9358e30814..e636d950ad6c 100644
--- a/drivers/extcon/extcon-max8997.c
+++ b/drivers/extcon/extcon-max8997.c
@@ -29,51 +29,14 @@
29#include <linux/irqdomain.h> 29#include <linux/irqdomain.h>
30 30
31#define DEV_NAME "max8997-muic" 31#define DEV_NAME "max8997-muic"
32#define DELAY_MS_DEFAULT 20000 /* unit: millisecond */
32 33
33/* MAX8997-MUIC STATUS1 register */ 34enum max8997_muic_adc_debounce_time {
34#define STATUS1_ADC_SHIFT 0 35 ADC_DEBOUNCE_TIME_0_5MS = 0, /* 0.5ms */
35#define STATUS1_ADCLOW_SHIFT 5 36 ADC_DEBOUNCE_TIME_10MS, /* 10ms */
36#define STATUS1_ADCERR_SHIFT 6 37 ADC_DEBOUNCE_TIME_25MS, /* 25ms */
37#define STATUS1_ADC_MASK (0x1f << STATUS1_ADC_SHIFT) 38 ADC_DEBOUNCE_TIME_38_62MS, /* 38.62ms */
38#define STATUS1_ADCLOW_MASK (0x1 << STATUS1_ADCLOW_SHIFT) 39};
39#define STATUS1_ADCERR_MASK (0x1 << STATUS1_ADCERR_SHIFT)
40
41/* MAX8997-MUIC STATUS2 register */
42#define STATUS2_CHGTYP_SHIFT 0
43#define STATUS2_CHGDETRUN_SHIFT 3
44#define STATUS2_DCDTMR_SHIFT 4
45#define STATUS2_DBCHG_SHIFT 5
46#define STATUS2_VBVOLT_SHIFT 6
47#define STATUS2_CHGTYP_MASK (0x7 << STATUS2_CHGTYP_SHIFT)
48#define STATUS2_CHGDETRUN_MASK (0x1 << STATUS2_CHGDETRUN_SHIFT)
49#define STATUS2_DCDTMR_MASK (0x1 << STATUS2_DCDTMR_SHIFT)
50#define STATUS2_DBCHG_MASK (0x1 << STATUS2_DBCHG_SHIFT)
51#define STATUS2_VBVOLT_MASK (0x1 << STATUS2_VBVOLT_SHIFT)
52
53/* MAX8997-MUIC STATUS3 register */
54#define STATUS3_OVP_SHIFT 2
55#define STATUS3_OVP_MASK (0x1 << STATUS3_OVP_SHIFT)
56
57/* MAX8997-MUIC CONTROL1 register */
58#define COMN1SW_SHIFT 0
59#define COMP2SW_SHIFT 3
60#define COMN1SW_MASK (0x7 << COMN1SW_SHIFT)
61#define COMP2SW_MASK (0x7 << COMP2SW_SHIFT)
62#define SW_MASK (COMP2SW_MASK | COMN1SW_MASK)
63
64#define MAX8997_SW_USB ((1 << COMP2SW_SHIFT) | (1 << COMN1SW_SHIFT))
65#define MAX8997_SW_AUDIO ((2 << COMP2SW_SHIFT) | (2 << COMN1SW_SHIFT))
66#define MAX8997_SW_UART ((3 << COMP2SW_SHIFT) | (3 << COMN1SW_SHIFT))
67#define MAX8997_SW_OPEN ((0 << COMP2SW_SHIFT) | (0 << COMN1SW_SHIFT))
68
69#define MAX8997_ADC_GROUND 0x00
70#define MAX8997_ADC_MHL 0x01
71#define MAX8997_ADC_JIG_USB_1 0x18
72#define MAX8997_ADC_JIG_USB_2 0x19
73#define MAX8997_ADC_DESKDOCK 0x1a
74#define MAX8997_ADC_JIG_UART 0x1c
75#define MAX8997_ADC_CARDOCK 0x1d
76#define MAX8997_ADC_OPEN 0x1f
77 40
78struct max8997_muic_irq { 41struct max8997_muic_irq {
79 unsigned int irq; 42 unsigned int irq;
@@ -82,61 +45,303 @@ struct max8997_muic_irq {
82}; 45};
83 46
84static struct max8997_muic_irq muic_irqs[] = { 47static struct max8997_muic_irq muic_irqs[] = {
85 { MAX8997_MUICIRQ_ADCError, "muic-ADC_error" }, 48 { MAX8997_MUICIRQ_ADCError, "muic-ADCERROR" },
86 { MAX8997_MUICIRQ_ADCLow, "muic-ADC_low" }, 49 { MAX8997_MUICIRQ_ADCLow, "muic-ADCLOW" },
87 { MAX8997_MUICIRQ_ADC, "muic-ADC" }, 50 { MAX8997_MUICIRQ_ADC, "muic-ADC" },
88 { MAX8997_MUICIRQ_VBVolt, "muic-VB_voltage" }, 51 { MAX8997_MUICIRQ_VBVolt, "muic-VBVOLT" },
89 { MAX8997_MUICIRQ_DBChg, "muic-DB_charger" }, 52 { MAX8997_MUICIRQ_DBChg, "muic-DBCHG" },
90 { MAX8997_MUICIRQ_DCDTmr, "muic-DCD_timer" }, 53 { MAX8997_MUICIRQ_DCDTmr, "muic-DCDTMR" },
91 { MAX8997_MUICIRQ_ChgDetRun, "muic-CDR_status" }, 54 { MAX8997_MUICIRQ_ChgDetRun, "muic-CHGDETRUN" },
92 { MAX8997_MUICIRQ_ChgTyp, "muic-charger_type" }, 55 { MAX8997_MUICIRQ_ChgTyp, "muic-CHGTYP" },
93 { MAX8997_MUICIRQ_OVP, "muic-over_voltage" }, 56 { MAX8997_MUICIRQ_OVP, "muic-OVP" },
57};
58
59/* Define supported cable type */
60enum max8997_muic_acc_type {
61 MAX8997_MUIC_ADC_GROUND = 0x0,
62 MAX8997_MUIC_ADC_MHL, /* MHL*/
63 MAX8997_MUIC_ADC_REMOTE_S1_BUTTON,
64 MAX8997_MUIC_ADC_REMOTE_S2_BUTTON,
65 MAX8997_MUIC_ADC_REMOTE_S3_BUTTON,
66 MAX8997_MUIC_ADC_REMOTE_S4_BUTTON,
67 MAX8997_MUIC_ADC_REMOTE_S5_BUTTON,
68 MAX8997_MUIC_ADC_REMOTE_S6_BUTTON,
69 MAX8997_MUIC_ADC_REMOTE_S7_BUTTON,
70 MAX8997_MUIC_ADC_REMOTE_S8_BUTTON,
71 MAX8997_MUIC_ADC_REMOTE_S9_BUTTON,
72 MAX8997_MUIC_ADC_REMOTE_S10_BUTTON,
73 MAX8997_MUIC_ADC_REMOTE_S11_BUTTON,
74 MAX8997_MUIC_ADC_REMOTE_S12_BUTTON,
75 MAX8997_MUIC_ADC_RESERVED_ACC_1,
76 MAX8997_MUIC_ADC_RESERVED_ACC_2,
77 MAX8997_MUIC_ADC_RESERVED_ACC_3,
78 MAX8997_MUIC_ADC_RESERVED_ACC_4,
79 MAX8997_MUIC_ADC_RESERVED_ACC_5,
80 MAX8997_MUIC_ADC_CEA936_AUDIO,
81 MAX8997_MUIC_ADC_PHONE_POWERED_DEV,
82 MAX8997_MUIC_ADC_TTY_CONVERTER,
83 MAX8997_MUIC_ADC_UART_CABLE,
84 MAX8997_MUIC_ADC_CEA936A_TYPE1_CHG,
85 MAX8997_MUIC_ADC_FACTORY_MODE_USB_OFF, /* JIG-USB-OFF */
86 MAX8997_MUIC_ADC_FACTORY_MODE_USB_ON, /* JIG-USB-ON */
87 MAX8997_MUIC_ADC_AV_CABLE_NOLOAD, /* DESKDOCK */
88 MAX8997_MUIC_ADC_CEA936A_TYPE2_CHG,
89 MAX8997_MUIC_ADC_FACTORY_MODE_UART_OFF, /* JIG-UART */
90 MAX8997_MUIC_ADC_FACTORY_MODE_UART_ON, /* CARDOCK */
91 MAX8997_MUIC_ADC_AUDIO_MODE_REMOTE,
92 MAX8997_MUIC_ADC_OPEN, /* OPEN */
93};
94
95enum max8997_muic_cable_group {
96 MAX8997_CABLE_GROUP_ADC = 0,
97 MAX8997_CABLE_GROUP_ADC_GND,
98 MAX8997_CABLE_GROUP_CHG,
99 MAX8997_CABLE_GROUP_VBVOLT,
100};
101
102enum max8997_muic_usb_type {
103 MAX8997_USB_HOST,
104 MAX8997_USB_DEVICE,
105};
106
107enum max8997_muic_charger_type {
108 MAX8997_CHARGER_TYPE_NONE = 0,
109 MAX8997_CHARGER_TYPE_USB,
110 MAX8997_CHARGER_TYPE_DOWNSTREAM_PORT,
111 MAX8997_CHARGER_TYPE_DEDICATED_CHG,
112 MAX8997_CHARGER_TYPE_500MA,
113 MAX8997_CHARGER_TYPE_1A,
114 MAX8997_CHARGER_TYPE_DEAD_BATTERY = 7,
94}; 115};
95 116
96struct max8997_muic_info { 117struct max8997_muic_info {
97 struct device *dev; 118 struct device *dev;
98 struct i2c_client *muic; 119 struct i2c_client *muic;
99 struct max8997_muic_platform_data *muic_pdata; 120 struct extcon_dev *edev;
121 int prev_cable_type;
122 int prev_chg_type;
123 u8 status[2];
100 124
101 int irq; 125 int irq;
102 struct work_struct irq_work; 126 struct work_struct irq_work;
127 struct mutex mutex;
103 128
129 struct max8997_muic_platform_data *muic_pdata;
104 enum max8997_muic_charger_type pre_charger_type; 130 enum max8997_muic_charger_type pre_charger_type;
105 int pre_adc;
106 131
107 struct mutex mutex; 132 /*
133 * Use delayed workqueue to detect cable state and then
134 * notify cable state to notifiee/platform through uevent.
135 * After completing the booting of platform, the extcon provider
136 * driver should notify cable state to upper layer.
137 */
138 struct delayed_work wq_detcable;
139
140 /*
141 * Default usb/uart path whether UART/USB or AUX_UART/AUX_USB
142 * h/w path of COMP2/COMN1 on CONTROL1 register.