]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
usb: dwc3: dwc3-omap: change probe and remove to uboot init and uboot exit code
authorKishon Vijay Abraham I <kishon@ti.com>
Mon, 23 Feb 2015 13:10:09 +0000 (18:40 +0530)
committerLothar Waßmann <LW@KARO-electronics.de>
Tue, 8 Sep 2015 19:47:10 +0000 (21:47 +0200)
Removed probe and remove that are specific to linux and replaced it with
uboot init and uboot exit. These functions will be invoked from boardfile.

This will change once we have dwc3-omap driver adapted to use the uboot
driver model.

Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
drivers/usb/dwc3/dwc3-omap.c
include/dwc3-omap-uboot.h

index 31a2aa34b0f0276dcd5b9db4998b35441f8fdb1e..30d72101541d676b23f189ccc7f7bd1bfbc74c9e 100644 (file)
@@ -17,6 +17,7 @@
 #include <common.h>
 #include <malloc.h>
 #include <asm/io.h>
+#include <dwc3-omap-uboot.h>
 #include <linux/usb/dwc3-omap.h>
 #include <linux/ioport.h>
 
@@ -120,6 +121,8 @@ struct dwc3_omap {
        u32                     dma_status:1;
 };
 
+struct dwc3_omap *omap;
+
 static inline u32 dwc3_omap_readl(void __iomem *base, u32 offset)
 {
        return readl(base + offset);
@@ -278,15 +281,6 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap)
        return IRQ_HANDLED;
 }
 
-static int dwc3_omap_remove_core(struct device *dev, void *c)
-{
-       struct platform_device *pdev = to_platform_device(dev);
-
-       of_device_unregister(pdev);
-
-       return 0;
-}
-
 static void dwc3_omap_enable_irqs(struct dwc3_omap *omap)
 {
        u32                     reg;
@@ -315,12 +309,8 @@ static void dwc3_omap_disable_irqs(struct dwc3_omap *omap)
        dwc3_omap_write_irq0_set(omap, 0x00);
 }
 
-static u64 dwc3_omap_dma_mask = DMA_BIT_MASK(32);
-
 static void dwc3_omap_map_offset(struct dwc3_omap *omap)
 {
-       struct device_node      *node = omap->dev->of_node;
-
        /*
         * Differentiate between OMAP5 and AM437x.
         *
@@ -329,25 +319,21 @@ static void dwc3_omap_map_offset(struct dwc3_omap *omap)
         *
         * Using dt compatible to differentiate AM437x.
         */
-       if (of_device_is_compatible(node, "ti,am437x-dwc3")) {
-               omap->irq_eoi_offset = USBOTGSS_EOI_OFFSET;
-               omap->irq0_offset = USBOTGSS_IRQ0_OFFSET;
-               omap->irqmisc_offset = USBOTGSS_IRQMISC_OFFSET;
-               omap->utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET;
-               omap->debug_offset = USBOTGSS_DEBUG_OFFSET;
-       }
+#ifdef CONFIG_AM43XX
+       omap->irq_eoi_offset = USBOTGSS_EOI_OFFSET;
+       omap->irq0_offset = USBOTGSS_IRQ0_OFFSET;
+       omap->irqmisc_offset = USBOTGSS_IRQMISC_OFFSET;
+       omap->utmi_otg_offset = USBOTGSS_UTMI_OTG_OFFSET;
+       omap->debug_offset = USBOTGSS_DEBUG_OFFSET;
+#endif
 }
 
