]> Pileus Git - ~andy/linux/blob - drivers/usb/renesas_usbhs/common.c
38249da8e7b21c5557d4b092d749c2e96fb0b7dd
[~andy/linux] / drivers / usb / renesas_usbhs / common.c
1 /*
2  * Renesas USB driver
3  *
4  * Copyright (C) 2011 Renesas Solutions Corp.
5  * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6  *
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.
11  *
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
15  *
16  */
17 #include <linux/io.h>
18 #include <linux/module.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/slab.h>
21 #include <linux/sysfs.h>
22 #include "./common.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 #define USBHSF_RUNTIME_PWCTRL   (1 << 0)
48
49 /* status */
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))
54
55 /*
56  * platform call back
57  *
58  * renesas usb support platform callback function.
59  * Below macro call it.
60  * if platform doesn't have callback, it return 0 (no error)
61  */
62 #define usbhs_platform_call(priv, func, args...)\
63         (!(priv) ? -ENODEV :                    \
64          !((priv)->pfunc.func) ? 0 :            \
65          (priv)->pfunc.func(args))
66
67 /*
68  *              common functions
69  */
70 u16 usbhs_read(struct usbhs_priv *priv, u32 reg)
71 {
72         return ioread16(priv->base + reg);
73 }
74
75 void usbhs_write(struct usbhs_priv *priv, u32 reg, u16 data)
76 {
77         iowrite16(data, priv->base + reg);
78 }
79
80 void usbhs_bset(struct usbhs_priv *priv, u32 reg, u16 mask, u16 data)
81 {
82         u16 val = usbhs_read(priv, reg);
83
84         val &= ~mask;
85         val |= data & mask;
86
87         usbhs_write(priv, reg, val);
88 }
89
90 struct usbhs_priv *usbhs_pdev_to_priv(struct platform_device *pdev)
91 {
92         return dev_get_drvdata(&pdev->dev);
93 }
94
95 /*
96  *              syscfg functions
97  */
98 void usbhs_sys_clock_ctrl(struct usbhs_priv *priv, int enable)
99 {
100         usbhs_bset(priv, SYSCFG, SCKE, enable ? SCKE : 0);
101 }
102
103 void usbhs_sys_usb_ctrl(struct usbhs_priv *priv, int enable)
104 {
105         usbhs_bset(priv, SYSCFG, USBE, enable ? USBE : 0);
106 }
107
108 void usbhs_sys_host_ctrl(struct usbhs_priv *priv, int enable)
109 {
110         u16 mask = DCFM | DRPD | DPRPU | HSE;
111         u16 val  = DCFM | DRPD | HSE;
112         int has_otg = usbhs_get_dparam(priv, has_otg);
113
114         if (has_otg)
115                 usbhs_bset(priv, DVSTCTR, (EXTLP | PWEN), (EXTLP | PWEN));
116
117         /*
118          * if enable
119          *
120          * - select Host mode
121          * - D+ Line/D- Line Pull-down
122          */
123         usbhs_bset(priv, SYSCFG, mask, enable ? val : 0);
124 }
125
126 void usbhs_sys_function_ctrl(struct usbhs_priv *priv, int enable)
127 {
128         u16 mask = DCFM | DRPD | DPRPU | HSE;
129         u16 val  = DPRPU | HSE;
130
131         /*
132          * if enable
133          *
134          * - select Function mode
135          * - D+ Line Pull-up
136          */
137         usbhs_bset(priv, SYSCFG, mask, enable ? val : 0);
138 }
139
140 /*
141  *              frame functions
142  */
143 int usbhs_frame_get_num(struct usbhs_priv *priv)
144 {
145         return usbhs_read(priv, FRMNUM) & FRNM_MASK;
146 }
147
148 /*
149  *              usb request functions
150  */
151 void usbhs_usbreq_get_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req)
152 {
153         u16 val;
154
155         val = usbhs_read(priv, USBREQ);
156         req->bRequest           = (val >> 8) & 0xFF;
157         req->bRequestType       = (val >> 0) & 0xFF;
158
159         req->wValue     = usbhs_read(priv, USBVAL);
160         req->wIndex     = usbhs_read(priv, USBINDX);
161         req->wLength    = usbhs_read(priv, USBLENG);
162 }
163
164 void usbhs_usbreq_set_val(struct usbhs_priv *priv, struct usb_ctrlrequest *req)
165 {
166         usbhs_write(priv, USBREQ,  (req->bRequest << 8) | req->bRequestType);
167         usbhs_write(priv, USBVAL,  req->wValue);
168         usbhs_write(priv, USBINDX, req->wIndex);
169         usbhs_write(priv, USBLENG, req->wLength);
170
171         usbhs_bset(priv, DCPCTR, SUREQ, SUREQ);
172 }
173
174 /*
175  *              bus/vbus functions
176  */
177 void usbhs_bus_send_sof_enable(struct usbhs_priv *priv)
178 {
179         u16 status = usbhs_read(priv, DVSTCTR) & (USBRST | UACT);
180
181         if (status != USBRST) {
182                 struct device *dev = usbhs_priv_to_dev(priv);
183                 dev_err(dev, "usbhs should be reset\n");
184         }
185
186         usbhs_bset(priv, DVSTCTR, (USBRST | UACT), UACT);
187 }
188
189 void usbhs_bus_send_reset(struct usbhs_priv *priv)
190 {
191         usbhs_bset(priv, DVSTCTR, (USBRST | UACT), USBRST);
192 }
193
194 int usbhs_bus_get_speed(struct usbhs_priv *priv)
195 {
196         u16 dvstctr = usbhs_read(priv, DVSTCTR);
197
198         switch (RHST & dvstctr) {
199         case RHST_LOW_SPEED:
200                 return USB_SPEED_LOW;
201         case RHST_FULL_SPEED:
202                 return USB_SPEED_FULL;
203         case RHST_HIGH_SPEED:
204                 return USB_SPEED_HIGH;
205         }
206
207         return USB_SPEED_UNKNOWN;
208 }
209
210 int usbhs_vbus_ctrl(struct usbhs_priv *priv, int enable)
211 {
212         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
213
214         return usbhs_platform_call(priv, set_vbus, pdev, enable);
215 }
216
217 static void usbhsc_bus_init(struct usbhs_priv *priv)
218 {
219         usbhs_write(priv, DVSTCTR, 0);
220
221         usbhs_vbus_ctrl(priv, 0);
222 }
223
224 /*
225  *              device configuration
226  */
227 int usbhs_set_device_speed(struct usbhs_priv *priv, int devnum,
228                            u16 upphub, u16 hubport, u16 speed)
229 {
230         struct device *dev = usbhs_priv_to_dev(priv);
231         u16 usbspd = 0;
232         u32 reg = DEVADD0 + (2 * devnum);
233
234         if (devnum > 10) {
235                 dev_err(dev, "cannot set speed to unknown device %d\n", devnum);
236                 return -EIO;
237         }
238
239         if (upphub > 0xA) {
240                 dev_err(dev, "unsupported hub number %d\n", upphub);
241                 return -EIO;
242         }
243
244         switch (speed) {
245         case USB_SPEED_LOW:
246                 usbspd = USBSPD_SPEED_LOW;
247                 break;
248         case USB_SPEED_FULL:
249                 usbspd = USBSPD_SPEED_FULL;
250                 break;
251         case USB_SPEED_HIGH:
252                 usbspd = USBSPD_SPEED_HIGH;
253                 break;
254         default:
255                 dev_err(dev, "unsupported speed %d\n", speed);
256                 return -EIO;
257         }
258
259         usbhs_write(priv, reg,  UPPHUB(upphub)  |
260                                 HUBPORT(hubport)|
261                                 USBSPD(usbspd));
262
263         return 0;
264 }
265
266 /*
267  *              local functions
268  */
269 static void usbhsc_set_buswait(struct usbhs_priv *priv)
270 {
271         int wait = usbhs_get_dparam(priv, buswait_bwait);
272
273         /* set bus wait if platform have */
274         if (wait)
275                 usbhs_bset(priv, BUSWAIT, 0x000F, wait);
276 }
277
278 /*
279  *              platform default param
280  */
281 static u32 usbhsc_default_pipe_type[] = {
282                 USB_ENDPOINT_XFER_CONTROL,
283                 USB_ENDPOINT_XFER_ISOC,
284                 USB_ENDPOINT_XFER_ISOC,
285                 USB_ENDPOINT_XFER_BULK,
286                 USB_ENDPOINT_XFER_BULK,
287                 USB_ENDPOINT_XFER_BULK,
288                 USB_ENDPOINT_XFER_INT,
289                 USB_ENDPOINT_XFER_INT,
290                 USB_ENDPOINT_XFER_INT,
291                 USB_ENDPOINT_XFER_INT,
292 };
293
294 /*
295  *              power control
296  */
297 static void usbhsc_power_ctrl(struct usbhs_priv *priv, int enable)
298 {
299         struct device *dev = usbhs_priv_to_dev(priv);
300
301         if (enable) {
302                 /* enable PM */
303                 pm_runtime_get_sync(dev);
304
305                 /* USB on */
306                 usbhs_sys_clock_ctrl(priv, enable);
307         } else {
308                 /* USB off */
309                 usbhs_sys_clock_ctrl(priv, enable);
310
311                 /* disable PM */
312                 pm_runtime_put_sync(dev);
313         }
314 }
315
316 /*
317  *              hotplug
318  */
319 static void usbhsc_hotplug(struct usbhs_priv *priv)
320 {
321         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
322         struct usbhs_mod *mod = usbhs_mod_get_current(priv);
323         int id;
324         int enable;
325         int ret;
326
327         /*
328          * get vbus status from platform
329          */
330         enable = usbhs_platform_call(priv, get_vbus, pdev);
331
332         /*
333          * get id from platform
334          */
335         id = usbhs_platform_call(priv, get_id, pdev);
336
337         if (enable && !mod) {
338                 ret = usbhs_mod_change(priv, id);
339                 if (ret < 0)
340                         return;
341
342                 dev_dbg(&pdev->dev, "%s enable\n", __func__);
343
344                 /* power on */
345                 if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
346                         usbhsc_power_ctrl(priv, enable);
347
348                 /* bus init */
349                 usbhsc_set_buswait(priv);
350                 usbhsc_bus_init(priv);
351
352                 /* module start */
353                 usbhs_mod_call(priv, start, priv);
354
355         } else if (!enable && mod) {
356                 dev_dbg(&pdev->dev, "%s disable\n", __func__);
357
358                 /* module stop */
359                 usbhs_mod_call(priv, stop, priv);
360
361                 /* bus init */
362                 usbhsc_bus_init(priv);
363
364                 /* power off */
365                 if (usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
366                         usbhsc_power_ctrl(priv, enable);
367
368                 usbhs_mod_change(priv, -1);
369
370                 /* reset phy for next connection */
371                 usbhs_platform_call(priv, phy_reset, pdev);
372         }
373 }
374
375 /*
376  *              notify hotplug
377  */
378 static void usbhsc_notify_hotplug(struct work_struct *work)
379 {
380         struct usbhs_priv *priv = container_of(work,
381                                                struct usbhs_priv,
382                                                notify_hotplug_work.work);
383         usbhsc_hotplug(priv);
384 }
385
386 int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev)
387 {
388         struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
389         int delay = usbhs_get_dparam(priv, detection_delay);
390
391         /*
392          * This functions will be called in interrupt.
393          * To make sure safety context,
394          * use workqueue for usbhs_notify_hotplug
395          */
396         schedule_delayed_work(&priv->notify_hotplug_work, delay);
397         return 0;
398 }
399
400 /*
401  *              platform functions
402  */
403 static int usbhs_probe(struct platform_device *pdev)
404 {
405         struct renesas_usbhs_platform_info *info = pdev->dev.platform_data;
406         struct renesas_usbhs_driver_callback *dfunc;
407         struct usbhs_priv *priv;
408         struct resource *res;
409         unsigned int irq;
410         int ret;
411
412         /* check platform information */
413         if (!info ||
414             !info->platform_callback.get_id) {
415                 dev_err(&pdev->dev, "no platform information\n");
416                 return -EINVAL;
417         }
418
419         /* platform data */
420         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
421         irq = platform_get_irq(pdev, 0);
422         if (!res || (int)irq <= 0) {
423                 dev_err(&pdev->dev, "Not enough Renesas USB platform resources.\n");
424                 return -ENODEV;
425         }
426
427         /* usb private data */
428         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
429         if (!priv) {
430                 dev_err(&pdev->dev, "Could not allocate priv\n");
431                 return -ENOMEM;
432         }
433
434         priv->base = ioremap_nocache(res->start, resource_size(res));
435         if (!priv->base) {
436                 dev_err(&pdev->dev, "ioremap error.\n");
437                 ret = -ENOMEM;
438                 goto probe_end_kfree;
439         }
440
441         /*
442          * care platform info
443          */
444         memcpy(&priv->pfunc,
445                &info->platform_callback,
446                sizeof(struct renesas_usbhs_platform_callback));
447         memcpy(&priv->dparam,
448                &info->driver_param,
449                sizeof(struct renesas_usbhs_driver_param));
450
451         /* set driver callback functions for platform */
452         dfunc                   = &info->driver_callback;
453         dfunc->notify_hotplug   = usbhsc_drvcllbck_notify_hotplug;
454
455         /* set default param if platform doesn't have */
456         if (!priv->dparam.pipe_type) {
457                 priv->dparam.pipe_type = usbhsc_default_pipe_type;
458                 priv->dparam.pipe_size = ARRAY_SIZE(usbhsc_default_pipe_type);
459         }
460         if (!priv->dparam.pio_dma_border)
461                 priv->dparam.pio_dma_border = 64; /* 64byte */
462
463         /* FIXME */
464         /* runtime power control ? */
465         if (priv->pfunc.get_vbus)
466                 usbhsc_flags_set(priv, USBHSF_RUNTIME_PWCTRL);
467
468         /*
469          * priv settings
470          */
471         priv->irq       = irq;
472         priv->pdev      = pdev;
473         INIT_DELAYED_WORK(&priv->notify_hotplug_work, usbhsc_notify_hotplug);
474         spin_lock_init(usbhs_priv_to_lock(priv));
475
476         /* call pipe and module init */
477         ret = usbhs_pipe_probe(priv);
478         if (ret < 0)
479                 goto probe_end_iounmap;
480
481         ret = usbhs_fifo_probe(priv);
482         if (ret < 0)
483                 goto probe_end_pipe_exit;
484
485         ret = usbhs_mod_probe(priv);
486         if (ret < 0)
487                 goto probe_end_fifo_exit;
488
489         /* dev_set_drvdata should be called after usbhs_mod_init */
490         dev_set_drvdata(&pdev->dev, priv);
491
492         /*
493          * deviece reset here because
494          * USB device might be used in boot loader.
495          */
496         usbhs_sys_clock_ctrl(priv, 0);
497
498         /*
499          * platform call
500          *
501          * USB phy setup might depend on CPU/Board.
502          * If platform has its callback functions,
503          * call it here.
504          */
505         ret = usbhs_platform_call(priv, hardware_init, pdev);
506         if (ret < 0) {
507                 dev_err(&pdev->dev, "platform prove failed.\n");
508                 goto probe_end_mod_exit;
509         }
510
511         /* reset phy for connection */
512         usbhs_platform_call(priv, phy_reset, pdev);
513
514         /* power control */
515         pm_runtime_enable(&pdev->dev);
516         if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) {
517                 usbhsc_power_ctrl(priv, 1);
518                 usbhs_mod_autonomy_mode(priv);
519         }
520
521         /*
522          * manual call notify_hotplug for cold plug
523          */
524         ret = usbhsc_drvcllbck_notify_hotplug(pdev);
525         if (ret < 0)
526                 goto probe_end_call_remove;
527
528         dev_info(&pdev->dev, "probed\n");
529
530         return ret;
531
532 probe_end_call_remove:
533         usbhs_platform_call(priv, hardware_exit, pdev);
534 probe_end_mod_exit:
535         usbhs_mod_remove(priv);
536 probe_end_fifo_exit:
537         usbhs_fifo_remove(priv);
538 probe_end_pipe_exit:
539         usbhs_pipe_remove(priv);
540 probe_end_iounmap:
541         iounmap(priv->base);
542 probe_end_kfree:
543         kfree(priv);
544
545         dev_info(&pdev->dev, "probe failed\n");
546
547         return ret;
548 }
549
550 static int __devexit usbhs_remove(struct platform_device *pdev)
551 {
552         struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev);
553         struct renesas_usbhs_platform_info *info = pdev->dev.platform_data;
554         struct renesas_usbhs_driver_callback *dfunc = &info->driver_callback;
555
556         dev_dbg(&pdev->dev, "usb remove\n");
557
558         dfunc->notify_hotplug = NULL;
559
560         /* power off */
561         if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
562                 usbhsc_power_ctrl(priv, 0);
563
564         pm_runtime_disable(&pdev->dev);
565
566         usbhs_platform_call(priv, hardware_exit, pdev);
567         usbhs_mod_remove(priv);
568         usbhs_fifo_remove(priv);
569         usbhs_pipe_remove(priv);
570         iounmap(priv->base);
571         kfree(priv);
572
573         return 0;
574 }
575
576 static int usbhsc_suspend(struct device *dev)
577 {
578         struct usbhs_priv *priv = dev_get_drvdata(dev);
579         struct usbhs_mod *mod = usbhs_mod_get_current(priv);
580
581         if (mod) {
582                 usbhs_mod_call(priv, stop, priv);
583                 usbhs_mod_change(priv, -1);
584         }
585
586         if (mod || !usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
587                 usbhsc_power_ctrl(priv, 0);
588
589         return 0;
590 }
591
592 static int usbhsc_resume(struct device *dev)
593 {
594         struct usbhs_priv *priv = dev_get_drvdata(dev);
595         struct platform_device *pdev = usbhs_priv_to_pdev(priv);
596
597         usbhs_platform_call(priv, phy_reset, pdev);
598
599         if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL))
600                 usbhsc_power_ctrl(priv, 1);
601
602         usbhsc_hotplug(priv);
603
604         return 0;
605 }
606
607 static int usbhsc_runtime_nop(struct device *dev)
608 {
609         /* Runtime PM callback shared between ->runtime_suspend()
610          * and ->runtime_resume(). Simply returns success.
611          *
612          * This driver re-initializes all registers after
613          * pm_runtime_get_sync() anyway so there is no need
614          * to save and restore registers here.
615          */
616         return 0;
617 }
618
619 static const struct dev_pm_ops usbhsc_pm_ops = {
620         .suspend                = usbhsc_suspend,
621         .resume                 = usbhsc_resume,
622         .runtime_suspend        = usbhsc_runtime_nop,
623         .runtime_resume         = usbhsc_runtime_nop,
624 };
625
626 static struct platform_driver renesas_usbhs_driver = {
627         .driver         = {
628                 .name   = "renesas_usbhs",
629                 .pm     = &usbhsc_pm_ops,
630         },
631         .probe          = usbhs_probe,
632         .remove         = __devexit_p(usbhs_remove),
633 };
634
635 static int __init usbhs_init(void)
636 {
637         return platform_driver_register(&renesas_usbhs_driver);
638 }
639
640 static void __exit usbhs_exit(void)
641 {
642         platform_driver_unregister(&renesas_usbhs_driver);
643 }
644
645 module_init(usbhs_init);
646 module_exit(usbhs_exit);
647
648 MODULE_LICENSE("GPL");
649 MODULE_DESCRIPTION("Renesas USB driver");
650 MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");