[U-Boot] [PATCH 15/16] usb: ohci: Add dm support

Hans de Goede hdegoede at redhat.com
Tue May 5 23:56:18 CEST 2015


Add driver-model support to the ohci code.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 drivers/usb/host/ohci-hcd.c | 84 +++++++++++++++++++++++++++++++++++++++++++++
 drivers/usb/host/ohci.h     |  7 ++++
 2 files changed, 91 insertions(+)

diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index d06d9dc..9a0313a 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -30,6 +30,8 @@
 
 #include <common.h>
 #include <asm/byteorder.h>
+#include <dm.h>
+#include <errno.h>
 
 #if defined(CONFIG_PCI_OHCI)
 # include <pci.h>
@@ -129,10 +131,12 @@ static struct pci_device_id ehci_pci_ids[] = {
 #define invalidate_dcache_iso_td(addr) invalidate_dcache_buffer(addr, 32)
 #define invalidate_dcache_hcca(addr) invalidate_dcache_buffer(addr, 256)
 
+#ifndef CONFIG_DM_USB
 /* global ohci_t */
 static ohci_t gohci;
 /* this must be aligned to a 256 byte boundary */
 struct ohci_hcca ghcca[1];
+#endif
 
 /* mapping of the OHCI CC status to error codes */
 static int cc_to_error[16] = {
@@ -1562,6 +1566,7 @@ static int submit_common_msg(ohci_t *ohci, struct usb_device *dev,
 	return 0;
 }
 
+#ifndef CONFIG_DM_USB
 /* submit routines called from usb.c */
 int submit_bulk_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 		int transfer_len)
@@ -1578,6 +1583,7 @@ int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
 	return submit_common_msg(&gohci, dev, pipe, buffer, transfer_len, NULL,
 			interval);
 }
+#endif
 
 static int _ohci_submit_control_msg(ohci_t *ohci, struct usb_device *dev,
 	unsigned long pipe, void *buffer, int transfer_len,
@@ -1830,6 +1836,8 @@ static int hc_interrupt(ohci_t *ohci)
 
 /*-------------------------------------------------------------------------*/
 
+#ifndef CONFIG_DM_USB
+
 /*-------------------------------------------------------------------------*/
 
 /* De-allocate all resources.. */
@@ -1976,3 +1984,79 @@ int submit_control_msg(struct usb_device *dev, unsigned long pipe,
 	return _ohci_submit_control_msg(&gohci, dev, pipe, buffer,
 					transfer_len, setup);
 }
+#endif
+
+#ifdef CONFIG_DM_USB
+static int ohci_submit_control_msg(struct udevice *dev, struct usb_device *udev,
+				   unsigned long pipe, void *buffer, int length,
+				   struct devrequest *setup)
+{
+	ohci_t *ohci = dev_get_priv(usb_get_bus(dev));
+
+	return _ohci_submit_control_msg(ohci, udev, pipe, buffer,
+					length, setup);
+}
+
+static int ohci_submit_bulk_msg(struct udevice *dev, struct usb_device *udev,
+				unsigned long pipe, void *buffer, int length)
+{
+	ohci_t *ohci = dev_get_priv(usb_get_bus(dev));
+
+	return submit_common_msg(ohci, udev, pipe, buffer, length, NULL, 0);
+}
+
+static int ohci_submit_int_msg(struct udevice *dev, struct usb_device *udev,
+			       unsigned long pipe, void *buffer, int length,
+			       int interval)
+{
+	ohci_t *ohci = dev_get_priv(usb_get_bus(dev));
+
+	return submit_common_msg(ohci, udev, pipe, buffer, length,
+				 NULL, interval);
+}
+
+int ohci_register(struct udevice *dev, struct ohci_regs *regs)
+{
+	struct usb_bus_priv *priv = dev_get_uclass_priv(dev);
+	ohci_t *ohci = dev_get_priv(dev);
+	u32 reg;
+
+	priv->desc_before_addr = true;
+
+	ohci->regs = regs;
+	ohci->hcca = memalign(256, sizeof(struct ohci_hcca));
+	if (!ohci->hcca)
+		return -ENOMEM;
+	memset(ohci->hcca, 0, sizeof(struct ohci_hcca));
+
+	if (hc_reset(ohci) < 0)
+		return -EIO;
+
+	if (hc_start(ohci) < 0)
+		return -EIO;
+
+	reg = ohci_readl(&regs->revision);
+	printf("USB OHCI %x.%x\n", (reg >> 4) & 0xf, reg & 0xf);
+
+	return 0;
+}
+
+int ohci_deregister(struct udevice *dev)
+{
+	ohci_t *ohci = dev_get_priv(dev);
+
+	if (hc_reset(ohci) < 0)
+		return -EIO;
+
+	/* TODO free hcca, and ohci ? */
+
+	return 0;
+}
+
+struct dm_usb_ops ohci_usb_ops = {
+	.control = ohci_submit_control_msg,
+	.bulk = ohci_submit_bulk_msg,
+	.interrupt = ohci_submit_int_msg,
+};
+
+#endif
diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
index f52b4c1..3f9869b 100644
--- a/drivers/usb/host/ohci.h
+++ b/drivers/usb/host/ohci.h
@@ -405,3 +405,10 @@ typedef struct ohci {
 
 	const char	*slot_name;
 } ohci_t;
+
+#ifdef CONFIG_DM_USB
+extern struct dm_usb_ops ohci_usb_ops;
+
+int ohci_register(struct udevice *dev, struct ohci_regs *regs);
+int ohci_deregister(struct udevice *dev);
+#endif
-- 
2.3.6



More information about the U-Boot mailing list