usb: isp1760: Fix indentation in probe error path
[cascardo/linux.git] / drivers / usb / host / isp1760-hcd.c
index e752c30..aa894a1 100644 (file)
@@ -11,6 +11,7 @@
  * (c) 2011 Arvid Brodin <arvid.brodin@enea.com>
  *
  */
+#include <linux/gpio/consumer.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -24,7 +25,6 @@
 #include <linux/timer.h>
 #include <asm/unaligned.h>
 #include <asm/cacheflush.h>
-#include <linux/gpio.h>
 
 #include "isp1760-hcd.h"
 
@@ -57,9 +57,12 @@ struct isp1760_hcd {
        unsigned long           next_statechange;
        unsigned int            devflags;
 
-       int                     rst_gpio;
+       struct gpio_desc        *rst_gpio;
 };
 
+typedef void (packet_enqueue)(struct usb_hcd *hcd, struct isp1760_qh *qh,
+               struct isp1760_qtd *qtd);
+
 static inline struct isp1760_hcd *hcd_to_priv(struct usb_hcd *hcd)
 {
        return (struct isp1760_hcd *) (hcd->hcd_priv);
@@ -444,15 +447,10 @@ static int isp1760_hc_setup(struct usb_hcd *hcd)
        u32 scratch, hwmode;
 
        /* low-level chip reset */
-       if (gpio_is_valid(priv->rst_gpio)) {
-               unsigned int rst_lvl;
-
-               rst_lvl = (priv->devflags &
-                          ISP1760_FLAG_RESET_ACTIVE_HIGH) ? 1 : 0;
-
-               gpio_set_value(priv->rst_gpio, rst_lvl);
+       if (priv->rst_gpio) {
+               gpiod_set_value_cansleep(priv->rst_gpio, 1);
                mdelay(50);
-               gpio_set_value(priv->rst_gpio, !rst_lvl);
+               gpiod_set_value_cansleep(priv->rst_gpio, 0);
        }
 
        /* Setup HW Mode Control: This assumes a level active-low interrupt */
@@ -1739,7 +1737,7 @@ static int isp1760_hub_status_data(struct usb_hcd *hcd, char *buf)
        int retval = 1;
        unsigned long flags;
 
-       /* if !PM_RUNTIME, root hub timers won't get shut down ... */
+       /* if !PM, root hub timers won't get shut down ... */
        if (!HC_IS_RUNNING(hcd->state))
                return 0;
 
@@ -2213,29 +2211,33 @@ void deinit_kmem_cache(void)
        kmem_cache_destroy(urb_listitem_cachep);
 }
 
-struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
-                                int irq, unsigned long irqflags,
-                                int rst_gpio,
-                                struct device *dev, const char *busname,
-                                unsigned int devflags)
+int isp1760_register(phys_addr_t res_start, resource_size_t res_len, int irq,
+                    unsigned long irqflags, struct device *dev,
+                    const char *busname, unsigned int devflags)
 {
        struct usb_hcd *hcd;
        struct isp1760_hcd *priv;
        int ret;
 
        if (usb_disabled())
-               return ERR_PTR(-ENODEV);
+               return -ENODEV;
 
        /* prevent usb-core allocating DMA pages */
        dev->dma_mask = NULL;
 
        hcd = usb_create_hcd(&isp1760_hc_driver, dev, dev_name(dev));
        if (!hcd)
-               return ERR_PTR(-ENOMEM);
+               return -ENOMEM;
 
        priv = hcd_to_priv(hcd);
        priv->devflags = devflags;
-       priv->rst_gpio = rst_gpio;
+
+       priv->rst_gpio = devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH);
+       if (IS_ERR(priv->rst_gpio)) {
+               ret = PTR_ERR(priv->rst_gpio);
+               goto err_put;
+       }
+
        init_memory(priv);
        hcd->regs = ioremap(res_start, res_len);
        if (!hcd->regs) {
@@ -2252,15 +2254,27 @@ struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
                goto err_unmap;
        device_wakeup_enable(hcd->self.controller);
 
-       return hcd;
+       dev_set_drvdata(dev, hcd);
+
+       return 0;
 
 err_unmap:
-        iounmap(hcd->regs);
+       iounmap(hcd->regs);
 
 err_put:
-        usb_put_hcd(hcd);
+       usb_put_hcd(hcd);
+
+       return ret;
+}
+
+void isp1760_unregister(struct device *dev)
+{
+       struct usb_hcd *hcd = dev_get_drvdata(dev);
 
-        return ERR_PTR(ret);
+       usb_remove_hcd(hcd);
+       iounmap(hcd->regs);
+       release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
+       usb_put_hcd(hcd);
 }
 
 MODULE_DESCRIPTION("Driver for the ISP1760 USB-controller from NXP");