1 // SPDX-License-Identifier: GPL-1.0+
5 * Copyright (C) 2011 Renesas Solutions Corp.
6 * Copyright (C) 2019 Renesas Electronics Corporation
7 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
10 #include <linux/err.h>
11 #include <linux/gpio/consumer.h>
13 #include <linux/module.h>
14 #include <linux/of_device.h>
15 #include <linux/pm_runtime.h>
16 #include <linux/reset.h>
17 #include <linux/slab.h>
18 #include <linux/sysfs.h>
25 * image of renesas_usbhs
31 * mod_host.c pipe.c fifo.c
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 * | .... | +-----------+
49 * renesas usb support platform callback function.
50 * Below macro call it.
51 * if platform doesn't have callback, it return 0 (no error)
53 #define usbhs_platform_call(priv, func, args...)\
54 (!(priv) ? -ENODEV : \
55 !((priv)->pfunc->func) ? 0 : \
56 (priv)->pfunc->func(args))
61 u16
usbhs_read(struct usbhs_priv
*priv
, u32 reg
)
63 return ioread16(priv
->base
+ reg
);
66 void usbhs_write(struct usbhs_priv
*priv
, u32 reg
, u16 data
)
68 iowrite16(data
, priv
->base
+ reg
);
71 void usbhs_bset(struct usbhs_priv
*priv
, u32 reg
, u16 mask
, u16 data
)
73 u16 val
= usbhs_read(priv
, reg
);
78 usbhs_write(priv
, reg
, val
);
81 struct usbhs_priv
*usbhs_pdev_to_priv(struct platform_device
*pdev
)
83 return dev_get_drvdata(&pdev
->dev
);
86 int usbhs_get_id_as_gadget(struct platform_device
*pdev
)
94 static void usbhs_sys_clock_ctrl(struct usbhs_priv
*priv
, int enable
)
96 usbhs_bset(priv
, SYSCFG
, SCKE
, enable
? SCKE
: 0);
99 void usbhs_sys_host_ctrl(struct usbhs_priv
*priv
, int enable
)
101 u16 mask
= DCFM
| DRPD
| DPRPU
| HSE
| USBE
;
102 u16 val
= DCFM
| DRPD
| HSE
| USBE
;
108 * - D+ Line/D- Line Pull-down
110 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
113 void usbhs_sys_function_ctrl(struct usbhs_priv
*priv
, int enable
)
115 u16 mask
= DCFM
| DRPD
| DPRPU
| HSE
| USBE
;
116 u16 val
= HSE
| USBE
;
118 /* CNEN bit is required for function operation */
119 if (usbhs_get_dparam(priv
, has_cnen
)) {
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)
132 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
135 void usbhs_sys_function_pullup(struct usbhs_priv
*priv
, int enable
)
137 usbhs_bset(priv
, SYSCFG
, DPRPU
, enable
? DPRPU
: 0);
140 void usbhs_sys_set_test_mode(struct usbhs_priv
*priv
, u16 mode
)
142 usbhs_write(priv
, TESTMODE
, mode
);
148 int usbhs_frame_get_num(struct usbhs_priv
*priv
)
150 return usbhs_read(priv
, FRMNUM
) & FRNM_MASK
;
154 * usb request functions
156 void usbhs_usbreq_get_val(struct usbhs_priv
*priv
, struct usb_ctrlrequest
*req
)
160 val
= usbhs_read(priv
, USBREQ
);
161 req
->bRequest
= (val
>> 8) & 0xFF;
162 req
->bRequestType
= (val
>> 0) & 0xFF;
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
));
169 void usbhs_usbreq_set_val(struct usbhs_priv
*priv
, struct usb_ctrlrequest
*req
)
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
));
176 usbhs_bset(priv
, DCPCTR
, SUREQ
, SUREQ
);
182 void usbhs_bus_send_sof_enable(struct usbhs_priv
*priv
)
184 u16 status
= usbhs_read(priv
, DVSTCTR
) & (USBRST
| UACT
);
186 if (status
!= USBRST
) {
187 struct device
*dev
= usbhs_priv_to_dev(priv
);
188 dev_err(dev
, "usbhs should be reset\n");
191 usbhs_bset(priv
, DVSTCTR
, (USBRST
| UACT
), UACT
);
194 void usbhs_bus_send_reset(struct usbhs_priv
*priv
)
196 usbhs_bset(priv
, DVSTCTR
, (USBRST
| UACT
), USBRST
);
199 int usbhs_bus_get_speed(struct usbhs_priv
*priv
)
201 u16 dvstctr
= usbhs_read(priv
, DVSTCTR
);
203 switch (RHST
& dvstctr
) {
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
;
212 return USB_SPEED_UNKNOWN
;
215 int usbhs_vbus_ctrl(struct usbhs_priv
*priv
, int enable
)
217 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
219 return usbhs_platform_call(priv
, set_vbus
, pdev
, enable
);
222 static void usbhsc_bus_init(struct usbhs_priv
*priv
)
224 usbhs_write(priv
, DVSTCTR
, 0);
226 usbhs_vbus_ctrl(priv
, 0);
230 * device configuration
232 int usbhs_set_device_config(struct usbhs_priv
*priv
, int devnum
,
233 u16 upphub
, u16 hubport
, u16 speed
)
235 struct device
*dev
= usbhs_priv_to_dev(priv
);
237 u32 reg
= DEVADD0
+ (2 * devnum
);
240 dev_err(dev
, "cannot set speed to unknown device %d\n", devnum
);
245 dev_err(dev
, "unsupported hub number %d\n", upphub
);
251 usbspd
= USBSPD_SPEED_LOW
;
254 usbspd
= USBSPD_SPEED_FULL
;
257 usbspd
= USBSPD_SPEED_HIGH
;
260 dev_err(dev
, "unsupported speed %d\n", speed
);
264 usbhs_write(priv
, reg
, UPPHUB(upphub
) |
272 * interrupt functions
274 void usbhs_xxxsts_clear(struct usbhs_priv
*priv
, u16 sts_reg
, u16 bit
)
276 u16 pipe_mask
= (u16
)GENMASK(usbhs_get_dparam(priv
, pipe_size
), 0);
278 usbhs_write(priv
, sts_reg
, ~(1 << bit
) & pipe_mask
);
284 static void usbhsc_set_buswait(struct usbhs_priv
*priv
)
286 int wait
= usbhs_get_dparam(priv
, buswait_bwait
);
288 /* set bus wait if platform have */
290 usbhs_bset(priv
, BUSWAIT
, 0x000F, wait
);
293 static bool usbhsc_is_multi_clks(struct usbhs_priv
*priv
)
295 return priv
->dparam
.multi_clks
;
298 static int usbhsc_clk_get(struct device
*dev
, struct usbhs_priv
*priv
)
300 if (!usbhsc_is_multi_clks(priv
))
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]);
309 * To backward compatibility with old DT, this driver checks the return
310 * value if it's -ENOENT or not.
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 return PTR_ERR(priv
->clks
[1]);
321 static void usbhsc_clk_put(struct usbhs_priv
*priv
)
325 if (!usbhsc_is_multi_clks(priv
))
328 for (i
= 0; i
< ARRAY_SIZE(priv
->clks
); i
++)
329 clk_put(priv
->clks
[i
]);
332 static int usbhsc_clk_prepare_enable(struct usbhs_priv
*priv
)
336 if (!usbhsc_is_multi_clks(priv
))
339 for (i
= 0; i
< ARRAY_SIZE(priv
->clks
); i
++) {
340 ret
= clk_prepare_enable(priv
->clks
[i
]);
343 clk_disable_unprepare(priv
->clks
[i
]);
351 static void usbhsc_clk_disable_unprepare(struct usbhs_priv
*priv
)
355 if (!usbhsc_is_multi_clks(priv
))
358 for (i
= 0; i
< ARRAY_SIZE(priv
->clks
); i
++)
359 clk_disable_unprepare(priv
->clks
[i
]);
363 * platform default param
366 /* commonly used on old SH-Mobile SoCs */
367 static struct renesas_usbhs_driver_pipe_config usbhsc_default_pipe
[] = {
368 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL
, 64, 0x00, false),
369 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x08, false),
370 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x18, false),
371 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x28, true),
372 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x38, true),
373 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x48, true),
374 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x04, false),
375 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x05, false),
376 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x06, false),
377 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x07, false),
380 /* commonly used on newer SH-Mobile and R-Car SoCs */
381 static struct renesas_usbhs_driver_pipe_config usbhsc_new_pipe
[] = {
382 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL
, 64, 0x00, false),
383 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x08, true),
384 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x28, true),
385 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x48, true),
386 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x58, true),
387 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x68, true),
388 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x04, false),
389 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x05, false),
390 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x06, false),
391 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x78, true),
392 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x88, true),
393 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x98, true),
394 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xa8, true),
395 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xb8, true),
396 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xc8, true),
397 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xd8, true),
403 static void usbhsc_power_ctrl(struct usbhs_priv
*priv
, int enable
)
405 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
406 struct device
*dev
= usbhs_priv_to_dev(priv
);
410 pm_runtime_get_sync(dev
);
413 if (usbhsc_clk_prepare_enable(priv
))
416 /* enable platform power */
417 usbhs_platform_call(priv
, power_ctrl
, pdev
, priv
->base
, enable
);
420 usbhs_sys_clock_ctrl(priv
, enable
);
423 usbhs_sys_clock_ctrl(priv
, enable
);
425 /* disable platform power */
426 usbhs_platform_call(priv
, power_ctrl
, pdev
, priv
->base
, enable
);
429 usbhsc_clk_disable_unprepare(priv
);
432 pm_runtime_put_sync(dev
);
439 static void usbhsc_hotplug(struct usbhs_priv
*priv
)
441 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
442 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
449 * get vbus status from platform
451 enable
= usbhs_mod_info_call(priv
, get_vbus
, pdev
);
454 * get id from platform
456 id
= usbhs_platform_call(priv
, get_id
, pdev
);
458 if (enable
&& !mod
) {
460 cable
= extcon_get_state(priv
->edev
, EXTCON_USB_HOST
);
461 if ((cable
> 0 && id
!= USBHS_HOST
) ||
462 (!cable
&& id
!= USBHS_GADGET
)) {
464 "USB cable plugged in doesn't match the selected role!\n");
469 ret
= usbhs_mod_change(priv
, id
);
473 dev_dbg(&pdev
->dev
, "%s enable\n", __func__
);
476 if (usbhs_get_dparam(priv
, runtime_pwctrl
))
477 usbhsc_power_ctrl(priv
, enable
);
480 usbhsc_set_buswait(priv
);
481 usbhsc_bus_init(priv
);
484 usbhs_mod_call(priv
, start
, priv
);
486 } else if (!enable
&& mod
) {
487 dev_dbg(&pdev
->dev
, "%s disable\n", __func__
);
490 usbhs_mod_call(priv
, stop
, priv
);
493 usbhsc_bus_init(priv
);
496 if (usbhs_get_dparam(priv
, runtime_pwctrl
))
497 usbhsc_power_ctrl(priv
, enable
);
499 usbhs_mod_change(priv
, -1);
501 /* reset phy for next connection */
502 usbhs_platform_call(priv
, phy_reset
, pdev
);
509 static void usbhsc_notify_hotplug(struct work_struct
*work
)
511 struct usbhs_priv
*priv
= container_of(work
,
513 notify_hotplug_work
.work
);
514 usbhsc_hotplug(priv
);
517 int usbhsc_schedule_notify_hotplug(struct platform_device
*pdev
)
519 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
520 int delay
= usbhs_get_dparam(priv
, detection_delay
);
523 * This functions will be called in interrupt.
524 * To make sure safety context,
525 * use workqueue for usbhs_notify_hotplug
527 schedule_delayed_work(&priv
->notify_hotplug_work
,
528 msecs_to_jiffies(delay
));
535 static const struct of_device_id usbhs_of_match
[] = {
537 .compatible
= "renesas,usbhs-r8a774c0",
538 .data
= &usbhs_rcar_gen3_with_pll_plat_info
,
541 .compatible
= "renesas,usbhs-r8a7790",
542 .data
= &usbhs_rcar_gen2_plat_info
,
545 .compatible
= "renesas,usbhs-r8a7791",
546 .data
= &usbhs_rcar_gen2_plat_info
,
549 .compatible
= "renesas,usbhs-r8a7794",
550 .data
= &usbhs_rcar_gen2_plat_info
,
553 .compatible
= "renesas,usbhs-r8a7795",
554 .data
= &usbhs_rcar_gen3_plat_info
,
557 .compatible
= "renesas,usbhs-r8a7796",
558 .data
= &usbhs_rcar_gen3_plat_info
,
561 .compatible
= "renesas,usbhs-r8a77990",
562 .data
= &usbhs_rcar_gen3_with_pll_plat_info
,
565 .compatible
= "renesas,usbhs-r8a77995",
566 .data
= &usbhs_rcar_gen3_with_pll_plat_info
,
569 .compatible
= "renesas,rcar-gen2-usbhs",
570 .data
= &usbhs_rcar_gen2_plat_info
,
573 .compatible
= "renesas,rcar-gen3-usbhs",
574 .data
= &usbhs_rcar_gen3_plat_info
,
577 .compatible
= "renesas,rza1-usbhs",
578 .data
= &usbhs_rza1_plat_info
,
581 .compatible
= "renesas,rza2-usbhs",
582 .data
= &usbhs_rza2_plat_info
,
586 MODULE_DEVICE_TABLE(of
, usbhs_of_match
);
588 static int usbhs_probe(struct platform_device
*pdev
)
590 const struct renesas_usbhs_platform_info
*info
;
591 struct usbhs_priv
*priv
;
592 struct resource
*irq_res
;
593 struct device
*dev
= &pdev
->dev
;
594 struct gpio_desc
*gpiod
;
598 /* check device node */
599 if (dev_of_node(dev
))
600 info
= of_device_get_match_data(dev
);
602 info
= renesas_usbhs_get_info(pdev
);
604 /* check platform information */
606 dev_err(dev
, "no platform information\n");
611 irq_res
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
613 dev_err(dev
, "Not enough Renesas USB platform resources.\n");
617 /* usb private data */
618 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
622 priv
->base
= devm_platform_ioremap_resource(pdev
, 0);
623 if (IS_ERR(priv
->base
))
624 return PTR_ERR(priv
->base
);
626 if (of_property_read_bool(dev_of_node(dev
), "extcon")) {
627 priv
->edev
= extcon_get_edev_by_phandle(dev
, 0);
628 if (IS_ERR(priv
->edev
))
629 return PTR_ERR(priv
->edev
);
632 priv
->rsts
= devm_reset_control_array_get_optional_shared(dev
);
633 if (IS_ERR(priv
->rsts
))
634 return PTR_ERR(priv
->rsts
);
640 priv
->dparam
= info
->driver_param
;
642 if (!info
->platform_callback
.get_id
) {
643 dev_err(dev
, "no platform callbacks\n");
646 priv
->pfunc
= &info
->platform_callback
;
648 /* set default param if platform doesn't have */
649 if (usbhs_get_dparam(priv
, has_new_pipe_configs
)) {
650 priv
->dparam
.pipe_configs
= usbhsc_new_pipe
;
651 priv
->dparam
.pipe_size
= ARRAY_SIZE(usbhsc_new_pipe
);
652 } else if (!priv
->dparam
.pipe_configs
) {
653 priv
->dparam
.pipe_configs
= usbhsc_default_pipe
;
654 priv
->dparam
.pipe_size
= ARRAY_SIZE(usbhsc_default_pipe
);
656 if (!priv
->dparam
.pio_dma_border
)
657 priv
->dparam
.pio_dma_border
= 64; /* 64byte */
658 if (!of_property_read_u32(dev_of_node(dev
), "renesas,buswait", &tmp
))
659 priv
->dparam
.buswait_bwait
= tmp
;
660 gpiod
= devm_gpiod_get_optional(dev
, "renesas,enable", GPIOD_IN
);
662 return PTR_ERR(gpiod
);
665 /* runtime power control ? */
666 if (priv
->pfunc
->get_vbus
)
667 usbhs_get_dparam(priv
, runtime_pwctrl
) = 1;
672 priv
->irq
= irq_res
->start
;
673 if (irq_res
->flags
& IORESOURCE_IRQ_SHAREABLE
)
674 priv
->irqflags
= IRQF_SHARED
;
676 INIT_DELAYED_WORK(&priv
->notify_hotplug_work
, usbhsc_notify_hotplug
);
677 spin_lock_init(usbhs_priv_to_lock(priv
));
679 /* call pipe and module init */
680 ret
= usbhs_pipe_probe(priv
);
684 ret
= usbhs_fifo_probe(priv
);
686 goto probe_end_pipe_exit
;
688 ret
= usbhs_mod_probe(priv
);
690 goto probe_end_fifo_exit
;
692 /* dev_set_drvdata should be called after usbhs_mod_init */
693 platform_set_drvdata(pdev
, priv
);
695 ret
= reset_control_deassert(priv
->rsts
);
699 ret
= usbhsc_clk_get(dev
, priv
);
701 goto probe_fail_clks
;
704 * deviece reset here because
705 * USB device might be used in boot loader.
707 usbhs_sys_clock_ctrl(priv
, 0);
709 /* check GPIO determining if USB function should be enabled */
711 ret
= !gpiod_get_value(gpiod
);
713 dev_warn(dev
, "USB function not selected (GPIO)\n");
715 goto probe_end_mod_exit
;
722 * USB phy setup might depend on CPU/Board.
723 * If platform has its callback functions,
726 ret
= usbhs_platform_call(priv
, hardware_init
, pdev
);
728 dev_err(dev
, "platform init failed.\n");
729 goto probe_end_mod_exit
;
732 /* reset phy for connection */
733 usbhs_platform_call(priv
, phy_reset
, pdev
);
736 pm_runtime_enable(dev
);
737 if (!usbhs_get_dparam(priv
, runtime_pwctrl
)) {
738 usbhsc_power_ctrl(priv
, 1);
739 usbhs_mod_autonomy_mode(priv
);
741 usbhs_mod_non_autonomy_mode(priv
);
745 * manual call notify_hotplug for cold plug
747 usbhsc_schedule_notify_hotplug(pdev
);
749 dev_info(dev
, "probed\n");
754 usbhsc_clk_put(priv
);
756 reset_control_assert(priv
->rsts
);
758 usbhs_mod_remove(priv
);
760 usbhs_fifo_remove(priv
);
762 usbhs_pipe_remove(priv
);
764 dev_info(dev
, "probe failed (%d)\n", ret
);
769 static int usbhs_remove(struct platform_device
*pdev
)
771 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
773 dev_dbg(&pdev
->dev
, "usb remove\n");
776 if (!usbhs_get_dparam(priv
, runtime_pwctrl
))
777 usbhsc_power_ctrl(priv
, 0);
779 pm_runtime_disable(&pdev
->dev
);
781 usbhs_platform_call(priv
, hardware_exit
, pdev
);
782 usbhsc_clk_put(priv
);
783 reset_control_assert(priv
->rsts
);
784 usbhs_mod_remove(priv
);
785 usbhs_fifo_remove(priv
);
786 usbhs_pipe_remove(priv
);
791 static __maybe_unused
int usbhsc_suspend(struct device
*dev
)
793 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
794 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
797 usbhs_mod_call(priv
, stop
, priv
);
798 usbhs_mod_change(priv
, -1);
801 if (mod
|| !usbhs_get_dparam(priv
, runtime_pwctrl
))
802 usbhsc_power_ctrl(priv
, 0);
807 static __maybe_unused
int usbhsc_resume(struct device
*dev
)
809 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
810 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
812 if (!usbhs_get_dparam(priv
, runtime_pwctrl
)) {
813 usbhsc_power_ctrl(priv
, 1);
814 usbhs_mod_autonomy_mode(priv
);
817 usbhs_platform_call(priv
, phy_reset
, pdev
);
819 usbhsc_schedule_notify_hotplug(pdev
);
824 static SIMPLE_DEV_PM_OPS(usbhsc_pm_ops
, usbhsc_suspend
, usbhsc_resume
);
826 static struct platform_driver renesas_usbhs_driver
= {
828 .name
= "renesas_usbhs",
829 .pm
= &usbhsc_pm_ops
,
830 .of_match_table
= of_match_ptr(usbhs_of_match
),
832 .probe
= usbhs_probe
,
833 .remove
= usbhs_remove
,
836 module_platform_driver(renesas_usbhs_driver
);
838 MODULE_LICENSE("GPL");
839 MODULE_DESCRIPTION("Renesas USB driver");
840 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");