support other fsl SoCs with usbmisc + small fixes
Subsystems (6)
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.
Marc Kleine-Budde (3):
usb: chipidea: usbmisc: unset global varibale usbmisc on driver
remove
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/ci13xxx_imx.c | 12 + drivers/usb/chipidea/ci13xxx_imx.h | 3 + drivers/usb/chipidea/usbmisc_imx.c | 256 ++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 162 ------------- 5 files changed, 273 insertions(+), 162 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 1/6 usb: chipidea: usbmisc: unset global varibale usbmisc on driver remove
From: Marc Kleine-Budde <[email protected]>
While there fix a potential race condition, first set usbmisc, then call usbmisc_set_ops().
--- drivers/usb/chipidea/usbmisc_imx6q.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/chipidea/usbmisc_imx6q.c +3 -2
@@ -116,14 +116,14 @@ static int __devinit usbmisc_imx6q_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 ; }
@@ -131,6 +131,7 @@ static int __devexit usbmisc_imx6q_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 1/6 usb: chipidea: usbmisc: unset global varibale usbmisc on driver remove
Quoted 4 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
While there fix a potential race condition, first set usbmisc, then call
usbmisc_set_ops().
This should be really two separate patches, both of which could use more elaborate commit messages. That is, if you unset variable, what kind of scenario it prevents, what exactly is the potential race condition, etc. Saves time for everybody.
Quoted 6 lines
Signed-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>--- drivers/usb/chipidea/usbmisc_imx6q.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
I'd also move the renaming patch in front of everything else, but that's up to you.
Regards,
--
Alex
PATCH 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
In reply to Michael GrzeschikThis 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.
--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ---------------------------------- 2 files changed, 163 insertions(+), 163 deletions(-) create mode 100644 drivers/usb/chipidea/usbmisc_imx.c delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
drivers/usb/chipidea/usbmisc_imx.c new file +163 -0
@@ -0,0 +1,163 @@ +/* +* Copyright 2012 Freescale Semiconductor, Inc. +* +* The code contained herein is licensed under the GNU General Public +* License. You may obtain a copy of the GNU General Public License +* Version 2 or later at the following locations: +* +* http://www.opensource.org/licenses/gpl-license.html +* http://www.gnu.org/copyleft/gpl.html +*/ + +#include <linux/module.h> +#include <linux/of_platform.h> +#include <linux/clk.h> +#include <linux/err.h> +#include <linux/io.h> + +#include "ci13xxx_imx.h" + +#define USB_DEV_MAX 4 + +#define 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 ]; +}; + +static struct imx_usbmisc *usbmisc; + +static struct usbmisc_usb_device *get_usbdev (struct device *dev) +{ +int i, ret; + +for (i =0 ; i <USB_DEV_MAX ; i++) { +if (usbmisc->usbdev[i].dev == dev) +return &usbmisc->usbdev[i]; +else if (!usbmisc->usbdev[i].dev) +break ; + } + +if (i >=USB_DEV_MAX ) +return ERR_PTR (-EBUSY ); + + ret =usbmisc_get_init_data (dev, &usbmisc->usbdev[i]); +if (ret) +return ERR_PTR (ret); + +return &usbmisc->usbdev[i]; +} + +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 |BM_OVER_CUR_DIS , + usbmisc->base + usbdev->index *4 ); +spin_unlock_irqrestore (&usbmisc->lock, flags); + } + +return 0 ; +} + +static const struct usbmisc_ops imx6q_usbmisc_ops = { + .init = usbmisc_imx6q_init, +}; + +static const struct of_device_id usbmisc_imx_dt_ids[] = { + { .compatible ="fsl,imx6q-usbmisc" }, + {/* sentinel */ } +}; + +static int __devinit usbmisc_imx_probe (struct platform_device *pdev) +{ +struct resource *res; +struct imx_usbmisc *data; +int ret; + +if (usbmisc) +return -EBUSY ; + + data =devm_kzalloc (&pdev->dev,sizeof (*data),GFP_KERNEL ); +if (!data) +return -ENOMEM ; + +spin_lock_init (&data->lock); + + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + data->base =devm_request_and_ioremap (&pdev->dev, res); +if (!data->base) +return -EADDRNOTAVAIL ; + + data->clk =devm_clk_get (&pdev->dev,NULL ); +if (IS_ERR (data->clk)) { +dev_err (&pdev->dev, +"failed to get clock, err=%ld\n" ,PTR_ERR (data->clk)); +return PTR_ERR (data->clk); + } + + ret =clk_prepare_enable (data->clk); +if (ret) { +dev_err (&pdev->dev, +"clk_prepare_enable failed, err=%d\n" , ret); +return ret; + } + + usbmisc = data; + ret =usbmisc_set_ops (&imx6q_usbmisc_ops); +if (ret) { + usbmisc =NULL ; +clk_disable_unprepare (data->clk); +return ret; + } + +return 0 ; +} + +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 ; +} + +static struct platform_driver usbmisc_imx_driver = { + .probe = usbmisc_imx_probe, + .remove =__devexit_p (usbmisc_imx_remove), + .driver = { + .name ="usbmisc_imx" , + .owner =THIS_MODULE , + .of_match_table = usbmisc_imx_dt_ids, + }, +}; + +int __init usbmisc_imx_drv_init (void ) +{ +return platform_driver_register (&usbmisc_imx_driver); +} +subsys_initcall (usbmisc_imx_drv_init); + +void __exit usbmisc_imx_drv_exit(void) +{ +platform_driver_unregister (&usbmisc_imx_driver); +} +module_exit (usbmisc_imx_drv_exit); + +MODULE_ALIAS ("platform:usbmisc-imx" ); +MODULE_LICENSE ("GPL v2" ); +MODULE_DESCRIPTION ("driver for imx usb non-core registers" ); +MODULE_AUTHOR ("Richard Zhao <[email protected]>" );
drivers/usb/chipidea/usbmisc_imx6q.c deleted +0 -163
163 lines not on this page · raw message
Signature · 1 line
1.7.10.4
Fabio Estevam
reviewerPATCH 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
Hi Michael,
Quoted 10 lines · Michael Grzeschik
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.
Reported-by Fabio Estevam <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ----------------------------------
Please use git mv / git format -M so that git can detect the file rename.
Thanks,
Fabio Estevam
PATCH 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
Quoted 8 lines · Fabio Estevam
Hi Michael,
Quoted 4 lines · Michael Grzeschik
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.
Quoted 8 lines
Quoted 6 lines
Reported-by Fabio Estevam <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ----------------------------------Please use git mv / git format -M so that git can detect the file rename.
I have created this patch with git mv. Until now, i did not know that git send-email needs -M to stick with the git format.
Will change that in V2.
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 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
In reply to Michael GrzeschikQuoted 7 lines · Michael Grzeschik
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.
Reported-by Fabio Estevam <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>
Quoted 6 lines
--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ---------------------------------- 2 files changed, 163 insertions(+), 163 deletions(-) create mode 100644 drivers/usb/chipidea/usbmisc_imx.c delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
Like Fabio suggested already, please use rename detection. Another thing, how do you get away with this without fixing the Makefile accordingly? Did you (at least) compile-test this patchset?
Regards,
--
Alex
PATCH 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
Quoted 16 lines · Alexander Shishkin
Quoted 7 lines · Michael Grzeschik
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.
Reported-by Fabio Estevam <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>Quoted 6 lines
--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ---------------------------------- 2 files changed, 163 insertions(+), 163 deletions(-) create mode 100644 drivers/usb/chipidea/usbmisc_imx.c delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
Quoted 3 lines
Like Fabio suggested already, please use rename detection. Another thing, how do you get away with this without fixing the
Makefileaccordingly? Did you (at least) compile-test this patchset?
You are right, i have compile tested this patchset before adding this patch. Sorry for that, i will test the whole series again on my platform (mx53), before sending v2.
Regars,
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 2/6 usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx
Quoted 17 lines · Michael Grzeschik
Quoted 16 lines · Alexander Shishkin
Quoted 13 lines · Michael Grzeschik
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.
Reported-by Fabio Estevam <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>Signed-off-by Marc Kleine-Budde <[email protected]>--- drivers/usb/chipidea/usbmisc_imx.c | 163 ++++++++++++++++++++++++++++++++++ drivers/usb/chipidea/usbmisc_imx6q.c | 163 ---------------------------------- 2 files changed, 163 insertions(+), 163 deletions(-) create mode 100644 drivers/usb/chipidea/usbmisc_imx.c delete mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
Quoted 7 lines
Quoted 3 lines
Like Fabio suggested already, please use rename detection. Another thing, how do you get away with this without fixing the
Makefileaccordingly? Did you (at least) compile-test this patchset?You are right, i have compile tested this patchset before adding this patch. Sorry for that, i will test the whole series again on my platform (mx53), before sending v2.
Thanks!
Regards,
--
Alex
PATCH 3/6 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.
--- drivers/usb/chipidea/usbmisc_imx.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/usb/chipidea/usbmisc_imx.c +8 -3
@@ -26,6 +26,7 @@ struct imx_usbmisc {spinlock_t lock;struct clk *clk;struct usbmisc_usb_device usbdev[USB_DEV_MAX ]; +const struct usbmisc_ops *ops; };static struct imx_usbmisc *usbmisc;
@@ -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_imx6q_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 4/6 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 ahb, ipg and per clock, which is needed to support imx53.
--- 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_imx6q_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 4/6 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 4 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This patch adds support for ahb, ipg and per clock, which is needed to support imx53.
I would also suggest using a more elaborate wording here, some people might also be interested what are the different clocks for (like, interface, peripheral, etc etc).
Quoted 23 lines
Signed-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>--- drivers/usb/chipidea/usbmisc_imx.c | 60 +++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 15 deletions(-)drivers/usb/chipidea/usbmisc_imx.c +3
-1@@ -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; };
drivers/usb/chipidea/usbmisc_imx.c static int __devinit usbmisc_imx_probe(struct platform_device *pdev) · line 109
Quoted 6 lines
drivers/usb/chipidea/usbmisc_imx.c +1
-2@@ -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" );
I suppose the clock names are also being added/changed in the platform code in another patchset that's also being queued? What's the target merge window (if there's a dependency)?
Regards,
--
Alex
PATCH 4/6 usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Quoted 11 lines · Alexander Shishkin
Quoted 4 lines · Michael Grzeschik
From: Marc Kleine-Budde <[email protected]>
This patch adds support for ahb, ipg and per clock, which is needed to support imx53.
I would also suggest using a more elaborate wording here, some people might also be interested what are the different clocks for (like, interface, peripheral, etc etc).
Will do in V2.
Quoted 26 lines
Quoted 26 lines
Signed-off-by Marc Kleine-Budde <[email protected]>Signed-off-by Michael Grzeschik <[email protected]>--- drivers/usb/chipidea/usbmisc_imx.c | 60 +++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 15 deletions(-)drivers/usb/chipidea/usbmisc_imx.c +3
-1@@ -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 ;
Quoted 7 lines
drivers/usb/chipidea/usbmisc_imx.c static int __devinit usbmisc_imx_probe(struct platform_device *pdev) · line 109
Quoted 3 lines
drivers/usb/chipidea/usbmisc_imx.c +1
-2- data->clk =devm_clk_get (&pdev->dev,NULL ); -if (IS_ERR (data->clk)) { + data->clk_ahb =devm_clk_get (&pdev->dev,"ahb" );I suppose the clock names are also being added/changed in the platform code in another patchset that's also being queued? What's the target merge window (if there's a dependency)?
Yes we have more branches to be published next. One of them is adding the usb device tree nodes and clock entries for mx53.
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 5/6 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.
--- drivers/usb/chipidea/usbmisc_imx.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)
drivers/usb/chipidea/usbmisc_imx.c +28 -0
@@ -54,6 +54,29 @@ 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); + + reg = usbmisc->base + usbdev->index *8 ; + +if (usbdev->disable_oc) { +spin_lock_irqsave (&usbmisc->lock, flags); + val =readl (reg); +writel (val | (1 <<5 ), reg); +spin_unlock_irqrestore (&usbmisc->lock, flags); + } + +return 0 ; +} +static int usbmisc_imx6q_init (struct device *dev) {
@@ -76,11 +99,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 6/6 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.
--- .../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 | 30 ++++++++++++++++++++ 4 files changed, 47 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 err; + } + } + 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 +30 -0
@@ -14,6 +14,7 @@#include <linux/clk.h> #include <linux/err.h> #include <linux/io.h> +#include <linux/delay.h> #include "ci13xxx_imx.h"
@@ -54,6 +55,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 +0x08 ; + +if (usbdev->evdo) { +spin_lock_irqsave (&usbmisc->lock, flags); + val =readl (reg); +writel (val | (1 <<23 ), 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;
@@ -99,6 +124,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, };
@@ -108,6 +137,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 6/6 usb: chipidea: usbmisc: add post handling and errata fix for mx25
Hi,
Quoted 6 lines · Michael Grzeschik
drivers/usb/chipidea/ci13xxx_imx.c +2
-0@@ -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);
drivers/usb/chipidea/ci13xxx_imx.c static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) · line 230
Quoted 10 lines
drivers/usb/chipidea/ci13xxx_imx.c +7
-0+if (ret) { +dev_err (&pdev->dev, +"usbmisc post failed, ret=%d\n" , ret); + goto err; + } + } + data->ci_pdev = plat_ci;platform_set_drvdata (pdev, data);
This hunk fails to apply for me on 3.7-rc5:
error: while searching for:
goto put_np; } data->ci_pdev = plat_ci; platform_set_drvdata(pdev, data);
Regards,
Martin
PATCH 6/6 usb: chipidea: usbmisc: add post handling and errata fix for mx25
Quoted 20 lines · Martin Fuzzey
Quoted 6 lines · Michael Grzeschik
drivers/usb/chipidea/ci13xxx_imx.c +2
-0@@ -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);drivers/usb/chipidea/ci13xxx_imx.c static int __devinit ci13xxx_imx_probe(struct platform_device *pdev) · line 230
Quoted 10 lines
drivers/usb/chipidea/ci13xxx_imx.c +7
-0+if (ret) { +dev_err (&pdev->dev, +"usbmisc post failed, ret=%d\n" , ret); + goto err; + } + } + data->ci_pdev = plat_ci;platform_set_drvdata (pdev, data);This hunk fails to apply for me on 3.7-rc5:
error: while searching for:
Quoted 2 lines
goto put_np; }
This is because that series is based on Peter Chen's work. I should have mentioned this in the cover-letter mail. You can merge his master branch before adding my series:
https://github.com/hzpeterchen/linux-usb.git
Apart from the latter patches, his work already got queued up by Greg:
http://comments.gmane.org/gmane.linux.usb.general/74537
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 6/6 usb: chipidea: usbmisc: add post handling and errata fix for mx25
Quoted 3 lines
This is because that series is based on Peter Chen's work. I should have mentioned this in the cover-letter mail. You can merge his master branch before adding my series:
Ok thanks for the very rapid reply.
I've now built this together with patch 2 "ci13xxx_imx: add 2nd and 3rd clock to support imx5x and newer" from your other series. But it hangs because the usb-phy clock is not being enabled. If I add a clock enable for that clock too to usbmisc_imx.c it works but that can't be the right way.
Who is supposed to enable the phy clock?
[I'm using the OTG port in host only mode on i.MX53 with "nop-usbphy"]
Here's what I did (illustration only, probably white space broken):
(quoted diff) +0 -0
b/arch/arm/mach-imx/clk-imx51-imx53.c
index cd6d7a0..2f0687a 100644
arch/arm/mach-imx/clk-imx51-imx53.c +0 -0
@@ -492,6 +492,7 @@ int __init mx53_clocks_init(unsigned long
rate_ckil, unsigned long rate_osc,
clk_register_clkdev(clk[usboh3_per_gate], "per", "53f80800.usbmisc");
clk_register_clkdev(clk[usboh3_gate], "ipg", "53f80800.usbmisc");
clk_register_clkdev(clk[usboh3_gate], "ahb", "53f80800.usbmisc");
+ clk_register_clkdev(clk[usb_phy1_gate], "phy1",
"53f80800.usbmisc"); // MF
clk_register_clkdev(clk[esdhc1_ipg_gate], "ipg", "sdhci-esdhc-imx53.0");
clk_register_clkdev(clk[dummy], "ahb", "sdhci-esdhc-imx53.0");
clk_register_clkdev(clk[esdhc1_per_gate], "per", "sdhci-esdhc-imx53.0");(quoted diff) +0 -0
b/drivers/usb/chipidea/usbmisc_imx.c
index acca109..a59093a 100644
drivers/usb/chipidea/usbmisc_imx.c +0 -0
@@ -197,6 +197,24 @@ static int __devinit usbmisc_imx_probe(struct
platform_device *pdev)
if (ret)
goto err_per_failed;+
+ { /* Temp Hack by MF awaiting reply on mailing list */
+ struct clk *phy_clk;
+
+ dev_info(&pdev->dev, "@MF@ hacking phy clock enable\n");
+ phy_clk = devm_clk_get(&pdev->dev, "phy1");
+ if (IS_ERR(phy_clk)) {+ dev_err(&pdev->dev, "failed to get PHY clock,
err=%ld\n", PTR_ERR(phy_clk));
+ goto err_per_failed;
+ }
+
+ ret = clk_prepare_enable(phy_clk);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to enable PHY
clock, err=%d\n", 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;PATCH 6/6 usb: chipidea: usbmisc: add post handling and errata fix for mx25
Quoted 12 lines · Martin Fuzzey
Quoted 3 lines
This is because that series is based on Peter Chen's work. I should have mentioned this in the cover-letter mail. You can merge his master branch before adding my series:
Ok thanks for the very rapid reply.
I've now built this together with patch 2 "
ci13xxx_imx: add 2nd and 3rd clock to support imx5x and newer" from your other series. But it hangs because the usb-phy clock is not being enabled. If I add a clock enable for that clock too tousbmisc_imx.cit works but that can't be the right way.
Quoted 4 lines
Who is supposed to enable the phy clock?
[I'm using the OTG port in host only mode on i.MX53 with "nop-usbphy"]Here's what I did (illustration only, probably white space broken):
We've have a patch that the missing clock handling to the nop phy driver, which isn't much better. What are other possible options?
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: 259 bytes Desc: OpenPGP digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121115/0a32aec2/attachment.sig>