1 // SPDX-License-Identifier: GPL-1.0+
5 * Copyright (C) 2011 Renesas Solutions Corp.
6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
9 #include <linux/gpio.h>
11 #include <linux/module.h>
12 #include <linux/of_device.h>
13 #include <linux/of_gpio.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/slab.h>
16 #include <linux/sysfs.h>
23 * image of renesas_usbhs
29 * mod_host.c pipe.c fifo.c
31 * +-------+ +-----------+
32 * | pipe0 |------>| fifo pio |
33 * +------------+ +-------+ +-----------+
34 * | mod_gadget |=====> | pipe1 |--+
35 * +------------+ +-------+ | +-----------+
36 * | pipe2 | | +-| fifo dma0 |
37 * +------------+ +-------+ | | +-----------+
38 * | mod_host | | pipe3 |<-|--+
39 * +------------+ +-------+ | +-----------+
40 * | .... | +--->| fifo dma1 |
41 * | .... | +-----------+
45 #define USBHSF_RUNTIME_PWCTRL (1 << 0)
48 #define usbhsc_flags_init(p) do {(p)->flags = 0; } while (0)
49 #define usbhsc_flags_set(p, b) ((p)->flags |= (b))
50 #define usbhsc_flags_clr(p, b) ((p)->flags &= ~(b))
51 #define usbhsc_flags_has(p, b) ((p)->flags & (b))
56 * renesas usb support platform callback function.
57 * Below macro call it.
58 * if platform doesn't have callback, it return 0 (no error)
60 #define usbhs_platform_call(priv, func, args...)\
61 (!(priv) ? -ENODEV : \
62 !((priv)->pfunc.func) ? 0 : \
63 (priv)->pfunc.func(args))
68 u16
usbhs_read(struct usbhs_priv
*priv
, u32 reg
)
70 return ioread16(priv
->base
+ reg
);
73 void usbhs_write(struct usbhs_priv
*priv
, u32 reg
, u16 data
)
75 iowrite16(data
, priv
->base
+ reg
);
78 void usbhs_bset(struct usbhs_priv
*priv
, u32 reg
, u16 mask
, u16 data
)
80 u16 val
= usbhs_read(priv
, reg
);
85 usbhs_write(priv
, reg
, val
);
88 struct usbhs_priv
*usbhs_pdev_to_priv(struct platform_device
*pdev
)
90 return dev_get_drvdata(&pdev
->dev
);
96 static void usbhs_sys_clock_ctrl(struct usbhs_priv
*priv
, int enable
)
98 usbhs_bset(priv
, SYSCFG
, SCKE
, enable
? SCKE
: 0);
101 void usbhs_sys_host_ctrl(struct usbhs_priv
*priv
, int enable
)
103 u16 mask
= DCFM
| DRPD
| DPRPU
| HSE
| USBE
;
104 u16 val
= DCFM
| DRPD
| HSE
| USBE
;
105 int has_otg
= usbhs_get_dparam(priv
, has_otg
);
108 usbhs_bset(priv
, DVSTCTR
, (EXTLP
| PWEN
), (EXTLP
| PWEN
));
114 * - D+ Line/D- Line Pull-down
116 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
119 void usbhs_sys_function_ctrl(struct usbhs_priv
*priv
, int enable
)
121 u16 mask
= DCFM
| DRPD
| DPRPU
| HSE
| USBE
;
122 u16 val
= HSE
| USBE
;
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
= usbhs_read(priv
, USBVAL
);
165 req
->wIndex
= usbhs_read(priv
, USBINDX
);
166 req
->wLength
= 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
, req
->wValue
);
173 usbhs_write(priv
, USBINDX
, req
->wIndex
);
174 usbhs_write(priv
, USBLENG
, 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
);
294 * platform default param
297 /* commonly used on old SH-Mobile SoCs */
298 static struct renesas_usbhs_driver_pipe_config usbhsc_default_pipe
[] = {
299 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL
, 64, 0x00, false),
300 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x08, false),
301 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x18, false),
302 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x28, true),
303 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x38, true),
304 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x48, true),
305 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x04, false),
306 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x05, false),
307 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x06, false),
308 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x07, false),
311 /* commonly used on newer SH-Mobile and R-Car SoCs */
312 static struct renesas_usbhs_driver_pipe_config usbhsc_new_pipe
[] = {
313 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_CONTROL
, 64, 0x00, false),
314 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x08, true),
315 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_ISOC
, 1024, 0x28, true),
316 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x48, true),
317 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x58, true),
318 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x68, true),
319 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x04, false),
320 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x05, false),
321 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_INT
, 64, 0x06, false),
322 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x78, true),
323 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x88, true),
324 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0x98, true),
325 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xa8, true),
326 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xb8, true),
327 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xc8, true),
328 RENESAS_USBHS_PIPE(USB_ENDPOINT_XFER_BULK
, 512, 0xd8, true),
334 static void usbhsc_power_ctrl(struct usbhs_priv
*priv
, int enable
)
336 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
337 struct device
*dev
= usbhs_priv_to_dev(priv
);
341 pm_runtime_get_sync(dev
);
343 /* enable platform power */
344 usbhs_platform_call(priv
, power_ctrl
, pdev
, priv
->base
, enable
);
347 usbhs_sys_clock_ctrl(priv
, enable
);
350 usbhs_sys_clock_ctrl(priv
, enable
);
352 /* disable platform power */
353 usbhs_platform_call(priv
, power_ctrl
, pdev
, priv
->base
, enable
);
356 pm_runtime_put_sync(dev
);
363 static void usbhsc_hotplug(struct usbhs_priv
*priv
)
365 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
366 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
373 * get vbus status from platform
375 enable
= usbhs_platform_call(priv
, get_vbus
, pdev
);
378 * get id from platform
380 id
= usbhs_platform_call(priv
, get_id
, pdev
);
382 if (enable
&& !mod
) {
384 cable
= extcon_get_state(priv
->edev
, EXTCON_USB_HOST
);
385 if ((cable
> 0 && id
!= USBHS_HOST
) ||
386 (!cable
&& id
!= USBHS_GADGET
)) {
388 "USB cable plugged in doesn't match the selected role!\n");
393 ret
= usbhs_mod_change(priv
, id
);
397 dev_dbg(&pdev
->dev
, "%s enable\n", __func__
);
400 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
401 usbhsc_power_ctrl(priv
, enable
);
404 usbhsc_set_buswait(priv
);
405 usbhsc_bus_init(priv
);
408 usbhs_mod_call(priv
, start
, priv
);
410 } else if (!enable
&& mod
) {
411 dev_dbg(&pdev
->dev
, "%s disable\n", __func__
);
414 usbhs_mod_call(priv
, stop
, priv
);
417 usbhsc_bus_init(priv
);
420 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
421 usbhsc_power_ctrl(priv
, enable
);
423 usbhs_mod_change(priv
, -1);
425 /* reset phy for next connection */
426 usbhs_platform_call(priv
, phy_reset
, pdev
);
433 static void usbhsc_notify_hotplug(struct work_struct
*work
)
435 struct usbhs_priv
*priv
= container_of(work
,
437 notify_hotplug_work
.work
);
438 usbhsc_hotplug(priv
);
441 static int usbhsc_drvcllbck_notify_hotplug(struct platform_device
*pdev
)
443 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
444 int delay
= usbhs_get_dparam(priv
, detection_delay
);
447 * This functions will be called in interrupt.
448 * To make sure safety context,
449 * use workqueue for usbhs_notify_hotplug
451 schedule_delayed_work(&priv
->notify_hotplug_work
,
452 msecs_to_jiffies(delay
));
459 static const struct of_device_id usbhs_of_match
[] = {
461 .compatible
= "renesas,usbhs-r8a774c0",
462 .data
= (void *)USBHS_TYPE_RCAR_GEN3_WITH_PLL
,
465 .compatible
= "renesas,usbhs-r8a7790",
466 .data
= (void *)USBHS_TYPE_RCAR_GEN2
,
469 .compatible
= "renesas,usbhs-r8a7791",
470 .data
= (void *)USBHS_TYPE_RCAR_GEN2
,
473 .compatible
= "renesas,usbhs-r8a7794",
474 .data
= (void *)USBHS_TYPE_RCAR_GEN2
,
477 .compatible
= "renesas,usbhs-r8a7795",
478 .data
= (void *)USBHS_TYPE_RCAR_GEN3
,
481 .compatible
= "renesas,usbhs-r8a7796",
482 .data
= (void *)USBHS_TYPE_RCAR_GEN3
,
485 .compatible
= "renesas,usbhs-r8a77995",
486 .data
= (void *)USBHS_TYPE_RCAR_GEN3_WITH_PLL
,
489 .compatible
= "renesas,rcar-gen2-usbhs",
490 .data
= (void *)USBHS_TYPE_RCAR_GEN2
,
493 .compatible
= "renesas,rcar-gen3-usbhs",
494 .data
= (void *)USBHS_TYPE_RCAR_GEN3
,
497 .compatible
= "renesas,rza1-usbhs",
498 .data
= (void *)USBHS_TYPE_RZA1
,
502 MODULE_DEVICE_TABLE(of
, usbhs_of_match
);
504 static struct renesas_usbhs_platform_info
*usbhs_parse_dt(struct device
*dev
)
506 struct renesas_usbhs_platform_info
*info
;
507 struct renesas_usbhs_driver_param
*dparam
;
511 info
= devm_kzalloc(dev
, sizeof(*info
), GFP_KERNEL
);
515 dparam
= &info
->driver_param
;
516 dparam
->type
= (uintptr_t)of_device_get_match_data(dev
);
517 if (!of_property_read_u32(dev
->of_node
, "renesas,buswait", &tmp
))
518 dparam
->buswait_bwait
= tmp
;
519 gpio
= of_get_named_gpio_flags(dev
->of_node
, "renesas,enable-gpio", 0,
522 dparam
->enable_gpio
= gpio
;
524 if (dparam
->type
== USBHS_TYPE_RCAR_GEN2
||
525 dparam
->type
== USBHS_TYPE_RCAR_GEN3
||
526 dparam
->type
== USBHS_TYPE_RCAR_GEN3_WITH_PLL
) {
527 dparam
->has_usb_dmac
= 1;
528 dparam
->pipe_configs
= usbhsc_new_pipe
;
529 dparam
->pipe_size
= ARRAY_SIZE(usbhsc_new_pipe
);
532 if (dparam
->type
== USBHS_TYPE_RZA1
) {
533 dparam
->pipe_configs
= usbhsc_new_pipe
;
534 dparam
->pipe_size
= ARRAY_SIZE(usbhsc_new_pipe
);
540 static int usbhs_probe(struct platform_device
*pdev
)
542 struct renesas_usbhs_platform_info
*info
= renesas_usbhs_get_info(pdev
);
543 struct renesas_usbhs_driver_callback
*dfunc
;
544 struct usbhs_priv
*priv
;
545 struct resource
*res
, *irq_res
;
548 /* check device node */
549 if (pdev
->dev
.of_node
)
550 info
= pdev
->dev
.platform_data
= usbhs_parse_dt(&pdev
->dev
);
552 /* check platform information */
554 dev_err(&pdev
->dev
, "no platform information\n");
559 irq_res
= platform_get_resource(pdev
, IORESOURCE_IRQ
, 0);
561 dev_err(&pdev
->dev
, "Not enough Renesas USB platform resources.\n");
565 /* usb private data */
566 priv
= devm_kzalloc(&pdev
->dev
, sizeof(*priv
), GFP_KERNEL
);
570 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
571 priv
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
572 if (IS_ERR(priv
->base
))
573 return PTR_ERR(priv
->base
);
575 if (of_property_read_bool(pdev
->dev
.of_node
, "extcon")) {
576 priv
->edev
= extcon_get_edev_by_phandle(&pdev
->dev
, 0);
577 if (IS_ERR(priv
->edev
))
578 return PTR_ERR(priv
->edev
);
585 memcpy(&priv
->dparam
,
587 sizeof(struct renesas_usbhs_driver_param
));
589 switch (priv
->dparam
.type
) {
590 case USBHS_TYPE_RCAR_GEN2
:
591 priv
->pfunc
= usbhs_rcar2_ops
;
593 case USBHS_TYPE_RCAR_GEN3
:
594 priv
->pfunc
= usbhs_rcar3_ops
;
596 case USBHS_TYPE_RCAR_GEN3_WITH_PLL
:
597 priv
->pfunc
= usbhs_rcar3_with_pll_ops
;
598 if (!IS_ERR_OR_NULL(priv
->edev
)) {
599 priv
->nb
.notifier_call
= priv
->pfunc
.notifier
;
600 ret
= devm_extcon_register_notifier(&pdev
->dev
,
605 dev_err(&pdev
->dev
, "no notifier registered\n");
608 case USBHS_TYPE_RZA1
:
609 priv
->pfunc
= usbhs_rza1_ops
;
612 if (!info
->platform_callback
.get_id
) {
613 dev_err(&pdev
->dev
, "no platform callbacks");
617 &info
->platform_callback
,
618 sizeof(struct renesas_usbhs_platform_callback
));
622 /* set driver callback functions for platform */
623 dfunc
= &info
->driver_callback
;
624 dfunc
->notify_hotplug
= usbhsc_drvcllbck_notify_hotplug
;
626 /* set default param if platform doesn't have */
627 if (!priv
->dparam
.pipe_configs
) {
628 priv
->dparam
.pipe_configs
= usbhsc_default_pipe
;
629 priv
->dparam
.pipe_size
= ARRAY_SIZE(usbhsc_default_pipe
);
631 if (!priv
->dparam
.pio_dma_border
)
632 priv
->dparam
.pio_dma_border
= 64; /* 64byte */
635 /* runtime power control ? */
636 if (priv
->pfunc
.get_vbus
)
637 usbhsc_flags_set(priv
, USBHSF_RUNTIME_PWCTRL
);
642 priv
->irq
= irq_res
->start
;
643 if (irq_res
->flags
& IORESOURCE_IRQ_SHAREABLE
)
644 priv
->irqflags
= IRQF_SHARED
;
646 INIT_DELAYED_WORK(&priv
->notify_hotplug_work
, usbhsc_notify_hotplug
);
647 spin_lock_init(usbhs_priv_to_lock(priv
));
649 /* call pipe and module init */
650 ret
= usbhs_pipe_probe(priv
);
654 ret
= usbhs_fifo_probe(priv
);
656 goto probe_end_pipe_exit
;
658 ret
= usbhs_mod_probe(priv
);
660 goto probe_end_fifo_exit
;
662 /* dev_set_drvdata should be called after usbhs_mod_init */
663 platform_set_drvdata(pdev
, priv
);
666 * deviece reset here because
667 * USB device might be used in boot loader.
669 usbhs_sys_clock_ctrl(priv
, 0);
671 /* check GPIO determining if USB function should be enabled */
672 if (priv
->dparam
.enable_gpio
) {
673 gpio_request_one(priv
->dparam
.enable_gpio
, GPIOF_IN
, NULL
);
674 ret
= !gpio_get_value(priv
->dparam
.enable_gpio
);
675 gpio_free(priv
->dparam
.enable_gpio
);
678 "USB function not selected (GPIO %d)\n",
679 priv
->dparam
.enable_gpio
);
681 goto probe_end_mod_exit
;
688 * USB phy setup might depend on CPU/Board.
689 * If platform has its callback functions,
692 ret
= usbhs_platform_call(priv
, hardware_init
, pdev
);
694 dev_err(&pdev
->dev
, "platform init failed.\n");
695 goto probe_end_mod_exit
;
698 /* reset phy for connection */
699 usbhs_platform_call(priv
, phy_reset
, pdev
);
702 pm_runtime_enable(&pdev
->dev
);
703 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
)) {
704 usbhsc_power_ctrl(priv
, 1);
705 usbhs_mod_autonomy_mode(priv
);
709 * manual call notify_hotplug for cold plug
711 usbhsc_drvcllbck_notify_hotplug(pdev
);
713 dev_info(&pdev
->dev
, "probed\n");
718 usbhs_mod_remove(priv
);
720 usbhs_fifo_remove(priv
);
722 usbhs_pipe_remove(priv
);
724 dev_info(&pdev
->dev
, "probe failed (%d)\n", ret
);
729 static int usbhs_remove(struct platform_device
*pdev
)
731 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
732 struct renesas_usbhs_platform_info
*info
= renesas_usbhs_get_info(pdev
);
733 struct renesas_usbhs_driver_callback
*dfunc
= &info
->driver_callback
;
735 dev_dbg(&pdev
->dev
, "usb remove\n");
737 dfunc
->notify_hotplug
= NULL
;
740 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
741 usbhsc_power_ctrl(priv
, 0);
743 pm_runtime_disable(&pdev
->dev
);
745 usbhs_platform_call(priv
, hardware_exit
, pdev
);
746 usbhs_mod_remove(priv
);
747 usbhs_fifo_remove(priv
);
748 usbhs_pipe_remove(priv
);
753 static int usbhsc_suspend(struct device
*dev
)
755 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
756 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
759 usbhs_mod_call(priv
, stop
, priv
);
760 usbhs_mod_change(priv
, -1);
763 if (mod
|| !usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
764 usbhsc_power_ctrl(priv
, 0);
769 static int usbhsc_resume(struct device
*dev
)
771 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
772 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
774 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
)) {
775 usbhsc_power_ctrl(priv
, 1);
776 usbhs_mod_autonomy_mode(priv
);
779 usbhs_platform_call(priv
, phy_reset
, pdev
);
781 usbhsc_drvcllbck_notify_hotplug(pdev
);
786 static int usbhsc_runtime_nop(struct device
*dev
)
788 /* Runtime PM callback shared between ->runtime_suspend()
789 * and ->runtime_resume(). Simply returns success.
791 * This driver re-initializes all registers after
792 * pm_runtime_get_sync() anyway so there is no need
793 * to save and restore registers here.
798 static const struct dev_pm_ops usbhsc_pm_ops
= {
799 .suspend
= usbhsc_suspend
,
800 .resume
= usbhsc_resume
,
801 .runtime_suspend
= usbhsc_runtime_nop
,
802 .runtime_resume
= usbhsc_runtime_nop
,
805 static struct platform_driver renesas_usbhs_driver
= {
807 .name
= "renesas_usbhs",
808 .pm
= &usbhsc_pm_ops
,
809 .of_match_table
= of_match_ptr(usbhs_of_match
),
811 .probe
= usbhs_probe
,
812 .remove
= usbhs_remove
,
815 module_platform_driver(renesas_usbhs_driver
);
817 MODULE_LICENSE("GPL");
818 MODULE_DESCRIPTION("Renesas USB driver");
819 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");