f52418fe3fd47dcd7f6414f77662fce713ea5910
[linux-2.6-block.git] / drivers / usb / renesas_usbhs / common.c
1 // SPDX-License-Identifier: GPL-1.0+
2 /*
3  * Renesas USB driver
4  *
5  * Copyright (C) 2011 Renesas Solutions Corp.
6  * Copyright (C) 2019 Renesas Electronics Corporation
7  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
8  */
9 #include <linux/clk.h>
10 #include <linux/err.h>
11 #include <linux/gpio/consumer.h>
12 #include <linux/io.h>
13 #include <linux/module.h>
14 #include <linux/of.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/reset.h>
17 #include <linux/slab.h>
18 #include <linux/sysfs.h>
19 #include "common.h"
20 #include "rcar2.h"
21 #include "rcar3.h"
22 #include "rza.h"
23
24 /*
25  *              image of renesas_usbhs
26  *
27  * ex) gadget case
28
29  * mod.c
30  * mod_gadget.c
31  * mod_host.c           pipe.c          fifo.c
32  *
33  *                      +-------+       +-----------+
34  *                      | pipe0 |------>| fifo pio  |
35  * +------------+       +-------+       +-----------+
36  * | mod_gadget |=====> | pipe1 |--+
37  * +------------+       +-------+  |    +-----------+
38  *                      | pipe2 |  |  +-| fifo dma0 |
39  * +------------+       +-------+  |  | +-----------+
40  * | mod_host   |       | pipe3 |<-|--+
41  * +------------+       +-------+  |    +-----------+
42  *                      | ....  |  +--->| fifo dma1 |
43  *                      | ....  |       +-----------+
44  */
45
46 /*
47  * platform call back
48  *
49  * renesas usb support platform callback function.
50  * Below macro call it.
51  * if platform doesn't have callback, it return 0 (no error)
52  */
53 #define usbhs_platform_call(priv, func, args...)\
54         (!(priv) ? -ENODEV :                    \
55          !((priv)->pfunc->func) ? 0 :           \
56          (priv)->pfunc->func(args))
57
58 /*
59  *              common functions
60  */
61 u16 usbhs_read(struct usbhs_priv *priv, u32 reg)
62 {
63         return ioread16(priv->base + reg);
64 }
65
66 void usbhs_write(struct usbhs_priv *priv, u32 reg, u16 data)
67 {
68         iowrite16(data, priv->base + reg);
69 }
70
71 void usbhs_bset(struct usbhs_priv *priv, u32 reg, u16 mask, u16 data)
72 {
73         u16 val = usbhs_read(priv, reg);
74
75         val &= ~mask;
76         val |= data & mask;
77
78         usbhs_write(priv, reg, val);
79 }
80
81 struct usbhs_priv *usbhs_pdev_to_priv(struct platform_device *pdev)
82 {
83         return dev_get_drvdata(&pdev->dev);
84 }
85
86 int usbhs_get_id_as_gadget(struct platform_device *pdev)
87 {
88         return USBHS_GADGET;
89 }
90
91 /*
92  *              syscfg functions
93  */
94 static void usbhs_sys_clock_ctrl(struct usbhs_priv *priv, int enable)
95 {
96         usbhs_bset(priv, SYSCFG, SCKE, enable ? SCKE : 0);
97 }
98
99 void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable)
100 {
101         u16 mask = DCFM | DRPD | DPRPU | HSE | USBE;
102         u16 val  = DCFM | DRPD | HSE | USBE;
103
104         /*
105          * if enable
106          *
107          * - select Host mode
108          * - D+ Line/D- Line Pull-down
109          */
110         usbhs_bset(priv, SYSCFG, mask, enable ? val : 0);
111 }
112
113 void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable)
114 {
115         u16 mask = DCFM | DRPD | DPRPU | HSE | USBE;
116         u16 val  = HSE | USBE;
117
118         /* CNEN bit is required for function operation */
119         if (usbhs_get_dparam(priv, has_cnen)) {
120                 mask |= CNEN;
121                 val  |= CNEN;
122         }
123
124         /*
125          * if enable
126          *
127          * - select Function mode
128          * - D+ Line Pull-up is disabled
129          *      When D+ Line Pull-up is enabled,
130          *      calling usbhs_sys_function_pullup(,1)
131          */
132         usbhs_bset(priv, SYSCFG, mask, enable ? val : 0);
133 }
134
135 void usbhs_sys_function_pullup(struct usbhs_priv *priv, int enable)
136 {
137         usbhs_bset(priv, SYSCFG, DPRPU, enable ? DPRPU : 0);
138 }
139
140 void usbhs_sys_set_test_mode(struct usbhs_priv *priv, u16 mode)
141 {
142         usbhs_write(priv, TESTMODE, mode);
143 }
144
145 /*
146  *              frame functions
147  */
148 int usbhs_frame_get_num(struct usbhs_priv *priv)
149 {
150         return usbhs_read(priv, FRMNUM) & FRNM_MASK;
151 }
152
153 /*
154  *              usb request functions
155  */
156 void usbhs_usbreq_get_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req)
157 {
158         u16 val;
159
160         val = usbhs_read(priv, USBREQ);
161         req->bRequest           = (val >> 8) & 0xFF;
162         req->bRequestType       = (val >> 0) & 0xFF;
163
164         req->wValue     = cpu_to_le16(usbhs_read(priv, USBVAL));
165         req->wIndex     = cpu_to_le16(usbhs_read(priv, USBINDX));
166         req->wLength    = cpu_to_le16(usbhs_read(priv, USBLENG));
167 }
168
169 void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req)
170 {
171         usbhs_write(priv, USBREQ,  (req->bRequest << 8) | req->bRequestType);
172         usbhs_write(priv, USBVAL,  le16_to_cpu(req->wValue));
173         usbhs_write(priv, USBINDX, le16_to_cpu(req->wIndex));
174         usbhs_write(priv, USBLENG, le16_to_cpu(req->wLength));
175
176         usbhs_bset(priv, DCPCTR, SUREQ, SUREQ);
177 }
178
179 /*
180  *              bus/vbus functions
181  */
182 void usbhs_bus_send_sof_enable(struct usbhs_priv *priv)
183 {
184         u16 status = usbhs_read(priv, DVSTCTR) & (USBRST | UACT);
185
186         if (status != USBRST) {
187                 struct device *dev = usbhs_priv_to_dev(priv);
188                 dev_err(dev, "usbhs should be reset\n");
189         }
190
191         usbhs_bset(priv, DVSTCTR, (USBRST | UACT), UACT);
192 }
193
194 void usbhs_bus_send_reset(struct usbhs_priv *priv)
195 {
196         usbhs_bset(priv, DVSTCTR, (USBRST | UACT), USBRST);
197 }
198
199 int usbhs_bus_get_speed(struct usbhs_priv *priv)
200 {
201         u16 dvstctr = usbhs_read(priv, DVSTCTR);
202
203         switch (RHST & dvstctr) {
204         case RHST_LOW_SPEED:
205                 return USB_SPEED_LOW;
206         case RHST_FULL_SPEED:
207                 return USB_SPEED_FULL;
208         case RHST_HIGH_SPEED:
209                 return USB_SPEED_HIGH;
210         }
211
212         return USB_SPEED_UNKNOWN;
213 }
214
215 int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable)
216 {
217         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
218
219         return usbhs_platform_call(priv, set_vbus, pdev, enable);
220 }
221
222 static void usbhsc_bus_init(struct usbhs_priv *priv)
223 {
224         usbhs_write(priv, DVSTCTR, 0);
225
226         usbhs_vbus_ctrl(priv, 0);
227 }
228
229 /*
230  *              device configuration
231  */
232 int usbhs_set_device_config(struct usbhs_priv *priv, int devnum,
233                            u16 upphub, u16 hubport, u16 speed)
234 {
235         struct device *dev = usbhs_priv_to_dev(priv);
236         u16 usbspd = 0;
237         u32 reg = DEVADD0 + (2 * devnum);
238
239         if (devnum > 10) {
240                 dev_err(dev, "cannot set speed to unknown device %d\n", devnum);
241                 return -EIO;
242         }
243
244         if (upphub > 0xA) {
245                 dev_err(dev, "unsupported hub number %d\n", upphub);
246                 return -EIO;
247         }
248
249         switch (speed) {
250         case USB_SPEED_LOW:
251                 usbspd = USBSPD_SPEED_LOW;
252                 break;
253         case USB_SPEED_FULL:
254                 usbspd = USBSPD_SPEED_FULL;
255                 break;
256         case USB_SPEED_HIGH:
257                 usbspd = USBSPD_SPEED_HIGH;
258                 break;
259         default:
260                 dev_err(dev, "unsupported speed %d\n", speed);
261                 return -EIO;
262         }
263
264         usbhs_write(priv, reg,  UPPHUB(upphub)  |
265                                 HUBPORT(hubport)|
266                                 USBSPD(usbspd));
267
268         return 0;
269 }
270
271 /*
272  *              interrupt functions
273  */
274 void usbhs_xxxsts_clear(struct usbhs_priv *priv, u16 sts_reg, u16 bit)
275 {
276         u16 pipe_mask = (u16)GENMASK(usbhs_get_dparam(priv, pipe_size), 0);
277
278         usbhs_write(priv, sts_reg, ~(1 << bit) & pipe_mask);
279 }
280
281 /*
282  *              local functions
283  */
284 static void usbhsc_set_buswait(struct usbhs_priv *priv)
285 {
286         int wait = usbhs_get_dparam(priv, buswait_bwait);
287
288         /* set bus wait if platform have */
289         if (wait)
290                 usbhs_bset(priv, BUSWAIT, 0x000F, wait);
291 }
292
293 static bool usbhsc_is_multi_clks(struct usbhs_priv *priv)
294 {
295         return priv->dparam.multi_clks;
296 }
297
298 static int usbhsc_clk_get(struct device *dev, struct usbhs_priv *priv)
299 {
300         if (!usbhsc_is_multi_clks(priv))
301                 return 0;
302
303         /* The first clock should exist */
304         priv->clks[0] = of_clk_get(dev_of_node(dev), 0);
305         if (IS_ERR(priv->clks[0]))
306                 return PTR_ERR(priv->clks[0]);
307
308         /*
309          * To backward compatibility with old DT, this driver checks the return
310          * value if it's -ENOENT or not.
311          */
312         priv->clks[1] = of_clk_get(dev_of_node(dev), 1);
313         if (PTR_ERR(priv->clks[1]) == -ENOENT)
314                 priv->clks[1] = NULL;
315         else if (IS_ERR(priv->clks[1])) {
316                 clk_put(priv->clks[0]);
317                 return PTR_ERR(priv->clks[1]);
318         }
319
320         return 0;
321 }
322
323 static void usbhsc_clk_put(struct usbhs_priv *priv)
324 {
325         int i;
326
327         if (!usbhsc_is_multi_clks(priv))
328                 return;
329
330         for (i = 0; i < ARRAY_SIZE(priv->clks); i++)
331                 clk_put(priv->clks[i]);
332 }
333
334 static int usbhsc_clk_prepare_enable(struct usbhs_priv *priv)
335 {
336         int i, ret;
337
338         if (!usbhsc_is_multi_clks(priv))
339                 return 0;
340
341         for (i = 0; i < ARRAY_SIZE(priv->clks); i++) {
342                 ret = clk_prepare_enable(priv->clks[i]);
343                 if (ret) {
344                         while (--i >= 0)
345                                 clk_disable_unprepare(priv->clks[i]);
346                         return ret;
347                 }
348         }
349
350         return ret;
351 }
352
353 static void usbhsc_clk_disable_unprepare(struct usbhs_priv *priv)
354 {
355         int i;
356
357         if (!usbhsc_is_multi_clks(priv))
358                 return;
359
360         for (i = 0; i < ARRAY_SIZE(priv->clks); i++)
361                 clk_disable_unprepare(priv->clks[i]);
362 }
363
364 /*
365  *              platform default param
366  */
367
368 /* commonly used on old SH-Mobile and RZ/G2L family SoCs */
369 static struct renesas_usbhs_driver_pipe_config usbhsc_default_pipe[] = {
370         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL, 64, 0x00, false),
371         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC, 1024, 0x08, true),
372         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC, 1024, 0x28, true),
373         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x48, true),
374         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x58, true),
375         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x68, true),
376         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x04, false),
377         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x05, false),
378         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x06, false),
379         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x07, false),
380 };
381
382 /* commonly used on newer SH-Mobile and R-Car SoCs */
383 static struct renesas_usbhs_driver_pipe_config usbhsc_new_pipe[] = {
384         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL, 64, 0x00, false),
385         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC, 1024, 0x08, true),
386         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC, 1024, 0x28, true),
387         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x48, true),
388         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x58, true),
389         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x68, true),
390         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x04, false),
391         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x05, false),
392         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT, 64, 0x06, false),
393         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x78, true),
394         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x88, true),
395         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0x98, true),
396         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0xa8, true),
397         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0xb8, true),
398         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0xc8, true),
399         RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK, 512, 0xd8, true),
400 };
401
402 /*
403  *              power control
404  */
405 static void usbhsc_power_ctrl(struct usbhs_priv *priv, int enable)
406 {
407         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
408         struct device *dev = usbhs_priv_to_dev(priv);
409
410         if (enable) {
411                 /* enable PM */
412                 pm_runtime_get_sync(dev);
413
414                 /* enable clks */
415                 if (usbhsc_clk_prepare_enable(priv))
416                         return;
417
418                 /* enable platform power */
419                 usbhs_platform_call(priv, power_ctrl, pdev, priv->base, enable);
420
421                 /* USB on */
422                 usbhs_sys_clock_ctrl(priv, enable);
423         } else {
424                 /* USB off */
425                 usbhs_sys_clock_ctrl(priv, enable);
426
427                 /* disable platform power */
428                 usbhs_platform_call(priv, power_ctrl, pdev, priv->base, enable);
429
430                 /* disable clks */
431                 usbhsc_clk_disable_unprepare(priv);
432
433                 /* disable PM */
434                 pm_runtime_put_sync(dev);
435         }
436 }
437
438 /*
439  *              hotplug
440  */
441 static void usbhsc_hotplug(struct usbhs_priv *priv)
442 {
443         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
444         struct usbhs_mod *mod = usbhs_mod_get_current(priv);
445         int id;
446         int enable;
447         int cable;
448         int ret;
449
450         /*
451          * get vbus status from platform
452          */
453         enable = usbhs_mod_info_call(priv, get_vbus, pdev);
454
455         /*
456          * get id from platform
457          */
458         id = usbhs_platform_call(priv, get_id, pdev);
459
460         if (enable && !mod) {
461                 if (priv->edev) {
462                         cable = extcon_get_state(priv->edev, EXTCON_USB_HOST);
463                         if ((cable > 0 && id != USBHS_HOST) ||
464                             (!cable && id != USBHS_GADGET)) {
465                                 dev_info(&pdev->dev,
466                                          "USB cable plugged in doesn't match the selected role!\n");
467                                 return;
468                         }
469                 }
470
471                 ret = usbhs_mod_change(priv, id);
472                 if (ret < 0)
473                         return;
474
475                 dev_dbg(&pdev->dev, "%s enable\n", __func__);
476
477                 /* power on */
478                 if (usbhs_get_dparam(priv, runtime_pwctrl))
479                         usbhsc_power_ctrl(priv, enable);
480
481                 /* bus init */
482                 usbhsc_set_buswait(priv);
483                 usbhsc_bus_init(priv);
484
485                 /* module start */
486                 usbhs_mod_call(priv, start, priv);
487
488         } else if (!enable && mod) {
489                 dev_dbg(&pdev->dev, "%s disable\n", __func__);
490
491                 /* module stop */
492                 usbhs_mod_call(priv, stop, priv);
493
494                 /* bus init */
495                 usbhsc_bus_init(priv);
496
497                 /* power off */
498                 if (usbhs_get_dparam(priv, runtime_pwctrl))
499                         usbhsc_power_ctrl(priv, enable);
500
501                 usbhs_mod_change(priv, -1);
502
503                 /* reset phy for next connection */
504                 usbhs_platform_call(priv, phy_reset, pdev);
505         }
506 }
507
508 /*
509  *              notify hotplug
510  */
511 static void usbhsc_notify_hotplug(struct work_struct *work)
512 {
513         struct usbhs_priv *priv = container_of(work,
514                                                struct usbhs_priv,
515                                                notify_hotplug_work.work);
516         usbhsc_hotplug(priv);
517 }
518
519 int usbhsc_schedule_notify_hotplug(struct platform_device *pdev)
520 {
521         struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
522         int delay = usbhs_get_dparam(priv, detection_delay);
523
524         /*
525          * This functions will be called in interrupt.
526          * To make sure safety context,
527          * use workqueue for usbhs_notify_hotplug
528          */
529         schedule_delayed_work(&priv->notify_hotplug_work,
530                               msecs_to_jiffies(delay));
531         return 0;
532 }
533
534 /*
535  *              platform functions
536  */
537 static const struct of_device_id usbhs_of_match[] = {
538         {
539                 .compatible = "renesas,usbhs-r8a774c0",
540                 .data = &usbhs_rcar_gen3_with_pll_plat_info,
541         },
542         {
543                 .compatible = "renesas,usbhs-r8a7790",
544                 .data = &usbhs_rcar_gen2_plat_info,
545         },
546         {
547                 .compatible = "renesas,usbhs-r8a7791",
548                 .data = &usbhs_rcar_gen2_plat_info,
549         },
550         {
551                 .compatible = "renesas,usbhs-r8a7794",
552                 .data = &usbhs_rcar_gen2_plat_info,
553         },
554         {
555                 .compatible = "renesas,usbhs-r8a7795",
556                 .data = &usbhs_rcar_gen3_plat_info,
557         },
558         {
559                 .compatible = "renesas,usbhs-r8a7796",
560                 .data = &usbhs_rcar_gen3_plat_info,
561         },
562         {
563                 .compatible = "renesas,usbhs-r8a77990",
564                 .data = &usbhs_rcar_gen3_with_pll_plat_info,
565         },
566         {
567                 .compatible = "renesas,usbhs-r8a77995",
568                 .data = &usbhs_rcar_gen3_with_pll_plat_info,
569         },
570         {
571                 .compatible = "renesas,usbhs-r9a07g043",
572                 .data = &usbhs_rzg2l_plat_info,
573         },
574         {
575                 .compatible = "renesas,usbhs-r9a07g044",
576                 .data = &usbhs_rzg2l_plat_info,
577         },
578         {
579                 .compatible = "renesas,usbhs-r9a07g054",
580                 .data = &usbhs_rzg2l_plat_info,
581         },
582         {
583                 .compatible = "renesas,rcar-gen2-usbhs",
584                 .data = &usbhs_rcar_gen2_plat_info,
585         },
586         {
587                 .compatible = "renesas,rcar-gen3-usbhs",
588                 .data = &usbhs_rcar_gen3_plat_info,
589         },
590         {
591                 .compatible = "renesas,rza1-usbhs",
592                 .data = &usbhs_rza1_plat_info,
593         },
594         {
595                 .compatible = "renesas,rza2-usbhs",
596                 .data = &usbhs_rza2_plat_info,
597         },
598         {
599                 .compatible = "renesas,rzg2l-usbhs",
600                 .data = &usbhs_rzg2l_plat_info,
601         },
602         { }
603 };
604 MODULE_DEVICE_TABLE(of, usbhs_of_match);
605
606 static int usbhs_probe(struct platform_device *pdev)
607 {
608         const struct renesas_usbhs_platform_info *info;
609         struct usbhs_priv *priv;
610         struct device *dev = &pdev->dev;
611         struct gpio_desc *gpiod;
612         int ret;
613         u32 tmp;
614         int irq;
615
616         info = of_device_get_match_data(dev);
617         if (!info) {
618                 info = dev_get_platdata(dev);
619                 if (!info)
620                         return dev_err_probe(dev, -EINVAL, "no platform info\n");
621         }
622
623         /* platform data */
624         irq = platform_get_irq(pdev, 0);
625         if (irq < 0)
626                 return irq;
627
628         /* usb private data */
629         priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
630         if (!priv)
631                 return -ENOMEM;
632
633         priv->base = devm_platform_ioremap_resource(pdev, 0);
634         if (IS_ERR(priv->base))
635                 return PTR_ERR(priv->base);
636
637         if (of_property_present(dev_of_node(dev), "extcon")) {
638                 priv->edev = extcon_get_edev_by_phandle(dev, 0);
639                 if (IS_ERR(priv->edev))
640                         return PTR_ERR(priv->edev);
641         }
642
643         priv->rsts = devm_reset_control_array_get_optional_shared(dev);
644         if (IS_ERR(priv->rsts))
645                 return PTR_ERR(priv->rsts);
646
647         /*
648          * care platform info
649          */
650
651         priv->dparam = info->driver_param;
652
653         if (!info->platform_callback.get_id) {
654                 dev_err(dev, "no platform callbacks\n");
655                 return -EINVAL;
656         }
657         priv->pfunc = &info->platform_callback;
658
659         /* set default param if platform doesn't have */
660         if (usbhs_get_dparam(priv, has_new_pipe_configs)) {
661                 priv->dparam.pipe_configs = usbhsc_new_pipe;
662                 priv->dparam.pipe_size = ARRAY_SIZE(usbhsc_new_pipe);
663         } else if (!priv->dparam.pipe_configs) {
664                 priv->dparam.pipe_configs = usbhsc_default_pipe;
665                 priv->dparam.pipe_size = ARRAY_SIZE(usbhsc_default_pipe);
666         }
667         if (!priv->dparam.pio_dma_border)
668                 priv->dparam.pio_dma_border = 64; /* 64byte */
669         if (!of_property_read_u32(dev_of_node(dev), "renesas,buswait", &tmp))
670                 priv->dparam.buswait_bwait = tmp;
671         gpiod = devm_gpiod_get_optional(dev, "renesas,enable", GPIOD_IN);
672         if (IS_ERR(gpiod))
673                 return PTR_ERR(gpiod);
674
675         /* FIXME */
676         /* runtime power control ? */
677         if (priv->pfunc->get_vbus)
678                 usbhs_get_dparam(priv, runtime_pwctrl) = 1;
679
680         /*
681          * priv settings
682          */
683         priv->irq = irq;
684         priv->pdev      = pdev;
685         INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug);
686         spin_lock_init(usbhs_priv_to_lock(priv));
687
688         /*
689          * Acquire clocks and enable power management (PM) early in the
690          * probe process, as the driver accesses registers during
691          * initialization. Ensure the device is active before proceeding.
692          */
693         pm_runtime_enable(dev);
694
695         ret = usbhsc_clk_get(dev, priv);
696         if (ret)
697                 goto probe_pm_disable;
698
699         ret = pm_runtime_resume_and_get(dev);
700         if (ret)
701                 goto probe_clk_put;
702
703         ret = usbhsc_clk_prepare_enable(priv);
704         if (ret)
705                 goto probe_pm_put;
706
707         /* call pipe and module init */
708         ret = usbhs_pipe_probe(priv);
709         if (ret < 0)
710                 goto probe_clk_dis_unprepare;
711
712         ret = usbhs_fifo_probe(priv);
713         if (ret < 0)
714                 goto probe_end_pipe_exit;
715
716         ret = usbhs_mod_probe(priv);
717         if (ret < 0)
718                 goto probe_end_fifo_exit;
719
720         /* platform_set_drvdata() should be called after usbhs_mod_probe() */
721         platform_set_drvdata(pdev, priv);
722
723         ret = reset_control_deassert(priv->rsts);
724         if (ret)
725                 goto probe_fail_rst;
726
727         /*
728          * device reset here because
729          * USB device might be used in boot loader.
730          */
731         usbhs_sys_clock_ctrl(priv, 0);
732
733         /* check GPIO determining if USB function should be enabled */
734         if (gpiod) {
735                 ret = !gpiod_get_value(gpiod);
736                 if (ret) {
737                         dev_warn(dev, "USB function not selected (GPIO)\n");
738                         ret = -ENOTSUPP;
739                         goto probe_assert_rest;
740                 }
741         }
742
743         /*
744          * platform call
745          *
746          * USB phy setup might depend on CPU/Board.
747          * If platform has its callback functions,
748          * call it here.
749          */
750         ret = usbhs_platform_call(priv, hardware_init, pdev);
751         if (ret < 0) {
752                 dev_err(dev, "platform init failed.\n");
753                 goto probe_assert_rest;
754         }
755
756         /* reset phy for connection */
757         usbhs_platform_call(priv, phy_reset, pdev);
758
759         /*
760          * Disable the clocks that were enabled earlier in the probe path,
761          * and let the driver handle the clocks beyond this point.
762          */
763         usbhsc_clk_disable_unprepare(priv);
764         pm_runtime_put(dev);
765
766         if (!usbhs_get_dparam(priv, runtime_pwctrl)) {
767                 usbhsc_power_ctrl(priv, 1);
768                 usbhs_mod_autonomy_mode(priv);
769         } else {
770                 usbhs_mod_non_autonomy_mode(priv);
771         }
772
773         /*
774          * manual call notify_hotplug for cold plug
775          */
776         usbhsc_schedule_notify_hotplug(pdev);
777
778         dev_info(dev, "probed\n");
779
780         return ret;
781
782 probe_assert_rest:
783         reset_control_assert(priv->rsts);
784 probe_fail_rst:
785         usbhs_mod_remove(priv);
786 probe_end_fifo_exit:
787         usbhs_fifo_remove(priv);
788 probe_end_pipe_exit:
789         usbhs_pipe_remove(priv);
790 probe_clk_dis_unprepare:
791         usbhsc_clk_disable_unprepare(priv);
792 probe_pm_put:
793         pm_runtime_put(dev);
794 probe_clk_put:
795         usbhsc_clk_put(priv);
796 probe_pm_disable:
797         pm_runtime_disable(dev);
798
799         dev_info(dev, "probe failed (%d)\n", ret);
800
801         return ret;
802 }
803
804 static void usbhs_remove(struct platform_device *pdev)
805 {
806         struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
807
808         dev_dbg(&pdev->dev, "usb remove\n");
809
810         flush_delayed_work(&priv->notify_hotplug_work);
811
812         /* power off */
813         if (!usbhs_get_dparam(priv, runtime_pwctrl))
814                 usbhsc_power_ctrl(priv, 0);
815
816         pm_runtime_disable(&pdev->dev);
817
818         usbhs_platform_call(priv, hardware_exit, pdev);
819         usbhsc_clk_put(priv);
820         reset_control_assert(priv->rsts);
821         usbhs_mod_remove(priv);
822         usbhs_fifo_remove(priv);
823         usbhs_pipe_remove(priv);
824 }
825
826 static __maybe_unused int usbhsc_suspend(struct device *dev)
827 {
828         struct usbhs_priv *priv = dev_get_drvdata(dev);
829         struct usbhs_mod *mod = usbhs_mod_get_current(priv);
830
831         if (mod) {
832                 usbhs_mod_call(priv, stop, priv);
833                 usbhs_mod_change(priv, -1);
834         }
835
836         if (mod || !usbhs_get_dparam(priv, runtime_pwctrl))
837                 usbhsc_power_ctrl(priv, 0);
838
839         return 0;
840 }
841
842 static __maybe_unused int usbhsc_resume(struct device *dev)
843 {
844         struct usbhs_priv *priv = dev_get_drvdata(dev);
845         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
846
847         if (!usbhs_get_dparam(priv, runtime_pwctrl)) {
848                 usbhsc_power_ctrl(priv, 1);
849                 usbhs_mod_autonomy_mode(priv);
850         }
851
852         usbhs_platform_call(priv, phy_reset, pdev);
853
854         usbhsc_schedule_notify_hotplug(pdev);
855
856         return 0;
857 }
858
859 static SIMPLE_DEV_PM_OPS(usbhsc_pm_ops, usbhsc_suspend, usbhsc_resume);
860
861 static struct platform_driver renesas_usbhs_driver = {
862         .driver         = {
863                 .name   = "renesas_usbhs",
864                 .pm     = &usbhsc_pm_ops,
865                 .of_match_table = usbhs_of_match,
866         },
867         .probe          = usbhs_probe,
868         .remove         = usbhs_remove,
869 };
870
871 module_platform_driver(renesas_usbhs_driver);
872
873 MODULE_LICENSE("GPL");
874 MODULE_DESCRIPTION("Renesas USB driver");
875 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");