xref: /linux/drivers/extcon/extcon-max14526.c (revision 68a052239fc4b351e961f698b824f7654a346091)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include <linux/device.h>
4 #include <linux/devm-helpers.h>
5 #include <linux/delay.h>
6 #include <linux/err.h>
7 #include <linux/extcon-provider.h>
8 #include <linux/i2c.h>
9 #include <linux/mod_devicetable.h>
10 #include <linux/interrupt.h>
11 #include <linux/module.h>
12 #include <linux/pm.h>
13 #include <linux/regmap.h>
14 
15 /* I2C addresses of MUIC internal registers */
16 #define MAX14526_DEVICE_ID	0x00
17 #define MAX14526_ID		0x02
18 
19 /* CONTROL_1 register masks */
20 #define MAX14526_CONTROL_1	0x01
21 #define   ID_2P2		BIT(6)
22 #define   ID_620		BIT(5)
23 #define   ID_200		BIT(4)
24 #define   VLDO			BIT(3)
25 #define   SEMREN		BIT(2)
26 #define   ADC_EN		BIT(1)
27 #define   CP_EN			BIT(0)
28 
29 /* CONTROL_2 register masks */
30 #define MAX14526_CONTROL_2	0x02
31 #define   INTPOL		BIT(7)
32 #define   INT_EN		BIT(6)
33 #define   MIC_LP		BIT(5)
34 #define   CP_AUD		BIT(4)
35 #define   CHG_TYPE		BIT(1)
36 #define   USB_DET_DIS		BIT(0)
37 
38 /* SW_CONTROL register masks */
39 #define MAX14526_SW_CONTROL	0x03
40 #define   SW_DATA		0x00
41 #define   SW_UART		0x01
42 #define   SW_AUDIO		0x02
43 #define   SW_OPEN		0x07
44 
45 /* INT_STATUS register masks */
46 #define MAX14526_INT_STAT	0x04
47 #define   CHGDET		BIT(7)
48 #define   MR_COMP		BIT(6)
49 #define   SENDEND		BIT(5)
50 #define   V_VBUS		BIT(4)
51 
52 /* STATUS register masks */
53 #define MAX14526_STATUS		0x05
54 #define   CPORT			BIT(7)
55 #define   CHPORT		BIT(6)
56 #define   C1COMP		BIT(0)
57 
58 enum max14526_idno_resistance {
59 	MAX14526_GND,
60 	MAX14526_24KOHM,
61 	MAX14526_56KOHM,
62 	MAX14526_100KOHM,
63 	MAX14526_130KOHM,
64 	MAX14526_180KOHM,
65 	MAX14526_240KOHM,
66 	MAX14526_330KOHM,
67 	MAX14526_430KOHM,
68 	MAX14526_620KOHM,
69 	MAX14526_910KOHM,
70 	MAX14526_OPEN
71 };
72 
73 enum max14526_field_idx {
74 	VENDOR_ID, CHIP_REV,		/* DEVID */
75 	DM, DP,				/* SW_CONTROL */
76 	MAX14526_N_REGMAP_FIELDS
77 };
78 
79 static const struct reg_field max14526_reg_field[MAX14526_N_REGMAP_FIELDS] = {
80 	[VENDOR_ID] = REG_FIELD(MAX14526_DEVICE_ID,  4, 7),
81 	[CHIP_REV]  = REG_FIELD(MAX14526_DEVICE_ID,  0, 3),
82 	[DM]        = REG_FIELD(MAX14526_SW_CONTROL, 0, 2),
83 	[DP]        = REG_FIELD(MAX14526_SW_CONTROL, 3, 5),
84 };
85 
86 struct max14526_data {
87 	struct i2c_client *client;
88 	struct extcon_dev *edev;
89 
90 	struct regmap *regmap;
91 	struct regmap_field *rfield[MAX14526_N_REGMAP_FIELDS];
92 
93 	int last_state;
94 	int cable;
95 };
96 
97 enum max14526_muic_modes {
98 	MAX14526_OTG     = MAX14526_GND, /* no power */
99 	MAX14526_MHL     = MAX14526_56KOHM, /* no power */
100 	MAX14526_OTG_Y   = MAX14526_GND | V_VBUS,
101 	MAX14526_MHL_CHG = MAX14526_GND | V_VBUS | CHGDET,
102 	MAX14526_NONE    = MAX14526_OPEN,
103 	MAX14526_USB     = MAX14526_OPEN | V_VBUS,
104 	MAX14526_CHG     = MAX14526_OPEN | V_VBUS | CHGDET,
105 };
106 
107 static const unsigned int max14526_extcon_cable[] = {
108 	EXTCON_USB,
109 	EXTCON_USB_HOST,
110 	EXTCON_CHG_USB_FAST,
111 	EXTCON_DISP_MHL,
112 	EXTCON_NONE,
113 };
114 
115 static int max14526_ap_usb_mode(struct max14526_data *priv)
116 {
117 	struct device *dev = &priv->client->dev;
118 	int ret;
119 
120 	/* Enable USB Path */
121 	ret = regmap_field_write(priv->rfield[DM], SW_DATA);
122 	if (ret)
123 		return ret;
124 
125 	ret = regmap_field_write(priv->rfield[DP], SW_DATA);
126 	if (ret)
127 		return ret;
128 
129 	/* Enable 200K, Charger Pump and ADC */
130 	ret = regmap_write(priv->regmap, MAX14526_CONTROL_1,
131 			   ID_200 | ADC_EN | CP_EN);
132 	if (ret)
133 		return ret;
134 
135 	dev_dbg(dev, "AP USB mode set\n");
136 
137 	return 0;
138 }
139 
140 static irqreturn_t max14526_interrupt(int irq, void *dev_id)
141 {
142 	struct max14526_data *priv = dev_id;
143 	struct device *dev = &priv->client->dev;
144 	int state, ret;
145 
146 	/*
147 	 * Upon an MUIC IRQ (MUIC_INT_N falls), wait at least 70ms
148 	 * before reading INT_STAT and STATUS. After the reads,
149 	 * MUIC_INT_N returns to high (but the INT_STAT and STATUS
150 	 * contents will be held).
151 	 */
152 	msleep(100);
153 
154 	ret = regmap_read(priv->regmap, MAX14526_INT_STAT, &state);
155 	if (ret)
156 		dev_err(dev, "failed to read MUIC state %d\n", ret);
157 
158 	if (state == priv->last_state)
159 		return IRQ_HANDLED;
160 
161 	/* Detach previous device */
162 	extcon_set_state_sync(priv->edev, priv->cable, false);
163 
164 	switch (state) {
165 	case MAX14526_USB:
166 		priv->cable = EXTCON_USB;
167 		break;
168 
169 	case MAX14526_CHG:
170 		priv->cable = EXTCON_CHG_USB_FAST;
171 		break;
172 
173 	case MAX14526_OTG:
174 	case MAX14526_OTG_Y:
175 		priv->cable = EXTCON_USB_HOST;
176 		break;
177 
178 	case MAX14526_MHL:
179 	case MAX14526_MHL_CHG:
180 		priv->cable = EXTCON_DISP_MHL;
181 		break;
182 
183 	case MAX14526_NONE:
184 	default:
185 		priv->cable = EXTCON_NONE;
186 		break;
187 	}
188 
189 	extcon_set_state_sync(priv->edev, priv->cable, true);
190 
191 	priv->last_state = state;
192 
193 	return IRQ_HANDLED;
194 }
195 
196 static const struct regmap_config max14526_regmap_config = {
197 	.reg_bits = 8,
198 	.val_bits = 8,
199 	.max_register = MAX14526_STATUS,
200 };
201 
202 static int max14526_probe(struct i2c_client *client)
203 {
204 	struct device *dev = &client->dev;
205 	struct max14526_data *priv;
206 	int ret, dev_id, rev, i;
207 
208 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
209 	if (!priv)
210 		return -ENOMEM;
211 
212 	priv->client = client;
213 	i2c_set_clientdata(client, priv);
214 
215 	priv->regmap = devm_regmap_init_i2c(client, &max14526_regmap_config);
216 	if (IS_ERR(priv->regmap))
217 		return dev_err_probe(dev, PTR_ERR(priv->regmap), "cannot allocate regmap\n");
218 
219 	for (i = 0; i < MAX14526_N_REGMAP_FIELDS; i++) {
220 		priv->rfield[i] = devm_regmap_field_alloc(dev, priv->regmap,
221 							  max14526_reg_field[i]);
222 		if (IS_ERR(priv->rfield[i]))
223 			return dev_err_probe(dev, PTR_ERR(priv->rfield[i]),
224 					     "cannot allocate regmap field\n");
225 	}
226 
227 	/* Detect if MUIC version is supported */
228 	ret = regmap_field_read(priv->rfield[VENDOR_ID], &dev_id);
229 	if (ret)
230 		return dev_err_probe(dev, ret, "failed to read MUIC ID\n");
231 
232 	regmap_field_read(priv->rfield[CHIP_REV], &rev);
233 
234 	if (dev_id == MAX14526_ID)
235 		dev_info(dev, "detected MAX14526 MUIC with id 0x%x, rev 0x%x\n", dev_id, rev);
236 	else
237 		dev_err_probe(dev, -EINVAL, "MUIC vendor id 0x%X is not recognized\n", dev_id);
238 
239 	priv->edev = devm_extcon_dev_allocate(dev, max14526_extcon_cable);
240 	if (IS_ERR(priv->edev))
241 		return dev_err_probe(dev, (IS_ERR(priv->edev)),
242 				     "failed to allocate extcon device\n");
243 
244 	ret = devm_extcon_dev_register(dev, priv->edev);
245 	if (ret < 0)
246 		return dev_err_probe(dev, ret, "failed to register extcon device\n");
247 
248 	ret = max14526_ap_usb_mode(priv);
249 	if (ret < 0)
250 		return dev_err_probe(dev, ret, "failed to set AP USB mode\n");
251 
252 	regmap_write_bits(priv->regmap, MAX14526_CONTROL_2, INT_EN, INT_EN);
253 	regmap_write_bits(priv->regmap, MAX14526_CONTROL_2, USB_DET_DIS, (u32)~USB_DET_DIS);
254 
255 	ret = devm_request_threaded_irq(dev, client->irq, NULL, &max14526_interrupt,
256 					IRQF_ONESHOT | IRQF_SHARED, client->name, priv);
257 	if (ret)
258 		return dev_err_probe(dev, ret, "failed to register IRQ\n");
259 
260 	irq_wake_thread(client->irq, priv);
261 
262 	return 0;
263 }
264 
265 static int max14526_resume(struct device *dev)
266 {
267 	struct i2c_client *client = to_i2c_client(dev);
268 	struct max14526_data *priv = i2c_get_clientdata(client);
269 
270 	irq_wake_thread(client->irq, priv);
271 
272 	return 0;
273 }
274 
275 static DEFINE_SIMPLE_DEV_PM_OPS(max14526_pm_ops, NULL, max14526_resume);
276 
277 static const struct of_device_id max14526_match[] = {
278 	{ .compatible = "maxim,max14526" },
279 	{ /* sentinel */ }
280 };
281 MODULE_DEVICE_TABLE(of, max14526_match);
282 
283 static const struct i2c_device_id max14526_id[] = {
284 	{ "max14526" },
285 	{ }
286 };
287 MODULE_DEVICE_TABLE(i2c, max14526_id);
288 
289 static struct i2c_driver max14526_driver = {
290 	.driver = {
291 		.name = "max14526",
292 		.of_match_table = max14526_match,
293 		.pm = &max14526_pm_ops,
294 	},
295 	.probe = max14526_probe,
296 	.id_table = max14526_id,
297 };
298 module_i2c_driver(max14526_driver);
299 
300 MODULE_AUTHOR("Svyatoslav Ryhel <clamor95@gmail.com>");
301 MODULE_DESCRIPTION("MAX14526 extcon driver to support MUIC");
302 MODULE_LICENSE("GPL");
303