diff options
author | Felipe Balbi <balbi@ti.com> | 2011-10-08 06:17:34 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2011-10-13 13:39:55 -0400 |
commit | 2c7f098916e3eb5473724d0653eca9f446997915 (patch) | |
tree | 159aa03ea84483a2065ad15f257f907929dc82bc /drivers/usb/gadget | |
parent | 5bc639fc55b51f828b20747eb1c48a669053b1e5 (diff) |
usb: gadget: langwell: convert to new style
with this patch we can finally remove the global
"the_controller" pointer.
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r-- | drivers/usb/gadget/langwell_udc.c | 67 | ||||
-rw-r--r-- | drivers/usb/gadget/langwell_udc.h | 2 |
2 files changed, 21 insertions, 48 deletions
diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c index 444bd11d3f4b..7a133631bc2b 100644 --- a/drivers/usb/gadget/langwell_udc.c +++ b/drivers/usb/gadget/langwell_udc.c | |||
@@ -50,9 +50,6 @@ static const char driver_name[] = "langwell_udc"; | |||
50 | static const char driver_desc[] = DRIVER_DESC; | 50 | static const char driver_desc[] = DRIVER_DESC; |
51 | 51 | ||
52 | 52 | ||
53 | /* controller device global variable */ | ||
54 | static struct langwell_udc *the_controller; | ||
55 | |||
56 | /* for endpoint 0 operations */ | 53 | /* for endpoint 0 operations */ |
57 | static const struct usb_endpoint_descriptor | 54 | static const struct usb_endpoint_descriptor |
58 | langwell_ep0_desc = { | 55 | langwell_ep0_desc = { |
@@ -1311,9 +1308,12 @@ static int langwell_pullup(struct usb_gadget *_gadget, int is_on) | |||
1311 | return 0; | 1308 | return 0; |
1312 | } | 1309 | } |
1313 | 1310 | ||
1314 | static int langwell_start(struct usb_gadget_driver *driver, | 1311 | static int langwell_start(struct usb_gadget *g, |
1315 | int (*bind)(struct usb_gadget *)); | 1312 | struct usb_gadget_driver *driver); |
1316 | static int langwell_stop(struct usb_gadget_driver *driver); | 1313 | |
1314 | static int langwell_stop(struct usb_gadget *g, | ||
1315 | struct usb_gadget_driver *driver); | ||
1316 | |||
1317 | /* device controller usb_gadget_ops structure */ | 1317 | /* device controller usb_gadget_ops structure */ |
1318 | static const struct usb_gadget_ops langwell_ops = { | 1318 | static const struct usb_gadget_ops langwell_ops = { |
1319 | 1319 | ||
@@ -1335,8 +1335,8 @@ static const struct usb_gadget_ops langwell_ops = { | |||
1335 | /* D+ pullup, software-controlled connect/disconnect to USB host */ | 1335 | /* D+ pullup, software-controlled connect/disconnect to USB host */ |
1336 | .pullup = langwell_pullup, | 1336 | .pullup = langwell_pullup, |
1337 | 1337 | ||
1338 | .start = langwell_start, | 1338 | .udc_start = langwell_start, |
1339 | .stop = langwell_stop, | 1339 | .udc_stop = langwell_stop, |
1340 | }; | 1340 | }; |
1341 | 1341 | ||
1342 | 1342 | ||
@@ -1848,21 +1848,15 @@ static DEVICE_ATTR(remote_wakeup, S_IWUSR, NULL, store_remote_wakeup); | |||
1848 | * the driver might get unbound. | 1848 | * the driver might get unbound. |
1849 | */ | 1849 | */ |
1850 | 1850 | ||
1851 | static int langwell_start(struct usb_gadget_driver *driver, | 1851 | static int langwell_start(struct usb_gadget *g, |
1852 | int (*bind)(struct usb_gadget *)) | 1852 | struct usb_gadget_driver *driver) |
1853 | { | 1853 | { |
1854 | struct langwell_udc *dev = the_controller; | 1854 | struct langwell_udc *dev = gadget_to_langwell(g); |
1855 | unsigned long flags; | 1855 | unsigned long flags; |
1856 | int retval; | 1856 | int retval; |
1857 | 1857 | ||
1858 | if (!dev) | ||
1859 | return -ENODEV; | ||
1860 | |||
1861 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); | 1858 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); |
1862 | 1859 | ||
1863 | if (dev->driver) | ||
1864 | return -EBUSY; | ||
1865 | |||
1866 | spin_lock_irqsave(&dev->lock, flags); | 1860 | spin_lock_irqsave(&dev->lock, flags); |
1867 | 1861 | ||
1868 | /* hook up the driver ... */ | 1862 | /* hook up the driver ... */ |
@@ -1872,18 +1866,9 @@ static int langwell_start(struct usb_gadget_driver *driver, | |||
1872 | 1866 | ||
1873 | spin_unlock_irqrestore(&dev->lock, flags); | 1867 | spin_unlock_irqrestore(&dev->lock, flags); |
1874 | 1868 | ||
1875 | retval = bind(&dev->gadget); | ||
1876 | if (retval) { | ||
1877 | dev_dbg(&dev->pdev->dev, "bind to driver %s --> %d\n", | ||
1878 | driver->driver.name, retval); | ||
1879 | dev->driver = NULL; | ||
1880 | dev->gadget.dev.driver = NULL; | ||
1881 | return retval; | ||
1882 | } | ||
1883 | |||
1884 | retval = device_create_file(&dev->pdev->dev, &dev_attr_function); | 1869 | retval = device_create_file(&dev->pdev->dev, &dev_attr_function); |
1885 | if (retval) | 1870 | if (retval) |
1886 | goto err_unbind; | 1871 | goto err; |
1887 | 1872 | ||
1888 | dev->usb_state = USB_STATE_ATTACHED; | 1873 | dev->usb_state = USB_STATE_ATTACHED; |
1889 | dev->ep0_state = WAIT_FOR_SETUP; | 1874 | dev->ep0_state = WAIT_FOR_SETUP; |
@@ -1900,31 +1885,27 @@ static int langwell_start(struct usb_gadget_driver *driver, | |||
1900 | dev_info(&dev->pdev->dev, "register driver: %s\n", | 1885 | dev_info(&dev->pdev->dev, "register driver: %s\n", |
1901 | driver->driver.name); | 1886 | driver->driver.name); |
1902 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 1887 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
1888 | |||
1903 | return 0; | 1889 | return 0; |
1904 | 1890 | ||
1905 | err_unbind: | 1891 | err: |
1906 | driver->unbind(&dev->gadget); | ||
1907 | dev->gadget.dev.driver = NULL; | 1892 | dev->gadget.dev.driver = NULL; |
1908 | dev->driver = NULL; | 1893 | dev->driver = NULL; |
1909 | 1894 | ||
1910 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 1895 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
1896 | |||
1911 | return retval; | 1897 | return retval; |
1912 | } | 1898 | } |
1913 | 1899 | ||
1914 | /* unregister gadget driver */ | 1900 | /* unregister gadget driver */ |
1915 | static int langwell_stop(struct usb_gadget_driver *driver) | 1901 | static int langwell_stop(struct usb_gadget *g, |
1902 | struct usb_gadget_driver *driver) | ||
1916 | { | 1903 | { |
1917 | struct langwell_udc *dev = the_controller; | 1904 | struct langwell_udc *dev = gadget_to_langwell(g); |
1918 | unsigned long flags; | 1905 | unsigned long flags; |
1919 | 1906 | ||
1920 | if (!dev) | ||
1921 | return -ENODEV; | ||
1922 | |||
1923 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); | 1907 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); |
1924 | 1908 | ||
1925 | if (unlikely(!driver || !driver->unbind)) | ||
1926 | return -EINVAL; | ||
1927 | |||
1928 | /* exit PHY low power suspend */ | 1909 | /* exit PHY low power suspend */ |
1929 | if (dev->pdev->device != 0x0829) | 1910 | if (dev->pdev->device != 0x0829) |
1930 | langwell_phy_low_power(dev, 0); | 1911 | langwell_phy_low_power(dev, 0); |
@@ -1947,8 +1928,6 @@ static int langwell_stop(struct usb_gadget_driver *driver) | |||
1947 | stop_activity(dev, driver); | 1928 | stop_activity(dev, driver); |
1948 | spin_unlock_irqrestore(&dev->lock, flags); | 1929 | spin_unlock_irqrestore(&dev->lock, flags); |
1949 | 1930 | ||
1950 | /* unbind gadget driver */ | ||
1951 | driver->unbind(&dev->gadget); | ||
1952 | dev->gadget.dev.driver = NULL; | 1931 | dev->gadget.dev.driver = NULL; |
1953 | dev->driver = NULL; | 1932 | dev->driver = NULL; |
1954 | 1933 | ||
@@ -1957,6 +1936,7 @@ static int langwell_stop(struct usb_gadget_driver *driver) | |||
1957 | dev_info(&dev->pdev->dev, "unregistered driver '%s'\n", | 1936 | dev_info(&dev->pdev->dev, "unregistered driver '%s'\n", |
1958 | driver->driver.name); | 1937 | driver->driver.name); |
1959 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); | 1938 | dev_dbg(&dev->pdev->dev, "<--- %s()\n", __func__); |
1939 | |||
1960 | return 0; | 1940 | return 0; |
1961 | } | 1941 | } |
1962 | 1942 | ||
@@ -3098,8 +3078,6 @@ static void langwell_udc_remove(struct pci_dev *pdev) | |||
3098 | 3078 | ||
3099 | /* free dev, wait for the release() finished */ | 3079 | /* free dev, wait for the release() finished */ |
3100 | wait_for_completion(&done); | 3080 | wait_for_completion(&done); |
3101 | |||
3102 | the_controller = NULL; | ||
3103 | } | 3081 | } |
3104 | 3082 | ||
3105 | 3083 | ||
@@ -3118,11 +3096,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3118 | size_t size; | 3096 | size_t size; |
3119 | int retval; | 3097 | int retval; |
3120 | 3098 | ||
3121 | if (the_controller) { | ||
3122 | dev_warn(&pdev->dev, "ignoring\n"); | ||
3123 | return -EBUSY; | ||
3124 | } | ||
3125 | |||
3126 | /* alloc, and start init */ | 3099 | /* alloc, and start init */ |
3127 | dev = kzalloc(sizeof *dev, GFP_KERNEL); | 3100 | dev = kzalloc(sizeof *dev, GFP_KERNEL); |
3128 | if (dev == NULL) { | 3101 | if (dev == NULL) { |
@@ -3342,8 +3315,6 @@ static int langwell_udc_probe(struct pci_dev *pdev, | |||
3342 | "After langwell_udc_probe(), print all registers:\n"); | 3315 | "After langwell_udc_probe(), print all registers:\n"); |
3343 | print_all_registers(dev); | 3316 | print_all_registers(dev); |
3344 | 3317 | ||
3345 | the_controller = dev; | ||
3346 | |||
3347 | retval = device_register(&dev->gadget.dev); | 3318 | retval = device_register(&dev->gadget.dev); |
3348 | if (retval) | 3319 | if (retval) |
3349 | goto error; | 3320 | goto error; |
diff --git a/drivers/usb/gadget/langwell_udc.h b/drivers/usb/gadget/langwell_udc.h index 1bec66f95c36..ef79e242b7b0 100644 --- a/drivers/usb/gadget/langwell_udc.h +++ b/drivers/usb/gadget/langwell_udc.h | |||
@@ -221,3 +221,5 @@ struct langwell_udc { | |||
221 | u16 dev_status; | 221 | u16 dev_status; |
222 | }; | 222 | }; |
223 | 223 | ||
224 | #define gadget_to_langwell(g) container_of((g), struct langwell_udc, gadget) | ||
225 | |||