Signed-off-by: Peter Chen <[email protected]>
---
drivers/usb/chipidea/usbmisc_imx.c | 71 +++++++++++++++++-------------------
1 files changed, 34 insertions(+), 37 deletions(-)
diff --git a/drivers/usb/chipidea/usbmisc_imx.c
b/drivers/usb/chipidea/usbmisc_imx.c
index ac5a461..545efbf 100644
--- a/drivers/usb/chipidea/usbmisc_imx.c
+++ b/drivers/usb/chipidea/usbmisc_imx.c
@@ -15,6 +15,7 @@
#include <linux/err.h>
#include <linux/io.h>
#include <linux/delay.h>
+#include <linux/regmap.h>
#include "ci_hdrc_imx.h"
@@ -34,10 +35,10 @@
struct imx_usbmisc {
void __iomem *base;
- spinlock_t lock;
struct clk *clk;
struct usbmisc_usb_device usbdev[USB_DEV_MAX];
const struct usbmisc_ops *ops;
+ struct regmap *regmap;
};
static struct imx_usbmisc *usbmisc;
@@ -66,21 +67,16 @@ static struct usbmisc_usb_device *get_usbdev(struct device
*dev)
static int usbmisc_imx25_post(struct device *dev)
{
struct usbmisc_usb_device *usbdev;
- void __iomem *reg;
- unsigned long flags;
- u32 val;
usbdev = get_usbdev(dev);
if (IS_ERR(usbdev))
return PTR_ERR(usbdev);
- reg = usbmisc->base + MX25_USB_PHY_CTRL_OFFSET;
-
if (usbdev->evdo) {
- spin_lock_irqsave(&usbmisc->lock, flags);
- val = readl(reg);
- writel(val | MX25_BM_EXTERNAL_VBUS_DIVIDER, reg);
- spin_unlock_irqrestore(&usbmisc->lock, flags);
+ regmap_update_bits(usbmisc->regmap,
+ MX25_USB_PHY_CTRL_OFFSET,
+ MX25_BM_EXTERNAL_VBUS_DIVIDER,
+ MX25_BM_EXTERNAL_VBUS_DIVIDER);
usleep_range(5000, 10000); /* needed to stabilize voltage */
}
@@ -90,37 +86,33 @@ static int usbmisc_imx25_post(struct device *dev)
static int usbmisc_imx53_init(struct device *dev)
{
struct usbmisc_usb_device *usbdev;
- void __iomem *reg = NULL;
- unsigned long flags;
- u32 val = 0;
+ unsigned int reg = 0, 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;
+ reg = MX53_USB_OTG_PHY_CTRL_0_OFFSET;
+ val = 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;
+ reg = MX53_USB_OTG_PHY_CTRL_0_OFFSET;
+ val = 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;
+ reg = MX53_USB_UH2_CTRL_OFFSET;
+ val = 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;
+ reg = MX53_USB_UH3_CTRL_OFFSET;
+ val = MX53_BM_OVER_CUR_DIS_UHx;
break;
}
- if (reg && val)
- writel(val, reg);
- spin_unlock_irqrestore(&usbmisc->lock, flags);
+ if (usbdev->index >= 0 && usbdev->index <= 3)
+ regmap_update_bits(usbmisc->regmap, reg, val, val);
}
return 0;
@@ -128,22 +120,15 @@ static int usbmisc_imx53_init(struct device *dev)
static int usbmisc_imx6q_init(struct device *dev)
{
-
struct usbmisc_usb_device *usbdev;
- unsigned long flags;
- u32 reg;
usbdev = get_usbdev(dev);
if (IS_ERR(usbdev))
return PTR_ERR(usbdev);
- if (usbdev->disable_oc) {
- spin_lock_irqsave(&usbmisc->lock, flags);
- reg = readl(usbmisc->base + usbdev->index * 4);
- writel(reg | MX6_BM_OVER_CUR_DIS,
- usbmisc->base + usbdev->index * 4);
- spin_unlock_irqrestore(&usbmisc->lock, flags);
- }
+ if (usbdev->disable_oc)
+ regmap_update_bits(usbmisc->regmap, usbdev->index * 4,
+ MX6_BM_OVER_CUR_DIS, MX6_BM_OVER_CUR_DIS);
return 0;
}
@@ -177,6 +162,12 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = {
};
MODULE_DEVICE_TABLE(of, usbmisc_imx_dt_ids);
+static struct regmap_config usbmisc_regmap_config = {
+ .reg_bits = 32,
+ .val_bits = 32,
+ .reg_stride = 4,
+};
+
static int usbmisc_imx_probe(struct platform_device *pdev)
{
struct resource *res;
@@ -191,13 +182,19 @@ static int usbmisc_imx_probe(struct platform_device *pdev)
if (!data)
return -ENOMEM;
- spin_lock_init(&data->lock);
-
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
data->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(data->base))
return PTR_ERR(data->base);
+ usbmisc_regmap_config.max_register = res->end - res->start - 3;
+ data->regmap = devm_regmap_init_mmio(&pdev->dev, data->base,
+ &usbmisc_regmap_config);
+ if (IS_ERR(data->regmap)) {
+ dev_err(&pdev->dev, "regmap init failed\n");
+ return PTR_ERR(data->regmap);
+ }
+
data->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(data->clk)) {
dev_err(&pdev->dev,
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html