* [PATCH v3 0/3] imx: add usbmisc support
@ 2012-07-26 10:35 Richard Zhao
2012-07-26 10:35 ` [PATCH v3 1/3] USB: chipidea: add imx " Richard Zhao
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Richard Zhao @ 2012-07-26 10:35 UTC (permalink / raw)
To: linux-arm-kernel
usbmisc driver handles the SoC specific non-core usb registers.
Changes since last version:
- build usbmisc drivers into ci13xxx-imx module if it's chosen.
- interprete properties in common code
- check wether usbmisc_ops is null
- dts: enable usbmisc device by default
- take clk changes as a seperate patch
Richard Zhao (3):
USB: chipidea: add imx usbmisc support
ARM: dts: imx6q-sabrelite: add usbmisc device
ARM: imx6q: clk_register_clkdev usbmisc clock
.../devicetree/bindings/usb/ci13xxx-imx.txt | 2 +
.../devicetree/bindings/usb/usbmisc-imx.txt | 12 ++
arch/arm/boot/dts/imx6q-sabrelite.dts | 1 +
arch/arm/boot/dts/imx6q.dtsi | 18 ++-
arch/arm/mach-imx/clk-imx6q.c | 1 +
drivers/usb/chipidea/Makefile | 3 +-
drivers/usb/chipidea/ci13xxx_imx.c | 72 ++++++++-
drivers/usb/chipidea/usbmisc_imx6q.c | 155 ++++++++++++++++++++
8 files changed, 258 insertions(+), 6 deletions(-)
create mode 100644 Documentation/devicetree/bindings/usb/usbmisc-imx.txt
create mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
--
1.7.9.5
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] USB: chipidea: add imx usbmisc support
2012-07-26 10:35 [PATCH v3 0/3] imx: add usbmisc support Richard Zhao
@ 2012-07-26 10:35 ` Richard Zhao
2012-07-30 9:32 ` Sascha Hauer
2012-07-26 10:35 ` [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device Richard Zhao
2012-07-26 10:35 ` [PATCH v3 3/3] ARM: imx6q: clk_register_clkdev usbmisc clock Richard Zhao
2 siblings, 1 reply; 9+ messages in thread
From: Richard Zhao @ 2012-07-26 10:35 UTC (permalink / raw)
To: linux-arm-kernel
i.MX usb controllers shares non-core registers, which may include
SoC specific controls. We take it as a usbmisc device and usbmisc
driver set operations needed by ci13xxx_imx driver.
For example, Sabrelite board has bad over-current design, we can
usbmisc to disable over-current detect.
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
---
.../devicetree/bindings/usb/ci13xxx-imx.txt | 2 +
.../devicetree/bindings/usb/usbmisc-imx.txt | 12 ++
drivers/usb/chipidea/Makefile | 3 +-
drivers/usb/chipidea/ci13xxx_imx.c | 72 ++++++++-
drivers/usb/chipidea/usbmisc_imx6q.c | 155 ++++++++++++++++++++
5 files changed, 242 insertions(+), 2 deletions(-)
create mode 100644 Documentation/devicetree/bindings/usb/usbmisc-imx.txt
create mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
index 2c29041..06105ce 100644
--- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
+++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
@@ -8,6 +8,7 @@ Required properties:
Optional properties:
- fsl,usbphy: phandler of usb phy that connects to the only one port
- vbus-supply: regulator for vbus
+- disable-over-current: disable over current detect
Examples:
usb at 02184000 { /* USB OTG */
@@ -15,4 +16,5 @@ usb at 02184000 { /* USB OTG */
reg = <0x02184000 0x200>;
interrupts = <0 43 0x04>;
fsl,usbphy = <&usbphy1>;
+ disable-over-current;
};
diff --git a/Documentation/devicetree/bindings/usb/usbmisc-imx.txt b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
new file mode 100644
index 0000000..4fa500d
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
@@ -0,0 +1,12 @@
+* Freescale i.MX non-core registers
+
+Required properties:
+- compatible: Should be one of below:
+ "fsl,imx6q-usbmisc" for imx6q
+- reg: Should contain registers location and length
+
+Examples:
+usbmisc at 02184800 {
+ compatible = "fsl,imx6q-usbmisc";
+ reg = <0x02184800 0x200>;
+};
diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
index 5c66d9c..36f94c9d 100644
--- a/drivers/usb/chipidea/Makefile
+++ b/drivers/usb/chipidea/Makefile
@@ -15,5 +15,6 @@ ifneq ($(CONFIG_PCI),)
endif
ifneq ($(CONFIG_OF_DEVICE),)
- obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
+ obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx-imx.o
+ ci13xxx-imx-y := ci13xxx_imx.o usbmisc_imx6q.o
endif
diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
index ef60d06..d178889 100644
--- a/drivers/usb/chipidea/ci13xxx_imx.c
+++ b/drivers/usb/chipidea/ci13xxx_imx.c
@@ -22,6 +22,7 @@
#include <linux/regulator/consumer.h>
#include "ci.h"
+#include "ci13xxx_imx.h"
#define pdev_to_phy(pdev) \
((struct usb_phy *)platform_get_drvdata(pdev))
@@ -34,6 +35,48 @@ struct ci13xxx_imx_data {
struct regulator *reg_vbus;
};
+static const struct usbmisc_ops *usbmisc_ops;
+
+/* Common functions shared by usbmisc drivers */
+
+int usbmisc_set_ops(const struct usbmisc_ops *ops)
+{
+ if (usbmisc_ops)
+ return -EBUSY;
+
+ usbmisc_ops = ops;
+
+ return 0;
+}
+
+void usbmisc_unset_ops(const struct usbmisc_ops *ops)
+{
+ usbmisc_ops = NULL;
+}
+
+int usbmisc_get_init_data(struct device *dev, struct usbmisc_usb_device *usbdev)
+{
+ struct device_node *np = dev->of_node;
+ int id;
+
+ usbdev->dev = dev;
+
+ id = of_alias_get_id(np, "usb");
+ if (id < 0) {
+ dev_err(dev, "Failed to get alias id, errno %d\n", id);
+ memset(usbdev, 0, sizeof(*usbdev));
+ return id;
+ }
+ usbdev->index = id;
+
+ if (of_find_property(np, "disable-over-current", NULL))
+ usbdev->disable_oc = 1;
+
+ return 0;
+}
+
+/* End of common functions shared by usbmisc drivers*/
+
static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
.name = "ci13xxx_imx",
.flags = CI13XXX_REQUIRE_TRANSCEIVER |
@@ -120,6 +163,16 @@ static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
*pdev->dev.dma_mask = DMA_BIT_MASK(32);
dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
}
+
+ if (usbmisc_ops && usbmisc_ops->init) {
+ ret = usbmisc_ops->init(&pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev,
+ "usbmisc init failed, ret=%d\n", ret);
+ return ret;
+ }
+ }
+
plat_ci = ci13xxx_add_device(&pdev->dev,
pdev->resource, pdev->num_resources,
&ci13xxx_imx_platdata);
@@ -189,7 +242,24 @@ static struct platform_driver ci13xxx_imx_driver = {
},
};
-module_platform_driver(ci13xxx_imx_driver);
+static int __init ci13xxx_imx_drv_init(void)
+{
+ int ret;
+
+ ret = usbmisc_imx6q_drv_init();
+ if (ret)
+ return ret;
+
+ return platform_driver_register(&ci13xxx_imx_driver);
+}
+module_init(ci13xxx_imx_drv_init);
+
+static void __exit ci13xxx_imx_drv_exit(void)
+{
+ platform_driver_unregister(&ci13xxx_imx_driver);
+ usbmisc_imx6q_drv_exit();
+}
+module_exit(ci13xxx_imx_drv_exit);
MODULE_ALIAS("platform:imx-usb");
MODULE_LICENSE("GPL v2");
diff --git a/drivers/usb/chipidea/usbmisc_imx6q.c b/drivers/usb/chipidea/usbmisc_imx6q.c
new file mode 100644
index 0000000..95337a1
--- /dev/null
+++ b/drivers/usb/chipidea/usbmisc_imx6q.c
@@ -0,0 +1,155 @@
+/*
+ * 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 imx6q_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 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_imx6q_dt_ids[] = {
+ { .compatible = "fsl,imx6q-usbmisc"},
+ { /* sentinel */ }
+};
+
+static int __devinit usbmisc_imx6q_probe(struct platform_device *pdev)
+{
+ struct resource *res;
+ struct imx6q_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;
+ }
+
+ ret = usbmisc_set_ops(&imx6q_usbmisc_ops);
+ if (ret) {
+ clk_disable_unprepare(data->clk);
+ return ret;
+ }
+
+ usbmisc = data;
+
+ return 0;
+}
+
+static int __devexit usbmisc_imx6q_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),
+ .driver = {
+ .name = "usbmisc_imx6q",
+ .owner = THIS_MODULE,
+ .of_match_table = usbmisc_imx6q_dt_ids,
+ },
+};
+
+int __init usbmisc_imx6q_drv_init(void)
+{
+ return platform_driver_register(&usbmisc_imx6q_driver);
+}
+
+void __exit usbmisc_imx6q_drv_exit(void)
+{
+ platform_driver_unregister(&usbmisc_imx6q_driver);
+}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device
2012-07-26 10:35 [PATCH v3 0/3] imx: add usbmisc support Richard Zhao
2012-07-26 10:35 ` [PATCH v3 1/3] USB: chipidea: add imx " Richard Zhao
@ 2012-07-26 10:35 ` Richard Zhao
2012-07-30 1:27 ` Shawn Guo
2012-07-26 10:35 ` [PATCH v3 3/3] ARM: imx6q: clk_register_clkdev usbmisc clock Richard Zhao
2 siblings, 1 reply; 9+ messages in thread
From: Richard Zhao @ 2012-07-26 10:35 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
---
arch/arm/boot/dts/imx6q-sabrelite.dts | 1 +
arch/arm/boot/dts/imx6q.dtsi | 18 ++++++++++++++----
2 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
index d42e851..b32ebfc 100644
--- a/arch/arm/boot/dts/imx6q-sabrelite.dts
+++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
@@ -62,6 +62,7 @@
aips-bus at 02100000 { /* AIPS2 */
usb at 02184000 { /* USB OTG */
vbus-supply = <®_usb_otg_vbus>;
+ disable-over-current;
status = "okay";
};
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index c25d495..41d16cc 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -19,6 +19,11 @@
serial2 = &uart3;
serial3 = &uart4;
serial4 = &uart5;
+
+ usb0 = &usbotg;
+ usb1 = &usbhost1;
+ usb2 = &usbhost2;
+ usb3 = &usbhost3;
};
cpus {
@@ -624,7 +629,7 @@
reg = <0x0217c000 0x4000>;
};
- usb at 02184000 { /* USB OTG */
+ usbotg: usb at 02184000 {
compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
reg = <0x02184000 0x200>;
interrupts = <0 43 0x04>;
@@ -632,7 +637,7 @@
status = "disabled";
};
- usb at 02184200 { /* USB1 */
+ usbhost1: usb at 02184200 {
compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
reg = <0x02184200 0x200>;
interrupts = <0 40 0x04>;
@@ -640,20 +645,25 @@
status = "disabled";
};
- usb at 02184400 { /* USB2 */
+ usbhost2: usb at 02184400 {
compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
reg = <0x02184400 0x200>;
interrupts = <0 41 0x04>;
status = "disabled";
};
- usb at 02184600 { /* USB3 */
+ usbhost3: usb at 02184600 {
compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
reg = <0x02184600 0x200>;
interrupts = <0 42 0x04>;
status = "disabled";
};
+ usbmisc at 02184800 {
+ compatible = "fsl,imx6q-usbmisc";
+ reg = <0x02184800 0x200>;
+ };
+
ethernet at 02188000 {
compatible = "fsl,imx6q-fec";
reg = <0x02188000 0x4000>;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 3/3] ARM: imx6q: clk_register_clkdev usbmisc clock
2012-07-26 10:35 [PATCH v3 0/3] imx: add usbmisc support Richard Zhao
2012-07-26 10:35 ` [PATCH v3 1/3] USB: chipidea: add imx " Richard Zhao
2012-07-26 10:35 ` [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device Richard Zhao
@ 2012-07-26 10:35 ` Richard Zhao
2 siblings, 0 replies; 9+ messages in thread
From: Richard Zhao @ 2012-07-26 10:35 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
---
arch/arm/mach-imx/clk-imx6q.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
index ea89520..660fcbb 100644
--- a/arch/arm/mach-imx/clk-imx6q.c
+++ b/arch/arm/mach-imx/clk-imx6q.c
@@ -405,6 +405,7 @@ int __init mx6q_clocks_init(void)
clk_register_clkdev(clk[usboh3], NULL, "2184200.usb");
clk_register_clkdev(clk[usboh3], NULL, "2184400.usb");
clk_register_clkdev(clk[usboh3], NULL, "2184600.usb");
+ clk_register_clkdev(clk[usboh3], NULL, "2184800.usbmisc");
clk_register_clkdev(clk[usbphy1], NULL, "20c9000.usbphy");
clk_register_clkdev(clk[usbphy2], NULL, "20ca000.usbphy");
clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
--
1.7.9.5
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device
2012-07-26 10:35 ` [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device Richard Zhao
@ 2012-07-30 1:27 ` Shawn Guo
0 siblings, 0 replies; 9+ messages in thread
From: Shawn Guo @ 2012-07-30 1:27 UTC (permalink / raw)
To: linux-arm-kernel
The patch is doing a little bit more than what patch subject says.
Please either come up with a better subject and commit message or
split the patch to have it match the subject.
On Thu, Jul 26, 2012 at 06:35:15PM +0800, Richard Zhao wrote:
> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> ---
> arch/arm/boot/dts/imx6q-sabrelite.dts | 1 +
> arch/arm/boot/dts/imx6q.dtsi | 18 ++++++++++++++----
> 2 files changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
> index d42e851..b32ebfc 100644
> --- a/arch/arm/boot/dts/imx6q-sabrelite.dts
> +++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
> @@ -62,6 +62,7 @@
> aips-bus at 02100000 { /* AIPS2 */
> usb at 02184000 { /* USB OTG */
> vbus-supply = <®_usb_otg_vbus>;
> + disable-over-current;
> status = "okay";
> };
>
> diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
> index c25d495..41d16cc 100644
> --- a/arch/arm/boot/dts/imx6q.dtsi
> +++ b/arch/arm/boot/dts/imx6q.dtsi
> @@ -19,6 +19,11 @@
> serial2 = &uart3;
> serial3 = &uart4;
> serial4 = &uart5;
> +
> + usb0 = &usbotg;
> + usb1 = &usbhost1;
> + usb2 = &usbhost2;
> + usb3 = &usbhost3;
> };
>
> cpus {
> @@ -624,7 +629,7 @@
> reg = <0x0217c000 0x4000>;
> };
>
> - usb at 02184000 { /* USB OTG */
> + usbotg: usb at 02184000 {
I basically would like to have the first line of every node exactly
match between <soc>.dtsi and <board>.dts. Please also update the node
in imx6q-sabrelite.dtsi.
Regards,
Shawn
> compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> reg = <0x02184000 0x200>;
> interrupts = <0 43 0x04>;
> @@ -632,7 +637,7 @@
> status = "disabled";
> };
>
> - usb at 02184200 { /* USB1 */
> + usbhost1: usb at 02184200 {
> compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> reg = <0x02184200 0x200>;
> interrupts = <0 40 0x04>;
> @@ -640,20 +645,25 @@
> status = "disabled";
> };
>
> - usb at 02184400 { /* USB2 */
> + usbhost2: usb at 02184400 {
> compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> reg = <0x02184400 0x200>;
> interrupts = <0 41 0x04>;
> status = "disabled";
> };
>
> - usb at 02184600 { /* USB3 */
> + usbhost3: usb at 02184600 {
> compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> reg = <0x02184600 0x200>;
> interrupts = <0 42 0x04>;
> status = "disabled";
> };
>
> + usbmisc at 02184800 {
> + compatible = "fsl,imx6q-usbmisc";
> + reg = <0x02184800 0x200>;
> + };
> +
> ethernet at 02188000 {
> compatible = "fsl,imx6q-fec";
> reg = <0x02188000 0x4000>;
> --
> 1.7.9.5
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] USB: chipidea: add imx usbmisc support
2012-07-26 10:35 ` [PATCH v3 1/3] USB: chipidea: add imx " Richard Zhao
@ 2012-07-30 9:32 ` Sascha Hauer
2012-07-30 9:39 ` Richard Zhao
0 siblings, 1 reply; 9+ messages in thread
From: Sascha Hauer @ 2012-07-30 9:32 UTC (permalink / raw)
To: linux-arm-kernel
On Thu, Jul 26, 2012 at 06:35:14PM +0800, Richard Zhao wrote:
> i.MX usb controllers shares non-core registers, which may include
> SoC specific controls. We take it as a usbmisc device and usbmisc
> driver set operations needed by ci13xxx_imx driver.
>
> For example, Sabrelite board has bad over-current design, we can
> usbmisc to disable over-current detect.
>
> Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> ---
> .../devicetree/bindings/usb/ci13xxx-imx.txt | 2 +
> .../devicetree/bindings/usb/usbmisc-imx.txt | 12 ++
> drivers/usb/chipidea/Makefile | 3 +-
> drivers/usb/chipidea/ci13xxx_imx.c | 72 ++++++++-
> drivers/usb/chipidea/usbmisc_imx6q.c | 155 ++++++++++++++++++++
> 5 files changed, 242 insertions(+), 2 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> create mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
>
> diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> index 2c29041..06105ce 100644
> --- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> +++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> @@ -8,6 +8,7 @@ Required properties:
> Optional properties:
> - fsl,usbphy: phandler of usb phy that connects to the only one port
> - vbus-supply: regulator for vbus
> +- disable-over-current: disable over current detect
>
> Examples:
> usb at 02184000 { /* USB OTG */
> @@ -15,4 +16,5 @@ usb at 02184000 { /* USB OTG */
> reg = <0x02184000 0x200>;
> interrupts = <0 43 0x04>;
> fsl,usbphy = <&usbphy1>;
> + disable-over-current;
> };
> diff --git a/Documentation/devicetree/bindings/usb/usbmisc-imx.txt b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> new file mode 100644
> index 0000000..4fa500d
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> @@ -0,0 +1,12 @@
> +* Freescale i.MX non-core registers
> +
> +Required properties:
> +- compatible: Should be one of below:
> + "fsl,imx6q-usbmisc" for imx6q
> +- reg: Should contain registers location and length
> +
> +Examples:
> +usbmisc at 02184800 {
> + compatible = "fsl,imx6q-usbmisc";
> + reg = <0x02184800 0x200>;
> +};
> diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
> index 5c66d9c..36f94c9d 100644
> --- a/drivers/usb/chipidea/Makefile
> +++ b/drivers/usb/chipidea/Makefile
> @@ -15,5 +15,6 @@ ifneq ($(CONFIG_PCI),)
> endif
>
> ifneq ($(CONFIG_OF_DEVICE),)
> - obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
> + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx-imx.o
> + ci13xxx-imx-y := ci13xxx_imx.o usbmisc_imx6q.o
> endif
> diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
> index ef60d06..d178889 100644
> --- a/drivers/usb/chipidea/ci13xxx_imx.c
> +++ b/drivers/usb/chipidea/ci13xxx_imx.c
> @@ -22,6 +22,7 @@
> #include <linux/regulator/consumer.h>
>
> #include "ci.h"
> +#include "ci13xxx_imx.h"
>
> #define pdev_to_phy(pdev) \
> ((struct usb_phy *)platform_get_drvdata(pdev))
> @@ -34,6 +35,48 @@ struct ci13xxx_imx_data {
> struct regulator *reg_vbus;
> };
>
> +static const struct usbmisc_ops *usbmisc_ops;
> +
> +/* Common functions shared by usbmisc drivers */
> +
> +int usbmisc_set_ops(const struct usbmisc_ops *ops)
> +{
> + if (usbmisc_ops)
> + return -EBUSY;
> +
> + usbmisc_ops = ops;
> +
> + return 0;
> +}
> +
> +void usbmisc_unset_ops(const struct usbmisc_ops *ops)
> +{
> + usbmisc_ops = NULL;
> +}
> +
> +int usbmisc_get_init_data(struct device *dev, struct usbmisc_usb_device *usbdev)
> +{
> + struct device_node *np = dev->of_node;
> + int id;
> +
> + usbdev->dev = dev;
> +
> + id = of_alias_get_id(np, "usb");
> + if (id < 0) {
> + dev_err(dev, "Failed to get alias id, errno %d\n", id);
> + memset(usbdev, 0, sizeof(*usbdev));
> + return id;
> + }
> + usbdev->index = id;
> +
> + if (of_find_property(np, "disable-over-current", NULL))
> + usbdev->disable_oc = 1;
> +
> + return 0;
> +}
> +
> +/* End of common functions shared by usbmisc drivers*/
> +
> static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
> .name = "ci13xxx_imx",
> .flags = CI13XXX_REQUIRE_TRANSCEIVER |
> @@ -120,6 +163,16 @@ static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
> *pdev->dev.dma_mask = DMA_BIT_MASK(32);
> dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
> }
> +
> + if (usbmisc_ops && usbmisc_ops->init) {
> + ret = usbmisc_ops->init(&pdev->dev);
> + if (ret) {
> + dev_err(&pdev->dev,
> + "usbmisc init failed, ret=%d\n", ret);
> + return ret;
> + }
> + }
> +
> plat_ci = ci13xxx_add_device(&pdev->dev,
> pdev->resource, pdev->num_resources,
> &ci13xxx_imx_platdata);
> @@ -189,7 +242,24 @@ static struct platform_driver ci13xxx_imx_driver = {
> },
> };
>
> -module_platform_driver(ci13xxx_imx_driver);
> +static int __init ci13xxx_imx_drv_init(void)
> +{
> + int ret;
> +
> + ret = usbmisc_imx6q_drv_init();
> + if (ret)
> + return ret;
> +
> + return platform_driver_register(&ci13xxx_imx_driver);
> +}
> +module_init(ci13xxx_imx_drv_init);
You do this change because you need to make sure that on i.MX6 the
usbmisc device is probed before the chipidea core itself. This won't
look very nice when the other i.MX SoCs get usbmisc support aswell.
Wouldn't it be better to add a phandle which points from the chipidea
cores to the usbmisc device? You could drop the alias then aswell.
Like this:
usbotg: usb at 02184000 {
compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
reg = <0x02184000 0x200>;
interrupts = <0 43 0x04>;
status = "disabled";
usbmisc = <&usbmisc 0>
};
<&usbmisc 0> would then mean port 0 of the usbmisc device.
If the usbmisc property exists, you can return -EPROBE_DEFER until it is
available. If it doesn't exist, you just continue without usbmisc
support (i.MX28)
Sascha
--
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 |
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] USB: chipidea: add imx usbmisc support
2012-07-30 9:32 ` Sascha Hauer
@ 2012-07-30 9:39 ` Richard Zhao
2012-07-31 1:06 ` Chen Peter-B29397
0 siblings, 1 reply; 9+ messages in thread
From: Richard Zhao @ 2012-07-30 9:39 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jul 30, 2012 at 11:32:44AM +0200, Sascha Hauer wrote:
> On Thu, Jul 26, 2012 at 06:35:14PM +0800, Richard Zhao wrote:
> > i.MX usb controllers shares non-core registers, which may include
> > SoC specific controls. We take it as a usbmisc device and usbmisc
> > driver set operations needed by ci13xxx_imx driver.
> >
> > For example, Sabrelite board has bad over-current design, we can
> > usbmisc to disable over-current detect.
> >
> > Signed-off-by: Richard Zhao <richard.zhao@freescale.com>
> > ---
> > .../devicetree/bindings/usb/ci13xxx-imx.txt | 2 +
> > .../devicetree/bindings/usb/usbmisc-imx.txt | 12 ++
> > drivers/usb/chipidea/Makefile | 3 +-
> > drivers/usb/chipidea/ci13xxx_imx.c | 72 ++++++++-
> > drivers/usb/chipidea/usbmisc_imx6q.c | 155 ++++++++++++++++++++
> > 5 files changed, 242 insertions(+), 2 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> > create mode 100644 drivers/usb/chipidea/usbmisc_imx6q.c
> >
> > diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > index 2c29041..06105ce 100644
> > --- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > +++ b/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt
> > @@ -8,6 +8,7 @@ Required properties:
> > Optional properties:
> > - fsl,usbphy: phandler of usb phy that connects to the only one port
> > - vbus-supply: regulator for vbus
> > +- disable-over-current: disable over current detect
> >
> > Examples:
> > usb at 02184000 { /* USB OTG */
> > @@ -15,4 +16,5 @@ usb at 02184000 { /* USB OTG */
> > reg = <0x02184000 0x200>;
> > interrupts = <0 43 0x04>;
> > fsl,usbphy = <&usbphy1>;
> > + disable-over-current;
> > };
> > diff --git a/Documentation/devicetree/bindings/usb/usbmisc-imx.txt b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> > new file mode 100644
> > index 0000000..4fa500d
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/usb/usbmisc-imx.txt
> > @@ -0,0 +1,12 @@
> > +* Freescale i.MX non-core registers
> > +
> > +Required properties:
> > +- compatible: Should be one of below:
> > + "fsl,imx6q-usbmisc" for imx6q
> > +- reg: Should contain registers location and length
> > +
> > +Examples:
> > +usbmisc at 02184800 {
> > + compatible = "fsl,imx6q-usbmisc";
> > + reg = <0x02184800 0x200>;
> > +};
> > diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile
> > index 5c66d9c..36f94c9d 100644
> > --- a/drivers/usb/chipidea/Makefile
> > +++ b/drivers/usb/chipidea/Makefile
> > @@ -15,5 +15,6 @@ ifneq ($(CONFIG_PCI),)
> > endif
> >
> > ifneq ($(CONFIG_OF_DEVICE),)
> > - obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx_imx.o
> > + obj-$(CONFIG_USB_CHIPIDEA) += ci13xxx-imx.o
> > + ci13xxx-imx-y := ci13xxx_imx.o usbmisc_imx6q.o
> > endif
> > diff --git a/drivers/usb/chipidea/ci13xxx_imx.c b/drivers/usb/chipidea/ci13xxx_imx.c
> > index ef60d06..d178889 100644
> > --- a/drivers/usb/chipidea/ci13xxx_imx.c
> > +++ b/drivers/usb/chipidea/ci13xxx_imx.c
> > @@ -22,6 +22,7 @@
> > #include <linux/regulator/consumer.h>
> >
> > #include "ci.h"
> > +#include "ci13xxx_imx.h"
> >
> > #define pdev_to_phy(pdev) \
> > ((struct usb_phy *)platform_get_drvdata(pdev))
> > @@ -34,6 +35,48 @@ struct ci13xxx_imx_data {
> > struct regulator *reg_vbus;
> > };
> >
> > +static const struct usbmisc_ops *usbmisc_ops;
> > +
> > +/* Common functions shared by usbmisc drivers */
> > +
> > +int usbmisc_set_ops(const struct usbmisc_ops *ops)
> > +{
> > + if (usbmisc_ops)
> > + return -EBUSY;
> > +
> > + usbmisc_ops = ops;
> > +
> > + return 0;
> > +}
> > +
> > +void usbmisc_unset_ops(const struct usbmisc_ops *ops)
> > +{
> > + usbmisc_ops = NULL;
> > +}
> > +
> > +int usbmisc_get_init_data(struct device *dev, struct usbmisc_usb_device *usbdev)
> > +{
> > + struct device_node *np = dev->of_node;
> > + int id;
> > +
> > + usbdev->dev = dev;
> > +
> > + id = of_alias_get_id(np, "usb");
> > + if (id < 0) {
> > + dev_err(dev, "Failed to get alias id, errno %d\n", id);
> > + memset(usbdev, 0, sizeof(*usbdev));
> > + return id;
> > + }
> > + usbdev->index = id;
> > +
> > + if (of_find_property(np, "disable-over-current", NULL))
> > + usbdev->disable_oc = 1;
> > +
> > + return 0;
> > +}
> > +
> > +/* End of common functions shared by usbmisc drivers*/
> > +
> > static struct ci13xxx_platform_data ci13xxx_imx_platdata __devinitdata = {
> > .name = "ci13xxx_imx",
> > .flags = CI13XXX_REQUIRE_TRANSCEIVER |
> > @@ -120,6 +163,16 @@ static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
> > *pdev->dev.dma_mask = DMA_BIT_MASK(32);
> > dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
> > }
> > +
> > + if (usbmisc_ops && usbmisc_ops->init) {
> > + ret = usbmisc_ops->init(&pdev->dev);
> > + if (ret) {
> > + dev_err(&pdev->dev,
> > + "usbmisc init failed, ret=%d\n", ret);
> > + return ret;
> > + }
> > + }
> > +
> > plat_ci = ci13xxx_add_device(&pdev->dev,
> > pdev->resource, pdev->num_resources,
> > &ci13xxx_imx_platdata);
> > @@ -189,7 +242,24 @@ static struct platform_driver ci13xxx_imx_driver = {
> > },
> > };
> >
> > -module_platform_driver(ci13xxx_imx_driver);
> > +static int __init ci13xxx_imx_drv_init(void)
> > +{
> > + int ret;
> > +
> > + ret = usbmisc_imx6q_drv_init();
> > + if (ret)
> > + return ret;
> > +
> > + return platform_driver_register(&ci13xxx_imx_driver);
> > +}
> > +module_init(ci13xxx_imx_drv_init);
>
> You do this change because you need to make sure that on i.MX6 the
> usbmisc device is probed before the chipidea core itself. This won't
> look very nice when the other i.MX SoCs get usbmisc support aswell.
>
> Wouldn't it be better to add a phandle which points from the chipidea
> cores to the usbmisc device? You could drop the alias then aswell.
>
> Like this:
>
> usbotg: usb at 02184000 {
> compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
> reg = <0x02184000 0x200>;
> interrupts = <0 43 0x04>;
> status = "disabled";
> usbmisc = <&usbmisc 0>
> };
>
> <&usbmisc 0> would then mean port 0 of the usbmisc device.
I didn't add the restriction that a usbmisc driver must have a usbmisc
device. I'm not sure whether all SoC and future SoC can be look as
a device.
Peter, do you have any idea?
Thanks
Richard
>
> If the usbmisc property exists, you can return -EPROBE_DEFER until it is
> available. If it doesn't exist, you just continue without usbmisc
> support (i.MX28)
>
> Sascha
>
>
> --
> 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 |
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] USB: chipidea: add imx usbmisc support
2012-07-30 9:39 ` Richard Zhao
@ 2012-07-31 1:06 ` Chen Peter-B29397
2012-07-31 9:06 ` Richard Zhao
0 siblings, 1 reply; 9+ messages in thread
From: Chen Peter-B29397 @ 2012-07-31 1:06 UTC (permalink / raw)
To: linux-arm-kernel
> >
> > <&usbmisc 0> would then mean port 0 of the usbmisc device.
> I didn't add the restriction that a usbmisc driver must have a usbmisc
> device. I'm not sure whether all SoC and future SoC can be look as
> a device.
>
> Peter, do you have any idea?
>
I have not followed this usbmisc design, I just list some facts at i.mx
USB controller:
Sigmatel-derived SoCs (i.mx23, i.mx28) have no this register region, all phy controls
are through PHY register.
Other freescale SoCs have this usbmisc register region to control phy and tune some
signal quality. This register region is from another 0x800 or (last controller base address + 0x200)
> Thanks
> Richard
> >
> > If the usbmisc property exists, you can return -EPROBE_DEFER until it
> is
> > available. If it doesn't exist, you just continue without usbmisc
> > support (i.MX28)
> >
> > Sascha
> >
> >
> > --
> > 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 |
> >
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] USB: chipidea: add imx usbmisc support
2012-07-31 1:06 ` Chen Peter-B29397
@ 2012-07-31 9:06 ` Richard Zhao
0 siblings, 0 replies; 9+ messages in thread
From: Richard Zhao @ 2012-07-31 9:06 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Jul 31, 2012 at 09:06:33AM +0800, Chen Peter-B29397 wrote:
>
> > >
> > > <&usbmisc 0> would then mean port 0 of the usbmisc device.
> > I didn't add the restriction that a usbmisc driver must have a usbmisc
> > device. I'm not sure whether all SoC and future SoC can be look as
> > a device.
> >
> > Peter, do you have any idea?
> >
> I have not followed this usbmisc design, I just list some facts at i.mx
> USB controller:
>
> Sigmatel-derived SoCs (i.mx23, i.mx28) have no this register region, all phy controls
> are through PHY register.
> Other freescale SoCs have this usbmisc register region to control phy and tune some
> signal quality. This register region is from another 0x800 or (last controller base address + 0x200)
Looks good. I'll take Sascha's suggestion.
Thanks
Richard
>
> > Thanks
> > Richard
> > >
> > > If the usbmisc property exists, you can return -EPROBE_DEFER until it
> > is
> > > available. If it doesn't exist, you just continue without usbmisc
> > > support (i.MX28)
> > >
> > > Sascha
> > >
> > >
> > > --
> > > 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 |
> > >
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-07-31 9:06 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-07-26 10:35 [PATCH v3 0/3] imx: add usbmisc support Richard Zhao
2012-07-26 10:35 ` [PATCH v3 1/3] USB: chipidea: add imx " Richard Zhao
2012-07-30 9:32 ` Sascha Hauer
2012-07-30 9:39 ` Richard Zhao
2012-07-31 1:06 ` Chen Peter-B29397
2012-07-31 9:06 ` Richard Zhao
2012-07-26 10:35 ` [PATCH v3 2/3] ARM: dts: imx6q-sabrelite: add usbmisc device Richard Zhao
2012-07-30 1:27 ` Shawn Guo
2012-07-26 10:35 ` [PATCH v3 3/3] ARM: imx6q: clk_register_clkdev usbmisc clock Richard Zhao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).