xref: /linux/drivers/phy/motorola/phy-cpcap-usb.c (revision 42422993cf28d456778ee9168d73758ec037cd51)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Motorola CPCAP PMIC USB PHY driver
4  * Copyright (C) 2017 Tony Lindgren <tony@atomide.com>
5  *
6  * Some parts based on earlier Motorola Linux kernel tree code in
7  * board-mapphone-usb.c and cpcap-usb-det.c:
8  * Copyright (C) 2007 - 2011 Motorola, Inc.
9  */
10 
11 #include <linux/atomic.h>
12 #include <linux/clk.h>
13 #include <linux/delay.h>
14 #include <linux/err.h>
15 #include <linux/io.h>
16 #include <linux/module.h>
17 #include <linux/of.h>
18 #include <linux/iio/consumer.h>
19 #include <linux/pinctrl/consumer.h>
20 #include <linux/platform_device.h>
21 #include <linux/regmap.h>
22 #include <linux/slab.h>
23 
24 #include <linux/gpio/consumer.h>
25 #include <linux/mfd/motorola-cpcap.h>
26 #include <linux/phy/omap_usb.h>
27 #include <linux/phy/phy.h>
28 #include <linux/regulator/consumer.h>
29 #include <linux/usb/musb.h>
30 
31 /* CPCAP_REG_USBC1 register bits */
32 #define CPCAP_BIT_IDPULSE		BIT(15)
33 #define CPCAP_BIT_ID100KPU		BIT(14)
34 #define CPCAP_BIT_IDPUCNTRL		BIT(13)
35 #define CPCAP_BIT_IDPU			BIT(12)
36 #define CPCAP_BIT_IDPD			BIT(11)
37 #define CPCAP_BIT_VBUSCHRGTMR3		BIT(10)
38 #define CPCAP_BIT_VBUSCHRGTMR2		BIT(9)
39 #define CPCAP_BIT_VBUSCHRGTMR1		BIT(8)
40 #define CPCAP_BIT_VBUSCHRGTMR0		BIT(7)
41 #define CPCAP_BIT_VBUSPU		BIT(6)
42 #define CPCAP_BIT_VBUSPD		BIT(5)
43 #define CPCAP_BIT_DMPD			BIT(4)
44 #define CPCAP_BIT_DPPD			BIT(3)
45 #define CPCAP_BIT_DM1K5PU		BIT(2)
46 #define CPCAP_BIT_DP1K5PU		BIT(1)
47 #define CPCAP_BIT_DP150KPU		BIT(0)
48 
49 /* CPCAP_REG_USBC2 register bits */
50 #define CPCAP_BIT_ZHSDRV1		BIT(15)
51 #define CPCAP_BIT_ZHSDRV0		BIT(14)
52 #define CPCAP_BIT_DPLLCLKREQ		BIT(13)
53 #define CPCAP_BIT_SE0CONN		BIT(12)
54 #define CPCAP_BIT_UARTTXTRI		BIT(11)
55 #define CPCAP_BIT_UARTSWAP		BIT(10)
56 #define CPCAP_BIT_UARTMUX1		BIT(9)
57 #define CPCAP_BIT_UARTMUX0		BIT(8)
58 #define CPCAP_BIT_ULPISTPLOW		BIT(7)
59 #define CPCAP_BIT_TXENPOL		BIT(6)
60 #define CPCAP_BIT_USBXCVREN		BIT(5)
61 #define CPCAP_BIT_USBCNTRL		BIT(4)
62 #define CPCAP_BIT_USBSUSPEND		BIT(3)
63 #define CPCAP_BIT_EMUMODE2		BIT(2)
64 #define CPCAP_BIT_EMUMODE1		BIT(1)
65 #define CPCAP_BIT_EMUMODE0		BIT(0)
66 
67 /* CPCAP_REG_USBC3 register bits */
68 #define CPCAP_BIT_SPARE_898_15		BIT(15)
69 #define CPCAP_BIT_IHSTX03		BIT(14)
70 #define CPCAP_BIT_IHSTX02		BIT(13)
71 #define CPCAP_BIT_IHSTX01		BIT(12)
72 #define CPCAP_BIT_IHSTX0		BIT(11)
73 #define CPCAP_BIT_IDPU_SPI		BIT(10)
74 #define CPCAP_BIT_UNUSED_898_9		BIT(9)
75 #define CPCAP_BIT_VBUSSTBY_EN		BIT(8)
76 #define CPCAP_BIT_VBUSEN_SPI		BIT(7)
77 #define CPCAP_BIT_VBUSPU_SPI		BIT(6)
78 #define CPCAP_BIT_VBUSPD_SPI		BIT(5)
79 #define CPCAP_BIT_DMPD_SPI		BIT(4)
80 #define CPCAP_BIT_DPPD_SPI		BIT(3)
81 #define CPCAP_BIT_SUSPEND_SPI		BIT(2)
82 #define CPCAP_BIT_PU_SPI		BIT(1)
83 #define CPCAP_BIT_ULPI_SPI_SEL		BIT(0)
84 
85 struct cpcap_usb_ints_state {
86 	bool id_ground;
87 	bool id_float;
88 	bool chrg_det;
89 	bool rvrs_chrg;
90 	bool vbusov;
91 
92 	bool chrg_se1b;
93 	bool se0conn;
94 	bool rvrs_mode;
95 	bool chrgcurr1;
96 	bool vbusvld;
97 	bool sessvld;
98 	bool sessend;
99 	bool se1;
100 
101 	bool battdetb;
102 	bool dm;
103 	bool dp;
104 };
105 
106 enum cpcap_gpio_mode {
107 	CPCAP_DM_DP,
108 	CPCAP_MDM_RX_TX,
109 	CPCAP_UNKNOWN_DISABLED,	/* Seems to disable USB lines */
110 	CPCAP_OTG_DM_DP,
111 };
112 
113 struct cpcap_phy_ddata {
114 	struct regmap *reg;
115 	struct device *dev;
116 	struct usb_phy phy;
117 	struct delayed_work detect_work;
118 	struct pinctrl *pins;
119 	struct pinctrl_state *pins_ulpi;
120 	struct pinctrl_state *pins_utmi;
121 	struct pinctrl_state *pins_uart;
122 	struct gpio_desc *gpio[2];
123 	struct iio_channel *vbus;
124 	struct iio_channel *id;
125 	struct regulator *vusb;
126 	atomic_t active;
127 	unsigned int vbus_provider:1;
128 	unsigned int docked:1;
129 };
130 
131 static bool cpcap_usb_vbus_valid(struct cpcap_phy_ddata *ddata)
132 {
133 	int error, value = 0;
134 
135 	error = iio_read_channel_processed(ddata->vbus, &value);
136 	if (error >= 0)
137 		return value > 3900;
138 
139 	dev_err(ddata->dev, "error reading VBUS: %i\n", error);
140 
141 	return false;
142 }
143 
144 static int cpcap_usb_phy_set_host(struct usb_otg *otg, struct usb_bus *host)
145 {
146 	otg->host = host;
147 	if (!host)
148 		otg->state = OTG_STATE_UNDEFINED;
149 
150 	return 0;
151 }
152 
153 static int cpcap_usb_phy_set_peripheral(struct usb_otg *otg,
154 					struct usb_gadget *gadget)
155 {
156 	otg->gadget = gadget;
157 	if (!gadget)
158 		otg->state = OTG_STATE_UNDEFINED;
159 
160 	return 0;
161 }
162 
163 static const struct phy_ops ops = {
164 	.owner		= THIS_MODULE,
165 };
166 
167 static int cpcap_phy_get_ints_state(struct cpcap_phy_ddata *ddata,
168 				    struct cpcap_usb_ints_state *s)
169 {
170 	int val, error;
171 
172 	error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val);
173 	if (error)
174 		return error;
175 
176 	s->id_ground = val & BIT(15);
177 	s->id_float = val & BIT(14);
178 	s->vbusov = val & BIT(11);
179 
180 	error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val);
181 	if (error)
182 		return error;
183 
184 	s->vbusvld = val & BIT(3);
185 	s->sessvld = val & BIT(2);
186 	s->sessend = val & BIT(1);
187 	s->se1 = val & BIT(0);
188 
189 	error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val);
190 	if (error)
191 		return error;
192 
193 	s->dm = val & BIT(1);
194 	s->dp = val & BIT(0);
195 
196 	return 0;
197 }
198 
199 static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata);
200 static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata);
201 
202 static void cpcap_usb_try_musb_mailbox(struct cpcap_phy_ddata *ddata,
203 				       enum musb_vbus_id_status status)
204 {
205 	int error;
206 
207 	error = musb_mailbox(status);
208 	if (!error)
209 		return;
210 
211 	dev_dbg(ddata->dev, "%s: musb_mailbox failed: %i\n",
212 		__func__, error);
213 }
214 
215 static void cpcap_usb_detect(struct work_struct *work)
216 {
217 	struct cpcap_phy_ddata *ddata;
218 	struct cpcap_usb_ints_state s;
219 	bool vbus = false;
220 	int error;
221 
222 	ddata = container_of(work, struct cpcap_phy_ddata, detect_work.work);
223 
224 	error = cpcap_phy_get_ints_state(ddata, &s);
225 	if (error)
226 		return;
227 
228 	vbus = cpcap_usb_vbus_valid(ddata);
229 
230 	/* We need to kick the VBUS as USB A-host */
231 	if (s.id_ground && ddata->vbus_provider) {
232 		dev_dbg(ddata->dev, "still in USB A-host mode, kicking VBUS\n");
233 
234 		cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND);
235 
236 		error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
237 					   CPCAP_BIT_VBUSSTBY_EN |
238 					   CPCAP_BIT_VBUSEN_SPI,
239 					   CPCAP_BIT_VBUSEN_SPI);
240 		if (error)
241 			goto out_err;
242 
243 		return;
244 	}
245 
246 	if (vbus && s.id_ground && ddata->docked) {
247 		dev_dbg(ddata->dev, "still docked as A-host, signal ID down\n");
248 
249 		cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND);
250 
251 		return;
252 	}
253 
254 	/* No VBUS needed with docks */
255 	if (vbus && s.id_ground && !ddata->vbus_provider) {
256 		dev_dbg(ddata->dev, "connected to a dock\n");
257 
258 		ddata->docked = true;
259 
260 		error = cpcap_usb_set_usb_mode(ddata);
261 		if (error)
262 			goto out_err;
263 
264 		cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND);
265 
266 		/*
267 		 * Force check state again after musb has reoriented,
268 		 * otherwise devices won't enumerate after loading PHY
269 		 * driver.
270 		 */
271 		schedule_delayed_work(&ddata->detect_work,
272 				      msecs_to_jiffies(1000));
273 
274 		return;
275 	}
276 
277 	if (s.id_ground && !ddata->docked) {
278 		dev_dbg(ddata->dev, "id ground, USB host mode\n");
279 
280 		ddata->vbus_provider = true;
281 
282 		error = cpcap_usb_set_usb_mode(ddata);
283 		if (error)
284 			goto out_err;
285 
286 		cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND);
287 
288 		error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
289 					   CPCAP_BIT_VBUSSTBY_EN |
290 					   CPCAP_BIT_VBUSEN_SPI,
291 					   CPCAP_BIT_VBUSEN_SPI);
292 		if (error)
293 			goto out_err;
294 
295 		return;
296 	}
297 
298 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
299 				   CPCAP_BIT_VBUSSTBY_EN |
300 				   CPCAP_BIT_VBUSEN_SPI, 0);
301 	if (error)
302 		goto out_err;
303 
304 	vbus = cpcap_usb_vbus_valid(ddata);
305 
306 	/* Otherwise assume we're connected to a USB host */
307 	if (vbus) {
308 		dev_dbg(ddata->dev, "connected to USB host\n");
309 		error = cpcap_usb_set_usb_mode(ddata);
310 		if (error)
311 			goto out_err;
312 		cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_VALID);
313 
314 		return;
315 	}
316 
317 	ddata->vbus_provider = false;
318 	ddata->docked = false;
319 	cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF);
320 
321 	/* Default to debug UART mode */
322 	error = cpcap_usb_set_uart_mode(ddata);
323 	if (error)
324 		goto out_err;
325 
326 	dev_dbg(ddata->dev, "set UART mode\n");
327 
328 	return;
329 
330 out_err:
331 	dev_err(ddata->dev, "error setting cable state: %i\n", error);
332 }
333 
334 static irqreturn_t cpcap_phy_irq_thread(int irq, void *data)
335 {
336 	struct cpcap_phy_ddata *ddata = data;
337 
338 	if (!atomic_read(&ddata->active))
339 		return IRQ_NONE;
340 
341 	schedule_delayed_work(&ddata->detect_work, msecs_to_jiffies(1));
342 
343 	return IRQ_HANDLED;
344 }
345 
346 static int cpcap_usb_init_irq(struct platform_device *pdev,
347 			      struct cpcap_phy_ddata *ddata,
348 			      const char *name)
349 {
350 	int irq, error;
351 
352 	irq = platform_get_irq_byname(pdev, name);
353 	if (irq < 0)
354 		return -ENODEV;
355 
356 	error = devm_request_threaded_irq(ddata->dev, irq, NULL,
357 					  cpcap_phy_irq_thread,
358 					  IRQF_SHARED |
359 					  IRQF_ONESHOT,
360 					  name, ddata);
361 	if (error) {
362 		dev_err(ddata->dev, "could not get irq %s: %i\n",
363 			name, error);
364 
365 		return error;
366 	}
367 
368 	return 0;
369 }
370 
371 static const char * const cpcap_phy_irqs[] = {
372 	/* REG_INT_0 */
373 	"id_ground", "id_float",
374 
375 	/* REG_INT1 */
376 	"se0conn", "vbusvld", "sessvld", "sessend", "se1",
377 
378 	/* REG_INT_3 */
379 	"dm", "dp",
380 };
381 
382 static int cpcap_usb_init_interrupts(struct platform_device *pdev,
383 				     struct cpcap_phy_ddata *ddata)
384 {
385 	int i, error;
386 
387 	for (i = 0; i < ARRAY_SIZE(cpcap_phy_irqs); i++) {
388 		error = cpcap_usb_init_irq(pdev, ddata, cpcap_phy_irqs[i]);
389 		if (error)
390 			return error;
391 	}
392 
393 	return 0;
394 }
395 
396 /*
397  * Optional pins and modes. At least Motorola mapphone devices
398  * are using two GPIOs and dynamic pinctrl to multiplex PHY pins
399  * to UART, ULPI or UTMI mode.
400  */
401 
402 static int cpcap_usb_gpio_set_mode(struct cpcap_phy_ddata *ddata,
403 				   enum cpcap_gpio_mode mode)
404 {
405 	if (!ddata->gpio[0] || !ddata->gpio[1])
406 		return 0;
407 
408 	gpiod_set_value(ddata->gpio[0], mode & 1);
409 	gpiod_set_value(ddata->gpio[1], mode >> 1);
410 
411 	return 0;
412 }
413 
414 static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata)
415 {
416 	int error;
417 
418 	/* Disable lines to prevent glitches from waking up mdm6600 */
419 	error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
420 	if (error)
421 		goto out_err;
422 
423 	if (ddata->pins_uart) {
424 		error = pinctrl_select_state(ddata->pins, ddata->pins_uart);
425 		if (error)
426 			goto out_err;
427 	}
428 
429 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC1,
430 				   CPCAP_BIT_VBUSPD,
431 				   CPCAP_BIT_VBUSPD);
432 	if (error)
433 		goto out_err;
434 
435 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC2,
436 				   0xffff, CPCAP_BIT_UARTMUX0 |
437 				   CPCAP_BIT_EMUMODE0);
438 	if (error)
439 		goto out_err;
440 
441 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 0x7fff,
442 				   CPCAP_BIT_IDPU_SPI);
443 	if (error)
444 		goto out_err;
445 
446 	/* Enable UART mode */
447 	error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP);
448 	if (error)
449 		goto out_err;
450 
451 	return 0;
452 
453 out_err:
454 	dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
455 
456 	return error;
457 }
458 
459 static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata)
460 {
461 	int error;
462 
463 	/* Disable lines to prevent glitches from waking up mdm6600 */
464 	error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
465 	if (error)
466 		return error;
467 
468 	if (ddata->pins_utmi) {
469 		error = pinctrl_select_state(ddata->pins, ddata->pins_utmi);
470 		if (error) {
471 			dev_err(ddata->dev, "could not set usb mode: %i\n",
472 				error);
473 
474 			return error;
475 		}
476 	}
477 
478 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC1,
479 				   CPCAP_BIT_VBUSPD, 0);
480 	if (error)
481 		goto out_err;
482 
483 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3,
484 				   CPCAP_BIT_PU_SPI |
485 				   CPCAP_BIT_DMPD_SPI |
486 				   CPCAP_BIT_DPPD_SPI |
487 				   CPCAP_BIT_SUSPEND_SPI |
488 				   CPCAP_BIT_ULPI_SPI_SEL, 0);
489 	if (error)
490 		goto out_err;
491 
492 	error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC2,
493 				   CPCAP_BIT_USBXCVREN,
494 				   CPCAP_BIT_USBXCVREN);
495 	if (error)
496 		goto out_err;
497 
498 	/* Enable USB mode */
499 	error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP);
500 	if (error)
501 		goto out_err;
502 
503 	return 0;
504 
505 out_err:
506 	dev_err(ddata->dev, "%s failed with %i\n", __func__, error);
507 
508 	return error;
509 }
510 
511 static int cpcap_usb_init_optional_pins(struct cpcap_phy_ddata *ddata)
512 {
513 	ddata->pins = devm_pinctrl_get(ddata->dev);
514 	if (IS_ERR(ddata->pins)) {
515 		dev_info(ddata->dev, "default pins not configured: %ld\n",
516 			 PTR_ERR(ddata->pins));
517 		ddata->pins = NULL;
518 
519 		return 0;
520 	}
521 
522 	ddata->pins_ulpi = pinctrl_lookup_state(ddata->pins, "ulpi");
523 	if (IS_ERR(ddata->pins_ulpi)) {
524 		dev_info(ddata->dev, "ulpi pins not configured\n");
525 		ddata->pins_ulpi = NULL;
526 	}
527 
528 	ddata->pins_utmi = pinctrl_lookup_state(ddata->pins, "utmi");
529 	if (IS_ERR(ddata->pins_utmi)) {
530 		dev_info(ddata->dev, "utmi pins not configured\n");
531 		ddata->pins_utmi = NULL;
532 	}
533 
534 	ddata->pins_uart = pinctrl_lookup_state(ddata->pins, "uart");
535 	if (IS_ERR(ddata->pins_uart)) {
536 		dev_info(ddata->dev, "uart pins not configured\n");
537 		ddata->pins_uart = NULL;
538 	}
539 
540 	if (ddata->pins_uart)
541 		return pinctrl_select_state(ddata->pins, ddata->pins_uart);
542 
543 	return 0;
544 }
545 
546 static void cpcap_usb_init_optional_gpios(struct cpcap_phy_ddata *ddata)
547 {
548 	int i;
549 
550 	for (i = 0; i < 2; i++) {
551 		ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode",
552 						      i, GPIOD_OUT_HIGH);
553 		if (IS_ERR(ddata->gpio[i])) {
554 			dev_info(ddata->dev, "no mode change GPIO%i: %li\n",
555 				 i, PTR_ERR(ddata->gpio[i]));
556 			ddata->gpio[i] = NULL;
557 		}
558 	}
559 }
560 
561 static int cpcap_usb_init_iio(struct cpcap_phy_ddata *ddata)
562 {
563 	enum iio_chan_type type;
564 	int error;
565 
566 	ddata->vbus = devm_iio_channel_get(ddata->dev, "vbus");
567 	if (IS_ERR(ddata->vbus)) {
568 		error = PTR_ERR(ddata->vbus);
569 		goto out_err;
570 	}
571 
572 	if (!ddata->vbus->indio_dev) {
573 		error = -ENXIO;
574 		goto out_err;
575 	}
576 
577 	error = iio_get_channel_type(ddata->vbus, &type);
578 	if (error < 0)
579 		goto out_err;
580 
581 	if (type != IIO_VOLTAGE) {
582 		error = -EINVAL;
583 		goto out_err;
584 	}
585 
586 	return 0;
587 
588 out_err:
589 	dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n",
590 		error);
591 
592 	return error;
593 }
594 
595 #ifdef CONFIG_OF
596 static const struct of_device_id cpcap_usb_phy_id_table[] = {
597 	{
598 		.compatible = "motorola,cpcap-usb-phy",
599 	},
600 	{
601 		.compatible = "motorola,mapphone-cpcap-usb-phy",
602 	},
603 	{},
604 };
605 MODULE_DEVICE_TABLE(of, cpcap_usb_phy_id_table);
606 #endif
607 
608 static int cpcap_usb_phy_probe(struct platform_device *pdev)
609 {
610 	struct cpcap_phy_ddata *ddata;
611 	struct phy *generic_phy;
612 	struct phy_provider *phy_provider;
613 	struct usb_otg *otg;
614 	int error;
615 
616 	ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL);
617 	if (!ddata)
618 		return -ENOMEM;
619 
620 	ddata->reg = dev_get_regmap(pdev->dev.parent, NULL);
621 	if (!ddata->reg)
622 		return -ENODEV;
623 
624 	otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL);
625 	if (!otg)
626 		return -ENOMEM;
627 
628 	ddata->dev = &pdev->dev;
629 	ddata->phy.dev = ddata->dev;
630 	ddata->phy.label = "cpcap_usb_phy";
631 	ddata->phy.otg = otg;
632 	ddata->phy.type = USB_PHY_TYPE_USB2;
633 	otg->set_host = cpcap_usb_phy_set_host;
634 	otg->set_peripheral = cpcap_usb_phy_set_peripheral;
635 	otg->usb_phy = &ddata->phy;
636 	INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect);
637 	platform_set_drvdata(pdev, ddata);
638 
639 	ddata->vusb = devm_regulator_get(&pdev->dev, "vusb");
640 	if (IS_ERR(ddata->vusb))
641 		return PTR_ERR(ddata->vusb);
642 
643 	error = regulator_enable(ddata->vusb);
644 	if (error)
645 		return error;
646 
647 	generic_phy = devm_phy_create(ddata->dev, NULL, &ops);
648 	if (IS_ERR(generic_phy)) {
649 		error = PTR_ERR(generic_phy);
650 		goto out_reg_disable;
651 	}
652 
653 	phy_set_drvdata(generic_phy, ddata);
654 
655 	phy_provider = devm_of_phy_provider_register(ddata->dev,
656 						     of_phy_simple_xlate);
657 	if (IS_ERR(phy_provider)) {
658 		error = PTR_ERR(phy_provider);
659 		goto out_reg_disable;
660 	}
661 
662 	error = cpcap_usb_init_optional_pins(ddata);
663 	if (error)
664 		goto out_reg_disable;
665 
666 	cpcap_usb_init_optional_gpios(ddata);
667 
668 	error = cpcap_usb_init_iio(ddata);
669 	if (error)
670 		goto out_reg_disable;
671 
672 	error = cpcap_usb_init_interrupts(pdev, ddata);
673 	if (error)
674 		goto out_reg_disable;
675 
676 	usb_add_phy_dev(&ddata->phy);
677 	atomic_set(&ddata->active, 1);
678 	schedule_delayed_work(&ddata->detect_work, msecs_to_jiffies(1));
679 
680 	return 0;
681 
682 out_reg_disable:
683 	regulator_disable(ddata->vusb);
684 
685 	return error;
686 }
687 
688 static void cpcap_usb_phy_remove(struct platform_device *pdev)
689 {
690 	struct cpcap_phy_ddata *ddata = platform_get_drvdata(pdev);
691 	int error;
692 
693 	atomic_set(&ddata->active, 0);
694 	error = cpcap_usb_set_uart_mode(ddata);
695 	if (error)
696 		dev_err(ddata->dev, "could not set UART mode\n");
697 
698 	cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF);
699 
700 	usb_remove_phy(&ddata->phy);
701 	cancel_delayed_work_sync(&ddata->detect_work);
702 	regulator_disable(ddata->vusb);
703 }
704 
705 static struct platform_driver cpcap_usb_phy_driver = {
706 	.probe		= cpcap_usb_phy_probe,
707 	.remove_new	= cpcap_usb_phy_remove,
708 	.driver		= {
709 		.name	= "cpcap-usb-phy",
710 		.of_match_table = of_match_ptr(cpcap_usb_phy_id_table),
711 	},
712 };
713 
714 module_platform_driver(cpcap_usb_phy_driver);
715 
716 MODULE_ALIAS("platform:cpcap_usb");
717 MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
718 MODULE_DESCRIPTION("CPCAP usb phy driver");
719 MODULE_LICENSE("GPL v2");
720