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