* (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>
#include <linux/timer.h>
#include <asm/unaligned.h>
#include <asm/cacheflush.h>
-#include <linux/gpio.h>
#include "isp1760-hcd.h"
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);
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 */
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;
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) {
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");