4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 #include <linux/module.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/slab.h>
21 #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 * | .... | +-----------+
47 #define USBHSF_RUNTIME_PWCTRL (1 << 0)
50 #define usbhsc_flags_init(p) do {(p)->flags = 0; } while (0)
51 #define usbhsc_flags_set(p, b) ((p)->flags |= (b))
52 #define usbhsc_flags_clr(p, b) ((p)->flags &= ~(b))
53 #define usbhsc_flags_has(p, b) ((p)->flags & (b))
58 * renesas usb support platform callback function.
59 * Below macro call it.
60 * if platform doesn't have callback, it return 0 (no error)
62 #define usbhs_platform_call(priv, func, args...)\
63 (!(priv) ? -ENODEV : \
64 !((priv)->pfunc->func) ? 0 : \
65 (priv)->pfunc->func(args))
70 u16
usbhs_read(struct usbhs_priv
*priv
, u32 reg
)
72 return ioread16(priv
->base
+ reg
);
75 void usbhs_write(struct usbhs_priv
*priv
, u32 reg
, u16 data
)
77 iowrite16(data
, priv
->base
+ reg
);
80 void usbhs_bset(struct usbhs_priv
*priv
, u32 reg
, u16 mask
, u16 data
)
82 u16 val
= usbhs_read(priv
, reg
);
87 usbhs_write(priv
, reg
, val
);
90 struct usbhs_priv
*usbhs_pdev_to_priv(struct platform_device
*pdev
)
92 return dev_get_drvdata(&pdev
->dev
);
98 void usbhs_sys_clock_ctrl(struct usbhs_priv
*priv
, int enable
)
100 usbhs_bset(priv
, SYSCFG
, SCKE
, enable
? SCKE
: 0);
103 void usbhs_sys_hispeed_ctrl(struct usbhs_priv
*priv
, int enable
)
105 usbhs_bset(priv
, SYSCFG
, HSE
, enable
? HSE
: 0);
108 void usbhs_sys_usb_ctrl(struct usbhs_priv
*priv
, int enable
)
110 usbhs_bset(priv
, SYSCFG
, USBE
, enable
? USBE
: 0);
113 void usbhs_sys_host_ctrl(struct usbhs_priv
*priv
, int enable
)
115 u16 mask
= DCFM
| DRPD
| DPRPU
;
116 u16 val
= DCFM
| DRPD
;
122 * - D+ Line/D- Line Pull-down
124 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
127 void usbhs_sys_function_ctrl(struct usbhs_priv
*priv
, int enable
)
129 u16 mask
= DCFM
| DRPD
| DPRPU
;
135 * - select Function mode
138 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
144 int usbhs_frame_get_num(struct usbhs_priv
*priv
)
146 return usbhs_read(priv
, FRMNUM
) & FRNM_MASK
;
150 * usb request functions
152 void usbhs_usbreq_get_val(struct usbhs_priv
*priv
, struct usb_ctrlrequest
*req
)
156 val
= usbhs_read(priv
, USBREQ
);
157 req
->bRequest
= (val
>> 8) & 0xFF;
158 req
->bRequestType
= (val
>> 0) & 0xFF;
160 req
->wValue
= usbhs_read(priv
, USBVAL
);
161 req
->wIndex
= usbhs_read(priv
, USBINDX
);
162 req
->wLength
= usbhs_read(priv
, USBLENG
);
165 void usbhs_usbreq_set_val(struct usbhs_priv
*priv
, struct usb_ctrlrequest
*req
)
167 usbhs_write(priv
, USBREQ
, (req
->bRequest
<< 8) | req
->bRequestType
);
168 usbhs_write(priv
, USBVAL
, req
->wValue
);
169 usbhs_write(priv
, USBINDX
, req
->wIndex
);
170 usbhs_write(priv
, USBLENG
, req
->wLength
);
172 usbhs_bset(priv
, DCPCTR
, SUREQ
, SUREQ
);
178 void usbhs_bus_send_sof_enable(struct usbhs_priv
*priv
)
180 usbhs_bset(priv
, DVSTCTR
, (USBRST
| UACT
), UACT
);
183 void usbhs_bus_send_reset(struct usbhs_priv
*priv
)
185 usbhs_bset(priv
, DVSTCTR
, (USBRST
| UACT
), USBRST
);
188 int usbhs_bus_get_speed(struct usbhs_priv
*priv
)
190 u16 dvstctr
= usbhs_read(priv
, DVSTCTR
);
192 switch (RHST
& dvstctr
) {
194 return USB_SPEED_LOW
;
195 case RHST_FULL_SPEED
:
196 return USB_SPEED_FULL
;
197 case RHST_HIGH_SPEED
:
198 return USB_SPEED_HIGH
;
201 return USB_SPEED_UNKNOWN
;
204 int usbhs_vbus_ctrl(struct usbhs_priv
*priv
, int enable
)
206 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
208 return usbhs_platform_call(priv
, set_vbus
, pdev
, enable
);
211 static void usbhsc_bus_init(struct usbhs_priv
*priv
)
213 usbhs_write(priv
, DVSTCTR
, 0);
215 usbhs_vbus_ctrl(priv
, 0);
221 static void usbhsc_set_buswait(struct usbhs_priv
*priv
)
223 int wait
= usbhs_get_dparam(priv
, buswait_bwait
);
225 /* set bus wait if platform have */
227 usbhs_bset(priv
, BUSWAIT
, 0x000F, wait
);
231 * platform default param
233 static u32 usbhsc_default_pipe_type
[] = {
234 USB_ENDPOINT_XFER_CONTROL
,
235 USB_ENDPOINT_XFER_ISOC
,
236 USB_ENDPOINT_XFER_ISOC
,
237 USB_ENDPOINT_XFER_BULK
,
238 USB_ENDPOINT_XFER_BULK
,
239 USB_ENDPOINT_XFER_BULK
,
240 USB_ENDPOINT_XFER_INT
,
241 USB_ENDPOINT_XFER_INT
,
242 USB_ENDPOINT_XFER_INT
,
243 USB_ENDPOINT_XFER_INT
,
249 static void usbhsc_power_ctrl(struct usbhs_priv
*priv
, int enable
)
251 struct device
*dev
= usbhs_priv_to_dev(priv
);
255 pm_runtime_get_sync(dev
);
258 usbhs_sys_clock_ctrl(priv
, enable
);
261 usbhs_sys_clock_ctrl(priv
, enable
);
264 pm_runtime_put_sync(dev
);
271 static void usbhsc_hotplug(struct usbhs_priv
*priv
)
273 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
274 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
280 * get vbus status from platform
282 enable
= usbhs_platform_call(priv
, get_vbus
, pdev
);
285 * get id from platform
287 id
= usbhs_platform_call(priv
, get_id
, pdev
);
289 if (enable
&& !mod
) {
290 ret
= usbhs_mod_change(priv
, id
);
294 dev_dbg(&pdev
->dev
, "%s enable\n", __func__
);
297 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
298 usbhsc_power_ctrl(priv
, enable
);
301 usbhsc_set_buswait(priv
);
302 usbhsc_bus_init(priv
);
305 usbhs_mod_call(priv
, start
, priv
);
307 } else if (!enable
&& mod
) {
308 dev_dbg(&pdev
->dev
, "%s disable\n", __func__
);
311 usbhs_mod_call(priv
, stop
, priv
);
314 usbhsc_bus_init(priv
);
317 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
318 usbhsc_power_ctrl(priv
, enable
);
320 usbhs_mod_change(priv
, -1);
322 /* reset phy for next connection */
323 usbhs_platform_call(priv
, phy_reset
, pdev
);
330 static void usbhsc_notify_hotplug(struct work_struct
*work
)
332 struct usbhs_priv
*priv
= container_of(work
,
334 notify_hotplug_work
.work
);
335 usbhsc_hotplug(priv
);
338 int usbhsc_drvcllbck_notify_hotplug(struct platform_device
*pdev
)
340 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
341 int delay
= usbhs_get_dparam(priv
, detection_delay
);
344 * This functions will be called in interrupt.
345 * To make sure safety context,
346 * use workqueue for usbhs_notify_hotplug
348 schedule_delayed_work(&priv
->notify_hotplug_work
, delay
);
355 static int __devinit
usbhs_probe(struct platform_device
*pdev
)
357 struct renesas_usbhs_platform_info
*info
= pdev
->dev
.platform_data
;
358 struct renesas_usbhs_driver_callback
*dfunc
;
359 struct usbhs_priv
*priv
;
360 struct resource
*res
;
364 /* check platform information */
366 !info
->platform_callback
.get_id
) {
367 dev_err(&pdev
->dev
, "no platform information\n");
372 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
373 irq
= platform_get_irq(pdev
, 0);
374 if (!res
|| (int)irq
<= 0) {
375 dev_err(&pdev
->dev
, "Not enough Renesas USB platform resources.\n");
379 /* usb private data */
380 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
382 dev_err(&pdev
->dev
, "Could not allocate priv\n");
386 priv
->base
= ioremap_nocache(res
->start
, resource_size(res
));
388 dev_err(&pdev
->dev
, "ioremap error.\n");
390 goto probe_end_kfree
;
396 priv
->pfunc
= &info
->platform_callback
;
397 priv
->dparam
= &info
->driver_param
;
399 /* set driver callback functions for platform */
400 dfunc
= &info
->driver_callback
;
401 dfunc
->notify_hotplug
= usbhsc_drvcllbck_notify_hotplug
;
403 /* set default param if platform doesn't have */
404 if (!priv
->dparam
->pipe_type
) {
405 priv
->dparam
->pipe_type
= usbhsc_default_pipe_type
;
406 priv
->dparam
->pipe_size
= ARRAY_SIZE(usbhsc_default_pipe_type
);
408 if (!priv
->dparam
->pio_dma_border
)
409 priv
->dparam
->pio_dma_border
= 64; /* 64byte */
412 /* runtime power control ? */
413 if (priv
->pfunc
->get_vbus
)
414 usbhsc_flags_set(priv
, USBHSF_RUNTIME_PWCTRL
);
421 INIT_DELAYED_WORK(&priv
->notify_hotplug_work
, usbhsc_notify_hotplug
);
422 spin_lock_init(usbhs_priv_to_lock(priv
));
424 /* call pipe and module init */
425 ret
= usbhs_pipe_probe(priv
);
427 goto probe_end_iounmap
;
429 ret
= usbhs_fifo_probe(priv
);
431 goto probe_end_pipe_exit
;
433 ret
= usbhs_mod_probe(priv
);
435 goto probe_end_fifo_exit
;
437 /* dev_set_drvdata should be called after usbhs_mod_init */
438 dev_set_drvdata(&pdev
->dev
, priv
);
441 * deviece reset here because
442 * USB device might be used in boot loader.
444 usbhs_sys_clock_ctrl(priv
, 0);
449 * USB phy setup might depend on CPU/Board.
450 * If platform has its callback functions,
453 ret
= usbhs_platform_call(priv
, hardware_init
, pdev
);
455 dev_err(&pdev
->dev
, "platform prove failed.\n");
456 goto probe_end_mod_exit
;
459 /* reset phy for connection */
460 usbhs_platform_call(priv
, phy_reset
, pdev
);
463 pm_runtime_enable(&pdev
->dev
);
464 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
)) {
465 usbhsc_power_ctrl(priv
, 1);
466 usbhs_mod_autonomy_mode(priv
);
470 * manual call notify_hotplug for cold plug
472 ret
= usbhsc_drvcllbck_notify_hotplug(pdev
);
474 goto probe_end_call_remove
;
476 dev_info(&pdev
->dev
, "probed\n");
480 probe_end_call_remove
:
481 usbhs_platform_call(priv
, hardware_exit
, pdev
);
483 usbhs_mod_remove(priv
);
485 usbhs_fifo_remove(priv
);
487 usbhs_pipe_remove(priv
);
493 dev_info(&pdev
->dev
, "probe failed\n");
498 static int __devexit
usbhs_remove(struct platform_device
*pdev
)
500 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
501 struct renesas_usbhs_platform_info
*info
= pdev
->dev
.platform_data
;
502 struct renesas_usbhs_driver_callback
*dfunc
= &info
->driver_callback
;
504 dev_dbg(&pdev
->dev
, "usb remove\n");
506 dfunc
->notify_hotplug
= NULL
;
509 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
510 usbhsc_power_ctrl(priv
, 0);
512 pm_runtime_disable(&pdev
->dev
);
514 usbhs_platform_call(priv
, hardware_exit
, pdev
);
515 usbhs_mod_remove(priv
);
516 usbhs_fifo_remove(priv
);
517 usbhs_pipe_remove(priv
);
524 static int usbhsc_suspend(struct device
*dev
)
526 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
527 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
530 usbhs_mod_call(priv
, stop
, priv
);
531 usbhs_mod_change(priv
, -1);
534 if (mod
|| !usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
535 usbhsc_power_ctrl(priv
, 0);
540 static int usbhsc_resume(struct device
*dev
)
542 struct usbhs_priv
*priv
= dev_get_drvdata(dev
);
543 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
545 usbhs_platform_call(priv
, phy_reset
, pdev
);
547 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
548 usbhsc_power_ctrl(priv
, 1);
550 usbhsc_hotplug(priv
);
555 static int usbhsc_runtime_nop(struct device
*dev
)
557 /* Runtime PM callback shared between ->runtime_suspend()
558 * and ->runtime_resume(). Simply returns success.
560 * This driver re-initializes all registers after
561 * pm_runtime_get_sync() anyway so there is no need
562 * to save and restore registers here.
567 static const struct dev_pm_ops usbhsc_pm_ops
= {
568 .suspend
= usbhsc_suspend
,
569 .resume
= usbhsc_resume
,
570 .runtime_suspend
= usbhsc_runtime_nop
,
571 .runtime_resume
= usbhsc_runtime_nop
,
574 static struct platform_driver renesas_usbhs_driver
= {
576 .name
= "renesas_usbhs",
577 .pm
= &usbhsc_pm_ops
,
579 .probe
= usbhs_probe
,
580 .remove
= __devexit_p(usbhs_remove
),
583 static int __init
usbhs_init(void)
585 return platform_driver_register(&renesas_usbhs_driver
);
588 static void __exit
usbhs_exit(void)
590 platform_driver_unregister(&renesas_usbhs_driver
);
593 module_init(usbhs_init
);
594 module_exit(usbhs_exit
);
596 MODULE_LICENSE("GPL");
597 MODULE_DESCRIPTION("Renesas USB driver");
598 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");