usb: chipidea: imx: set over current polarity per dts setting
authorLi Jun <jun.li@nxp.com>
Wed, 20 Jul 2016 08:02:42 +0000 (16:02 +0800)
committerPeter Chen <peter.chen@nxp.com>
Wed, 14 Sep 2016 02:58:13 +0000 (10:58 +0800)
imx usb over current polarity is low active by default, with
over-current-active-high property added, user can config it to be high
active. Meanwhile keep this setting unchanged for existing platforms
so new platform must set the right value for active low by its usbmisc
init function if over current is enabled.

Signed-off-by: Li Jun <jun.li@nxp.com>
Signed-off-by: Peter Chen <peter.chen@nxp.com>
drivers/usb/chipidea/ci_hdrc_imx.c
drivers/usb/chipidea/ci_hdrc_imx.h
drivers/usb/chipidea/usbmisc_imx.c

index dedc33e589f41e752730f495fb082db8d4b771ae..099179457f60c0247af8c49c4084b7f77d30e98f 100644 (file)
@@ -140,6 +140,9 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev)
        if (of_find_property(np, "disable-over-current", NULL))
                data->disable_oc = 1;
 
+       if (of_find_property(np, "over-current-active-high", NULL))
+               data->oc_polarity = 1;
+
        if (of_find_property(np, "external-vbus-divider", NULL))
                data->evdo = 1;
 
index 635717e9354aa0f7a30c1797c0718f058adb045b..409aa5ca8dda1405aaf9c94ca16d363be386c810 100644 (file)
@@ -17,6 +17,7 @@ struct imx_usbmisc_data {
        int index;
 
        unsigned int disable_oc:1; /* over current detect disabled */
+       unsigned int oc_polarity:1; /* over current polarity if oc enabled */
        unsigned int evdo:1; /* set external vbus divider option */
 };
 
index ab8b027e8cc870615d399abb631849875db72427..20d02a5e418d936231fcb091e183c6f939d16701 100644 (file)
@@ -56,6 +56,7 @@
 
 #define MX6_BM_NON_BURST_SETTING       BIT(1)
 #define MX6_BM_OVER_CUR_DIS            BIT(7)
+#define MX6_BM_OVER_CUR_POLARITY       BIT(8)
 #define MX6_BM_WAKEUP_ENABLE           BIT(10)
 #define MX6_BM_ID_WAKEUP               BIT(16)
 #define MX6_BM_VBUS_WAKEUP             BIT(17)
@@ -266,11 +267,14 @@ static int usbmisc_imx6q_init(struct imx_usbmisc_data *data)
 
        spin_lock_irqsave(&usbmisc->lock, flags);
 
+       reg = readl(usbmisc->base + data->index * 4);
        if (data->disable_oc) {
-               reg = readl(usbmisc->base + data->index * 4);
-               writel(reg | MX6_BM_OVER_CUR_DIS,
-                       usbmisc->base + data->index * 4);
+               reg |= MX6_BM_OVER_CUR_DIS;
+       } else if (data->oc_polarity == 1) {
+               /* High active */
+               reg &= ~(MX6_BM_OVER_CUR_DIS | MX6_BM_OVER_CUR_POLARITY);
        }
+       writel(reg, usbmisc->base + data->index * 4);
 
        /* SoC non-burst setting */
        reg = readl(usbmisc->base + data->index * 4);
@@ -365,10 +369,14 @@ static int usbmisc_imx7d_init(struct imx_usbmisc_data *data)
                return -EINVAL;
 
        spin_lock_irqsave(&usbmisc->lock, flags);
+       reg = readl(usbmisc->base);
        if (data->disable_oc) {
-               reg = readl(usbmisc->base);
-               writel(reg | MX6_BM_OVER_CUR_DIS, usbmisc->base);
+               reg |= MX6_BM_OVER_CUR_DIS;
+       } else if (data->oc_polarity == 1) {
+               /* High active */
+               reg &= ~(MX6_BM_OVER_CUR_DIS | MX6_BM_OVER_CUR_POLARITY);
        }
+       writel(reg, usbmisc->base);
 
        reg = readl(usbmisc->base + MX7D_USBNC_USB_CTRL2);
        reg &= ~MX7D_USB_VBUS_WAKEUP_SOURCE_MASK;
@@ -492,6 +500,10 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = {
                .compatible = "fsl,imx6ul-usbmisc",
                .data = &imx6sx_usbmisc_ops,
        },
+       {
+               .compatible = "fsl,imx7d-usbmisc",
+               .data = &imx7d_usbmisc_ops,
+       },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, usbmisc_imx_dt_ids);