Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * OHCI HCD (Host Controller Driver) for USB.
  3  *
  4  * Copyright (C) 2008 Renesas Solutions Corp.
  5  *
  6  * Author : Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
  7  *
  8  * This program is free software; you can redistribute it and/or modify
  9  * it under the terms of the GNU General Public License as published by
 10  * the Free Software Foundation; version 2 of the License.
 11  *
 12  * This program is distributed in the hope that it will be useful,
 13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 15  * GNU General Public License for more details.
 16  *
 17  * You should have received a copy of the GNU General Public License
 18  * along with this program; if not, write to the Free Software
 19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 20  *
 21  */
 22 
 23 #include <linux/platform_device.h>
 24 
 25 static int ohci_sh_start(struct usb_hcd *hcd)
 26 {
 27         struct ohci_hcd *ohci = hcd_to_ohci(hcd);
 28 
 29         ohci_hcd_init(ohci);
 30         ohci_init(ohci);
 31         ohci_run(ohci);
 32         hcd->state = HC_STATE_RUNNING;
 33         return 0;
 34 }
 35 
 36 static const struct hc_driver ohci_sh_hc_driver = {
 37         .description =          hcd_name,
 38         .product_desc =         "SuperH OHCI",
 39         .hcd_priv_size =        sizeof(struct ohci_hcd),
 40 
 41         /*
 42          * generic hardware linkage
 43          */
 44         .irq =                  ohci_irq,
 45         .flags =                HCD_USB11 | HCD_MEMORY,
 46 
 47         /*
 48          * basic lifecycle operations
 49          */
 50         .start =                ohci_sh_start,
 51         .stop =                 ohci_stop,
 52         .shutdown =             ohci_shutdown,
 53 
 54         /*
 55          * managing i/o requests and associated device resources
 56          */
 57         .urb_enqueue =          ohci_urb_enqueue,
 58         .urb_dequeue =          ohci_urb_dequeue,
 59         .endpoint_disable =     ohci_endpoint_disable,
 60 
 61         /*
 62          * scheduling support
 63          */
 64         .get_frame_number =     ohci_get_frame,
 65 
 66         /*
 67          * root hub support
 68          */
 69         .hub_status_data =      ohci_hub_status_data,
 70         .hub_control =          ohci_hub_control,
 71         .hub_irq_enable =       ohci_rhsc_enable,
 72 #ifdef  CONFIG_PM
 73         .bus_suspend =          ohci_bus_suspend,
 74         .bus_resume =           ohci_bus_resume,
 75 #endif
 76         .start_port_reset =     ohci_start_port_reset,
 77 };
 78 
 79 /*-------------------------------------------------------------------------*/
 80 
 81 #define resource_len(r) (((r)->end - (r)->start) + 1)
 82 static int ohci_hcd_sh_probe(struct platform_device *pdev)
 83 {
 84         struct resource *res = NULL;
 85         struct usb_hcd *hcd = NULL;
 86         int irq = -1;
 87         int ret;
 88 
 89         if (usb_disabled())
 90                 return -ENODEV;
 91 
 92         res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 93         if (!res) {
 94                 err("platform_get_resource error.");
 95                 return -ENODEV;
 96         }
 97 
 98         irq = platform_get_irq(pdev, 0);
 99         if (irq < 0) {
100                 err("platform_get_irq error.");
101                 return -ENODEV;
102         }
103 
104         /* initialize hcd */
105         hcd = usb_create_hcd(&ohci_sh_hc_driver, &pdev->dev, (char *)hcd_name);
106         if (!hcd) {
107                 err("Failed to create hcd");
108                 return -ENOMEM;
109         }
110 
111         hcd->regs = (void __iomem *)res->start;
112         hcd->rsrc_start = res->start;
113         hcd->rsrc_len = resource_len(res);
114         ret = usb_add_hcd(hcd, irq, IRQF_DISABLED);
115         if (ret != 0) {
116                 err("Failed to add hcd");
117                 usb_put_hcd(hcd);
118                 return ret;
119         }
120 
121         return ret;
122 }
123 
124 static int ohci_hcd_sh_remove(struct platform_device *pdev)
125 {
126         struct usb_hcd *hcd = platform_get_drvdata(pdev);
127 
128         usb_remove_hcd(hcd);
129         usb_put_hcd(hcd);
130 
131         return 0;
132 }
133 
134 static struct platform_driver ohci_hcd_sh_driver = {
135         .probe          = ohci_hcd_sh_probe,
136         .remove         = ohci_hcd_sh_remove,
137         .shutdown       = usb_hcd_platform_shutdown,
138         .driver         = {
139                 .name   = "sh_ohci",
140                 .owner  = THIS_MODULE,
141         },
142 };
143 
144 MODULE_ALIAS("platform:sh_ohci");
145 
  This page was automatically generated by the LXR engine.