support other fsl SoCs with usbmisc + small fixes
Subsystems (4)
v3 cover support other fsl SoCs with usbmisc + small fixes
Nearly every SoC from Freescale has this non-core usb registers. This series adds support for more users of this driver.
This series is based on Peter Chen's work. Its needed to merge his master branch before applying this series:
https://github.com/hzpeterchen/linux-usb.git
Marc Kleine-Budde (4):
usb: chipidea: usbmisc: unset global varibale usbmisc on driver
remove
usb: chipidea: usbmisc: fix a potential race condition
usb: chipidea: usbmisc: prepare driver to handle more than one soc
usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Michael Grzeschik (3):
usb: chipidea: usbmisc: rename file, struct and functions to
usbmisc_imx
usb: chipidea: usbmisc: add mx53 support
usb: chipidea: usbmisc: add post handling and errata fix for mx25
.../devicetree/bindings/usb/ci13xxx-imx.txt | 2 + drivers/usb/chipidea/Makefile | 2 +- drivers/usb/chipidea/ci13xxx_imx.c | 12 + drivers/usb/chipidea/ci13xxx_imx.h | 3 + drivers/usb/chipidea/usbmisc_imx.c | 282 ++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 162 ----------- 6 files changed, 300 insertions(+), 163 deletions(-) create mode 100644 drivers/usb/chipidea/usbmisc_imx.c delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
Signature · 1 line
1.7.10.4
PATCH v3 1/7 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
This driver will be used for every Freescale SoC which has this misc memory layout to control the basic usb handling. So better name this driver, function and struct names in a more generic way.
---
Changes since v1:
* added Makefile change to be build as well
* moved this patch infront all other
drivers/usb/chipidea/Makefile | 2 +-
.../chipidea/{usbmisc_imx6q.c => usbmisc_imx.c} | 38 ++++++++++----------
2 files changed, 20 insertions(+), 20 deletions(-)
rename drivers/usb/chipidea/{usbmisc_imx6q.c => usbmisc_imx.c} (75%)drivers/usb/chipidea/Makefile +1 -1
@@ -17,5 +17,5 @@ ifneq ($(CONFIG_PCI),) endif ifneq ($(CONFIG_OF_DEVICE),) - obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o usbmisc_imx6q.o + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o usbmisc_imx.o endif
drivers/usb/chipidea/usbmisc_imx.c renamed from drivers/usb/chipidea/usbmisc_imx6q.c +19 -19
@@ -21,14 +21,14 @@#define BM_OVER_CUR_DIS BIT(7) -struct imx6q_usbmisc { +struct imx_usbmisc {void __iomem *base;spinlock_t lock;struct clk *clk;struct usbmisc_usb_device usbdev[USB_DEV_MAX ]; }; -static struct imx6q_usbmisc *usbmisc; +static struct imx_usbmisc *usbmisc;static struct usbmisc_usb_device *get_usbdev (struct device *dev) {
@@ -77,15 +77,15 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = { .init = usbmisc_imx6q_init, }; -static const struct of_device_id usbmisc_imx6q_dt_ids[] = { +static const struct of_device_id usbmisc_imx_dt_ids[] = { { .compatible ="fsl,imx6q-usbmisc" }, {/* sentinel */ } }; -static int __devinit usbmisc_imx6q_probe (struct platform_device *pdev) +static int __devinit usbmisc_imx_probe (struct platform_device *pdev) {struct resource *res; -struct imx6q_usbmisc *data; +struct imx_usbmisc *data;int ret;if (usbmisc)
@@ -127,36 +127,36 @@ static int __devinit usbmisc_imx6q_probe(struct platform_device *pdev)return 0 ; } -static int __devexit usbmisc_imx6q_remove(struct platform_device *pdev) +static int __devexit usbmisc_imx_remove(struct platform_device *pdev) {usbmisc_unset_ops (&imx6q_usbmisc_ops);clk_disable_unprepare (usbmisc->clk);return 0 ; } -static struct platform_driver usbmisc_imx6q_driver = { - .probe = usbmisc_imx6q_probe, - .remove =__devexit_p (usbmisc_imx6q_remove), +static struct platform_driver usbmisc_imx_driver = { + .probe = usbmisc_imx_probe, + .remove =__devexit_p (usbmisc_imx_remove), .driver = { - .name ="usbmisc_imx6q" , + .name ="usbmisc_imx" , .owner =THIS_MODULE , - .of_match_table = usbmisc_imx6q_dt_ids, + .of_match_table = usbmisc_imx_dt_ids, }, }; -int __init usbmisc_imx6q_drv_init (void ) +int __init usbmisc_imx_drv_init (void ) { -return platform_driver_register (&usbmisc_imx6q_driver); +return platform_driver_register (&usbmisc_imx_driver); } -subsys_initcall (usbmisc_imx6q_drv_init); +subsys_initcall (usbmisc_imx_drv_init); -void __exit usbmisc_imx6q_drv_exit(void) +void __exit usbmisc_imx_drv_exit(void) { -platform_driver_unregister (&usbmisc_imx6q_driver); +platform_driver_unregister (&usbmisc_imx_driver); } -module_exit (usbmisc_imx6q_drv_exit); +module_exit (usbmisc_imx_drv_exit); -MODULE_ALIAS ("platform:usbmisc-imx6q" ); +MODULE_ALIAS ("platform:usbmisc-imx" );MODULE_LICENSE ("GPL v2" ); -MODULE_DESCRIPTION ("driver for imx6q usb non-core registers" ); +MODULE_DESCRIPTION ("driver for imx usb non-core registers" );MODULE_AUTHOR ("Richard Zhao <[email protected]>" );
Signature · 1 line
1.7.10.4
PATCH v3 2/7 usb: chipidea: usbmisc: unset global varibale usbmisc on driver remove
In reply to Michael GrzeschikFrom: Marc Kleine-Budde <[email protected]>
The probe function checks usbmisc to be NULL in the beginning. Without this patch the can only be loaded once.
---
Changes since v1:
* split previous patch into two seperate.
drivers/usb/chipidea/usbmisc_imx.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/chipidea/usbmisc_imx.c +1 -0
@@ -131,6 +131,7 @@ static int __devexit usbmisc_imx_remove(struct platform_device *pdev) {usbmisc_unset_ops (&imx6q_usbmisc_ops);clk_disable_unprepare (usbmisc->clk); + usbmisc =NULL ;return 0 ; }
Signature · 1 line
1.7.10.4
PATCH v3 3/7 usb: chipidea: usbmisc: fix a potential race condition
In reply to Michael GrzeschikFrom: Marc Kleine-Budde <[email protected]>
This fixes a potential race condition where the ci13xxx_imx glue code could be fast enough to call one of the usbmisc_ops before he got a valid value on the static usbmisc pointer. To fix that we first set usbmisc, then call usbmisc_set_ops().
---
Changes since v1:
* split previous patch into two seperate.
drivers/usb/chipidea/usbmisc_imx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/chipidea/usbmisc_imx.c +2 -2
@@ -116,14 +116,14 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)return ret; } + usbmisc = data; ret =usbmisc_set_ops (&imx6q_usbmisc_ops);if (ret) { + usbmisc =NULL ;clk_disable_unprepare (data->clk);return ret; } - usbmisc = data; -return 0 ; }
Signature · 1 line
1.7.10.4
PATCH v3 3/7 usb: chipidea: usbmisc: fix a potential race condition
Quoted 6 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This fixes a potential race condition where the
ci13xxx_imxglue code could be fast enough to call one of theusbmisc_opsbefore he got a valid value on the static usbmisc pointer. To fix that we first set usbmisc, then callusbmisc_set_ops().
usbmisc is subsys_initcall, and cil13xxx_imx is module_init. Any potential situation that the ci13xxx_imx's probe is ran before the usbmisc's probe is completed? Besides, there is usbmisc_ops value check at the beginning of cil13xxx_imx's probe.
Quoted 39 lines
Signed-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>---
Changes since v1:
* split previous patch into two seperate.drivers/usb/chipidea/usbmisc_imx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/usb/chipidea/usbmisc_imx.c +2
-2@@ -116,14 +116,14 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)return ret; } + usbmisc = data; ret =usbmisc_set_ops (&imx6q_usbmisc_ops);if (ret) { + usbmisc =NULL ;clk_disable_unprepare (data->clk);return ret; } - usbmisc = data; -return 0 ; }Signature · 6 lines
1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 2 lines
Best Regards, Peter Chen
Sascha Hauer
maintainerPATCH v3 3/7 usb: chipidea: usbmisc: fix a potential race condition
Quoted 11 lines · Peter Chen
Quoted 6 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This fixes a potential race condition where the
ci13xxx_imxglue code could be fast enough to call one of theusbmisc_opsbefore he got a valid value on the static usbmisc pointer. To fix that we first set usbmisc, then callusbmisc_set_ops().usbmisc is
subsys_initcall, andcil13xxx_imxismodule_init. Any potential situation that the ci13xxx_imx's probe is ran before the usbmisc's probe is completed?
Not having looked at the code you are referring to at all I just want to say that: drivers can be modules (don't know if that's true for chipidea) and sooner or later we'll probably get devicetree overlays, so the devicetree nodes might just appear during runtime. Depending on initcall order is generally not a good idea.
Sascha
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
PATCH v3 3/7 usb: chipidea: usbmisc: fix a potential race condition
Quoted 9 lines · Sascha Hauer
Quoted 8 lines · Peter Chen
Quoted 6 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This fixes a potential race condition where the
ci13xxx_imxglue code could be fast enough to call one of theusbmisc_opsbefore he got a valid value on the static usbmisc pointer. To fix that we first set usbmisc, then callusbmisc_set_ops().
Quoted 7 lines
Quoted 3 lines
usbmisc is
subsys_initcall, andcil13xxx_imxismodule_init. Any potential situation that the ci13xxx_imx's probe is ran before the usbmisc's probe is completed?Not having looked at the code you are referring to at all I just want to say that: drivers can be modules (don't know if that's true for chipidea) and sooner or later we'll probably get devicetree overlays,
ChipIdea can be not even one, but two modules (ci_hdrc, the actual controller driver, always a platform_driver) and platform bindings like ci13xxx_imx, ci13xxx_pci, ci13xxx_msm, which can be platform or pci or whatever else drivers.
Quoted 2 lines
so the devicetree nodes might just appear during runtime. Depending on initcall order is generally not a good idea.
That's very true.
Regards,
--
Alex
PATCH v3 3/7 usb: chipidea: usbmisc: fix a potential race condition
In reply to Peter ChenQuoted 8 lines · Peter Chen
Quoted 6 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This fixes a potential race condition where the
ci13xxx_imxglue code could be fast enough to call one of theusbmisc_opsbefore he got a valid value on the static usbmisc pointer. To fix that we first set usbmisc, then callusbmisc_set_ops().
Quoted 4 lines
usbmisc is
subsys_initcall, andcil13xxx_imxismodule_init. Any potential situation that the ci13xxx_imx's probe is ran before the usbmisc's probe is completed? Besides, there isusbmisc_opsvalue check at the beginning of cil13xxx_imx's probe.
It's bad practice to rely your code on some external ordering mechanism, even more if the correct solution is so simple. And as Sascha pointed out everything might be build as modules and loaded individually.
Marc
Signature · 12 lines
Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de | -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 261 bytes Desc: OpenPGP digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121123/0408da18/attachment.sig>
PATCH v3 4/7 usb: chipidea: usbmisc: prepare driver to handle more than one soc
In reply to Michael GrzeschikFrom: Marc Kleine-Budde <[email protected]>
This attaches the usbmisc_ops to the of_device_id data and makes it possible to define special functions per soc.
---
Changes since v2:
* renamed bitmask to reflect soctype mx6
drivers/usb/chipidea/usbmisc_imx.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/usb/chipidea/usbmisc_imx.c +10 -5
@@ -19,13 +19,14 @@#define USB_DEV_MAX 4 -#define BM_OVER_CUR_DIS BIT(7) +#define MX6_BM_OVER_CUR_DIS BIT(7)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; };static struct imx_usbmisc *usbmisc;
@@ -65,7 +66,7 @@ static int usbmisc_imx6q_init(struct device *dev)if (usbdev->disable_oc) {spin_lock_irqsave (&usbmisc->lock, flags); reg =readl (usbmisc->base + usbdev->index *4 ); -writel (reg |BM_OVER_CUR_DIS , +writel (reg |MX6_BM_OVER_CUR_DIS , usbmisc->base + usbdev->index *4 );spin_unlock_irqrestore (&usbmisc->lock, flags); }
@@ -78,7 +79,7 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = { };static const struct of_device_id usbmisc_imx_dt_ids[] = { - { .compatible ="fsl,imx6q-usbmisc" }, + { .compatible ="fsl,imx6q-usbmisc" , .data = (void *)&imx6q_usbmisc_ops }, {/* sentinel */ } };
@@ -87,6 +88,7 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)struct resource *res;struct imx_usbmisc *data;int ret; +struct of_device_id *tmp_dev;if (usbmisc)return -EBUSY ;
@@ -116,8 +118,11 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)return ret; } + tmp_dev = (struct of_device_id *) +of_match_device (usbmisc_imx_dt_ids, &pdev->dev); + data->ops = (const struct usbmisc_ops *)tmp_dev->data; usbmisc = data; - ret =usbmisc_set_ops (&imx6q_usbmisc_ops); + ret =usbmisc_set_ops (data->ops);if (ret) { usbmisc =NULL ;clk_disable_unprepare (data->clk);
@@ -129,7 +134,7 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev) static int __devexit usbmisc_imx_remove(struct platform_device *pdev) { -usbmisc_unset_ops (&imx6q_usbmisc_ops); +usbmisc_unset_ops (usbmisc->ops);clk_disable_unprepare (usbmisc->clk); usbmisc =NULL ;return 0 ;
Signature · 1 line
1.7.10.4
PATCH v3 5/7 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
In reply to Michael GrzeschikFrom: Marc Kleine-Budde <[email protected]>
This patch adds support for a second and third clock to the usbmisc driver. On modern freescale ARM cores like the imx51, imx53 and imx6q three clocks ("ahb", "ipg" and "per") must be enabled in order to access the USB core.
ahb - AMBA High-Performance Bus clock domain
ipg - IP-Bus Gate clock domain
per - Peripheral clock domain
---
Changes since v1:
* changed patch description
drivers/usb/chipidea/usbmisc_imx.c | 60 +++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 15 deletions(-)
drivers/usb/chipidea/usbmisc_imx.c +45 -15
@@ -24,7 +24,9 @@struct imx_usbmisc {void __iomem *base;spinlock_t lock; -struct clk *clk; +struct clk *clk_ahb; +struct clk *clk_ipg; +struct clk *clk_per;struct usbmisc_usb_device usbdev[USB_DEV_MAX ];const struct usbmisc_ops *ops; };
@@ -104,38 +106,66 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)if (!data->base)return -EADDRNOTAVAIL ; - data->clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (data->clk)) { + data->clk_ahb =devm_clk_get (&pdev->dev,"ahb" ); +if (IS_ERR (data->clk_ahb)) {dev_err (&pdev->dev, -"failed to get clock, err=%ld\n" ,PTR_ERR (data->clk)); -return PTR_ERR (data->clk); +"failed to get ahb clock, err=%ld\n" ,PTR_ERR (data->clk_ahb)); +return PTR_ERR (data->clk_ahb); } - ret =clk_prepare_enable (data->clk); -if (ret) { + data->clk_ipg =devm_clk_get (&pdev->dev,"ipg" ); +if (IS_ERR (data->clk_ipg)) {dev_err (&pdev->dev, -"clk_prepare_enable failed, err=%d\n" , ret); -return ret; +"failed to get ipg clock, err=%ld\n" ,PTR_ERR (data->clk_ipg)); +return PTR_ERR (data->clk_ipg); } + data->clk_per =devm_clk_get (&pdev->dev,"per" ); +if (IS_ERR (data->clk_per)) { +dev_err (&pdev->dev, +"failed to get per clock, err=%ld\n" ,PTR_ERR (data->clk_per)); +return PTR_ERR (data->clk_per); + } + + ret =clk_prepare_enable (data->clk_ahb); +if (ret) +return ret; + + ret =clk_prepare_enable (data->clk_ipg); +if (ret) + goto err_ipg_failed; + + ret =clk_prepare_enable (data->clk_per); +if (ret) + goto err_per_failed; + tmp_dev = (struct of_device_id *)of_match_device (usbmisc_imx_dt_ids, &pdev->dev); data->ops = (const struct usbmisc_ops *)tmp_dev->data; usbmisc = data; ret =usbmisc_set_ops (data->ops); -if (ret) { - usbmisc =NULL ; -clk_disable_unprepare (data->clk); -return ret; - } +if (ret) + goto err_set_ops_failed;return 0 ; + + err_set_ops_failed: + usbmisc =NULL ; +clk_disable_unprepare (data->clk_per); + err_per_failed: +clk_disable_unprepare (data->clk_ipg); + err_ipg_failed: +clk_disable_unprepare (data->clk_ahb); + +return ret; } static int __devexit usbmisc_imx_remove(struct platform_device *pdev) {usbmisc_unset_ops (usbmisc->ops); -clk_disable_unprepare (usbmisc->clk); +clk_disable_unprepare (usbmisc->clk_per); +clk_disable_unprepare (usbmisc->clk_ipg); +clk_disable_unprepare (usbmisc->clk_ahb); usbmisc =NULL ;return 0 ; }
Signature · 1 line
1.7.10.4
PATCH v3 5/7 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 5 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This patch adds support for a second and third clock to the usbmisc driver. On modern freescale ARM cores like the imx51, imx53 and imx6q three clocks ("ahb", "ipg" and "per") must be enabled in order to access the USB core.
The imx6q usb's clock structure is different with old mxc serials (mx3x, mx5x) due to different PHY. This patch will cause mx6q's probe fail, the message like below:
imx_usb 2184000.usb: Failed to get clock, err=-2imx_usb: probe of 2184000.usb failed with error -2
The mx5x (50, 51, 53) and mx6q's clock structure like below:
mx5x:
- usboh3_ipg_ahb: CCGR2(index13), used to access register
(like your ahb)
- usboh3_60M: CCGR2(index14), used to access register at serial phy mode as the phy is at serial mode, we need to use it at the first before the phy goes to other modes.
(like your ipg)
usbphy: used to transfer data
(like your per)
mx6q:
- usboh3(Index 162 at DT), used to access register
- usbphy(Index 182 for otg port at DT), at phy controller
So, we may consider a way to consolidate both mx6q (mx28) and mxc (mx5x, mx3x) platforms.
Quoted 118 lines
ahb - AMBA High-Performance Bus clock domain
ipg - IP-Bus Gate clock domain
per - Peripheral clock domainSigned-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>---
Changes since v1:
* changed patch descriptiondrivers/usb/chipidea/usbmisc_imx.c | 60 +++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 15 deletions(-)drivers/usb/chipidea/usbmisc_imx.c +45
-15@@ -24,7 +24,9 @@struct imx_usbmisc {void __iomem *base;spinlock_t lock; -struct clk *clk; +struct clk *clk_ahb; +struct clk *clk_ipg; +struct clk *clk_per;struct usbmisc_usb_device usbdev[USB_DEV_MAX ];const struct usbmisc_ops *ops; };@@ -104,38 +106,66 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)if (!data->base)return -EADDRNOTAVAIL ; - data->clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (data->clk)) { + data->clk_ahb =devm_clk_get (&pdev->dev,"ahb" ); +if (IS_ERR (data->clk_ahb)) {dev_err (&pdev->dev, -"failed to get clock, err=%ld\n" ,PTR_ERR (data->clk)); -return PTR_ERR (data->clk); +"failed to get ahb clock, err=%ld\n" ,PTR_ERR (data->clk_ahb)); +return PTR_ERR (data->clk_ahb); } - ret =clk_prepare_enable (data->clk); -if (ret) { + data->clk_ipg =devm_clk_get (&pdev->dev,"ipg" ); +if (IS_ERR (data->clk_ipg)) {dev_err (&pdev->dev, -"clk_prepare_enable failed, err=%d\n" , ret); -return ret; +"failed to get ipg clock, err=%ld\n" ,PTR_ERR (data->clk_ipg)); +return PTR_ERR (data->clk_ipg); } + data->clk_per =devm_clk_get (&pdev->dev,"per" ); +if (IS_ERR (data->clk_per)) { +dev_err (&pdev->dev, +"failed to get per clock, err=%ld\n" ,PTR_ERR (data->clk_per)); +return PTR_ERR (data->clk_per); + } + + ret =clk_prepare_enable (data->clk_ahb); +if (ret) +return ret; + + ret =clk_prepare_enable (data->clk_ipg); +if (ret) + goto err_ipg_failed; + + ret =clk_prepare_enable (data->clk_per); +if (ret) + goto err_per_failed; + tmp_dev = (struct of_device_id *)of_match_device (usbmisc_imx_dt_ids, &pdev->dev); data->ops = (const struct usbmisc_ops *)tmp_dev->data; usbmisc = data; ret =usbmisc_set_ops (data->ops); -if (ret) { - usbmisc =NULL ; -clk_disable_unprepare (data->clk); -return ret; - } +if (ret) + goto err_set_ops_failed;return 0 ; + + err_set_ops_failed: + usbmisc =NULL ; +clk_disable_unprepare (data->clk_per); + err_per_failed: +clk_disable_unprepare (data->clk_ipg); + err_ipg_failed: +clk_disable_unprepare (data->clk_ahb); + +return ret; } static int __devexit usbmisc_imx_remove(struct platform_device *pdev) {usbmisc_unset_ops (usbmisc->ops); -clk_disable_unprepare (usbmisc->clk); +clk_disable_unprepare (usbmisc->clk_per); +clk_disable_unprepare (usbmisc->clk_ipg); +clk_disable_unprepare (usbmisc->clk_ahb); usbmisc =NULL ;return 0 ; }Signature · 6 lines
1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 2 lines
Best Regards, Peter Chen
PATCH v3 5/7 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 11 lines · Peter Chen
Quoted 5 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This patch adds support for a second and third clock to the usbmisc driver. On modern freescale ARM cores like the imx51, imx53 and imx6q three clocks ("ahb", "ipg" and "per") must be enabled in order to access the USB core.
The imx6q usb's clock structure is different with old mxc serials (mx3x, mx5x) due to different PHY. This patch will cause mx6q's probe fail, the message like below:
Quoted 8 lines
imx_usb2184000.usb: Failed to get clock, err=-2imx_usb: probe of 2184000.usb failed with error -2The mx5x (50, 51, 53) and mx6q's clock structure like below:
mx5x:
-usboh3_ipg_ahb: CCGR2(index13), used to access register (like your ahb)
That is probably the one, which already gets enabled inside the ci13xxx_imx code.
Quoted 9 lines
-
usboh3_60M: CCGR2(index14), used to access register at serial phy mode as the phy is at serial mode, we need to use it at the first before the phy goes to other modes.
(like your ipg)usbphy: used to transfer data
(like your per)
The "per" clk is a different clk than the usbphy. We have an usbphy clk aswell on the mx5x. As discussed before [1], we need a solution to enable the usbphy clk. The current approach is to let the nop-xceiver enable this.
[1] http://www.spinics.net/lists/linux-usb/msg74489.html
Quoted 6 lines
mx6q:
- usboh3(Index 162 at DT), used to access register
- usbphy(Index 182 for otg port at DT), at phy controllerSo, we may consider a way to consolidate both mx6q (mx28) and mxc (mx5x, mx3x) platforms.
Yes, we will discuss a real clktree solution in the usbmisc driver for the different cores. The first thoughts are, that the clk configuration has completely to be done inside the usbmisc driver. For this, the usbmisc needs to become a hard dependency for the ci13xxx_imx glue code.
Regards,
Michael
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
PATCH v3 5/7 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 9 lines · Michael Grzeschik
Quoted 2 lines
usbphy: used to transfer data
(like your per)The "per" clk is a different clk than the usbphy. We have an usbphy clk aswell on the mx5x. As discussed before [1], we need a solution to enable the usbphy clk. The current approach is to let the nop-xceiver enable this.
It does not matter which the name is, this clock is related to usb 480M or its source. We use nop-xceiver is just to create struct usb_otg and usb_phy. Clock information can be at imx specific file like cil13xxx_imx.
Quoted 5 lines
Quoted 4 lines
mx6q:
- usboh3(Index 162 at DT), used to access register
- usbphy(Index 182 for otg port at DT), at phy controller
Quoted 7 lines
Quoted 2 lines
So, we may consider a way to consolidate both mx6q (mx28) and mxc (mx5x, mx3x) platforms.
Yes, we will discuss a real clktree solution in the usbmisc driver for the different cores. The first thoughts are, that the clk configuration has completely to be done inside the usbmisc driver. For this, the usbmisc needs to become a hard dependency for the
ci13xxx_imxglue code.
For my mind, imx usb clock handling is better only at place, that is cil13xxx_imx. We can have imx_clk_enable and imx_clk_disable in it, and handling clk in imx_clk_enable using id_table or what else platform specific.
Quoted 10 lines
Regards,
MichaelSignature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Signature · 2 lines
Best Regards, Peter Chen
PATCH v3 5/7 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 9 lines · Peter Chen
Quoted 8 lines · Michael Grzeschik
Quoted 2 lines
usbphy: used to transfer data
(like your per)The "per" clk is a different clk than the usbphy. We have an usbphy clk aswell on the mx5x. As discussed before [1], we need a solution to enable the usbphy clk. The current approach is to let the nop-xceiver enable this.
Quoted 5 lines
Quoted 1 line
It does not matter which the name is, this clock is related to usb 480M or its source. We use nop-xceiver is just to create struct
usb_otgandusb_phy. Clock information can be at imx specific file likecil13xxx_imx.
I think the clock task needs to become a sepreate topic, apart from this series.
Quoted 13 lines
Quoted 5 lines
Quoted 4 lines
mx6q:
- usboh3(Index 162 at DT), used to access register
- usbphy(Index 182 for otg port at DT), at phy controllerQuoted 7 lines
Quoted 2 lines
So, we may consider a way to consolidate both mx6q (mx28) and mxc (mx5x, mx3x) platforms.
Yes, we will discuss a real clktree solution in the usbmisc driver for the different cores. The first thoughts are, that the clk configuration has completely to be done inside the usbmisc driver. For this, the usbmisc needs to become a hard dependency for the
ci13xxx_imxglue code.
Quoted 4 lines
For my mind, imx usb clock handling is better only at place, that is
cil13xxx_imx. We can haveimx_clk_enableandimx_clk_disablein it, and handling clk inimx_clk_enableusingid_tableor what else platform specific.
As already mentioned, the clock layout differs from SoC to SoC. Therefore the usbmisc can become a mandatory instance over the ci13xxx_imx instances in all imx cases. This controlling interface can define the special clock setups and connection types for the underlying usb cores.
I will send the next series without this clock handling.
Regards,
Michael
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
In reply to Michael GrzeschikThis adds mx53 as the next user of the usbmisc driver and makes it possible to disable the overcurrent-detection of the internal phy.
---
Changes since v2:
* added defines for register offsets and bitmasks
* fixed disable_oc option for all ports
drivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)
drivers/usb/chipidea/usbmisc_imx.c +51 -0
@@ -19,6 +19,13 @@#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 {
@@ -54,6 +61,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; +unsigned long flags; +u32 val; + + 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) {
@@ -76,11 +122,16 @@ 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 = (void *)&imx53_usbmisc_ops }, { .compatible ="fsl,imx6q-usbmisc" , .data = (void *)&imx6q_usbmisc_ops }, {/* sentinel */ } };
Signature · 1 line
1.7.10.4
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Hello.
Quoted 18 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0
drivers/usb/chipidea/usbmisc_imx.c line 24
Quoted 6 lines
drivers/usb/chipidea/usbmisc_imx.c +3
-0@@ -19,6 +19,13 @@#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;
Semicolons here? This can't be right.
WBR, Sergei
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Quoted 23 lines · Sergei Shtylyov
Hello.
Quoted 19 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@
Quoted 7 lines
drivers/usb/chipidea/usbmisc_imx.c line 24
Quoted 5 lines
drivers/usb/chipidea/usbmisc_imx.c +3
-0#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;Semicolons here? This can't be right.
You're right. Its compiling without errors, because its only used at the end of an assignement. So this will result in two Semicolons.
I will fix that.
Thanks,
Michael
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
In reply to Michael GrzeschikQuoted 19 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@
drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 10 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0#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)
As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
Quoted 73 lines
drivers/usb/chipidea/usbmisc_imx.c +44
-0struct imx_usbmisc {@@ -54,6 +61,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; +unsigned long flags; +u32 val; + + 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) {@@ -76,11 +122,16 @@ 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 = (void *)&imx53_usbmisc_ops }, { .compatible ="fsl,imx6q-usbmisc" , .data = (void *)&imx6q_usbmisc_ops }, {/* sentinel */ } };Signature · 6 lines
1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 2 lines
Best Regards, Peter Chen
Sascha Hauer
maintainerPATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Quoted 22 lines · Peter Chen
Quoted 21 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@#define USB_DEV_MAX 4
Quoted 11 lines
drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 8 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0+#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)As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
What do the different register mapping have to do with putting the definitions in .h files or not?
Sascha
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Quoted 35 lines · Sascha Hauer
Quoted 22 lines · Peter Chen
Quoted 21 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@#define USB_DEV_MAX 4Quoted 11 lines
drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 8 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0+#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)As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
Quoted 2 lines
What do the different register mapping have to do with putting the definitions in .h files or not?
No difference, just keep the .c clean and short, as every soc has its non-core register mapping, so it may occupy several ten lines if you write down every offset and bit for single SoC, the bit definition will grow longer and longer when more SoCs and more function are added.
Quoted 9 lines
Sascha
Signature · 4 lines
Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Signature · 2 lines
Best Regards, Peter Chen
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
In reply to Peter ChenQuoted 22 lines · Peter Chen
Quoted 21 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@#define USB_DEV_MAX 4
Quoted 11 lines
drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 8 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0+#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)As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
AFAIK in the kernel we don't make extra .h files any more, if there is only a single user of the contents.
Marc
Signature · 12 lines
Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de | -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 261 bytes Desc: OpenPGP digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121123/f530b8a1/attachment.sig>
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Quoted 35 lines · Marc Kleine-Budde
Quoted 22 lines · Peter Chen
Quoted 21 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@#define USB_DEV_MAX 4Quoted 11 lines
drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 8 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0+#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)As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
Quoted 2 lines
AFAIK in the kernel we don't make extra .h files any more, if there is only a single user of the contents.
OK, if it is the current rule for kernel, then just keep it. My original mind was there will be more and more bit definition in future, and move it to .h to make the code clean and short.
Quoted 8 lines
Marc
Signature · 4 lines
Pengutronix e.K. | Marc Kleine-Budde | Industrial Linux Solutions | Phone: +49-231-2826-924 | Vertretung West/Dortmund | Fax: +49-5121-206917-5555 | Amtsgericht Hildesheim, HRA 2686 | http://www.pengutronix.de |
Signature · 2 lines
Best Regards, Peter Chen
PATCH v3 6/7 usb: chipidea: usbmisc: add mx53 support
Quoted 36 lines · Peter Chen
Quoted 35 lines · Marc Kleine-Budde
Quoted 33 lines · Peter Chen
Quoted 19 lines · Michael Grzeschik
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 <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>---
Changes since v2:
* added defines for register offsets and bitmasks
* fixeddisable_ocoption for all portsdrivers/usb/chipidea/usbmisc_imx.c | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+)drivers/usb/chipidea/usbmisc_imx.c +0
-0@@ -19,6 +19,13 @@drivers/usb/chipidea/usbmisc_imx.c line 29
Quoted 10 lines
drivers/usb/chipidea/usbmisc_imx.c +7
-0#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)As every SoC platform's non-core register mapping is different, it is better to use .h to put register bit definition
Quoted 5 lines
Quoted 2 lines
AFAIK in the kernel we don't make extra .h files any more, if there is only a single user of the contents.
OK, if it is the current rule for kernel, then just keep it. My original mind was there will be more and more bit definition in future, and move it to .h to make the code clean and short.
Yeah. If there is only one user then keep it in the .c file. The kernel is huge, so keeping things out of the global scope is a GoodThing(tm).
g.
PATCH v3 7/7 usb: chipidea: usbmisc: add post handling and errata fix for mx25
In reply to Michael GrzeschikThis adds a post handling routine which is called after ci13xxx_add_device was called. The first user is the mx25, which has to disable the external-vbus-divider after the ude has started.
---
Changes since v2:
* added defines for register offsets and bitmasks
.../devicetree/bindings/usb/ci13xxx-imx.txt | 2 ++ drivers/usb/chipidea/ci13xxx_imx.c | 12 +++++++ drivers/usb/chipidea/ci13xxx_imx.h | 3 ++ drivers/usb/chipidea/usbmisc_imx.c | 33 ++++++++++++++++++++ 4 files changed, 50 insertions(+)
Documentation/devicetree/bindings/usb/ci13xxx-imx.txt +2 -0
@@ -11,6 +11,7 @@ Optional properties: that indicate usb controller index - vbus-supply: regulator for vbus - disable-over-current: disable over current detect +- external-vbus-divider: enables off-chip resistor divider for Vbus Examples: usb at 02184000 { /* USB OTG */
@@ -20,4 +21,5 @@ usb at 02184000 { /* USB OTG */ fsl,usbphy = <&usbphy1>; fsl,usbmisc = <&usbmisc 0>; disable-over-current; + external-vbus-divider; };
drivers/usb/chipidea/ci13xxx_imx.c +12 -0
@@ -79,6 +79,9 @@ int usbmisc_get_init_data(struct device *dev, struct usbmisc_usb_device *usbdev)if (of_find_property (np,"disable-over-current" ,NULL )) usbdev->disable_oc =1 ; +if (of_find_property (np,"external-vbus-divider" ,NULL )) + usbdev->evdo =1 ; +return 0 ; }EXPORT_SYMBOL_GPL (usbmisc_get_init_data);
@@ -213,6 +216,15 @@ static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) goto put_np; } +if (usbmisc_ops && usbmisc_ops->post) { + ret = usbmisc_ops->post (&pdev->dev); +if (ret) { +dev_err (&pdev->dev, +"usbmisc post failed, ret=%d\n" , ret); + goto put_np; + } + } + data->ci_pdev = plat_ci;platform_set_drvdata (pdev, data);
drivers/usb/chipidea/ci13xxx_imx.h +3 -0
@@ -13,6 +13,8 @@struct usbmisc_ops {/* It's called once when probe a usb device */ int (*init)(struct device *dev); +/* It's called once after adding a usb device */ +int (*post)(struct device *dev); };struct usbmisc_usb_device {
@@ -20,6 +22,7 @@ struct usbmisc_usb_device {int index; int disable_oc:1; /* over current detect disabled */ + int evdo:1; /* set external vbus divider option */ };int usbmisc_set_ops (const struct usbmisc_ops *ops);
drivers/usb/chipidea/usbmisc_imx.c +33 -0
@@ -14,11 +14,15 @@#include <linux/clk.h> #include <linux/err.h> #include <linux/io.h> +#include <linux/delay.h> #include "ci13xxx_imx.h" #define USB_DEV_MAX 4 +#define MX25_USB_PHY_CTRL_OFFSET 0x08; +#define MX25_BM_EXTERNAL_VBUS_DIVIDER BIT(23) +#define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08;#define MX53_USB_UH2_CTRL_OFFSET 0x14;#define MX53_USB_UH3_CTRL_OFFSET 0x18;
@@ -61,6 +65,30 @@ static struct usbmisc_usb_device *get_usbdev(struct device *dev)return &usbmisc->usbdev[i]; } +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); +mdelay (5 );/* needed to stabilize voltage */ + } + +return 0 ; +} +static int usbmisc_imx53_init (struct device *dev) {struct usbmisc_usb_device *usbdev;
@@ -122,6 +150,10 @@ static int usbmisc_imx6q_init(struct device *dev)return 0 ; } +static const struct usbmisc_ops imx25_usbmisc_ops = { + .post = usbmisc_imx25_post, +}; +static const struct usbmisc_ops imx53_usbmisc_ops = { .init = usbmisc_imx53_init, };
@@ -131,6 +163,7 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = { };static const struct of_device_id usbmisc_imx_dt_ids[] = { + { .compatible ="fsl,imx25-usbmisc" , .data = (void *)&imx25_usbmisc_ops }, { .compatible ="fsl,imx53-usbmisc" , .data = (void *)&imx53_usbmisc_ops }, { .compatible ="fsl,imx6q-usbmisc" , .data = (void *)&imx6q_usbmisc_ops }, {/* sentinel */ }
Signature · 1 line
1.7.10.4
PATCH v3 7/7 usb: chipidea: usbmisc: add post handling and errata fix for mx25
Quoted 3 lines · Michael Grzeschik
This adds a post handling routine which is called after
ci13xxx_add_devicewas called. The first user is the mx25, which has to disable the external-vbus-divider after the ude has started.
udc has started?
Quoted 11 lines
drivers/usb/chipidea/usbmisc_imx.c +9
-0+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))
drivers/usb/chipidea/usbmisc_imx.c static struct usbmisc_usb_device *get_usbdev(struct device *dev) · line 86
Quoted 10 lines
drivers/usb/chipidea/usbmisc_imx.c +10
-0+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); +mdelay (5 );/* needed to stabilize voltage */
better use usleep_range to avoid busy-wait.
Quoted 35 lines
drivers/usb/chipidea/usbmisc_imx.c +10
-0+ } + +return 0 ; +} +static int usbmisc_imx53_init (struct device *dev) {struct usbmisc_usb_device *usbdev;@@ -122,6 +150,10 @@ static int usbmisc_imx6q_init(struct device *dev)return 0 ; } +static const struct usbmisc_ops imx25_usbmisc_ops = { + .post = usbmisc_imx25_post, +}; +static const struct usbmisc_ops imx53_usbmisc_ops = { .init = usbmisc_imx53_init, };@@ -131,6 +163,7 @@ static const struct usbmisc_ops imx6q_usbmisc_ops = { };static const struct of_device_id usbmisc_imx_dt_ids[] = { + { .compatible ="fsl,imx25-usbmisc" , .data = (void *)&imx25_usbmisc_ops }, { .compatible ="fsl,imx53-usbmisc" , .data = (void *)&imx53_usbmisc_ops }, { .compatible ="fsl,imx6q-usbmisc" , .data = (void *)&imx6q_usbmisc_ops }, {/* sentinel */ }Signature · 6 lines
1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 2 lines
Best Regards, Peter Chen
v3 cover support other fsl SoCs with usbmisc + small fixes
In reply to Michael GrzeschikQuoted 15 lines · Michael Grzeschik
Nearly every SoC from Freescale has this non-core usb registers. This series adds support for more users of this driver.
This series is based on Peter Chen's work. Its needed to merge his master branch before applying this series:
https://github.com/hzpeterchen/linux-usb.git
Marc Kleine-Budde (4):
usb: chipidea: usbmisc: unset global varibale usbmisc on driver
remove
usb: chipidea: usbmisc: fix a potential race condition
usb: chipidea: usbmisc: prepare driver to handle more than one soc
usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 5 lines
Michael Grzeschik (3):
usb: chipidea: usbmisc: rename file, struct and functions to
usbmisc_imx
usb: chipidea: usbmisc: add mx53 support
usb: chipidea: usbmisc: add post handling and errata fix for mx25
Cc'ing Peter Chen, in case he didn't see this. Peter, can you have a look and give your Tested-by/Reviewed-by where appropriate?
Regards,
--
Alex
v3 cover support other fsl SoCs with usbmisc + small fixes
Quoted 17 lines · Alexander Shishkin
Quoted 15 lines · Michael Grzeschik
Nearly every SoC from Freescale has this non-core usb registers. This series adds support for more users of this driver.
This series is based on Peter Chen's work. Its needed to merge his master branch before applying this series:
https://github.com/hzpeterchen/linux-usb.git
Marc Kleine-Budde (4):
usb: chipidea: usbmisc: unset global varibale usbmisc on driver
remove
usb: chipidea: usbmisc: fix a potential race condition
usb: chipidea: usbmisc: prepare driver to handle more than one soc
usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 8 lines
Quoted 5 lines
Michael Grzeschik (3):
usb: chipidea: usbmisc: rename file, struct and functions to
usbmisc_imx
usb: chipidea: usbmisc: add mx53 support
usb: chipidea: usbmisc: add post handling and errata fix for mx25Cc'ing Peter Chen, in case he didn't see this. Peter, can you have a look and give your Tested-by/Reviewed-by where appropriate?
OK, I will have a look tomorrow or the beginning of next week.
Quoted 5 lines
Regards,
--
Alex
Signature · 2 lines
Best Regards, Peter Chen