Linux 6.9-rc1
[linux-2.6-microblaze.git] / drivers / phy / motorola / phy-cpcap-usb.c
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");