]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
usb: chipidea: usbmisc: add mx53 support
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Sat, 30 Mar 2013 10:54:00 +0000 (12:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 30 Mar 2013 15:13:58 +0000 (08:13 -0700)
This adds mx53 as the next user of the usbmisc driver and makes it
possible to disable the overcurrent-detection of the internal phy.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
[Alex: fixed another set of line-too-long and void pointer cast]
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/usbmisc_imx.c

index 08b046f9491be1534bd0b4aed048a002d8c3eada..746013d7d391f49b989a1cd02521c09c28412351 100644 (file)
 
 #define USB_DEV_MAX 4
 
+#define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08
+#define MX53_USB_UH2_CTRL_OFFSET       0x14
+#define MX53_USB_UH3_CTRL_OFFSET       0x18
+#define MX53_BM_OVER_CUR_DIS_H1                BIT(5)
+#define MX53_BM_OVER_CUR_DIS_OTG       BIT(8)
+#define MX53_BM_OVER_CUR_DIS_UHx       BIT(30)
+
 #define MX6_BM_OVER_CUR_DIS            BIT(7)
 
 struct imx_usbmisc {
@@ -52,6 +59,45 @@ static struct usbmisc_usb_device *get_usbdev(struct device *dev)
        return &usbmisc->usbdev[i];
 }
 
+static int usbmisc_imx53_init(struct device *dev)
+{
+       struct usbmisc_usb_device *usbdev;
+       void __iomem *reg = NULL;
+       unsigned long flags;
+       u32 val = 0;
+
+       usbdev = get_usbdev(dev);
+       if (IS_ERR(usbdev))
+               return PTR_ERR(usbdev);
+
+       if (usbdev->disable_oc) {
+               spin_lock_irqsave(&usbmisc->lock, flags);
+               switch (usbdev->index) {
+               case 0:
+                       reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
+                       val = readl(reg) | MX53_BM_OVER_CUR_DIS_OTG;
+                       break;
+               case 1:
+                       reg = usbmisc->base + MX53_USB_OTG_PHY_CTRL_0_OFFSET;
+                       val = readl(reg) | MX53_BM_OVER_CUR_DIS_H1;
+                       break;
+               case 2:
+                       reg = usbmisc->base + MX53_USB_UH2_CTRL_OFFSET;
+                       val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
+                       break;
+               case 3:
+                       reg = usbmisc->base + MX53_USB_UH3_CTRL_OFFSET;
+                       val = readl(reg) | MX53_BM_OVER_CUR_DIS_UHx;
+                       break;
+               }
+               if (reg && val)
+                       writel(val, reg);
+               spin_unlock_irqrestore(&usbmisc->lock, flags);
+       }
+
+       return 0;
+}
+
 static int usbmisc_imx6q_init(struct device *dev)
 {
 
@@ -74,11 +120,19 @@ static int usbmisc_imx6q_init(struct device *dev)
        return 0;
 }
 
+static const struct usbmisc_ops imx53_usbmisc_ops = {
+       .init = usbmisc_imx53_init,
+};
+
 static const struct usbmisc_ops imx6q_usbmisc_ops = {
        .init = usbmisc_imx6q_init,
 };
 
 static const struct of_device_id usbmisc_imx_dt_ids[] = {
+       {
+               .compatible = "fsl,imx53-usbmisc",
+               .data = &imx53_usbmisc_ops,
+       },
        {
                .compatible = "fsl,imx6q-usbmisc",
                .data = &imx6q_usbmisc_ops,