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>
24 #define USBHSF_RUNTIME_PWCTRL (1 << 0)
27 #define usbhsc_flags_init(p) do {(p)->flags = 0; } while (0)
28 #define usbhsc_flags_set(p, b) ((p)->flags |= (b))
29 #define usbhsc_flags_clr(p, b) ((p)->flags &= ~(b))
30 #define usbhsc_flags_has(p, b) ((p)->flags & (b))
35 * renesas usb support platform callback function.
36 * Below macro call it.
37 * if platform doesn't have callback, it return 0 (no error)
39 #define usbhs_platform_call(priv, func, args...)\
40 (!(priv) ? -ENODEV : \
41 !((priv)->pfunc->func) ? 0 : \
42 (priv)->pfunc->func(args))
47 u16
usbhs_read(struct usbhs_priv
*priv
, u32 reg
)
49 return ioread16(priv
->base
+ reg
);
52 void usbhs_write(struct usbhs_priv
*priv
, u32 reg
, u16 data
)
54 iowrite16(data
, priv
->base
+ reg
);
57 void usbhs_bset(struct usbhs_priv
*priv
, u32 reg
, u16 mask
, u16 data
)
59 u16 val
= usbhs_read(priv
, reg
);
64 usbhs_write(priv
, reg
, val
);
67 struct usbhs_priv
*usbhs_pdev_to_priv(struct platform_device
*pdev
)
69 return dev_get_drvdata(&pdev
->dev
);
75 void usbhs_sys_clock_ctrl(struct usbhs_priv
*priv
, int enable
)
77 usbhs_bset(priv
, SYSCFG
, SCKE
, enable
? SCKE
: 0);
80 void usbhs_sys_hispeed_ctrl(struct usbhs_priv
*priv
, int enable
)
82 usbhs_bset(priv
, SYSCFG
, HSE
, enable
? HSE
: 0);
85 void usbhs_sys_usb_ctrl(struct usbhs_priv
*priv
, int enable
)
87 usbhs_bset(priv
, SYSCFG
, USBE
, enable
? USBE
: 0);
90 void usbhs_sys_host_ctrl(struct usbhs_priv
*priv
, int enable
)
92 u16 mask
= DCFM
| DRPD
| DPRPU
;
93 u16 val
= DCFM
| DRPD
;
99 * - D+ Line/D- Line Pull-down
101 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
104 void usbhs_sys_function_ctrl(struct usbhs_priv
*priv
, int enable
)
106 u16 mask
= DCFM
| DRPD
| DPRPU
;
112 * - select Function mode
115 usbhs_bset(priv
, SYSCFG
, mask
, enable
? val
: 0);
121 int usbhs_frame_get_num(struct usbhs_priv
*priv
)
123 return usbhs_read(priv
, FRMNUM
) & FRNM_MASK
;
129 static void usbhsc_bus_ctrl(struct usbhs_priv
*priv
, int enable
)
131 int wait
= usbhs_get_dparam(priv
, buswait_bwait
);
135 /* set bus wait if platform have */
137 usbhs_bset(priv
, BUSWAIT
, 0x000F, wait
);
139 usbhs_write(priv
, DVSTCTR
, data
);
143 * platform default param
145 static u32 usbhsc_default_pipe_type
[] = {
146 USB_ENDPOINT_XFER_CONTROL
,
147 USB_ENDPOINT_XFER_ISOC
,
148 USB_ENDPOINT_XFER_ISOC
,
149 USB_ENDPOINT_XFER_BULK
,
150 USB_ENDPOINT_XFER_BULK
,
151 USB_ENDPOINT_XFER_BULK
,
152 USB_ENDPOINT_XFER_INT
,
153 USB_ENDPOINT_XFER_INT
,
154 USB_ENDPOINT_XFER_INT
,
155 USB_ENDPOINT_XFER_INT
,
161 static void usbhsc_power_ctrl(struct usbhs_priv
*priv
, int enable
)
163 struct device
*dev
= usbhs_priv_to_dev(priv
);
167 pm_runtime_get_sync(dev
);
170 usbhs_sys_clock_ctrl(priv
, enable
);
171 usbhsc_bus_ctrl(priv
, enable
);
174 usbhsc_bus_ctrl(priv
, enable
);
175 usbhs_sys_clock_ctrl(priv
, enable
);
178 pm_runtime_put_sync(dev
);
185 static void usbhsc_notify_hotplug(struct work_struct
*work
)
187 struct usbhs_priv
*priv
= container_of(work
,
189 notify_hotplug_work
.work
);
190 struct platform_device
*pdev
= usbhs_priv_to_pdev(priv
);
191 struct usbhs_mod
*mod
= usbhs_mod_get_current(priv
);
197 * get vbus status from platform
199 enable
= usbhs_platform_call(priv
, get_vbus
, pdev
);
202 * get id from platform
204 id
= usbhs_platform_call(priv
, get_id
, pdev
);
206 if (enable
&& !mod
) {
207 ret
= usbhs_mod_change(priv
, id
);
211 dev_dbg(&pdev
->dev
, "%s enable\n", __func__
);
214 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
215 usbhsc_power_ctrl(priv
, enable
);
218 usbhs_mod_call(priv
, start
, priv
);
220 } else if (!enable
&& mod
) {
221 dev_dbg(&pdev
->dev
, "%s disable\n", __func__
);
224 usbhs_mod_call(priv
, stop
, priv
);
227 if (usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
228 usbhsc_power_ctrl(priv
, enable
);
230 usbhs_mod_change(priv
, -1);
232 /* reset phy for next connection */
233 usbhs_platform_call(priv
, phy_reset
, pdev
);
237 int usbhsc_drvcllbck_notify_hotplug(struct platform_device
*pdev
)
239 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
240 int delay
= usbhs_get_dparam(priv
, detection_delay
);
243 * This functions will be called in interrupt.
244 * To make sure safety context,
245 * use workqueue for usbhs_notify_hotplug
247 schedule_delayed_work(&priv
->notify_hotplug_work
, delay
);
254 static int __devinit
usbhs_probe(struct platform_device
*pdev
)
256 struct renesas_usbhs_platform_info
*info
= pdev
->dev
.platform_data
;
257 struct renesas_usbhs_driver_callback
*dfunc
;
258 struct usbhs_priv
*priv
;
259 struct resource
*res
;
263 /* check platform information */
265 !info
->platform_callback
.get_id
) {
266 dev_err(&pdev
->dev
, "no platform information\n");
271 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
272 irq
= platform_get_irq(pdev
, 0);
273 if (!res
|| (int)irq
<= 0) {
274 dev_err(&pdev
->dev
, "Not enough Renesas USB platform resources.\n");
278 /* usb private data */
279 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
281 dev_err(&pdev
->dev
, "Could not allocate priv\n");
285 priv
->base
= ioremap_nocache(res
->start
, resource_size(res
));
287 dev_err(&pdev
->dev
, "ioremap error.\n");
289 goto probe_end_kfree
;
295 priv
->pfunc
= &info
->platform_callback
;
296 priv
->dparam
= &info
->driver_param
;
298 /* set driver callback functions for platform */
299 dfunc
= &info
->driver_callback
;
300 dfunc
->notify_hotplug
= usbhsc_drvcllbck_notify_hotplug
;
302 /* set default param if platform doesn't have */
303 if (!priv
->dparam
->pipe_type
) {
304 priv
->dparam
->pipe_type
= usbhsc_default_pipe_type
;
305 priv
->dparam
->pipe_size
= ARRAY_SIZE(usbhsc_default_pipe_type
);
307 if (!priv
->dparam
->pio_dma_border
)
308 priv
->dparam
->pio_dma_border
= 64; /* 64byte */
311 /* runtime power control ? */
312 if (priv
->pfunc
->get_vbus
)
313 usbhsc_flags_set(priv
, USBHSF_RUNTIME_PWCTRL
);
320 INIT_DELAYED_WORK(&priv
->notify_hotplug_work
, usbhsc_notify_hotplug
);
321 spin_lock_init(usbhs_priv_to_lock(priv
));
323 /* call pipe and module init */
324 ret
= usbhs_pipe_probe(priv
);
326 goto probe_end_iounmap
;
328 ret
= usbhs_fifo_probe(priv
);
330 goto probe_end_pipe_exit
;
332 ret
= usbhs_mod_probe(priv
);
334 goto probe_end_fifo_exit
;
336 /* dev_set_drvdata should be called after usbhs_mod_init */
337 dev_set_drvdata(&pdev
->dev
, priv
);
340 * deviece reset here because
341 * USB device might be used in boot loader.
343 usbhs_sys_clock_ctrl(priv
, 0);
348 * USB phy setup might depend on CPU/Board.
349 * If platform has its callback functions,
352 ret
= usbhs_platform_call(priv
, hardware_init
, pdev
);
354 dev_err(&pdev
->dev
, "platform prove failed.\n");
355 goto probe_end_mod_exit
;
358 /* reset phy for connection */
359 usbhs_platform_call(priv
, phy_reset
, pdev
);
362 pm_runtime_enable(&pdev
->dev
);
363 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
)) {
364 usbhsc_power_ctrl(priv
, 1);
365 usbhs_mod_autonomy_mode(priv
);
369 * manual call notify_hotplug for cold plug
371 ret
= usbhsc_drvcllbck_notify_hotplug(pdev
);
373 goto probe_end_call_remove
;
375 dev_info(&pdev
->dev
, "probed\n");
379 probe_end_call_remove
:
380 usbhs_platform_call(priv
, hardware_exit
, pdev
);
382 usbhs_mod_remove(priv
);
384 usbhs_fifo_remove(priv
);
386 usbhs_pipe_remove(priv
);
392 dev_info(&pdev
->dev
, "probe failed\n");
397 static int __devexit
usbhs_remove(struct platform_device
*pdev
)
399 struct usbhs_priv
*priv
= usbhs_pdev_to_priv(pdev
);
400 struct renesas_usbhs_platform_info
*info
= pdev
->dev
.platform_data
;
401 struct renesas_usbhs_driver_callback
*dfunc
= &info
->driver_callback
;
403 dev_dbg(&pdev
->dev
, "usb remove\n");
405 dfunc
->notify_hotplug
= NULL
;
408 if (!usbhsc_flags_has(priv
, USBHSF_RUNTIME_PWCTRL
))
409 usbhsc_power_ctrl(priv
, 0);
411 pm_runtime_disable(&pdev
->dev
);
413 usbhs_platform_call(priv
, hardware_exit
, pdev
);
414 usbhs_mod_remove(priv
);
415 usbhs_fifo_remove(priv
);
416 usbhs_pipe_remove(priv
);
423 static struct platform_driver renesas_usbhs_driver
= {
425 .name
= "renesas_usbhs",
427 .probe
= usbhs_probe
,
428 .remove
= __devexit_p(usbhs_remove
),
431 static int __init
usbhs_init(void)
433 return platform_driver_register(&renesas_usbhs_driver
);
436 static void __exit
usbhs_exit(void)
438 platform_driver_unregister(&renesas_usbhs_driver
);
441 module_init(usbhs_init
);
442 module_exit(usbhs_exit
);
444 MODULE_LICENSE("GPL");
445 MODULE_DESCRIPTION("Renesas USB driver");
446 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");