-static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap)
+static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap, int utmi_mode)
 {
        u32                     reg;
-       struct device_node      *node = omap->dev->of_node;
-       int                     utmi_mode = 0;
 
        reg = dwc3_omap_read_utmi_status(omap);
 
-       of_property_read_u32(node, "utmi-mode", &utmi_mode);
-
        switch (utmi_mode) {
        case DWC3_OMAP_UTMI_MODE_SW:
                reg |= USBOTGSS_UTMI_OTG_STATUS_SW_MODE;
@@ -362,95 +348,59 @@ static void dwc3_omap_set_utmi_mode(struct dwc3_omap *omap)
        dwc3_omap_write_utmi_status(omap, reg);
 }
 
-static int dwc3_omap_probe(struct platform_device *pdev)
+/**
+ * dwc3_omap_uboot_init - dwc3 omap uboot initialization code
+ * @dev: struct dwc3_omap_device containing initialization data
+ *
+ * Entry point for dwc3 omap driver (equivalent to dwc3_omap_probe in linux
+ * kernel driver). Pointer to dwc3_omap_device should be passed containing
+ * base address and other initialization data. Returns '0' on success and
+ * a negative value on failure.
+ *
+ * Generally called from board_usb_init() implemented in board file.
+ */
+int dwc3_omap_uboot_init(struct dwc3_omap_device *omap_dev)
 {
-       struct device_node      *node = pdev->dev.of_node;
-
-       struct dwc3_omap        *omap;
-       struct resource         *res;
-       struct device           *dev = &pdev->dev;
-
-       int                     ret;
        u32                     reg;
-
-       void __iomem            *base;
-
-       if (!node) {
-               dev_err(dev, "device node not found\n");
-               return -EINVAL;
-       }
+       struct device           *dev;
 
        omap = devm_kzalloc(dev, sizeof(*omap), GFP_KERNEL);
        if (!omap)
                return -ENOMEM;
 
-       platform_set_drvdata(pdev, omap);
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(base))
-               return PTR_ERR(base);
-
-       omap->dev       = dev;
-       omap->base      = base;
-       dev->dma_mask   = &dwc3_omap_dma_mask;
+       omap->base      = omap_dev->base;
 
        dwc3_omap_map_offset(omap);
-       dwc3_omap_set_utmi_mode(omap);
+       dwc3_omap_set_utmi_mode(omap, omap_dev->utmi_mode);
 
        /* check the DMA Status */
        reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG);
        omap->dma_status = !!(reg & USBOTGSS_SYSCONFIG_DMADISABLE);
 
-       dwc3_omap_enable_irqs(omap);
+       dwc3_omap_set_mailbox(omap, omap_dev->vbus_id_status);
 
-       ret = of_platform_populate(node, NULL, NULL, dev);
-       if (ret) {
-               dev_err(&pdev->dev, "failed to create dwc3 core\n");
-               goto err1;
-       }
+       dwc3_omap_enable_irqs(omap);
 
        return 0;
-
-err1:
-       dwc3_omap_disable_irqs(omap);
-
-err0:
-       return ret;
 }
 
-static int dwc3_omap_remove(struct platform_device *pdev)
+/**
+ * dwc3_omap_uboot_exit - dwc3 omap uboot cleanup code
+ * @index: index of this controller
+ *
+ * Performs cleanup of memory allocated in dwc3_omap_uboot_init
+ * (equivalent to dwc3_omap_remove in linux).
+ *
+ * Generally called from board file.
+ */
+void dwc3_omap_uboot_exit(void)
 {
-       struct dwc3_omap        *omap = platform_get_drvdata(pdev);
-
        dwc3_omap_disable_irqs(omap);
-       device_for_each_child(&pdev->dev, NULL, dwc3_omap_remove_core);
+       kfree(omap);
 
        return 0;
 }
 
-static const struct of_device_id of_dwc3_match[] = {
-       {
-               .compatible =   "ti,dwc3"
-       },
-       {
-               .compatible =   "ti,am437x-dwc3"
-       },
-       { },
-};
-MODULE_DEVICE_TABLE(of, of_dwc3_match);
-
-static struct platform_driver dwc3_omap_driver = {
-       .probe          = dwc3_omap_probe,
-       .remove         = dwc3_omap_remove,
-       .driver         = {
-               .name   = "omap-dwc3",
-               .of_match_table = of_dwc3_match,
-       },
-};
-
-module_platform_driver(dwc3_omap_driver);
-
 MODULE_ALIAS("platform:omap-dwc3");
 MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
 MODULE_LICENSE("GPL v2");
index b313b644392cac160339761e7c5102fd72b04554..99f8f38f22cbb318c5e898641e63d2e5d5589c01 100644 (file)
@@ -24,4 +24,7 @@ struct dwc3_omap_device {
        enum dwc3_omap_utmi_mode utmi_mode;
        enum omap_dwc3_vbus_id_status vbus_id_status;
 };
+
+int dwc3_omap_uboot_init(struct dwc3_omap_device *dev);
+void dwc3_omap_uboot_exit(void);
 #endif /* __DWC3_OMAP_UBOOT_H_ */