* [PATCH 0/7] ARM: mx28: add usb host function
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
@ 2011-07-20 10:57 ` Felipe Balbi
2011-07-20 11:08 ` [PATCH 1/7] consolidate definitions and structures to share among platforms Tony Lin
` (7 subsequent siblings)
8 siblings, 0 replies; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 10:57 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 07:08:19PM +0800, Tony Lin wrote:
> this patch series is to add mx28 usb host function.
> the driver only support usb host mode on usb port1.
> the driver reuses ehci-mxc.c under usb/host, but did
> some modifications based on it to satisfy mx28 usb host
> requirement. The modifications will not affect other
> platforms.
>
> Code is based on the branch for-next in sascha's tree
> http://git.pengutronix.de/git/imx/linux-2.6.git
>
> Tested on MX28 EVK.
>
> Tony Lin (7):
> consolidate definitions and structures to share among platforms
> enable usb1 phy power supply
> add usb phy clocks to clock tree
> mx28: add usb host phy functions
> ehci mxc: make it more flexible to be used for mx28
> add macro definitions according to ehci-mxc driver change
> add usb host function to default config
>
> arch/arm/configs/mxs_defconfig | 8 +-
> arch/arm/mach-mxs/Kconfig | 1 +
> arch/arm/mach-mxs/Makefile | 1 +
> arch/arm/mach-mxs/clock-mx28.c | 18 ++
> arch/arm/mach-mxs/include/mach/hardware.h | 2 +
> arch/arm/mach-mxs/include/mach/mxs.h | 12 +-
> arch/arm/mach-mxs/mach-mx28evk.c | 9 +
> arch/arm/mach-mxs/regs-usbphy-mx28.h | 323 +++++++++++++++++++++++++++++
> arch/arm/mach-mxs/usb_h1.c | 230 ++++++++++++++++++++
> arch/arm/plat-mxc/include/mach/mxc.h | 3 +
> arch/arm/plat-mxc/include/mach/mxc_ehci.h | 19 --
> drivers/usb/host/Kconfig | 2 +-
> drivers/usb/host/ehci-mxc.c | 57 ++++--
> include/linux/fsl_devices.h | 21 ++
> 14 files changed, 669 insertions(+), 37 deletions(-)
> create mode 100644 arch/arm/mach-mxs/regs-usbphy-mx28.h
> create mode 100644 arch/arm/mach-mxs/usb_h1.c
Alan Stern is the maintainer for the EHCI driver. I'll have a look on
this series anyway ;-)
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/c9e77787/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 1/7] consolidate definitions and structures to share among platforms
2011-07-20 11:08 ` [PATCH 1/7] consolidate definitions and structures to share among platforms Tony Lin
@ 2011-07-20 10:59 ` Felipe Balbi
2011-07-20 11:03 ` Lin Tony-B19295
0 siblings, 1 reply; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 10:59 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 07:08:20PM +0800, Tony Lin wrote:
> move common definitions and data structures used for mxs and mxc
> platforms to fsl_device.h from mxc_ehci.h
> so that these definitions and structures could be shared without
> duplicated copies.
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
>
> ---
> arch/arm/plat-mxc/include/mach/mxc_ehci.h | 19 -------------------
> include/linux/fsl_devices.h | 21 +++++++++++++++++++++
> 2 files changed, 21 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> index 2c159dc..8775807 100644
> --- a/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> +++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> @@ -1,17 +1,6 @@
> #ifndef __INCLUDE_ASM_ARCH_MXC_EHCI_H
> #define __INCLUDE_ASM_ARCH_MXC_EHCI_H
>
> -/* values for portsc field */
> -#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
> -#define MXC_EHCI_FORCE_FS (1 << 24)
> -#define MXC_EHCI_UTMI_8BIT (0 << 28)
> -#define MXC_EHCI_UTMI_16BIT (1 << 28)
> -#define MXC_EHCI_SERIAL (1 << 29)
> -#define MXC_EHCI_MODE_UTMI (0 << 30)
> -#define MXC_EHCI_MODE_PHILIPS (1 << 30)
> -#define MXC_EHCI_MODE_ULPI (2 << 30)
> -#define MXC_EHCI_MODE_SERIAL (3 << 30)
> -
> /* values for flags field */
> #define MXC_EHCI_INTERFACE_DIFF_UNI (0 << 0)
> #define MXC_EHCI_INTERFACE_DIFF_BI (1 << 0)
> @@ -39,14 +28,6 @@
> #define MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK 0x3
> #define MX5_USB_UTMI_PHYCTRL1_PLLDIV_SHIFT 0
>
> -struct mxc_usbh_platform_data {
> - int (*init)(struct platform_device *pdev);
> - int (*exit)(struct platform_device *pdev);
> -
> - unsigned int portsc;
> - struct otg_transceiver *otg;
> -};
> -
> int mx51_initialize_usb_hw(int port, unsigned int flags);
> int mx25_initialize_usb_hw(int port, unsigned int flags);
> int mx31_initialize_usb_hw(int port, unsigned int flags);
> diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h
> index fffdf00..c138988 100644
> --- a/include/linux/fsl_devices.h
> +++ b/include/linux/fsl_devices.h
> @@ -103,6 +103,27 @@ struct fsl_usb2_platform_data {
>
> #define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0)
>
> +/* values for portsc field */
> +#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
> +#define MXC_EHCI_FORCE_FS (1 << 24)
> +#define MXC_EHCI_UTMI_8BIT (0 << 28)
> +#define MXC_EHCI_UTMI_16BIT (1 << 28)
> +#define MXC_EHCI_SERIAL (1 << 29)
> +#define MXC_EHCI_MODE_UTMI (0 << 30)
> +#define MXC_EHCI_MODE_PHILIPS (1 << 30)
> +#define MXC_EHCI_MODE_ULPI (2 << 30)
> +#define MXC_EHCI_MODE_SERIAL (3 << 30)
> +
> +struct mxc_usbh_platform_data {
> + int (*init)(struct platform_device *pdev);
> + int (*exit)(struct platform_device *pdev);
> +
> + unsigned int portsc;
> + struct otg_transceiver *otg;
> + int (*plt_get_usb_connect_status)(void);
> + void (*plt_usb_disconnect_detect)(int enable);
> +};
> +
> struct spi_device;
>
> struct fsl_spi_platform_data {
I believe this patch will cause build breakage since ehci-mxc.c doesn't
include <linux/fsl_devices.h> ??
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/8d49f4ef/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
@ 2011-07-20 11:01 ` Felipe Balbi
2011-07-20 11:41 ` Wolfram Sang
2011-07-20 19:08 ` Sascha Hauer
2 siblings, 0 replies; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:01 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:21PM +0800, Tony Lin wrote:
> configure usb1 phy power enable gpio and enable usb1 phy power
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
this one looks ok from a code stand point, no access to any MXC
documentation. FWIW:
Reviewed-by: Felipe Balbi <balbi@ti.com>
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/4c5cf526/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-20 11:08 ` [PATCH 3/7] add usb phy clocks to clock tree Tony Lin
@ 2011-07-20 11:02 ` Felipe Balbi
2011-07-20 11:05 ` Lin Tony-B19295
2011-07-20 19:10 ` Sascha Hauer
1 sibling, 1 reply; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:02 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:22PM +0800, Tony Lin wrote:
it would be nice to have some changelog here even though the change is
obvious.
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
FWIW:
Reviewed-by: Felipe Balbi <balbi@ti.com>
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/2440dbe5/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 1/7] consolidate definitions and structures to share among platforms
2011-07-20 10:59 ` Felipe Balbi
@ 2011-07-20 11:03 ` Lin Tony-B19295
2011-07-20 11:16 ` Felipe Balbi
0 siblings, 1 reply; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:03 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Felipe Balbi [mailto:balbi at ti.com]
> Sent: Wednesday, July 20, 2011 7:00 PM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> balbi at ti.com; koen.beel.barco at gmail.com
> Subject: Re: [PATCH 1/7] consolidate definitions and structures to share
> among platforms
>
> Hi,
>
> On Wed, Jul 20, 2011 at 07:08:20PM +0800, Tony Lin wrote:
> > move common definitions and data structures used for mxs and mxc
> > platforms to fsl_device.h from mxc_ehci.h so that these definitions
> > and structures could be shared without duplicated copies.
> >
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
> >
> > ---
> > arch/arm/plat-mxc/include/mach/mxc_ehci.h | 19 -------------------
> > include/linux/fsl_devices.h | 21 +++++++++++++++++++++
> > 2 files changed, 21 insertions(+), 19 deletions(-)
> >
> > diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> > b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> > index 2c159dc..8775807 100644
> > --- a/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> > +++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
> > @@ -1,17 +1,6 @@
> > #ifndef __INCLUDE_ASM_ARCH_MXC_EHCI_H #define
> > __INCLUDE_ASM_ARCH_MXC_EHCI_H
> >
> > -/* values for portsc field */
> > -#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
> > -#define MXC_EHCI_FORCE_FS (1 << 24)
> > -#define MXC_EHCI_UTMI_8BIT (0 << 28)
> > -#define MXC_EHCI_UTMI_16BIT (1 << 28)
> > -#define MXC_EHCI_SERIAL (1 << 29)
> > -#define MXC_EHCI_MODE_UTMI (0 << 30)
> > -#define MXC_EHCI_MODE_PHILIPS (1 << 30)
> > -#define MXC_EHCI_MODE_ULPI (2 << 30)
> > -#define MXC_EHCI_MODE_SERIAL (3 << 30)
> > -
> > /* values for flags field */
> > #define MXC_EHCI_INTERFACE_DIFF_UNI (0 << 0)
> > #define MXC_EHCI_INTERFACE_DIFF_BI (1 << 0)
> > @@ -39,14 +28,6 @@
> > #define MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK 0x3
> > #define MX5_USB_UTMI_PHYCTRL1_PLLDIV_SHIFT 0
> >
> > -struct mxc_usbh_platform_data {
> > - int (*init)(struct platform_device *pdev);
> > - int (*exit)(struct platform_device *pdev);
> > -
> > - unsigned int portsc;
> > - struct otg_transceiver *otg;
> > -};
> > -
> > int mx51_initialize_usb_hw(int port, unsigned int flags); int
> > mx25_initialize_usb_hw(int port, unsigned int flags); int
> > mx31_initialize_usb_hw(int port, unsigned int flags); diff --git
> > a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h index
> > fffdf00..c138988 100644
> > --- a/include/linux/fsl_devices.h
> > +++ b/include/linux/fsl_devices.h
> > @@ -103,6 +103,27 @@ struct fsl_usb2_platform_data {
> >
> > #define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0)
> >
> > +/* values for portsc field */
> > +#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
> > +#define MXC_EHCI_FORCE_FS (1 << 24)
> > +#define MXC_EHCI_UTMI_8BIT (0 << 28)
> > +#define MXC_EHCI_UTMI_16BIT (1 << 28)
> > +#define MXC_EHCI_SERIAL (1 << 29)
> > +#define MXC_EHCI_MODE_UTMI (0 << 30)
> > +#define MXC_EHCI_MODE_PHILIPS (1 << 30)
> > +#define MXC_EHCI_MODE_ULPI (2 << 30)
> > +#define MXC_EHCI_MODE_SERIAL (3 << 30)
> > +
> > +struct mxc_usbh_platform_data {
> > + int (*init)(struct platform_device *pdev);
> > + int (*exit)(struct platform_device *pdev);
> > +
> > + unsigned int portsc;
> > + struct otg_transceiver *otg;
> > + int (*plt_get_usb_connect_status)(void);
> > + void (*plt_usb_disconnect_detect)(int enable); };
> > +
> > struct spi_device;
> >
> > struct fsl_spi_platform_data {
>
> I believe this patch will cause build breakage since ehci-mxc.c doesn't
> include <linux/fsl_devices.h> ??
Ehci-mxc.c does include <linux/fsl_devices.h>, please check patch 5/7. Thanks
BR
Tony
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-20 11:02 ` Felipe Balbi
@ 2011-07-20 11:05 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:05 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Felipe Balbi [mailto:balbi at ti.com]
> Sent: Wednesday, July 20, 2011 7:03 PM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> balbi at ti.com; koen.beel.barco at gmail.com
> Subject: Re: [PATCH 3/7] add usb phy clocks to clock tree
>
> On Wed, Jul 20, 2011 at 07:08:22PM +0800, Tony Lin wrote:
>
> it would be nice to have some changelog here even though the change is
> obvious.
Ok, accepted
>
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
>
> FWIW:
>
> Reviewed-by: Felipe Balbi <balbi@ti.com>
>
> --
> balbi
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
@ 2011-07-20 11:05 ` Arnaud Patard (Rtp)
2011-07-20 11:08 ` Lin Tony-B19295
2011-07-20 11:14 ` Felipe Balbi
` (2 subsequent siblings)
3 siblings, 1 reply; 41+ messages in thread
From: Arnaud Patard (Rtp) @ 2011-07-20 11:05 UTC (permalink / raw)
To: linux-arm-kernel
Tony Lin <tony.lin@freescale.com> writes:
Hi,
> old driver uses some hard coding for clks' name which could
> not be used for mx28. So workaround these hard codings by
> judging the cpu is mx28 or not.
Sascha had some patches to solve this in a different way, avoiding to
add yet an other cpu_is_* check for ahb clock. Don't know their current
status.
See:
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-February/040364.html
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-February/040365.html
http://lists.infradead.org/pipermail/linux-arm-kernel/2011-February/040363.html
Arnaud
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:05 ` Arnaud Patard (Rtp)
@ 2011-07-20 11:08 ` Lin Tony-B19295
2011-07-20 11:45 ` Wolfram Sang
0 siblings, 1 reply; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Arnaud Patard [mailto:arnaud.patard at rtp-net.org]
> Sent: Wednesday, July 20, 2011 7:06 PM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; koen.beel.barco at gmail.com; balbi at ti.com;
> linux-arm-kernel at lists.infradead.org; Sascha Hauer
> Subject: Re: [PATCH 5/7] ehci mxc: make it more flexible to be used for
> mx28
>
> Tony Lin <tony.lin@freescale.com> writes:
> Hi,
>
> > old driver uses some hard coding for clks' name which could not be
> > used for mx28. So workaround these hard codings by judging the cpu is
> > mx28 or not.
>
> Sascha had some patches to solve this in a different way, avoiding to add
> yet an other cpu_is_* check for ahb clock. Don't know their current
> status.
Yes, using cpu_is_* is really a bad method here :-)
But I had to follow that bad method so far, hope we could see some change from sascha.
>
> See:
> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-
> February/040364.html
> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-
> February/040365.html
> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-
> February/040363.html
>
> Arnaud
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 0/7] ARM: mx28: add usb host function
@ 2011-07-20 11:08 Tony Lin
2011-07-20 10:57 ` Felipe Balbi
` (8 more replies)
0 siblings, 9 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
this patch series is to add mx28 usb host function.
the driver only support usb host mode on usb port1.
the driver reuses ehci-mxc.c under usb/host, but did
some modifications based on it to satisfy mx28 usb host
requirement. The modifications will not affect other
platforms.
Code is based on the branch for-next in sascha's tree http://git.pengutronix.de/git/imx/linux-2.6.git
Tested on MX28 EVK.
Tony Lin (7):
consolidate definitions and structures to share among platforms
enable usb1 phy power supply
add usb phy clocks to clock tree
mx28: add usb host phy functions
ehci mxc: make it more flexible to be used for mx28
add macro definitions according to ehci-mxc driver change
add usb host function to default config
arch/arm/configs/mxs_defconfig | 8 +-
arch/arm/mach-mxs/Kconfig | 1 +
arch/arm/mach-mxs/Makefile | 1 +
arch/arm/mach-mxs/clock-mx28.c | 18 ++
arch/arm/mach-mxs/include/mach/hardware.h | 2 +
arch/arm/mach-mxs/include/mach/mxs.h | 12 +-
arch/arm/mach-mxs/mach-mx28evk.c | 9 +
arch/arm/mach-mxs/regs-usbphy-mx28.h | 323 +++++++++++++++++++++++++++++
arch/arm/mach-mxs/usb_h1.c | 230 ++++++++++++++++++++
arch/arm/plat-mxc/include/mach/mxc.h | 3 +
arch/arm/plat-mxc/include/mach/mxc_ehci.h | 19 --
drivers/usb/host/Kconfig | 2 +-
drivers/usb/host/ehci-mxc.c | 57 ++++--
include/linux/fsl_devices.h | 21 ++
14 files changed, 669 insertions(+), 37 deletions(-)
create mode 100644 arch/arm/mach-mxs/regs-usbphy-mx28.h
create mode 100644 arch/arm/mach-mxs/usb_h1.c
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 1/7] consolidate definitions and structures to share among platforms
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
2011-07-20 10:57 ` Felipe Balbi
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 10:59 ` Felipe Balbi
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
` (6 subsequent siblings)
8 siblings, 1 reply; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
move common definitions and data structures used for mxs and mxc
platforms to fsl_device.h from mxc_ehci.h
so that these definitions and structures could be shared without
duplicated copies.
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/plat-mxc/include/mach/mxc_ehci.h | 19 -------------------
include/linux/fsl_devices.h | 21 +++++++++++++++++++++
2 files changed, 21 insertions(+), 19 deletions(-)
diff --git a/arch/arm/plat-mxc/include/mach/mxc_ehci.h b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
index 2c159dc..8775807 100644
--- a/arch/arm/plat-mxc/include/mach/mxc_ehci.h
+++ b/arch/arm/plat-mxc/include/mach/mxc_ehci.h
@@ -1,17 +1,6 @@
#ifndef __INCLUDE_ASM_ARCH_MXC_EHCI_H
#define __INCLUDE_ASM_ARCH_MXC_EHCI_H
-/* values for portsc field */
-#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
-#define MXC_EHCI_FORCE_FS (1 << 24)
-#define MXC_EHCI_UTMI_8BIT (0 << 28)
-#define MXC_EHCI_UTMI_16BIT (1 << 28)
-#define MXC_EHCI_SERIAL (1 << 29)
-#define MXC_EHCI_MODE_UTMI (0 << 30)
-#define MXC_EHCI_MODE_PHILIPS (1 << 30)
-#define MXC_EHCI_MODE_ULPI (2 << 30)
-#define MXC_EHCI_MODE_SERIAL (3 << 30)
-
/* values for flags field */
#define MXC_EHCI_INTERFACE_DIFF_UNI (0 << 0)
#define MXC_EHCI_INTERFACE_DIFF_BI (1 << 0)
@@ -39,14 +28,6 @@
#define MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK 0x3
#define MX5_USB_UTMI_PHYCTRL1_PLLDIV_SHIFT 0
-struct mxc_usbh_platform_data {
- int (*init)(struct platform_device *pdev);
- int (*exit)(struct platform_device *pdev);
-
- unsigned int portsc;
- struct otg_transceiver *otg;
-};
-
int mx51_initialize_usb_hw(int port, unsigned int flags);
int mx25_initialize_usb_hw(int port, unsigned int flags);
int mx31_initialize_usb_hw(int port, unsigned int flags);
diff --git a/include/linux/fsl_devices.h b/include/linux/fsl_devices.h
index fffdf00..c138988 100644
--- a/include/linux/fsl_devices.h
+++ b/include/linux/fsl_devices.h
@@ -103,6 +103,27 @@ struct fsl_usb2_platform_data {
#define FLS_USB2_WORKAROUND_ENGCM09152 (1 << 0)
+/* values for portsc field */
+#define MXC_EHCI_PHY_LOW_POWER_SUSPEND (1 << 23)
+#define MXC_EHCI_FORCE_FS (1 << 24)
+#define MXC_EHCI_UTMI_8BIT (0 << 28)
+#define MXC_EHCI_UTMI_16BIT (1 << 28)
+#define MXC_EHCI_SERIAL (1 << 29)
+#define MXC_EHCI_MODE_UTMI (0 << 30)
+#define MXC_EHCI_MODE_PHILIPS (1 << 30)
+#define MXC_EHCI_MODE_ULPI (2 << 30)
+#define MXC_EHCI_MODE_SERIAL (3 << 30)
+
+struct mxc_usbh_platform_data {
+ int (*init)(struct platform_device *pdev);
+ int (*exit)(struct platform_device *pdev);
+
+ unsigned int portsc;
+ struct otg_transceiver *otg;
+ int (*plt_get_usb_connect_status)(void);
+ void (*plt_usb_disconnect_detect)(int enable);
+};
+
struct spi_device;
struct fsl_spi_platform_data {
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
2011-07-20 10:57 ` Felipe Balbi
2011-07-20 11:08 ` [PATCH 1/7] consolidate definitions and structures to share among platforms Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 11:01 ` Felipe Balbi
` (2 more replies)
2011-07-20 11:08 ` [PATCH 3/7] add usb phy clocks to clock tree Tony Lin
` (5 subsequent siblings)
8 siblings, 3 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
configure usb1 phy power enable gpio and enable usb1 phy power
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/mach-mxs/mach-mx28evk.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c
index eaaf6ff..6934867 100644
--- a/arch/arm/mach-mxs/mach-mx28evk.c
+++ b/arch/arm/mach-mxs/mach-mx28evk.c
@@ -34,6 +34,7 @@
#define MX28EVK_BL_ENABLE MXS_GPIO_NR(3, 18)
#define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
#define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
+#define MX28EVK_USB1_PWR_EN MXS_GPIO_NR(3, 8)
#define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
#define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
@@ -183,6 +184,8 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
/* led */
MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
+ /* usb1 */
+ MX28_PAD_AUART2_RX__GPIO_3_8 | MXS_PAD_CTRL,
};
/* led */
@@ -405,6 +408,12 @@ static void __init mx28evk_init(void)
pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
+ ret = gpio_request_one(MX28EVK_USB1_PWR_EN, GPIOF_DIR_OUT,
+ "usb1-power-en");
+ if (ret)
+ pr_warn("failed to request gpio usb1-power-en %d\n", ret);
+ else
+ gpio_set_value(MX28EVK_USB1_PWR_EN, 1);
gpio_led_register_device(0, &mx28evk_led_data);
}
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (2 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 11:02 ` Felipe Balbi
2011-07-20 19:10 ` Sascha Hauer
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
` (4 subsequent siblings)
8 siblings, 2 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/mach-mxs/clock-mx28.c | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c
index 5dcc59d..6fd0fe6 100644
--- a/arch/arm/mach-mxs/clock-mx28.c
+++ b/arch/arm/mach-mxs/clock-mx28.c
@@ -570,7 +570,23 @@ static struct clk usb1_clk = {
.disable = _raw_clk_disable,
.parent = &pll1_clk,
};
+/* usb phy clock for usb0 */
+static struct clk usb_phy_clk0 = {
+ .parent = &pll0_clk,
+ .enable = _raw_clk_disable, /* EN_USB_CLKS = 1 means ON */
+ .disable = _raw_clk_enable,
+ .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL0CTRL0,
+ .enable_shift = 18,
+};
+/* usb phy clock for usb1 */
+static struct clk usb_phy_clk1 = {
+ .parent = &pll1_clk,
+ .enable = _raw_clk_disable,
+ .disable = _raw_clk_enable,
+ .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL1CTRL0,
+ .enable_shift = 18,
+};
#define _DEFINE_CLOCK(name, er, es, p) \
static struct clk name = { \
.enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \
@@ -629,6 +645,8 @@ static struct clk_lookup lookups[] = {
_REGISTER_CLOCK("flexcan.1", NULL, can1_clk)
_REGISTER_CLOCK(NULL, "usb0", usb0_clk)
_REGISTER_CLOCK(NULL, "usb1", usb1_clk)
+ _REGISTER_CLOCK(NULL, "usb0_phy", usb_phy_clk0)
+ _REGISTER_CLOCK(NULL, "usb1_phy", usb_phy_clk1)
_REGISTER_CLOCK("mxs-pwm.0", NULL, pwm_clk)
_REGISTER_CLOCK("mxs-pwm.1", NULL, pwm_clk)
_REGISTER_CLOCK("mxs-pwm.2", NULL, pwm_clk)
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 4/7] mx28: add usb host phy functions
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (3 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 3/7] add usb phy clocks to clock tree Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 11:12 ` Felipe Balbi
` (2 more replies)
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
` (3 subsequent siblings)
8 siblings, 3 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
add usb phy register definitions and functions
usb host driver will use these functions to initialize
usb phy and change phy working mode
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/mach-mxs/Kconfig | 1 +
arch/arm/mach-mxs/Makefile | 1 +
arch/arm/mach-mxs/regs-usbphy-mx28.h | 323 ++++++++++++++++++++++++++++++++++
arch/arm/mach-mxs/usb_h1.c | 230 ++++++++++++++++++++++++
4 files changed, 555 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig
index 4cd0231..1c4264f 100644
--- a/arch/arm/mach-mxs/Kconfig
+++ b/arch/arm/mach-mxs/Kconfig
@@ -49,6 +49,7 @@ config MACH_MX28EVK
select MXS_HAVE_PLATFORM_MXS_MMC
select MXS_HAVE_PLATFORM_MXSFB
select MXS_OCOTP
+ select USB_ARCH_HAS_EHCI
help
Include support for MX28EVK platform. This includes specific
configurations for the board and its peripherals.
diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
index 6c38262..48fc2f5 100644
--- a/arch/arm/mach-mxs/Makefile
+++ b/arch/arm/mach-mxs/Makefile
@@ -12,5 +12,6 @@ obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
obj-$(CONFIG_MODULE_TX28) += module-tx28.o
obj-$(CONFIG_MACH_TX28) += mach-tx28.o
+obj-$(CONFIG_USB_EHCI_MXC) += usb_h1.o
obj-y += devices/
diff --git a/arch/arm/mach-mxs/regs-usbphy-mx28.h b/arch/arm/mach-mxs/regs-usbphy-mx28.h
new file mode 100644
index 0000000..a367927
--- /dev/null
+++ b/arch/arm/mach-mxs/regs-usbphy-mx28.h
@@ -0,0 +1,323 @@
+/*
+ * Freescale USBPHY Register Definitions
+ *
+ * Copyright 2008-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * This file is created by xml file. Don't Edit it.
+ *
+ * Xml Revision: 1.52
+ * Template revision: 26195
+ */
+
+#ifndef __ARCH_ARM___USBPHY_H
+#define __ARCH_ARM___USBPHY_H
+
+
+#define HW_USBPHY_PWD (0x00000000)
+#define HW_USBPHY_PWD_SET (0x00000004)
+#define HW_USBPHY_PWD_CLR (0x00000008)
+#define HW_USBPHY_PWD_TOG (0x0000000c)
+
+#define BP_USBPHY_PWD_RSVD2 21
+#define BM_USBPHY_PWD_RSVD2 0xFFE00000
+#define BF_USBPHY_PWD_RSVD2(v) \
+ (((v) << 21) & BM_USBPHY_PWD_RSVD2)
+#define BM_USBPHY_PWD_RXPWDRX 0x00100000
+#define BM_USBPHY_PWD_RXPWDDIFF 0x00080000
+#define BM_USBPHY_PWD_RXPWD1PT1 0x00040000
+#define BM_USBPHY_PWD_RXPWDENV 0x00020000
+#define BP_USBPHY_PWD_RSVD1 13
+#define BM_USBPHY_PWD_RSVD1 0x0001E000
+#define BF_USBPHY_PWD_RSVD1(v) \
+ (((v) << 13) & BM_USBPHY_PWD_RSVD1)
+#define BM_USBPHY_PWD_TXPWDV2I 0x00001000
+#define BM_USBPHY_PWD_TXPWDIBIAS 0x00000800
+#define BM_USBPHY_PWD_TXPWDFS 0x00000400
+#define BP_USBPHY_PWD_RSVD0 0
+#define BM_USBPHY_PWD_RSVD0 0x000003FF
+#define BF_USBPHY_PWD_RSVD0(v) \
+ (((v) << 0) & BM_USBPHY_PWD_RSVD0)
+
+#define HW_USBPHY_TX (0x00000010)
+#define HW_USBPHY_TX_SET (0x00000014)
+#define HW_USBPHY_TX_CLR (0x00000018)
+#define HW_USBPHY_TX_TOG (0x0000001c)
+
+#define BP_USBPHY_TX_RSVD5 29
+#define BM_USBPHY_TX_RSVD5 0xE0000000
+#define BF_USBPHY_TX_RSVD5(v) \
+ (((v) << 29) & BM_USBPHY_TX_RSVD5)
+#define BP_USBPHY_TX_USBPHY_TX_EDGECTRL 26
+#define BM_USBPHY_TX_USBPHY_TX_EDGECTRL 0x1C000000
+#define BF_USBPHY_TX_USBPHY_TX_EDGECTRL(v) \
+ (((v) << 26) & BM_USBPHY_TX_USBPHY_TX_EDGECTRL)
+#define BM_USBPHY_TX_USBPHY_TX_SYNC_INVERT 0x02000000
+#define BM_USBPHY_TX_USBPHY_TX_SYNC_MUX 0x01000000
+#define BP_USBPHY_TX_RSVD4 22
+#define BM_USBPHY_TX_RSVD4 0x00C00000
+#define BF_USBPHY_TX_RSVD4(v) \
+ (((v) << 22) & BM_USBPHY_TX_RSVD4)
+#define BM_USBPHY_TX_TXENCAL45DP 0x00200000
+#define BM_USBPHY_TX_RSVD3 0x00100000
+#define BP_USBPHY_TX_TXCAL45DP 16
+#define BM_USBPHY_TX_TXCAL45DP 0x000F0000
+#define BF_USBPHY_TX_TXCAL45DP(v) \
+ (((v) << 16) & BM_USBPHY_TX_TXCAL45DP)
+#define BP_USBPHY_TX_RSVD2 14
+#define BM_USBPHY_TX_RSVD2 0x0000C000
+#define BF_USBPHY_TX_RSVD2(v) \
+ (((v) << 14) & BM_USBPHY_TX_RSVD2)
+#define BM_USBPHY_TX_TXENCAL45DN 0x00002000
+#define BM_USBPHY_TX_RSVD1 0x00001000
+#define BP_USBPHY_TX_TXCAL45DN 8
+#define BM_USBPHY_TX_TXCAL45DN 0x00000F00
+#define BF_USBPHY_TX_TXCAL45DN(v) \
+ (((v) << 8) & BM_USBPHY_TX_TXCAL45DN)
+#define BP_USBPHY_TX_RSVD0 4
+#define BM_USBPHY_TX_RSVD0 0x000000F0
+#define BF_USBPHY_TX_RSVD0(v) \
+ (((v) << 4) & BM_USBPHY_TX_RSVD0)
+#define BP_USBPHY_TX_D_CAL 0
+#define BM_USBPHY_TX_D_CAL 0x0000000F
+#define BF_USBPHY_TX_D_CAL(v) \
+ (((v) << 0) & BM_USBPHY_TX_D_CAL)
+
+#define HW_USBPHY_RX (0x00000020)
+#define HW_USBPHY_RX_SET (0x00000024)
+#define HW_USBPHY_RX_CLR (0x00000028)
+#define HW_USBPHY_RX_TOG (0x0000002c)
+
+#define BP_USBPHY_RX_RSVD2 23
+#define BM_USBPHY_RX_RSVD2 0xFF800000
+#define BF_USBPHY_RX_RSVD2(v) \
+ (((v) << 23) & BM_USBPHY_RX_RSVD2)
+#define BM_USBPHY_RX_RXDBYPASS 0x00400000
+#define BP_USBPHY_RX_RSVD1 7
+#define BM_USBPHY_RX_RSVD1 0x003FFF80
+#define BF_USBPHY_RX_RSVD1(v) \
+ (((v) << 7) & BM_USBPHY_RX_RSVD1)
+#define BP_USBPHY_RX_DISCONADJ 4
+#define BM_USBPHY_RX_DISCONADJ 0x00000070
+#define BF_USBPHY_RX_DISCONADJ(v) \
+ (((v) << 4) & BM_USBPHY_RX_DISCONADJ)
+#define BM_USBPHY_RX_RSVD0 0x00000008
+#define BP_USBPHY_RX_ENVADJ 0
+#define BM_USBPHY_RX_ENVADJ 0x00000007
+#define BF_USBPHY_RX_ENVADJ(v) \
+ (((v) << 0) & BM_USBPHY_RX_ENVADJ)
+
+#define HW_USBPHY_CTRL (0x00000030)
+#define HW_USBPHY_CTRL_SET (0x00000034)
+#define HW_USBPHY_CTRL_CLR (0x00000038)
+#define HW_USBPHY_CTRL_TOG (0x0000003c)
+
+#define BM_USBPHY_CTRL_SFTRST 0x80000000
+#define BM_USBPHY_CTRL_CLKGATE 0x40000000
+#define BM_USBPHY_CTRL_UTMI_SUSPENDM 0x20000000
+#define BM_USBPHY_CTRL_HOST_FORCE_LS_SE0 0x10000000
+#define BM_USBPHY_CTRL_RSVD3 0x08000000
+#define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS 0x04000000
+#define BM_USBPHY_CTRL_ENAUTOCLR_USBCLKGATE 0x02000000
+#define BM_USBPHY_CTRL_FSDLL_RST_EN 0x01000000
+#define BM_USBPHY_CTRL_ENVBUSCHG_WKUP 0x00800000
+#define BM_USBPHY_CTRL_ENIDCHG_WKUP 0x00400000
+#define BM_USBPHY_CTRL_ENDPDMCHG_WKUP 0x00200000
+#define BM_USBPHY_CTRL_ENAUTOCLR_PHY_PWD 0x00100000
+#define BM_USBPHY_CTRL_ENAUTOCLR_CLKGATE 0x00080000
+#define BM_USBPHY_CTRL_ENAUTO_PWRON_PLL 0x00040000
+#define BM_USBPHY_CTRL_WAKEUP_IRQ 0x00020000
+#define BM_USBPHY_CTRL_ENIRQWAKEUP 0x00010000
+#define BM_USBPHY_CTRL_ENUTMILEVEL3 0x00008000
+#define BM_USBPHY_CTRL_ENUTMILEVEL2 0x00004000
+#define BM_USBPHY_CTRL_DATA_ON_LRADC 0x00002000
+#define BM_USBPHY_CTRL_DEVPLUGIN_IRQ 0x00001000
+#define BM_USBPHY_CTRL_ENIRQDEVPLUGIN 0x00000800
+#define BM_USBPHY_CTRL_RESUME_IRQ 0x00000400
+#define BM_USBPHY_CTRL_ENIRQRESUMEDETECT 0x00000200
+#define BM_USBPHY_CTRL_RESUMEIRQSTICKY 0x00000100
+#define BM_USBPHY_CTRL_ENOTGIDDETECT 0x00000080
+#define BM_USBPHY_CTRL_RSVD1 0x00000040
+#define BM_USBPHY_CTRL_DEVPLUGIN_POLARITY 0x00000020
+#define BM_USBPHY_CTRL_ENDEVPLUGINDETECT 0x00000010
+#define BM_USBPHY_CTRL_HOSTDISCONDETECT_IRQ 0x00000008
+#define BM_USBPHY_CTRL_ENIRQHOSTDISCON 0x00000004
+#define BM_USBPHY_CTRL_ENHOSTDISCONDETECT 0x00000002
+#define BM_USBPHY_CTRL_RSVD0 0x00000001
+
+#define HW_USBPHY_STATUS (0x00000040)
+
+#define BP_USBPHY_STATUS_RSVD4 11
+#define BM_USBPHY_STATUS_RSVD4 0xFFFFF800
+#define BF_USBPHY_STATUS_RSVD4(v) \
+ (((v) << 11) & BM_USBPHY_STATUS_RSVD4)
+#define BM_USBPHY_STATUS_RESUME_STATUS 0x00000400
+#define BM_USBPHY_STATUS_RSVD3 0x00000200
+#define BM_USBPHY_STATUS_OTGID_STATUS 0x00000100
+#define BM_USBPHY_STATUS_RSVD2 0x00000080
+#define BM_USBPHY_STATUS_DEVPLUGIN_STATUS 0x00000040
+#define BP_USBPHY_STATUS_RSVD1 4
+#define BM_USBPHY_STATUS_RSVD1 0x00000030
+#define BF_USBPHY_STATUS_RSVD1(v) \
+ (((v) << 4) & BM_USBPHY_STATUS_RSVD1)
+#define BM_USBPHY_STATUS_HOSTDISCONDETECT_STATUS 0x00000008
+#define BP_USBPHY_STATUS_RSVD0 0
+#define BM_USBPHY_STATUS_RSVD0 0x00000007
+#define BF_USBPHY_STATUS_RSVD0(v) \
+ (((v) << 0) & BM_USBPHY_STATUS_RSVD0)
+
+#define HW_USBPHY_DEBUG (0x00000050)
+#define HW_USBPHY_DEBUG_SET (0x00000054)
+#define HW_USBPHY_DEBUG_CLR (0x00000058)
+#define HW_USBPHY_DEBUG_TOG (0x0000005c)
+
+#define BM_USBPHY_DEBUG_RSVD3 0x80000000
+#define BM_USBPHY_DEBUG_CLKGATE 0x40000000
+#define BM_USBPHY_DEBUG_HOST_RESUME_DEBUG 0x20000000
+#define BP_USBPHY_DEBUG_SQUELCHRESETLENGTH 25
+#define BM_USBPHY_DEBUG_SQUELCHRESETLENGTH 0x1E000000
+#define BF_USBPHY_DEBUG_SQUELCHRESETLENGTH(v) \
+ (((v) << 25) & BM_USBPHY_DEBUG_SQUELCHRESETLENGTH)
+#define BM_USBPHY_DEBUG_ENSQUELCHRESET 0x01000000
+#define BP_USBPHY_DEBUG_RSVD2 21
+#define BM_USBPHY_DEBUG_RSVD2 0x00E00000
+#define BF_USBPHY_DEBUG_RSVD2(v) \
+ (((v) << 21) & BM_USBPHY_DEBUG_RSVD2)
+#define BP_USBPHY_DEBUG_SQUELCHRESETCOUNT 16
+#define BM_USBPHY_DEBUG_SQUELCHRESETCOUNT 0x001F0000
+#define BF_USBPHY_DEBUG_SQUELCHRESETCOUNT(v) \
+ (((v) << 16) & BM_USBPHY_DEBUG_SQUELCHRESETCOUNT)
+#define BP_USBPHY_DEBUG_RSVD1 13
+#define BM_USBPHY_DEBUG_RSVD1 0x0000E000
+#define BF_USBPHY_DEBUG_RSVD1(v) \
+ (((v) << 13) & BM_USBPHY_DEBUG_RSVD1)
+#define BM_USBPHY_DEBUG_ENTX2RXCOUNT 0x00001000
+#define BP_USBPHY_DEBUG_TX2RXCOUNT 8
+#define BM_USBPHY_DEBUG_TX2RXCOUNT 0x00000F00
+#define BF_USBPHY_DEBUG_TX2RXCOUNT(v) \
+ (((v) << 8) & BM_USBPHY_DEBUG_TX2RXCOUNT)
+#define BP_USBPHY_DEBUG_RSVD0 6
+#define BM_USBPHY_DEBUG_RSVD0 0x000000C0
+#define BF_USBPHY_DEBUG_RSVD0(v) \
+ (((v) << 6) & BM_USBPHY_DEBUG_RSVD0)
+#define BP_USBPHY_DEBUG_ENHSTPULLDOWN 4
+#define BM_USBPHY_DEBUG_ENHSTPULLDOWN 0x00000030
+#define BF_USBPHY_DEBUG_ENHSTPULLDOWN(v) \
+ (((v) << 4) & BM_USBPHY_DEBUG_ENHSTPULLDOWN)
+#define BP_USBPHY_DEBUG_HSTPULLDOWN 2
+#define BM_USBPHY_DEBUG_HSTPULLDOWN 0x0000000C
+#define BF_USBPHY_DEBUG_HSTPULLDOWN(v) \
+ (((v) << 2) & BM_USBPHY_DEBUG_HSTPULLDOWN)
+#define BM_USBPHY_DEBUG_DEBUG_INTERFACE_HOLD 0x00000002
+#define BM_USBPHY_DEBUG_OTGIDPIOLOCK 0x00000001
+
+#define HW_USBPHY_DEBUG0_STATUS (0x00000060)
+
+#define BP_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT 26
+#define BM_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT 0xFC000000
+#define BF_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT(v) \
+ (((v) << 26) & BM_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT)
+#define BP_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT 16
+#define BM_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT 0x03FF0000
+#define BF_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT(v) \
+ (((v) << 16) & BM_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT)
+#define BP_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT 0
+#define BM_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT 0x0000FFFF
+#define BF_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT(v) \
+ (((v) << 0) & BM_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT)
+
+#define HW_USBPHY_DEBUG1 (0x00000070)
+#define HW_USBPHY_DEBUG1_SET (0x00000074)
+#define HW_USBPHY_DEBUG1_CLR (0x00000078)
+#define HW_USBPHY_DEBUG1_TOG (0x0000007c)
+
+#define BP_USBPHY_DEBUG1_RSVD1 15
+#define BM_USBPHY_DEBUG1_RSVD1 0xFFFF8000
+#define BF_USBPHY_DEBUG1_RSVD1(v) \
+ (((v) << 15) & BM_USBPHY_DEBUG1_RSVD1)
+#define BP_USBPHY_DEBUG1_ENTAILADJVD 13
+#define BM_USBPHY_DEBUG1_ENTAILADJVD 0x00006000
+#define BF_USBPHY_DEBUG1_ENTAILADJVD(v) \
+ (((v) << 13) & BM_USBPHY_DEBUG1_ENTAILADJVD)
+#define BM_USBPHY_DEBUG1_ENTX2TX 0x00001000
+#define BP_USBPHY_DEBUG1_RSVD0 4
+#define BM_USBPHY_DEBUG1_RSVD0 0x00000FF0
+#define BF_USBPHY_DEBUG1_RSVD0(v) \
+ (((v) << 4) & BM_USBPHY_DEBUG1_RSVD0)
+#define BP_USBPHY_DEBUG1_DBG_ADDRESS 0
+#define BM_USBPHY_DEBUG1_DBG_ADDRESS 0x0000000F
+#define BF_USBPHY_DEBUG1_DBG_ADDRESS(v) \
+ (((v) << 0) & BM_USBPHY_DEBUG1_DBG_ADDRESS)
+
+#define HW_USBPHY_VERSION (0x00000080)
+
+#define BP_USBPHY_VERSION_MAJOR 24
+#define BM_USBPHY_VERSION_MAJOR 0xFF000000
+#define BF_USBPHY_VERSION_MAJOR(v) \
+ (((v) << 24) & BM_USBPHY_VERSION_MAJOR)
+#define BP_USBPHY_VERSION_MINOR 16
+#define BM_USBPHY_VERSION_MINOR 0x00FF0000
+#define BF_USBPHY_VERSION_MINOR(v) \
+ (((v) << 16) & BM_USBPHY_VERSION_MINOR)
+#define BP_USBPHY_VERSION_STEP 0
+#define BM_USBPHY_VERSION_STEP 0x0000FFFF
+#define BF_USBPHY_VERSION_STEP(v) \
+ (((v) << 0) & BM_USBPHY_VERSION_STEP)
+
+#define HW_USBPHY_IP (0x00000090)
+#define HW_USBPHY_IP_SET (0x00000094)
+#define HW_USBPHY_IP_CLR (0x00000098)
+#define HW_USBPHY_IP_TOG (0x0000009c)
+
+#define BP_USBPHY_IP_RSVD1 25
+#define BM_USBPHY_IP_RSVD1 0xFE000000
+#define BF_USBPHY_IP_RSVD1(v) \
+ (((v) << 25) & BM_USBPHY_IP_RSVD1)
+#define BP_USBPHY_IP_DIV_SEL 23
+#define BM_USBPHY_IP_DIV_SEL 0x01800000
+#define BF_USBPHY_IP_DIV_SEL(v) \
+ (((v) << 23) & BM_USBPHY_IP_DIV_SEL)
+#define BV_USBPHY_IP_DIV_SEL__DEFAULT 0x0
+#define BV_USBPHY_IP_DIV_SEL__LOWER 0x1
+#define BV_USBPHY_IP_DIV_SEL__LOWEST 0x2
+#define BV_USBPHY_IP_DIV_SEL__UNDEFINED 0x3
+#define BP_USBPHY_IP_LFR_SEL 21
+#define BM_USBPHY_IP_LFR_SEL 0x00600000
+#define BF_USBPHY_IP_LFR_SEL(v) \
+ (((v) << 21) & BM_USBPHY_IP_LFR_SEL)
+#define BV_USBPHY_IP_LFR_SEL__DEFAULT 0x0
+#define BV_USBPHY_IP_LFR_SEL__TIMES_2 0x1
+#define BV_USBPHY_IP_LFR_SEL__TIMES_05 0x2
+#define BV_USBPHY_IP_LFR_SEL__UNDEFINED 0x3
+#define BP_USBPHY_IP_CP_SEL 19
+#define BM_USBPHY_IP_CP_SEL 0x00180000
+#define BF_USBPHY_IP_CP_SEL(v) \
+ (((v) << 19) & BM_USBPHY_IP_CP_SEL)
+#define BV_USBPHY_IP_CP_SEL__DEFAULT 0x0
+#define BV_USBPHY_IP_CP_SEL__TIMES_2 0x1
+#define BV_USBPHY_IP_CP_SEL__TIMES_05 0x2
+#define BV_USBPHY_IP_CP_SEL__UNDEFINED 0x3
+#define BM_USBPHY_IP_TSTI_TX_DP 0x00040000
+#define BM_USBPHY_IP_TSTI_TX_DM 0x00020000
+#define BM_USBPHY_IP_ANALOG_TESTMODE 0x00010000
+#define BP_USBPHY_IP_RSVD0 3
+#define BM_USBPHY_IP_RSVD0 0x0000FFF8
+#define BF_USBPHY_IP_RSVD0(v) \
+ (((v) << 3) & BM_USBPHY_IP_RSVD0)
+#define BM_USBPHY_IP_EN_USB_CLKS 0x00000004
+#define BM_USBPHY_IP_PLL_LOCKED 0x00000002
+#define BM_USBPHY_IP_PLL_POWER 0x00000001
+#endif /* __ARCH_ARM___USBPHY_H */
diff --git a/arch/arm/mach-mxs/usb_h1.c b/arch/arm/mach-mxs/usb_h1.c
new file mode 100644
index 0000000..9ca5236
--- /dev/null
+++ b/arch/arm/mach-mxs/usb_h1.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/clk.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/fsl_devices.h>
+#include <linux/gpio.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <mach/irqs.h>
+#include <mach/mx28.h>
+#include "regs-usbphy-mx28.h"
+
+/* EHCI registers: */
+#define UOG_USBCMD (0x140)/* USB command register */
+#define UOG_PORTSC1 (0x184)/* port status and control */
+/* x_PORTSCx */
+#define PORTSC_PTS_MASK (3 << 30)/* parallel xcvr mask */
+#define PORTSC_PTS_UTMI (0 << 30)/* UTMI/UTMI+ */
+#define PORTSC_PTW (1 << 28)/* UTMI width */
+/* USBCMD */
+#define UCMD_RUN_STOP (1 << 0)/* controller run/stop */
+#define UCMD_RESET (1 << 1)/* controller reset */
+
+#define HOSTPHY_CONNECT_STATE (1 << 3)
+
+static struct clk *usb_clk;
+static struct clk *usb_phy_clk;
+static int internal_phy_clk_already_on;
+
+/* The dmamask must be set for EHCI to work */
+static u64 ehci_dmamask = ~(u32) 0;
+static int instance_id = ~(u32) 0;
+
+static int fsl_platform_get_usb_conn_status(void)
+{
+ u32 status;
+
+ status = __raw_readl(MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + \
+ HW_USBPHY_STATUS);
+ return ((status & HOSTPHY_CONNECT_STATE) == 0);
+}
+
+/* enable/disable high-speed disconnect detector of phy ctrl */
+static void fsl_platform_set_usb_phy_dis(int enable)
+{
+ if (enable)
+ __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
+ MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_SET);
+ else
+ __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
+ MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_CLR);
+}
+
+static int usb_phy_enable(struct mxc_usbh_platform_data *pdata)
+{
+ u32 tmp;
+ void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
+ void __iomem *usb_reg = MX28_IO_ADDRESS(MX28_USBCTRL1_BASE_ADDR);
+ void __iomem *usbcmd, *phy_ctrl, *portsc;
+ /* Reset USB IP */
+ usbcmd = usb_reg + UOG_USBCMD;
+ tmp = __raw_readl(usbcmd); /* usb command */
+ tmp &= ~UCMD_RUN_STOP;
+ __raw_writel(tmp, usbcmd);
+ while (__raw_readl(usbcmd) & UCMD_RUN_STOP)
+ ;
+ tmp |= UCMD_RESET;
+ __raw_writel(tmp, usbcmd);
+ while (__raw_readl(usbcmd) & UCMD_RESET)
+ ;
+ mdelay(10);
+ /* Reset USBPHY module */
+ phy_ctrl = phy_reg + HW_USBPHY_CTRL;
+ tmp = __raw_readl(phy_ctrl);
+ tmp |= BM_USBPHY_CTRL_SFTRST;
+ __raw_writel(tmp, phy_ctrl);
+ udelay(10);
+ /* Remove CLKGATE and SFTRST */
+ tmp = __raw_readl(phy_ctrl);
+ tmp &= ~(BM_USBPHY_CTRL_CLKGATE | BM_USBPHY_CTRL_SFTRST);
+ __raw_writel(tmp, phy_ctrl);
+ udelay(10);
+ /* set UTMI xcvr */
+ /* Workaround an IC issue for ehci driver:
+ * when turn off root hub port power, EHCI set
+ * PORTSC reserved bits to be 0, but PTW with 0
+ * means 8 bits tranceiver width, here change
+ * it back to be 16 bits and do PHY diable and
+ * then enable.
+ */
+ portsc = usb_reg + UOG_PORTSC1;
+ tmp = __raw_readl(portsc);
+ tmp &= ~PORTSC_PTS_MASK;
+ tmp |= (PORTSC_PTS_UTMI | PORTSC_PTW);
+ __raw_writel(tmp, portsc);
+ /* Power up the PHY */
+ __raw_writel(0, phy_reg + HW_USBPHY_PWD);
+ return 0;
+}
+
+static int fsl_usb_host_init(struct platform_device *pdev)
+{
+ struct mxc_usbh_platform_data *pdata = pdev->dev.platform_data;
+ void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
+ u32 tmp;
+
+ usb_phy_enable(pdata);
+ /* enable FS/LS device */
+ tmp = __raw_readl(phy_reg + HW_USBPHY_CTRL);
+ tmp |= (BM_USBPHY_CTRL_ENUTMILEVEL2 | BM_USBPHY_CTRL_ENUTMILEVEL3);
+ __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL);
+
+ return 0;
+}
+
+static void usbh1_internal_phy_clock_gate(bool on)
+{
+ u32 tmp;
+ void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
+
+ if (on) {
+ internal_phy_clk_already_on += 1;
+ if (internal_phy_clk_already_on == 1) {
+ tmp = BM_USBPHY_CTRL_SFTRST | BM_USBPHY_CTRL_CLKGATE;
+ __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_CLR);
+ }
+ } else {
+ internal_phy_clk_already_on -= 1;
+ if (internal_phy_clk_already_on == 0) {
+ tmp = BM_USBPHY_CTRL_CLKGATE;
+ __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_SET);
+ }
+ }
+ if (internal_phy_clk_already_on < 0)
+ printk(KERN_ERR "please check phy clock ON/OFF sequence\n");
+}
+static int fsl_usb_host_init_ext(struct platform_device *pdev)
+{
+ usb_clk = clk_get(NULL, "usb1");
+ clk_enable(usb_clk);
+ clk_put(usb_clk);
+ usb_phy_clk = clk_get(NULL, "usb1_phy");
+ clk_enable(usb_phy_clk);
+ clk_put(usb_phy_clk);
+
+ usbh1_internal_phy_clock_gate(true);
+ return fsl_usb_host_init(pdev);
+}
+
+static int fsl_usb_host_uninit_ext(struct platform_device *pdev)
+{
+ usbh1_internal_phy_clock_gate(false);
+ clk_disable(usb_phy_clk);
+ clk_disable(usb_clk);
+ return 0;
+}
+
+static struct mxc_usbh_platform_data usbh1_config = {
+ .init = fsl_usb_host_init_ext,
+ .exit = fsl_usb_host_uninit_ext,
+ .portsc = MXC_EHCI_MODE_ULPI,
+ .otg = NULL,
+ .plt_get_usb_connect_status = fsl_platform_get_usb_conn_status,
+ .plt_usb_disconnect_detect = fsl_platform_set_usb_phy_dis,
+};
+
+/* The resources for kinds of usb devices */
+static struct resource usbh1_resources[] = {
+ [0] = {
+ .start = (u32) (MX28_USBCTRL1_BASE_ADDR),
+ .end = (u32) (MX28_USBCTRL1_BASE_ADDR + 0x1ff),
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = MX28_INT_USB1,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static int __init usbh1_init(void)
+{
+ struct platform_device *pdev;
+ int rc;
+
+ if (!cpu_is_mx28())
+ return 0;
+
+ pdev = platform_device_register_simple("mxc-ehci",
+ instance_id, usbh1_resources, ARRAY_SIZE(usbh1_resources));
+ if (IS_ERR(pdev)) {
+ pr_debug("can't register Host, %ld\n",
+ PTR_ERR(pdev));
+ return -EFAULT;
+ }
+
+ pdev->dev.coherent_dma_mask = 0xffffffff;
+ pdev->dev.dma_mask = &ehci_dmamask;
+
+ rc = platform_device_add_data(pdev, &usbh1_config,
+ sizeof(struct mxc_usbh_platform_data));
+ if (rc) {
+ platform_device_unregister(pdev);
+ return -EFAULT;
+ }
+
+ instance_id++;
+ return 0;
+}
+module_init(usbh1_init);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (4 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 11:05 ` Arnaud Patard (Rtp)
` (3 more replies)
2011-07-20 11:08 ` [PATCH 6/7] add macro definitions according to ehci-mxc driver change Tony Lin
` (2 subsequent siblings)
8 siblings, 4 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
old driver uses some hard coding for clks' name which could
not be used for mx28. So workaround these hard codings by
judging the cpu is mx28 or not.
add platform callback funtions in usb irq handler in the case
usb phy need to change its disconnect detector mode after usb
device is connected and disconnected. These callbacks also
could be used for other machines whose usb phy need such kind
of operations
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
drivers/usb/host/Kconfig | 2 +-
drivers/usb/host/ehci-mxc.c | 57 +++++++++++++++++++++++++++++++-----------
2 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index ab085f1..6a5905b 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -139,7 +139,7 @@ config USB_EHCI_FSL
config USB_EHCI_MXC
bool "Support for Freescale on-chip EHCI USB controller"
- depends on USB_EHCI_HCD && ARCH_MXC
+ depends on USB_EHCI_HCD && (ARCH_MXC || ARCH_MXS)
select USB_EHCI_ROOT_HUB_TT
---help---
Variation of ARC USB block used in some Freescale chips.
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
index 0c058be..65e78cd 100644
--- a/drivers/usb/host/ehci-mxc.c
+++ b/drivers/usb/host/ehci-mxc.c
@@ -23,9 +23,7 @@
#include <linux/usb/otg.h>
#include <linux/usb/ulpi.h>
#include <linux/slab.h>
-
-#include <mach/mxc_ehci.h>
-
+#include <linux/fsl_devices.h>
#include <asm/mach-types.h>
#define ULPI_VIEWPORT_OFFSET 0x170
@@ -66,6 +64,30 @@ static int ehci_mxc_setup(struct usb_hcd *hcd)
return 0;
}
+static irqreturn_t fsl_ehci_irq(struct usb_hcd *hcd)
+{
+ struct mxc_usbh_platform_data *pdata;
+ struct ehci_hcd *ehci = hcd_to_ehci(hcd);
+ u32 status;
+
+ pdata = hcd->self.controller->platform_data;
+ if (pdata->plt_get_usb_connect_status == NULL || \
+ pdata->plt_usb_disconnect_detect == NULL)
+ goto out;
+
+ spin_lock(&ehci->lock);
+ status = ehci_readl(ehci, &ehci->regs->status);
+ if (status & STS_PCD) {
+ if (pdata->plt_get_usb_connect_status())
+ pdata->plt_usb_disconnect_detect(true);
+ else
+ pdata->plt_usb_disconnect_detect(false);
+ }
+ spin_unlock(&ehci->lock);
+out:
+ return ehci_irq(hcd);
+}
+
static const struct hc_driver ehci_mxc_hc_driver = {
.description = hcd_name,
.product_desc = "Freescale On-Chip EHCI Host Controller",
@@ -74,7 +96,7 @@ static const struct hc_driver ehci_mxc_hc_driver = {
/*
* generic hardware linkage
*/
- .irq = ehci_irq,
+ .irq = fsl_ehci_irq,
.flags = HCD_USB2 | HCD_MEMORY,
/*
@@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
}
/* enable clocks */
- priv->usbclk = clk_get(dev, "usb");
- if (IS_ERR(priv->usbclk)) {
- ret = PTR_ERR(priv->usbclk);
- goto err_clk;
+ if (!cpu_is_mx28()) {
+ priv->usbclk = clk_get(dev, "usb");
+ if (IS_ERR(priv->usbclk)) {
+ ret = PTR_ERR(priv->usbclk);
+ goto err_clk;
+ }
+ clk_enable(priv->usbclk);
}
- clk_enable(priv->usbclk);
-
- if (!cpu_is_mx35() && !cpu_is_mx25()) {
+ if (!cpu_is_mx35() && !cpu_is_mx25() && !cpu_is_mx28()) {
priv->ahbclk = clk_get(dev, "usb_ahb");
if (IS_ERR(priv->ahbclk)) {
ret = PTR_ERR(priv->ahbclk);
@@ -272,8 +295,10 @@ err_clk_phy:
clk_put(priv->ahbclk);
}
err_clk_ahb:
- clk_disable(priv->usbclk);
- clk_put(priv->usbclk);
+ if (priv->usbclk) {
+ clk_disable(priv->usbclk);
+ clk_put(priv->usbclk);
+ }
err_clk:
iounmap(hcd->regs);
err_ioremap:
@@ -304,8 +329,10 @@ static int __exit ehci_mxc_drv_remove(struct platform_device *pdev)
usb_put_hcd(hcd);
platform_set_drvdata(pdev, NULL);
- clk_disable(priv->usbclk);
- clk_put(priv->usbclk);
+ if (priv->usbclk) {
+ clk_disable(priv->usbclk);
+ clk_put(priv->usbclk);
+ }
if (priv->ahbclk) {
clk_disable(priv->ahbclk);
clk_put(priv->ahbclk);
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 6/7] add macro definitions according to ehci-mxc driver change
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (5 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 19:43 ` Sascha Hauer
2011-07-21 6:06 ` Lothar Waßmann
2011-07-20 11:08 ` [PATCH 7/7] add usb host function to default config Tony Lin
2011-07-20 20:07 ` [PATCH 0/7] ARM: mx28: add usb host function Sascha Hauer
8 siblings, 2 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/mach-mxs/include/mach/hardware.h | 2 ++
arch/arm/mach-mxs/include/mach/mxs.h | 12 +++++++++++-
arch/arm/plat-mxc/include/mach/mxc.h | 3 +++
3 files changed, 16 insertions(+), 1 deletions(-)
diff --git a/arch/arm/mach-mxs/include/mach/hardware.h b/arch/arm/mach-mxs/include/mach/hardware.h
index 53e89a0..affa72b 100644
--- a/arch/arm/mach-mxs/include/mach/hardware.h
+++ b/arch/arm/mach-mxs/include/mach/hardware.h
@@ -26,4 +26,6 @@
#define IOMEM(addr) ((void __force __iomem *)(addr))
#endif
+#include "mxs.h"
+
#endif /* __MACH_MXS_HARDWARE_H__ */
diff --git a/arch/arm/mach-mxs/include/mach/mxs.h b/arch/arm/mach-mxs/include/mach/mxs.h
index 35a89dd..6e5928d 100644
--- a/arch/arm/mach-mxs/include/mach/mxs.h
+++ b/arch/arm/mach-mxs/include/mach/mxs.h
@@ -35,7 +35,17 @@
machine_is_mx28evk() || \
machine_is_tx28() || \
0)
-
+#define cpu_is_mx1() (0)
+#define cpu_is_mx21() (0)
+#define cpu_is_mx25() (0)
+#define cpu_is_mx27() (0)
+#define cpu_is_mx31() (0)
+#define cpu_is_mx35() (0)
+#define cpu_is_mx50() (0)
+#define cpu_is_mx51() (0)
+#define cpu_is_mx53() (0)
+#define cpu_is_mx3() (cpu_is_mx31() || cpu_is_mx35())
+#define cpu_is_mx2() (cpu_is_mx21() || cpu_is_mx27())
/*
* IO addresses common to MXS-based
*/
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h
index 0987923..d4dbe9e 100644
--- a/arch/arm/plat-mxc/include/mach/mxc.h
+++ b/arch/arm/plat-mxc/include/mach/mxc.h
@@ -176,6 +176,9 @@ extern unsigned int __mxc_cpu_type;
# define cpu_is_mx53() (0)
#endif
+# define cpu_is_mx23() (0)
+# define cpu_is_mx28() (0)
+
#ifndef __ASSEMBLY__
struct cpu_op {
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 7/7] add usb host function to default config
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (6 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 6/7] add macro definitions according to ehci-mxc driver change Tony Lin
@ 2011-07-20 11:08 ` Tony Lin
2011-07-20 20:07 ` [PATCH 0/7] ARM: mx28: add usb host function Sascha Hauer
8 siblings, 0 replies; 41+ messages in thread
From: Tony Lin @ 2011-07-20 11:08 UTC (permalink / raw)
To: linux-arm-kernel
Signed-off-by: Tony Lin <tony.lin@freescale.com>
---
arch/arm/configs/mxs_defconfig | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/arch/arm/configs/mxs_defconfig b/arch/arm/configs/mxs_defconfig
index db2cb7d..0a187a2 100644
--- a/arch/arm/configs/mxs_defconfig
+++ b/arch/arm/configs/mxs_defconfig
@@ -87,8 +87,14 @@ CONFIG_GPIO_SYSFS=y
# CONFIG_HWMON is not set
# CONFIG_MFD_SUPPORT is not set
CONFIG_DISPLAY_SUPPORT=m
+CONFIG_USB_ARCH_HAS_EHCI=y
# CONFIG_HID_SUPPORT is not set
-# CONFIG_USB_SUPPORT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+CONFIG_USB_EHCI_MXC=y
CONFIG_MMC=y
CONFIG_MMC_MXS=y
CONFIG_RTC_CLASS=y
--
1.7.0.4
^ permalink raw reply related [flat|nested] 41+ messages in thread
* [PATCH 4/7] mx28: add usb host phy functions
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
@ 2011-07-20 11:12 ` Felipe Balbi
2011-07-20 19:26 ` Sascha Hauer
2011-07-21 6:04 ` Lothar Waßmann
2 siblings, 0 replies; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:12 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 07:08:23PM +0800, Tony Lin wrote:
> add usb phy register definitions and functions
> usb host driver will use these functions to initialize
> usb phy and change phy working mode
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
I don't like this patch...
> ---
> arch/arm/mach-mxs/Kconfig | 1 +
> arch/arm/mach-mxs/Makefile | 1 +
> arch/arm/mach-mxs/regs-usbphy-mx28.h | 323 ++++++++++++++++++++++++++++++++++
> arch/arm/mach-mxs/usb_h1.c | 230 ++++++++++++++++++++++++
there's no point in keeping this under arch/arm/
> 4 files changed, 555 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig
> index 4cd0231..1c4264f 100644
> --- a/arch/arm/mach-mxs/Kconfig
> +++ b/arch/arm/mach-mxs/Kconfig
> @@ -49,6 +49,7 @@ config MACH_MX28EVK
> select MXS_HAVE_PLATFORM_MXS_MMC
> select MXS_HAVE_PLATFORM_MXSFB
> select MXS_OCOTP
> + select USB_ARCH_HAS_EHCI
> help
> Include support for MX28EVK platform. This includes specific
> configurations for the board and its peripherals.
> diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
> index 6c38262..48fc2f5 100644
> --- a/arch/arm/mach-mxs/Makefile
> +++ b/arch/arm/mach-mxs/Makefile
> @@ -12,5 +12,6 @@ obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
> obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
> obj-$(CONFIG_MODULE_TX28) += module-tx28.o
> obj-$(CONFIG_MACH_TX28) += mach-tx28.o
> +obj-$(CONFIG_USB_EHCI_MXC) += usb_h1.o
>
> obj-y += devices/
> diff --git a/arch/arm/mach-mxs/regs-usbphy-mx28.h b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> new file mode 100644
> index 0000000..a367927
> --- /dev/null
> +++ b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> @@ -0,0 +1,323 @@
> +/*
> + * Freescale USBPHY Register Definitions
> + *
> + * Copyright 2008-2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + * This file is created by xml file. Don't Edit it.
> + *
> + * Xml Revision: 1.52
> + * Template revision: 26195
> + */
> +
> +#ifndef __ARCH_ARM___USBPHY_H
> +#define __ARCH_ARM___USBPHY_H
> +
> +
> +#define HW_USBPHY_PWD (0x00000000)
> +#define HW_USBPHY_PWD_SET (0x00000004)
> +#define HW_USBPHY_PWD_CLR (0x00000008)
> +#define HW_USBPHY_PWD_TOG (0x0000000c)
> +
> +#define BP_USBPHY_PWD_RSVD2 21
> +#define BM_USBPHY_PWD_RSVD2 0xFFE00000
> +#define BF_USBPHY_PWD_RSVD2(v) \
> + (((v) << 21) & BM_USBPHY_PWD_RSVD2)
> +#define BM_USBPHY_PWD_RXPWDRX 0x00100000
> +#define BM_USBPHY_PWD_RXPWDDIFF 0x00080000
> +#define BM_USBPHY_PWD_RXPWD1PT1 0x00040000
> +#define BM_USBPHY_PWD_RXPWDENV 0x00020000
> +#define BP_USBPHY_PWD_RSVD1 13
> +#define BM_USBPHY_PWD_RSVD1 0x0001E000
> +#define BF_USBPHY_PWD_RSVD1(v) \
> + (((v) << 13) & BM_USBPHY_PWD_RSVD1)
> +#define BM_USBPHY_PWD_TXPWDV2I 0x00001000
> +#define BM_USBPHY_PWD_TXPWDIBIAS 0x00000800
> +#define BM_USBPHY_PWD_TXPWDFS 0x00000400
> +#define BP_USBPHY_PWD_RSVD0 0
> +#define BM_USBPHY_PWD_RSVD0 0x000003FF
> +#define BF_USBPHY_PWD_RSVD0(v) \
> + (((v) << 0) & BM_USBPHY_PWD_RSVD0)
> +
> +#define HW_USBPHY_TX (0x00000010)
> +#define HW_USBPHY_TX_SET (0x00000014)
> +#define HW_USBPHY_TX_CLR (0x00000018)
> +#define HW_USBPHY_TX_TOG (0x0000001c)
> +
> +#define BP_USBPHY_TX_RSVD5 29
> +#define BM_USBPHY_TX_RSVD5 0xE0000000
> +#define BF_USBPHY_TX_RSVD5(v) \
> + (((v) << 29) & BM_USBPHY_TX_RSVD5)
> +#define BP_USBPHY_TX_USBPHY_TX_EDGECTRL 26
> +#define BM_USBPHY_TX_USBPHY_TX_EDGECTRL 0x1C000000
> +#define BF_USBPHY_TX_USBPHY_TX_EDGECTRL(v) \
> + (((v) << 26) & BM_USBPHY_TX_USBPHY_TX_EDGECTRL)
> +#define BM_USBPHY_TX_USBPHY_TX_SYNC_INVERT 0x02000000
> +#define BM_USBPHY_TX_USBPHY_TX_SYNC_MUX 0x01000000
> +#define BP_USBPHY_TX_RSVD4 22
> +#define BM_USBPHY_TX_RSVD4 0x00C00000
> +#define BF_USBPHY_TX_RSVD4(v) \
> + (((v) << 22) & BM_USBPHY_TX_RSVD4)
> +#define BM_USBPHY_TX_TXENCAL45DP 0x00200000
> +#define BM_USBPHY_TX_RSVD3 0x00100000
> +#define BP_USBPHY_TX_TXCAL45DP 16
> +#define BM_USBPHY_TX_TXCAL45DP 0x000F0000
> +#define BF_USBPHY_TX_TXCAL45DP(v) \
> + (((v) << 16) & BM_USBPHY_TX_TXCAL45DP)
> +#define BP_USBPHY_TX_RSVD2 14
> +#define BM_USBPHY_TX_RSVD2 0x0000C000
> +#define BF_USBPHY_TX_RSVD2(v) \
> + (((v) << 14) & BM_USBPHY_TX_RSVD2)
> +#define BM_USBPHY_TX_TXENCAL45DN 0x00002000
> +#define BM_USBPHY_TX_RSVD1 0x00001000
> +#define BP_USBPHY_TX_TXCAL45DN 8
> +#define BM_USBPHY_TX_TXCAL45DN 0x00000F00
> +#define BF_USBPHY_TX_TXCAL45DN(v) \
> + (((v) << 8) & BM_USBPHY_TX_TXCAL45DN)
> +#define BP_USBPHY_TX_RSVD0 4
> +#define BM_USBPHY_TX_RSVD0 0x000000F0
> +#define BF_USBPHY_TX_RSVD0(v) \
> + (((v) << 4) & BM_USBPHY_TX_RSVD0)
> +#define BP_USBPHY_TX_D_CAL 0
> +#define BM_USBPHY_TX_D_CAL 0x0000000F
> +#define BF_USBPHY_TX_D_CAL(v) \
> + (((v) << 0) & BM_USBPHY_TX_D_CAL)
> +
> +#define HW_USBPHY_RX (0x00000020)
> +#define HW_USBPHY_RX_SET (0x00000024)
> +#define HW_USBPHY_RX_CLR (0x00000028)
> +#define HW_USBPHY_RX_TOG (0x0000002c)
> +
> +#define BP_USBPHY_RX_RSVD2 23
> +#define BM_USBPHY_RX_RSVD2 0xFF800000
> +#define BF_USBPHY_RX_RSVD2(v) \
> + (((v) << 23) & BM_USBPHY_RX_RSVD2)
> +#define BM_USBPHY_RX_RXDBYPASS 0x00400000
> +#define BP_USBPHY_RX_RSVD1 7
> +#define BM_USBPHY_RX_RSVD1 0x003FFF80
> +#define BF_USBPHY_RX_RSVD1(v) \
> + (((v) << 7) & BM_USBPHY_RX_RSVD1)
> +#define BP_USBPHY_RX_DISCONADJ 4
> +#define BM_USBPHY_RX_DISCONADJ 0x00000070
> +#define BF_USBPHY_RX_DISCONADJ(v) \
> + (((v) << 4) & BM_USBPHY_RX_DISCONADJ)
> +#define BM_USBPHY_RX_RSVD0 0x00000008
> +#define BP_USBPHY_RX_ENVADJ 0
> +#define BM_USBPHY_RX_ENVADJ 0x00000007
> +#define BF_USBPHY_RX_ENVADJ(v) \
> + (((v) << 0) & BM_USBPHY_RX_ENVADJ)
> +
> +#define HW_USBPHY_CTRL (0x00000030)
> +#define HW_USBPHY_CTRL_SET (0x00000034)
> +#define HW_USBPHY_CTRL_CLR (0x00000038)
> +#define HW_USBPHY_CTRL_TOG (0x0000003c)
> +
> +#define BM_USBPHY_CTRL_SFTRST 0x80000000
> +#define BM_USBPHY_CTRL_CLKGATE 0x40000000
> +#define BM_USBPHY_CTRL_UTMI_SUSPENDM 0x20000000
> +#define BM_USBPHY_CTRL_HOST_FORCE_LS_SE0 0x10000000
> +#define BM_USBPHY_CTRL_RSVD3 0x08000000
> +#define BM_USBPHY_CTRL_ENAUTOSET_USBCLKS 0x04000000
> +#define BM_USBPHY_CTRL_ENAUTOCLR_USBCLKGATE 0x02000000
> +#define BM_USBPHY_CTRL_FSDLL_RST_EN 0x01000000
> +#define BM_USBPHY_CTRL_ENVBUSCHG_WKUP 0x00800000
> +#define BM_USBPHY_CTRL_ENIDCHG_WKUP 0x00400000
> +#define BM_USBPHY_CTRL_ENDPDMCHG_WKUP 0x00200000
> +#define BM_USBPHY_CTRL_ENAUTOCLR_PHY_PWD 0x00100000
> +#define BM_USBPHY_CTRL_ENAUTOCLR_CLKGATE 0x00080000
> +#define BM_USBPHY_CTRL_ENAUTO_PWRON_PLL 0x00040000
> +#define BM_USBPHY_CTRL_WAKEUP_IRQ 0x00020000
> +#define BM_USBPHY_CTRL_ENIRQWAKEUP 0x00010000
> +#define BM_USBPHY_CTRL_ENUTMILEVEL3 0x00008000
> +#define BM_USBPHY_CTRL_ENUTMILEVEL2 0x00004000
> +#define BM_USBPHY_CTRL_DATA_ON_LRADC 0x00002000
> +#define BM_USBPHY_CTRL_DEVPLUGIN_IRQ 0x00001000
> +#define BM_USBPHY_CTRL_ENIRQDEVPLUGIN 0x00000800
> +#define BM_USBPHY_CTRL_RESUME_IRQ 0x00000400
> +#define BM_USBPHY_CTRL_ENIRQRESUMEDETECT 0x00000200
> +#define BM_USBPHY_CTRL_RESUMEIRQSTICKY 0x00000100
> +#define BM_USBPHY_CTRL_ENOTGIDDETECT 0x00000080
> +#define BM_USBPHY_CTRL_RSVD1 0x00000040
> +#define BM_USBPHY_CTRL_DEVPLUGIN_POLARITY 0x00000020
> +#define BM_USBPHY_CTRL_ENDEVPLUGINDETECT 0x00000010
> +#define BM_USBPHY_CTRL_HOSTDISCONDETECT_IRQ 0x00000008
> +#define BM_USBPHY_CTRL_ENIRQHOSTDISCON 0x00000004
> +#define BM_USBPHY_CTRL_ENHOSTDISCONDETECT 0x00000002
> +#define BM_USBPHY_CTRL_RSVD0 0x00000001
> +
> +#define HW_USBPHY_STATUS (0x00000040)
> +
> +#define BP_USBPHY_STATUS_RSVD4 11
> +#define BM_USBPHY_STATUS_RSVD4 0xFFFFF800
> +#define BF_USBPHY_STATUS_RSVD4(v) \
> + (((v) << 11) & BM_USBPHY_STATUS_RSVD4)
> +#define BM_USBPHY_STATUS_RESUME_STATUS 0x00000400
> +#define BM_USBPHY_STATUS_RSVD3 0x00000200
> +#define BM_USBPHY_STATUS_OTGID_STATUS 0x00000100
> +#define BM_USBPHY_STATUS_RSVD2 0x00000080
> +#define BM_USBPHY_STATUS_DEVPLUGIN_STATUS 0x00000040
> +#define BP_USBPHY_STATUS_RSVD1 4
> +#define BM_USBPHY_STATUS_RSVD1 0x00000030
> +#define BF_USBPHY_STATUS_RSVD1(v) \
> + (((v) << 4) & BM_USBPHY_STATUS_RSVD1)
> +#define BM_USBPHY_STATUS_HOSTDISCONDETECT_STATUS 0x00000008
> +#define BP_USBPHY_STATUS_RSVD0 0
> +#define BM_USBPHY_STATUS_RSVD0 0x00000007
> +#define BF_USBPHY_STATUS_RSVD0(v) \
> + (((v) << 0) & BM_USBPHY_STATUS_RSVD0)
> +
> +#define HW_USBPHY_DEBUG (0x00000050)
> +#define HW_USBPHY_DEBUG_SET (0x00000054)
> +#define HW_USBPHY_DEBUG_CLR (0x00000058)
> +#define HW_USBPHY_DEBUG_TOG (0x0000005c)
> +
> +#define BM_USBPHY_DEBUG_RSVD3 0x80000000
> +#define BM_USBPHY_DEBUG_CLKGATE 0x40000000
> +#define BM_USBPHY_DEBUG_HOST_RESUME_DEBUG 0x20000000
> +#define BP_USBPHY_DEBUG_SQUELCHRESETLENGTH 25
> +#define BM_USBPHY_DEBUG_SQUELCHRESETLENGTH 0x1E000000
> +#define BF_USBPHY_DEBUG_SQUELCHRESETLENGTH(v) \
> + (((v) << 25) & BM_USBPHY_DEBUG_SQUELCHRESETLENGTH)
> +#define BM_USBPHY_DEBUG_ENSQUELCHRESET 0x01000000
> +#define BP_USBPHY_DEBUG_RSVD2 21
> +#define BM_USBPHY_DEBUG_RSVD2 0x00E00000
> +#define BF_USBPHY_DEBUG_RSVD2(v) \
> + (((v) << 21) & BM_USBPHY_DEBUG_RSVD2)
> +#define BP_USBPHY_DEBUG_SQUELCHRESETCOUNT 16
> +#define BM_USBPHY_DEBUG_SQUELCHRESETCOUNT 0x001F0000
> +#define BF_USBPHY_DEBUG_SQUELCHRESETCOUNT(v) \
> + (((v) << 16) & BM_USBPHY_DEBUG_SQUELCHRESETCOUNT)
> +#define BP_USBPHY_DEBUG_RSVD1 13
> +#define BM_USBPHY_DEBUG_RSVD1 0x0000E000
> +#define BF_USBPHY_DEBUG_RSVD1(v) \
> + (((v) << 13) & BM_USBPHY_DEBUG_RSVD1)
> +#define BM_USBPHY_DEBUG_ENTX2RXCOUNT 0x00001000
> +#define BP_USBPHY_DEBUG_TX2RXCOUNT 8
> +#define BM_USBPHY_DEBUG_TX2RXCOUNT 0x00000F00
> +#define BF_USBPHY_DEBUG_TX2RXCOUNT(v) \
> + (((v) << 8) & BM_USBPHY_DEBUG_TX2RXCOUNT)
> +#define BP_USBPHY_DEBUG_RSVD0 6
> +#define BM_USBPHY_DEBUG_RSVD0 0x000000C0
> +#define BF_USBPHY_DEBUG_RSVD0(v) \
> + (((v) << 6) & BM_USBPHY_DEBUG_RSVD0)
> +#define BP_USBPHY_DEBUG_ENHSTPULLDOWN 4
> +#define BM_USBPHY_DEBUG_ENHSTPULLDOWN 0x00000030
> +#define BF_USBPHY_DEBUG_ENHSTPULLDOWN(v) \
> + (((v) << 4) & BM_USBPHY_DEBUG_ENHSTPULLDOWN)
> +#define BP_USBPHY_DEBUG_HSTPULLDOWN 2
> +#define BM_USBPHY_DEBUG_HSTPULLDOWN 0x0000000C
> +#define BF_USBPHY_DEBUG_HSTPULLDOWN(v) \
> + (((v) << 2) & BM_USBPHY_DEBUG_HSTPULLDOWN)
> +#define BM_USBPHY_DEBUG_DEBUG_INTERFACE_HOLD 0x00000002
> +#define BM_USBPHY_DEBUG_OTGIDPIOLOCK 0x00000001
> +
> +#define HW_USBPHY_DEBUG0_STATUS (0x00000060)
> +
> +#define BP_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT 26
> +#define BM_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT 0xFC000000
> +#define BF_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT(v) \
> + (((v) << 26) & BM_USBPHY_DEBUG0_STATUS_SQUELCH_COUNT)
> +#define BP_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT 16
> +#define BM_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT 0x03FF0000
> +#define BF_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT(v) \
> + (((v) << 16) & BM_USBPHY_DEBUG0_STATUS_UTMI_RXERROR_FAIL_COUNT)
> +#define BP_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT 0
> +#define BM_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT 0x0000FFFF
> +#define BF_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT(v) \
> + (((v) << 0) & BM_USBPHY_DEBUG0_STATUS_LOOP_BACK_FAIL_COUNT)
> +
> +#define HW_USBPHY_DEBUG1 (0x00000070)
> +#define HW_USBPHY_DEBUG1_SET (0x00000074)
> +#define HW_USBPHY_DEBUG1_CLR (0x00000078)
> +#define HW_USBPHY_DEBUG1_TOG (0x0000007c)
> +
> +#define BP_USBPHY_DEBUG1_RSVD1 15
> +#define BM_USBPHY_DEBUG1_RSVD1 0xFFFF8000
> +#define BF_USBPHY_DEBUG1_RSVD1(v) \
> + (((v) << 15) & BM_USBPHY_DEBUG1_RSVD1)
> +#define BP_USBPHY_DEBUG1_ENTAILADJVD 13
> +#define BM_USBPHY_DEBUG1_ENTAILADJVD 0x00006000
> +#define BF_USBPHY_DEBUG1_ENTAILADJVD(v) \
> + (((v) << 13) & BM_USBPHY_DEBUG1_ENTAILADJVD)
> +#define BM_USBPHY_DEBUG1_ENTX2TX 0x00001000
> +#define BP_USBPHY_DEBUG1_RSVD0 4
> +#define BM_USBPHY_DEBUG1_RSVD0 0x00000FF0
> +#define BF_USBPHY_DEBUG1_RSVD0(v) \
> + (((v) << 4) & BM_USBPHY_DEBUG1_RSVD0)
> +#define BP_USBPHY_DEBUG1_DBG_ADDRESS 0
> +#define BM_USBPHY_DEBUG1_DBG_ADDRESS 0x0000000F
> +#define BF_USBPHY_DEBUG1_DBG_ADDRESS(v) \
> + (((v) << 0) & BM_USBPHY_DEBUG1_DBG_ADDRESS)
> +
> +#define HW_USBPHY_VERSION (0x00000080)
> +
> +#define BP_USBPHY_VERSION_MAJOR 24
> +#define BM_USBPHY_VERSION_MAJOR 0xFF000000
> +#define BF_USBPHY_VERSION_MAJOR(v) \
> + (((v) << 24) & BM_USBPHY_VERSION_MAJOR)
> +#define BP_USBPHY_VERSION_MINOR 16
> +#define BM_USBPHY_VERSION_MINOR 0x00FF0000
> +#define BF_USBPHY_VERSION_MINOR(v) \
> + (((v) << 16) & BM_USBPHY_VERSION_MINOR)
> +#define BP_USBPHY_VERSION_STEP 0
> +#define BM_USBPHY_VERSION_STEP 0x0000FFFF
> +#define BF_USBPHY_VERSION_STEP(v) \
> + (((v) << 0) & BM_USBPHY_VERSION_STEP)
> +
> +#define HW_USBPHY_IP (0x00000090)
> +#define HW_USBPHY_IP_SET (0x00000094)
> +#define HW_USBPHY_IP_CLR (0x00000098)
> +#define HW_USBPHY_IP_TOG (0x0000009c)
> +
> +#define BP_USBPHY_IP_RSVD1 25
> +#define BM_USBPHY_IP_RSVD1 0xFE000000
> +#define BF_USBPHY_IP_RSVD1(v) \
> + (((v) << 25) & BM_USBPHY_IP_RSVD1)
> +#define BP_USBPHY_IP_DIV_SEL 23
> +#define BM_USBPHY_IP_DIV_SEL 0x01800000
> +#define BF_USBPHY_IP_DIV_SEL(v) \
> + (((v) << 23) & BM_USBPHY_IP_DIV_SEL)
> +#define BV_USBPHY_IP_DIV_SEL__DEFAULT 0x0
> +#define BV_USBPHY_IP_DIV_SEL__LOWER 0x1
> +#define BV_USBPHY_IP_DIV_SEL__LOWEST 0x2
> +#define BV_USBPHY_IP_DIV_SEL__UNDEFINED 0x3
> +#define BP_USBPHY_IP_LFR_SEL 21
> +#define BM_USBPHY_IP_LFR_SEL 0x00600000
> +#define BF_USBPHY_IP_LFR_SEL(v) \
> + (((v) << 21) & BM_USBPHY_IP_LFR_SEL)
> +#define BV_USBPHY_IP_LFR_SEL__DEFAULT 0x0
> +#define BV_USBPHY_IP_LFR_SEL__TIMES_2 0x1
> +#define BV_USBPHY_IP_LFR_SEL__TIMES_05 0x2
> +#define BV_USBPHY_IP_LFR_SEL__UNDEFINED 0x3
> +#define BP_USBPHY_IP_CP_SEL 19
> +#define BM_USBPHY_IP_CP_SEL 0x00180000
> +#define BF_USBPHY_IP_CP_SEL(v) \
> + (((v) << 19) & BM_USBPHY_IP_CP_SEL)
> +#define BV_USBPHY_IP_CP_SEL__DEFAULT 0x0
> +#define BV_USBPHY_IP_CP_SEL__TIMES_2 0x1
> +#define BV_USBPHY_IP_CP_SEL__TIMES_05 0x2
> +#define BV_USBPHY_IP_CP_SEL__UNDEFINED 0x3
> +#define BM_USBPHY_IP_TSTI_TX_DP 0x00040000
> +#define BM_USBPHY_IP_TSTI_TX_DM 0x00020000
> +#define BM_USBPHY_IP_ANALOG_TESTMODE 0x00010000
> +#define BP_USBPHY_IP_RSVD0 3
> +#define BM_USBPHY_IP_RSVD0 0x0000FFF8
> +#define BF_USBPHY_IP_RSVD0(v) \
> + (((v) << 3) & BM_USBPHY_IP_RSVD0)
> +#define BM_USBPHY_IP_EN_USB_CLKS 0x00000004
> +#define BM_USBPHY_IP_PLL_LOCKED 0x00000002
> +#define BM_USBPHY_IP_PLL_POWER 0x00000001
> +#endif /* __ARCH_ARM___USBPHY_H */
> diff --git a/arch/arm/mach-mxs/usb_h1.c b/arch/arm/mach-mxs/usb_h1.c
> new file mode 100644
> index 0000000..9ca5236
> --- /dev/null
> +++ b/arch/arm/mach-mxs/usb_h1.c
> @@ -0,0 +1,230 @@
> +/*
> + * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/types.h>
> +#include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/io.h>
> +#include <linux/err.h>
> +#include <linux/fsl_devices.h>
> +#include <linux/gpio.h>
> +#include <asm/mach-types.h>
> +#include <asm/mach/arch.h>
> +#include <mach/irqs.h>
> +#include <mach/mx28.h>
> +#include "regs-usbphy-mx28.h"
> +
> +/* EHCI registers: */
> +#define UOG_USBCMD (0x140)/* USB command register */
> +#define UOG_PORTSC1 (0x184)/* port status and control */
> +/* x_PORTSCx */
> +#define PORTSC_PTS_MASK (3 << 30)/* parallel xcvr mask */
> +#define PORTSC_PTS_UTMI (0 << 30)/* UTMI/UTMI+ */
> +#define PORTSC_PTW (1 << 28)/* UTMI width */
> +/* USBCMD */
> +#define UCMD_RUN_STOP (1 << 0)/* controller run/stop */
> +#define UCMD_RESET (1 << 1)/* controller reset */
> +
> +#define HOSTPHY_CONNECT_STATE (1 << 3)
> +
> +static struct clk *usb_clk;
> +static struct clk *usb_phy_clk;
> +static int internal_phy_clk_already_on;
> +
> +/* The dmamask must be set for EHCI to work */
> +static u64 ehci_dmamask = ~(u32) 0;
> +static int instance_id = ~(u32) 0;
> +
> +static int fsl_platform_get_usb_conn_status(void)
> +{
> + u32 status;
> +
> + status = __raw_readl(MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + \
you should, probably, avoid using this macro and pass here ioremapped
address base. Ditto to all below.
> + HW_USBPHY_STATUS);
> + return ((status & HOSTPHY_CONNECT_STATE) == 0);
> +}
> +
> +/* enable/disable high-speed disconnect detector of phy ctrl */
> +static void fsl_platform_set_usb_phy_dis(int enable)
> +{
> + if (enable)
> + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_SET);
> + else
> + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_CLR);
> +}
> +
> +static int usb_phy_enable(struct mxc_usbh_platform_data *pdata)
> +{
> + u32 tmp;
> + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> + void __iomem *usb_reg = MX28_IO_ADDRESS(MX28_USBCTRL1_BASE_ADDR);
> + void __iomem *usbcmd, *phy_ctrl, *portsc;
> + /* Reset USB IP */
> + usbcmd = usb_reg + UOG_USBCMD;
> + tmp = __raw_readl(usbcmd); /* usb command */
> + tmp &= ~UCMD_RUN_STOP;
> + __raw_writel(tmp, usbcmd);
> + while (__raw_readl(usbcmd) & UCMD_RUN_STOP)
> + ;
> + tmp |= UCMD_RESET;
> + __raw_writel(tmp, usbcmd);
> + while (__raw_readl(usbcmd) & UCMD_RESET)
> + ;
> + mdelay(10);
> + /* Reset USBPHY module */
> + phy_ctrl = phy_reg + HW_USBPHY_CTRL;
> + tmp = __raw_readl(phy_ctrl);
> + tmp |= BM_USBPHY_CTRL_SFTRST;
> + __raw_writel(tmp, phy_ctrl);
> + udelay(10);
> + /* Remove CLKGATE and SFTRST */
> + tmp = __raw_readl(phy_ctrl);
> + tmp &= ~(BM_USBPHY_CTRL_CLKGATE | BM_USBPHY_CTRL_SFTRST);
> + __raw_writel(tmp, phy_ctrl);
> + udelay(10);
> + /* set UTMI xcvr */
> + /* Workaround an IC issue for ehci driver:
> + * when turn off root hub port power, EHCI set
> + * PORTSC reserved bits to be 0, but PTW with 0
> + * means 8 bits tranceiver width, here change
> + * it back to be 16 bits and do PHY diable and
> + * then enable.
> + */
> + portsc = usb_reg + UOG_PORTSC1;
> + tmp = __raw_readl(portsc);
> + tmp &= ~PORTSC_PTS_MASK;
> + tmp |= (PORTSC_PTS_UTMI | PORTSC_PTW);
> + __raw_writel(tmp, portsc);
> + /* Power up the PHY */
> + __raw_writel(0, phy_reg + HW_USBPHY_PWD);
> + return 0;
readability can be greatly improved here and on all below
> +static int __init usbh1_init(void)
> +{
> + struct platform_device *pdev;
> + int rc;
> +
> + if (!cpu_is_mx28())
> + return 0;
> +
> + pdev = platform_device_register_simple("mxc-ehci",
> + instance_id, usbh1_resources, ARRAY_SIZE(usbh1_resources));
> + if (IS_ERR(pdev)) {
> + pr_debug("can't register Host, %ld\n",
> + PTR_ERR(pdev));
> + return -EFAULT;
> + }
> +
> + pdev->dev.coherent_dma_mask = 0xffffffff;
> + pdev->dev.dma_mask = &ehci_dmamask;
> +
> + rc = platform_device_add_data(pdev, &usbh1_config,
> + sizeof(struct mxc_usbh_platform_data));
> + if (rc) {
> + platform_device_unregister(pdev);
> + return -EFAULT;
> + }
all of this can be combine in:
platform_device_register_rsndata(NULL, "mxc-ehci", instance_id,
usbh1_resources, ARRAY_SIZE(usbh1_resources), &usbh1_config,
sizeof(usbh1_config);
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/8a32d444/attachment-0001.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
2011-07-20 11:05 ` Arnaud Patard (Rtp)
@ 2011-07-20 11:14 ` Felipe Balbi
2011-07-20 11:21 ` Lin Tony-B19295
2011-07-20 13:59 ` Alan Stern
2011-07-20 19:41 ` Sascha Hauer
3 siblings, 1 reply; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:14 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 07:08:24PM +0800, Tony Lin wrote:
> @@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
> }
>
> /* enable clocks */
> - priv->usbclk = clk_get(dev, "usb");
> - if (IS_ERR(priv->usbclk)) {
> - ret = PTR_ERR(priv->usbclk);
> - goto err_clk;
> + if (!cpu_is_mx28()) {
this should not be used in drivers, IMHO.
> + priv->usbclk = clk_get(dev, "usb");
drivers should not have to care about clock names, are you sure your
clkdev support is correct ?
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/9f05a300/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 1/7] consolidate definitions and structures to share among platforms
2011-07-20 11:03 ` Lin Tony-B19295
@ 2011-07-20 11:16 ` Felipe Balbi
2011-07-20 11:21 ` Lin Tony-B19295
0 siblings, 1 reply; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:16 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 11:03:56AM +0000, Lin Tony-B19295 wrote:
> > I believe this patch will cause build breakage since ehci-mxc.c doesn't
> > include <linux/fsl_devices.h> ??
> Ehci-mxc.c does include <linux/fsl_devices.h>, please check patch 5/7. Thanks
that's too late. You will always have the broken bisection point.
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/3b981ab7/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:14 ` Felipe Balbi
@ 2011-07-20 11:21 ` Lin Tony-B19295
2011-07-20 11:23 ` Felipe Balbi
0 siblings, 1 reply; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:21 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Felipe Balbi [mailto:balbi at ti.com]
> Sent: Wednesday, July 20, 2011 7:15 PM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> balbi at ti.com; koen.beel.barco at gmail.com
> Subject: Re: [PATCH 5/7] ehci mxc: make it more flexible to be used for
> mx28
>
> Hi,
>
> On Wed, Jul 20, 2011 at 07:08:24PM +0800, Tony Lin wrote:
> > @@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct
> platform_device *pdev)
> > }
> >
> > /* enable clocks */
> > - priv->usbclk = clk_get(dev, "usb");
> > - if (IS_ERR(priv->usbclk)) {
> > - ret = PTR_ERR(priv->usbclk);
> > - goto err_clk;
> > + if (!cpu_is_mx28()) {
>
> this should not be used in drivers, IMHO.
>
> > + priv->usbclk = clk_get(dev, "usb");
>
> drivers should not have to care about clock names, are you sure your
> clkdev support is correct ?
Yes, I agree with you about above two points. I feel the same as you.
But I had to following the existing framework. I didn't add any new special to the driver.
Just try some ways to workaround these ugly points.
>
> --
> balbi
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 1/7] consolidate definitions and structures to share among platforms
2011-07-20 11:16 ` Felipe Balbi
@ 2011-07-20 11:21 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:21 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Felipe Balbi [mailto:balbi at ti.com]
> Sent: Wednesday, July 20, 2011 7:17 PM
> To: Lin Tony-B19295
> Cc: balbi at ti.com; linux-usb at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org; koen.beel.barco at gmail.com
> Subject: Re: [PATCH 1/7] consolidate definitions and structures to share
> among platforms
>
> Hi,
>
> On Wed, Jul 20, 2011 at 11:03:56AM +0000, Lin Tony-B19295 wrote:
> > > I believe this patch will cause build breakage since ehci-mxc.c
> > > doesn't include <linux/fsl_devices.h> ??
> > Ehci-mxc.c does include <linux/fsl_devices.h>, please check patch 5/7.
> > Thanks
>
> that's too late. You will always have the broken bisection point.
>
Ok, I'll re-org my patch series later. Thank you.
> --
> balbi
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:21 ` Lin Tony-B19295
@ 2011-07-20 11:23 ` Felipe Balbi
2011-07-20 11:25 ` Lin Tony-B19295
0 siblings, 1 reply; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:23 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 11:21:10AM +0000, Lin Tony-B19295 wrote:
> > -----Original Message-----
> > From: Felipe Balbi [mailto:balbi at ti.com]
> > Sent: Wednesday, July 20, 2011 7:15 PM
> > To: Lin Tony-B19295
> > Cc: linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> > balbi at ti.com; koen.beel.barco at gmail.com
> > Subject: Re: [PATCH 5/7] ehci mxc: make it more flexible to be used for
> > mx28
> >
> > Hi,
> >
> > On Wed, Jul 20, 2011 at 07:08:24PM +0800, Tony Lin wrote:
> > > @@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct
> > platform_device *pdev)
> > > }
> > >
> > > /* enable clocks */
> > > - priv->usbclk = clk_get(dev, "usb");
> > > - if (IS_ERR(priv->usbclk)) {
> > > - ret = PTR_ERR(priv->usbclk);
> > > - goto err_clk;
> > > + if (!cpu_is_mx28()) {
> >
> > this should not be used in drivers, IMHO.
> >
> > > + priv->usbclk = clk_get(dev, "usb");
> >
> > drivers should not have to care about clock names, are you sure your
> > clkdev support is correct ?
>
> Yes, I agree with you about above two points. I feel the same as you.
> But I had to following the existing framework. I didn't add any new special to the driver.
> Just try some ways to workaround these ugly points.
but in that case, since you're already there... why not cleaning those
things up before making your changes ?
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/ce9098e9/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:23 ` Felipe Balbi
@ 2011-07-20 11:25 ` Lin Tony-B19295
2011-07-20 11:27 ` Felipe Balbi
0 siblings, 1 reply; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-20 11:25 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Felipe Balbi [mailto:balbi at ti.com]
> Sent: Wednesday, July 20, 2011 7:23 PM
> To: Lin Tony-B19295
> Cc: balbi at ti.com; linux-usb at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org; koen.beel.barco at gmail.com
> Subject: Re: [PATCH 5/7] ehci mxc: make it more flexible to be used for
> mx28
>
> Hi,
>
> On Wed, Jul 20, 2011 at 11:21:10AM +0000, Lin Tony-B19295 wrote:
> > > -----Original Message-----
> > > From: Felipe Balbi [mailto:balbi at ti.com]
> > > Sent: Wednesday, July 20, 2011 7:15 PM
> > > To: Lin Tony-B19295
> > > Cc: linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org;
> > > balbi at ti.com; koen.beel.barco at gmail.com
> > > Subject: Re: [PATCH 5/7] ehci mxc: make it more flexible to be used
> > > for
> > > mx28
> > >
> > > Hi,
> > >
> > > On Wed, Jul 20, 2011 at 07:08:24PM +0800, Tony Lin wrote:
> > > > @@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct
> > > platform_device *pdev)
> > > > }
> > > >
> > > > /* enable clocks */
> > > > - priv->usbclk = clk_get(dev, "usb");
> > > > - if (IS_ERR(priv->usbclk)) {
> > > > - ret = PTR_ERR(priv->usbclk);
> > > > - goto err_clk;
> > > > + if (!cpu_is_mx28()) {
> > >
> > > this should not be used in drivers, IMHO.
> > >
> > > > + priv->usbclk = clk_get(dev, "usb");
> > >
> > > drivers should not have to care about clock names, are you sure your
> > > clkdev support is correct ?
> >
> > Yes, I agree with you about above two points. I feel the same as you.
> > But I had to following the existing framework. I didn't add any new
> special to the driver.
> > Just try some ways to workaround these ugly points.
>
> but in that case, since you're already there... why not cleaning those
> things up before making your changes ?
>
Ok, I'll clean up these things. Thanks, balbi.
> --
> balbi
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:25 ` Lin Tony-B19295
@ 2011-07-20 11:27 ` Felipe Balbi
0 siblings, 0 replies; 41+ messages in thread
From: Felipe Balbi @ 2011-07-20 11:27 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
On Wed, Jul 20, 2011 at 11:25:07AM +0000, Lin Tony-B19295 wrote:
> > > But I had to following the existing framework. I didn't add any new
> > special to the driver.
> > > Just try some ways to workaround these ugly points.
> >
> > but in that case, since you're already there... why not cleaning those
> > things up before making your changes ?
> >
> Ok, I'll clean up these things. Thanks, balbi.
no problem ;-)
--
balbi
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/d31e72d9/attachment-0001.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
2011-07-20 11:01 ` Felipe Balbi
@ 2011-07-20 11:41 ` Wolfram Sang
2011-07-22 2:16 ` Lin Tony-B19295
2011-07-20 19:08 ` Sascha Hauer
2 siblings, 1 reply; 41+ messages in thread
From: Wolfram Sang @ 2011-07-20 11:41 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:21PM +0800, Tony Lin wrote:
> configure usb1 phy power enable gpio and enable usb1 phy power
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/mach-mx28evk.c | 9 +++++++++
> 1 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c
> index eaaf6ff..6934867 100644
> --- a/arch/arm/mach-mxs/mach-mx28evk.c
> +++ b/arch/arm/mach-mxs/mach-mx28evk.c
> @@ -34,6 +34,7 @@
> #define MX28EVK_BL_ENABLE MXS_GPIO_NR(3, 18)
> #define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
> #define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
> +#define MX28EVK_USB1_PWR_EN MXS_GPIO_NR(3, 8)
>
> #define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
> #define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
> @@ -183,6 +184,8 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
>
> /* led */
> MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
> + /* usb1 */
/* usb1 power enable */
> + MX28_PAD_AUART2_RX__GPIO_3_8 | MXS_PAD_CTRL,
> };
>
> /* led */
> @@ -405,6 +408,12 @@ static void __init mx28evk_init(void)
> pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
> mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
>
> + ret = gpio_request_one(MX28EVK_USB1_PWR_EN, GPIOF_DIR_OUT,
use GPIOF_OUT_INIT_HIGH here to save the set_value below and have less
glitch on the line
> + "usb1-power-en");
> + if (ret)
> + pr_warn("failed to request gpio usb1-power-en %d\n", ret);
> + else
> + gpio_set_value(MX28EVK_USB1_PWR_EN, 1);
> gpio_led_register_device(0, &mx28evk_led_data);
> }
>
> --
> 1.7.0.4
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/779662c5/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 ` Lin Tony-B19295
@ 2011-07-20 11:45 ` Wolfram Sang
0 siblings, 0 replies; 41+ messages in thread
From: Wolfram Sang @ 2011-07-20 11:45 UTC (permalink / raw)
To: linux-arm-kernel
> Yes, using cpu_is_* is really a bad method here :-)
> But I had to follow that bad method so far,
I don't think you 'had to'...
> hope we could see some change from sascha.
...because you could have asked him about the status of these patches.
Regerds,
Wolfram
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20110720/0c3df8fc/attachment.sig>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
2011-07-20 11:05 ` Arnaud Patard (Rtp)
2011-07-20 11:14 ` Felipe Balbi
@ 2011-07-20 13:59 ` Alan Stern
2011-07-22 5:18 ` Lin Tony-B19295
2011-07-20 19:41 ` Sascha Hauer
3 siblings, 1 reply; 41+ messages in thread
From: Alan Stern @ 2011-07-20 13:59 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, 20 Jul 2011, Tony Lin wrote:
> old driver uses some hard coding for clks' name which could
> not be used for mx28. So workaround these hard codings by
> judging the cpu is mx28 or not.
> add platform callback funtions in usb irq handler in the case
> usb phy need to change its disconnect detector mode after usb
> device is connected and disconnected. These callbacks also
> could be used for other machines whose usb phy need such kind
> of operations
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
...
> --- a/drivers/usb/host/ehci-mxc.c
> +++ b/drivers/usb/host/ehci-mxc.c
...
> +static irqreturn_t fsl_ehci_irq(struct usb_hcd *hcd)
> +{
> + struct mxc_usbh_platform_data *pdata;
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> + u32 status;
> +
> + pdata = hcd->self.controller->platform_data;
> + if (pdata->plt_get_usb_connect_status == NULL || \
> + pdata->plt_usb_disconnect_detect == NULL)
> + goto out;
> +
> + spin_lock(&ehci->lock);
Do you really need to use this spinlock? I don't see any reason for
it.
> + status = ehci_readl(ehci, &ehci->regs->status);
> + if (status & STS_PCD) {
> + if (pdata->plt_get_usb_connect_status())
> + pdata->plt_usb_disconnect_detect(true);
> + else
> + pdata->plt_usb_disconnect_detect(false);
How about just this:
pdata->plt_usb_disconnect_detect(
pdata->plt_get_usb_connect_status());
> + }
> + spin_unlock(&ehci->lock);
> +out:
> + return ehci_irq(hcd);
> +}
Alan Stern
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
2011-07-20 11:01 ` Felipe Balbi
2011-07-20 11:41 ` Wolfram Sang
@ 2011-07-20 19:08 ` Sascha Hauer
2011-07-22 2:20 ` Lin Tony-B19295
2 siblings, 1 reply; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 19:08 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:21PM +0800, Tony Lin wrote:
> configure usb1 phy power enable gpio and enable usb1 phy power
You should add the architecture and board name to the subject so that
it's clear what this patch is about.
Sascha
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/mach-mx28evk.c | 9 +++++++++
> 1 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c
> index eaaf6ff..6934867 100644
> --- a/arch/arm/mach-mxs/mach-mx28evk.c
> +++ b/arch/arm/mach-mxs/mach-mx28evk.c
> @@ -34,6 +34,7 @@
> #define MX28EVK_BL_ENABLE MXS_GPIO_NR(3, 18)
> #define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
> #define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
> +#define MX28EVK_USB1_PWR_EN MXS_GPIO_NR(3, 8)
>
> #define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
> #define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
> @@ -183,6 +184,8 @@ static const iomux_cfg_t mx28evk_pads[] __initconst = {
>
> /* led */
> MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
> + /* usb1 */
> + MX28_PAD_AUART2_RX__GPIO_3_8 | MXS_PAD_CTRL,
> };
>
> /* led */
> @@ -405,6 +408,12 @@ static void __init mx28evk_init(void)
> pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
> mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
>
> + ret = gpio_request_one(MX28EVK_USB1_PWR_EN, GPIOF_DIR_OUT,
> + "usb1-power-en");
> + if (ret)
> + pr_warn("failed to request gpio usb1-power-en %d\n", ret);
> + else
> + gpio_set_value(MX28EVK_USB1_PWR_EN, 1);
> gpio_led_register_device(0, &mx28evk_led_data);
> }
>
> --
> 1.7.0.4
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
--
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] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-20 11:08 ` [PATCH 3/7] add usb phy clocks to clock tree Tony Lin
2011-07-20 11:02 ` Felipe Balbi
@ 2011-07-20 19:10 ` Sascha Hauer
2011-07-22 6:02 ` Lin Tony-B19295
1 sibling, 1 reply; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 19:10 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:22PM +0800, Tony Lin wrote:
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/clock-mx28.c | 18 ++++++++++++++++++
> 1 files changed, 18 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c
> index 5dcc59d..6fd0fe6 100644
> --- a/arch/arm/mach-mxs/clock-mx28.c
> +++ b/arch/arm/mach-mxs/clock-mx28.c
> @@ -570,7 +570,23 @@ static struct clk usb1_clk = {
> .disable = _raw_clk_disable,
> .parent = &pll1_clk,
> };
> +/* usb phy clock for usb0 */
> +static struct clk usb_phy_clk0 = {
> + .parent = &pll0_clk,
> + .enable = _raw_clk_disable, /* EN_USB_CLKS = 1 means ON */
> + .disable = _raw_clk_enable,
> + .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL0CTRL0,
> + .enable_shift = 18,
> +};
>
> +/* usb phy clock for usb1 */
> +static struct clk usb_phy_clk1 = {
> + .parent = &pll1_clk,
> + .enable = _raw_clk_disable,
> + .disable = _raw_clk_enable,
> + .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL1CTRL0,
> + .enable_shift = 18,
> +};
> #define _DEFINE_CLOCK(name, er, es, p) \
> static struct clk name = { \
> .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \
> @@ -629,6 +645,8 @@ static struct clk_lookup lookups[] = {
> _REGISTER_CLOCK("flexcan.1", NULL, can1_clk)
> _REGISTER_CLOCK(NULL, "usb0", usb0_clk)
> _REGISTER_CLOCK(NULL, "usb1", usb1_clk)
> + _REGISTER_CLOCK(NULL, "usb0_phy", usb_phy_clk0)
> + _REGISTER_CLOCK(NULL, "usb1_phy", usb_phy_clk1)
This looks suspicious. The phys are real devices, but this shows you
do not intend to use them as devices. Really the phys should be drivers.
Sascha
> _REGISTER_CLOCK("mxs-pwm.0", NULL, pwm_clk)
> _REGISTER_CLOCK("mxs-pwm.1", NULL, pwm_clk)
> _REGISTER_CLOCK("mxs-pwm.2", NULL, pwm_clk)
> --
> 1.7.0.4
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
--
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] 41+ messages in thread
* [PATCH 4/7] mx28: add usb host phy functions
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
2011-07-20 11:12 ` Felipe Balbi
@ 2011-07-20 19:26 ` Sascha Hauer
2011-07-22 2:23 ` Lin Tony-B19295
2011-07-21 6:04 ` Lothar Waßmann
2 siblings, 1 reply; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 19:26 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:23PM +0800, Tony Lin wrote:
> add usb phy register definitions and functions
> usb host driver will use these functions to initialize
> usb phy and change phy working mode
>
>
> obj-y += devices/
> diff --git a/arch/arm/mach-mxs/regs-usbphy-mx28.h b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> new file mode 100644
> index 0000000..a367927
> --- /dev/null
> +++ b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> @@ -0,0 +1,323 @@
> +/*
> + * Freescale USBPHY Register Definitions
> + *
> + * Copyright 2008-2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + * This file is created by xml file. Don't Edit it.
Please remove this comment. We can and will change this header if need
arises.
> + *
> + * Xml Revision: 1.52
> + * Template revision: 26195
> + */
> +
> +#ifndef __ARCH_ARM___USBPHY_H
> +#define __ARCH_ARM___USBPHY_H
> +
> +
> +#define HW_USBPHY_PWD (0x00000000)
> +#define HW_USBPHY_PWD_SET (0x00000004)
> +#define HW_USBPHY_PWD_CLR (0x00000008)
> +#define HW_USBPHY_PWD_TOG (0x0000000c)
> +
> +#define BP_USBPHY_PWD_RSVD2 21
> +#define BM_USBPHY_PWD_RSVD2 0xFFE00000
> +#define BF_USBPHY_PWD_RSVD2(v) \
> + (((v) << 21) & BM_USBPHY_PWD_RSVD2)
> +#define BM_USBPHY_PWD_RXPWDRX 0x00100000
> +#define BM_USBPHY_PWD_RXPWDDIFF 0x00080000
> +#define BM_USBPHY_PWD_RXPWD1PT1 0x00040000
> +#define BM_USBPHY_PWD_RXPWDENV 0x00020000
> +#define BP_USBPHY_PWD_RSVD1 13
> +#define BM_USBPHY_PWD_RSVD1 0x0001E000
> +#define BF_USBPHY_PWD_RSVD1(v) \
> + (((v) << 13) & BM_USBPHY_PWD_RSVD1)
Please remove all these reserved bits. They only reduce readability
> diff --git a/arch/arm/mach-mxs/usb_h1.c b/arch/arm/mach-mxs/usb_h1.c
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
` (2 preceding siblings ...)
2011-07-20 13:59 ` Alan Stern
@ 2011-07-20 19:41 ` Sascha Hauer
3 siblings, 0 replies; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 19:41 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:24PM +0800, Tony Lin wrote:
> old driver uses some hard coding for clks' name which could
> not be used for mx28. So workaround these hard codings by
> judging the cpu is mx28 or not.
> add platform callback funtions in usb irq handler in the case
> usb phy need to change its disconnect detector mode after usb
> device is connected and disconnected. These callbacks also
> could be used for other machines whose usb phy need such kind
> of operations
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> drivers/usb/host/Kconfig | 2 +-
> drivers/usb/host/ehci-mxc.c | 57 +++++++++++++++++++++++++++++++-----------
> 2 files changed, 43 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index ab085f1..6a5905b 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -139,7 +139,7 @@ config USB_EHCI_FSL
>
> config USB_EHCI_MXC
> bool "Support for Freescale on-chip EHCI USB controller"
> - depends on USB_EHCI_HCD && ARCH_MXC
> + depends on USB_EHCI_HCD && (ARCH_MXC || ARCH_MXS)
> select USB_EHCI_ROOT_HUB_TT
> ---help---
> Variation of ARC USB block used in some Freescale chips.
> diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
> index 0c058be..65e78cd 100644
> --- a/drivers/usb/host/ehci-mxc.c
> +++ b/drivers/usb/host/ehci-mxc.c
> @@ -23,9 +23,7 @@
> #include <linux/usb/otg.h>
> #include <linux/usb/ulpi.h>
> #include <linux/slab.h>
> -
> -#include <mach/mxc_ehci.h>
> -
> +#include <linux/fsl_devices.h>
> #include <asm/mach-types.h>
>
> #define ULPI_VIEWPORT_OFFSET 0x170
> @@ -66,6 +64,30 @@ static int ehci_mxc_setup(struct usb_hcd *hcd)
> return 0;
> }
>
> +static irqreturn_t fsl_ehci_irq(struct usb_hcd *hcd)
> +{
> + struct mxc_usbh_platform_data *pdata;
> + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> + u32 status;
> +
> + pdata = hcd->self.controller->platform_data;
> + if (pdata->plt_get_usb_connect_status == NULL || \
This backslash is unnecessary
> + pdata->plt_usb_disconnect_detect == NULL)
> + goto out;
> +
> + spin_lock(&ehci->lock);
> + status = ehci_readl(ehci, &ehci->regs->status);
> + if (status & STS_PCD) {
> + if (pdata->plt_get_usb_connect_status())
> + pdata->plt_usb_disconnect_detect(true);
> + else
> + pdata->plt_usb_disconnect_detect(false);
> + }
> + spin_unlock(&ehci->lock);
> +out:
> + return ehci_irq(hcd);
> +}
> +
> static const struct hc_driver ehci_mxc_hc_driver = {
> .description = hcd_name,
> .product_desc = "Freescale On-Chip EHCI Host Controller",
> @@ -74,7 +96,7 @@ static const struct hc_driver ehci_mxc_hc_driver = {
> /*
> * generic hardware linkage
> */
> - .irq = ehci_irq,
> + .irq = fsl_ehci_irq,
> .flags = HCD_USB2 | HCD_MEMORY,
>
> /*
> @@ -165,14 +187,15 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
> }
>
> /* enable clocks */
> - priv->usbclk = clk_get(dev, "usb");
> - if (IS_ERR(priv->usbclk)) {
> - ret = PTR_ERR(priv->usbclk);
> - goto err_clk;
> + if (!cpu_is_mx28()) {
> + priv->usbclk = clk_get(dev, "usb");
> + if (IS_ERR(priv->usbclk)) {
> + ret = PTR_ERR(priv->usbclk);
> + goto err_clk;
> + }
> + clk_enable(priv->usbclk);
> }
We should start and provide dummy clocks for usb and ahb clock on
platform which do not have them. Then we can get rid of the cpu checks
in the driver.
> - clk_enable(priv->usbclk);
> -
> - if (!cpu_is_mx35() && !cpu_is_mx25()) {
> + if (!cpu_is_mx35() && !cpu_is_mx25() && !cpu_is_mx28()) {
> priv->ahbclk = clk_get(dev, "usb_ahb");
> if (IS_ERR(priv->ahbclk)) {
> ret = PTR_ERR(priv->ahbclk);
> @@ -272,8 +295,10 @@ err_clk_phy:
> clk_put(priv->ahbclk);
> }
> err_clk_ahb:
> - clk_disable(priv->usbclk);
> - clk_put(priv->usbclk);
> + if (priv->usbclk) {
> + clk_disable(priv->usbclk);
> + clk_put(priv->usbclk);
> + }
> err_clk:
> iounmap(hcd->regs);
> err_ioremap:
> @@ -304,8 +329,10 @@ static int __exit ehci_mxc_drv_remove(struct platform_device *pdev)
> usb_put_hcd(hcd);
> platform_set_drvdata(pdev, NULL);
>
> - clk_disable(priv->usbclk);
> - clk_put(priv->usbclk);
> + if (priv->usbclk) {
> + clk_disable(priv->usbclk);
> + clk_put(priv->usbclk);
> + }
> if (priv->ahbclk) {
> clk_disable(priv->ahbclk);
> clk_put(priv->ahbclk);
> --
> 1.7.0.4
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
--
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] 41+ messages in thread
* [PATCH 6/7] add macro definitions according to ehci-mxc driver change
2011-07-20 11:08 ` [PATCH 6/7] add macro definitions according to ehci-mxc driver change Tony Lin
@ 2011-07-20 19:43 ` Sascha Hauer
2011-07-21 6:06 ` Lothar Waßmann
1 sibling, 0 replies; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 19:43 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:25PM +0800, Tony Lin wrote:
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/include/mach/hardware.h | 2 ++
> arch/arm/mach-mxs/include/mach/mxs.h | 12 +++++++++++-
> arch/arm/plat-mxc/include/mach/mxc.h | 3 +++
> 3 files changed, 16 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/include/mach/hardware.h b/arch/arm/mach-mxs/include/mach/hardware.h
> index 53e89a0..affa72b 100644
> --- a/arch/arm/mach-mxs/include/mach/hardware.h
> +++ b/arch/arm/mach-mxs/include/mach/hardware.h
> @@ -26,4 +26,6 @@
> #define IOMEM(addr) ((void __force __iomem *)(addr))
> #endif
>
> +#include "mxs.h"
> +
> #endif /* __MACH_MXS_HARDWARE_H__ */
> diff --git a/arch/arm/mach-mxs/include/mach/mxs.h b/arch/arm/mach-mxs/include/mach/mxs.h
> index 35a89dd..6e5928d 100644
> --- a/arch/arm/mach-mxs/include/mach/mxs.h
> +++ b/arch/arm/mach-mxs/include/mach/mxs.h
> @@ -35,7 +35,17 @@
> machine_is_mx28evk() || \
> machine_is_tx28() || \
> 0)
> -
> +#define cpu_is_mx1() (0)
> +#define cpu_is_mx21() (0)
> +#define cpu_is_mx25() (0)
> +#define cpu_is_mx27() (0)
> +#define cpu_is_mx31() (0)
> +#define cpu_is_mx35() (0)
> +#define cpu_is_mx50() (0)
> +#define cpu_is_mx51() (0)
> +#define cpu_is_mx53() (0)
> +#define cpu_is_mx3() (cpu_is_mx31() || cpu_is_mx35())
> +#define cpu_is_mx2() (cpu_is_mx21() || cpu_is_mx27())
As said before, please get rid of the usage of the macros in the driver
instead.
BTW this patch would have to be earlier in the series to maintain
bisectability.
Sascha
> /*
> * IO addresses common to MXS-based
> */
> diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h
> index 0987923..d4dbe9e 100644
> --- a/arch/arm/plat-mxc/include/mach/mxc.h
> +++ b/arch/arm/plat-mxc/include/mach/mxc.h
> @@ -176,6 +176,9 @@ extern unsigned int __mxc_cpu_type;
> # define cpu_is_mx53() (0)
> #endif
>
> +# define cpu_is_mx23() (0)
> +# define cpu_is_mx28() (0)
> +
> #ifndef __ASSEMBLY__
>
> struct cpu_op {
> --
> 1.7.0.4
>
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
--
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] 41+ messages in thread
* [PATCH 0/7] ARM: mx28: add usb host function
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
` (7 preceding siblings ...)
2011-07-20 11:08 ` [PATCH 7/7] add usb host function to default config Tony Lin
@ 2011-07-20 20:07 ` Sascha Hauer
8 siblings, 0 replies; 41+ messages in thread
From: Sascha Hauer @ 2011-07-20 20:07 UTC (permalink / raw)
To: linux-arm-kernel
On Wed, Jul 20, 2011 at 07:08:19PM +0800, Tony Lin wrote:
> this patch series is to add mx28 usb host function.
> the driver only support usb host mode on usb port1.
> the driver reuses ehci-mxc.c under usb/host, but did
> some modifications based on it to satisfy mx28 usb host
> requirement. The modifications will not affect other
> platforms.
>
> Code is based on the branch for-next in sascha's tree http://git.pengutronix.de/git/imx/linux-2.6.git
I don't really like the approach of merging a completely
unrelated architecture into the i.MX platform glue code.
Currently every architecture has it's own very similar
glue code for the EHCI driver which is bad. What is even
worse is that we have multiple (I think 4) drivers for the
gadget part of this chip. Some architectures support OTG,
others not, but all of them have a different way to attach
a USB phy to the EHCI core.
We are on the road to device tree support which should give
us a good opportunity to clean this up (We don't want to have
device tree binding code in each platform driver we have now,
right?)
Given that Freescale is currently working hard on device tree
support I think the effort is better spent in bringing the
existing oftree driver in shape for use on ARM.
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] 41+ messages in thread
* [PATCH 4/7] mx28: add usb host phy functions
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
2011-07-20 11:12 ` Felipe Balbi
2011-07-20 19:26 ` Sascha Hauer
@ 2011-07-21 6:04 ` Lothar Waßmann
2 siblings, 0 replies; 41+ messages in thread
From: Lothar Waßmann @ 2011-07-21 6:04 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Tony Lin writes:
> add usb phy register definitions and functions
> usb host driver will use these functions to initialize
> usb phy and change phy working mode
>
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/Kconfig | 1 +
> arch/arm/mach-mxs/Makefile | 1 +
> arch/arm/mach-mxs/regs-usbphy-mx28.h | 323 ++++++++++++++++++++++++++++++++++
> arch/arm/mach-mxs/usb_h1.c | 230 ++++++++++++++++++++++++
> 4 files changed, 555 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig
> index 4cd0231..1c4264f 100644
> --- a/arch/arm/mach-mxs/Kconfig
> +++ b/arch/arm/mach-mxs/Kconfig
> @@ -49,6 +49,7 @@ config MACH_MX28EVK
> select MXS_HAVE_PLATFORM_MXS_MMC
> select MXS_HAVE_PLATFORM_MXSFB
> select MXS_OCOTP
> + select USB_ARCH_HAS_EHCI
> help
> Include support for MX28EVK platform. This includes specific
> configurations for the board and its peripherals.
> diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
> index 6c38262..48fc2f5 100644
> --- a/arch/arm/mach-mxs/Makefile
> +++ b/arch/arm/mach-mxs/Makefile
> @@ -12,5 +12,6 @@ obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
> obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
> obj-$(CONFIG_MODULE_TX28) += module-tx28.o
> obj-$(CONFIG_MACH_TX28) += mach-tx28.o
> +obj-$(CONFIG_USB_EHCI_MXC) += usb_h1.o
>
> obj-y += devices/
> diff --git a/arch/arm/mach-mxs/regs-usbphy-mx28.h b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> new file mode 100644
> index 0000000..a367927
> --- /dev/null
> +++ b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> @@ -0,0 +1,323 @@
> +/*
> + * Freescale USBPHY Register Definitions
> + *
> + * Copyright 2008-2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> + *
> + * This file is created by xml file. Don't Edit it.
> + *
> + * Xml Revision: 1.52
> + * Template revision: 26195
> + */
> +
> +#ifndef __ARCH_ARM___USBPHY_H
> +#define __ARCH_ARM___USBPHY_H
> +
> +
> +#define HW_USBPHY_PWD (0x00000000)
> +#define HW_USBPHY_PWD_SET (0x00000004)
> +#define HW_USBPHY_PWD_CLR (0x00000008)
> +#define HW_USBPHY_PWD_TOG (0x0000000c)
> +
You should educate your file generator to omit those silly parens.
> diff --git a/arch/arm/mach-mxs/usb_h1.c b/arch/arm/mach-mxs/usb_h1.c
> new file mode 100644
> index 0000000..9ca5236
> --- /dev/null
> +++ b/arch/arm/mach-mxs/usb_h1.c
> @@ -0,0 +1,230 @@
> +/*
> + * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights Reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/types.h>
> +#include <linux/clk.h>
> +#include <linux/delay.h>
> +#include <linux/platform_device.h>
> +#include <linux/io.h>
> +#include <linux/err.h>
> +#include <linux/fsl_devices.h>
> +#include <linux/gpio.h>
> +#include <asm/mach-types.h>
> +#include <asm/mach/arch.h>
> +#include <mach/irqs.h>
> +#include <mach/mx28.h>
> +#include "regs-usbphy-mx28.h"
> +
> +/* EHCI registers: */
> +#define UOG_USBCMD (0x140)/* USB command register */
> +#define UOG_PORTSC1 (0x184)/* port status and control */
> +/* x_PORTSCx */
> +#define PORTSC_PTS_MASK (3 << 30)/* parallel xcvr mask */
> +#define PORTSC_PTS_UTMI (0 << 30)/* UTMI/UTMI+ */
> +#define PORTSC_PTW (1 << 28)/* UTMI width */
> +/* USBCMD */
> +#define UCMD_RUN_STOP (1 << 0)/* controller run/stop */
> +#define UCMD_RESET (1 << 1)/* controller reset */
> +
A space between the value and the comment would be nice.
> +#define HOSTPHY_CONNECT_STATE (1 << 3)
> +
> +static struct clk *usb_clk;
> +static struct clk *usb_phy_clk;
> +static int internal_phy_clk_already_on;
> +
> +/* The dmamask must be set for EHCI to work */
> +static u64 ehci_dmamask = ~(u32) 0;
> +static int instance_id = ~(u32) 0;
> +
> +static int fsl_platform_get_usb_conn_status(void)
> +{
> + u32 status;
> +
> + status = __raw_readl(MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + \
> + HW_USBPHY_STATUS);
> + return ((status & HOSTPHY_CONNECT_STATE) == 0);
> +}
> +
> +/* enable/disable high-speed disconnect detector of phy ctrl */
> +static void fsl_platform_set_usb_phy_dis(int enable)
> +{
> + if (enable)
> + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_SET);
> + else
> + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_CLR);
> +}
> +
> +static int usb_phy_enable(struct mxc_usbh_platform_data *pdata)
> +{
> + u32 tmp;
> + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> + void __iomem *usb_reg = MX28_IO_ADDRESS(MX28_USBCTRL1_BASE_ADDR);
> + void __iomem *usbcmd, *phy_ctrl, *portsc;
> + /* Reset USB IP */
> + usbcmd = usb_reg + UOG_USBCMD;
> + tmp = __raw_readl(usbcmd); /* usb command */
> + tmp &= ~UCMD_RUN_STOP;
> + __raw_writel(tmp, usbcmd);
> + while (__raw_readl(usbcmd) & UCMD_RUN_STOP)
> + ;
>
This loop (and the subsequent similar ones) should be bounded in case
the condition never becomes true.
Otherwise the return type could be changed to void, since the return
value is always zero and not even checked by the caller.
> + tmp |= UCMD_RESET;
> + __raw_writel(tmp, usbcmd);
> + while (__raw_readl(usbcmd) & UCMD_RESET)
> + ;
> + mdelay(10);
> + /* Reset USBPHY module */
> + phy_ctrl = phy_reg + HW_USBPHY_CTRL;
> + tmp = __raw_readl(phy_ctrl);
> + tmp |= BM_USBPHY_CTRL_SFTRST;
> + __raw_writel(tmp, phy_ctrl);
> + udelay(10);
> + /* Remove CLKGATE and SFTRST */
> + tmp = __raw_readl(phy_ctrl);
> + tmp &= ~(BM_USBPHY_CTRL_CLKGATE | BM_USBPHY_CTRL_SFTRST);
> + __raw_writel(tmp, phy_ctrl);
> + udelay(10);
> + /* set UTMI xcvr */
> + /* Workaround an IC issue for ehci driver:
> + * when turn off root hub port power, EHCI set
> + * PORTSC reserved bits to be 0, but PTW with 0
> + * means 8 bits tranceiver width, here change
> + * it back to be 16 bits and do PHY diable and
> + * then enable.
> + */
> + portsc = usb_reg + UOG_PORTSC1;
> + tmp = __raw_readl(portsc);
> + tmp &= ~PORTSC_PTS_MASK;
> + tmp |= (PORTSC_PTS_UTMI | PORTSC_PTW);
> + __raw_writel(tmp, portsc);
> + /* Power up the PHY */
> + __raw_writel(0, phy_reg + HW_USBPHY_PWD);
> + return 0;
> +}
> +
> +static int fsl_usb_host_init(struct platform_device *pdev)
> +{
> + struct mxc_usbh_platform_data *pdata = pdev->dev.platform_data;
> + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> + u32 tmp;
> +
> + usb_phy_enable(pdata);
> + /* enable FS/LS device */
> + tmp = __raw_readl(phy_reg + HW_USBPHY_CTRL);
> + tmp |= (BM_USBPHY_CTRL_ENUTMILEVEL2 | BM_USBPHY_CTRL_ENUTMILEVEL3);
> + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL);
> +
> + return 0;
> +}
> +
> +static void usbh1_internal_phy_clock_gate(bool on)
> +{
> + u32 tmp;
> + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> +
> + if (on) {
> + internal_phy_clk_already_on += 1;
> + if (internal_phy_clk_already_on == 1) {
> + tmp = BM_USBPHY_CTRL_SFTRST | BM_USBPHY_CTRL_CLKGATE;
> + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_CLR);
> + }
> + } else {
> + internal_phy_clk_already_on -= 1;
> + if (internal_phy_clk_already_on == 0) {
> + tmp = BM_USBPHY_CTRL_CLKGATE;
> + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_SET);
> + }
> + }
> + if (internal_phy_clk_already_on < 0)
> + printk(KERN_ERR "please check phy clock ON/OFF sequence\n");
>
A WARN_ON() would be appropriate here.
> +}
> +static int fsl_usb_host_init_ext(struct platform_device *pdev)
> +{
>
blank line before new function prototype.
> + usb_clk = clk_get(NULL, "usb1");
> + clk_enable(usb_clk);
> + clk_put(usb_clk);
> + usb_phy_clk = clk_get(NULL, "usb1_phy");
> + clk_enable(usb_phy_clk);
> + clk_put(usb_phy_clk);
> +
clk_get() may fail!
if (IS_ERR(usb_clk))
...
if (IS_ERR(usb_phy_clk))
...
> + usbh1_internal_phy_clock_gate(true);
> + return fsl_usb_host_init(pdev);
> +}
> +
> +static int fsl_usb_host_uninit_ext(struct platform_device *pdev)
> +{
> + usbh1_internal_phy_clock_gate(false);
> + clk_disable(usb_phy_clk);
> + clk_disable(usb_clk);
>
The clocks have already been released by clk_put() in the
fsl_usb_host_init_ext() function. Thus they must not be used any more!
You probably should move the clk_put() from the init function to
here.
> + return 0;
> +}
> +
> +static struct mxc_usbh_platform_data usbh1_config = {
> + .init = fsl_usb_host_init_ext,
> + .exit = fsl_usb_host_uninit_ext,
> + .portsc = MXC_EHCI_MODE_ULPI,
> + .otg = NULL,
> + .plt_get_usb_connect_status = fsl_platform_get_usb_conn_status,
> + .plt_usb_disconnect_detect = fsl_platform_set_usb_phy_dis,
> +};
> +
> +/* The resources for kinds of usb devices */
> +static struct resource usbh1_resources[] = {
> + [0] = {
unnecessary index.
> + .start = (u32) (MX28_USBCTRL1_BASE_ADDR),
> + .end = (u32) (MX28_USBCTRL1_BASE_ADDR + 0x1ff),
>
pointless and wrong cast. Silly parens around MX28_USBCTRL1_BASE_ADDR.
> + .flags = IORESOURCE_MEM,
> + },
> + [1] = {
> + .start = MX28_INT_USB1,
> + .flags = IORESOURCE_IRQ,
'.end =' missing.
> + },
>
strange indentation of the whole block.
> +};
> +
> +static int __init usbh1_init(void)
> +{
> + struct platform_device *pdev;
> + int rc;
> +
> + if (!cpu_is_mx28())
> + return 0;
> +
> + pdev = platform_device_register_simple("mxc-ehci",
> + instance_id, usbh1_resources, ARRAY_SIZE(usbh1_resources));
> + if (IS_ERR(pdev)) {
> + pr_debug("can't register Host, %ld\n",
> + PTR_ERR(pdev));
> + return -EFAULT;
>
You have already an error code returned by
platform_device_register_simple(). So use it:
return PTR_ERR(pdev);
> + }
> +
> + pdev->dev.coherent_dma_mask = 0xffffffff;
> + pdev->dev.dma_mask = &ehci_dmamask;
> +
> + rc = platform_device_add_data(pdev, &usbh1_config,
> + sizeof(struct mxc_usbh_platform_data));
> + if (rc) {
> + platform_device_unregister(pdev);
> + return -EFAULT;
>
ditto.
Lothar Wa?mann
--
___________________________________________________________
Ka-Ro electronics GmbH | Pascalstra?e 22 | D - 52076 Aachen
Phone: +49 2408 1402-0 | Fax: +49 2408 1402-10
Gesch?ftsf?hrer: Matthias Kaussen
Handelsregistereintrag: Amtsgericht Aachen, HRB 4996
www.karo-electronics.de | info at karo-electronics.de
___________________________________________________________
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 6/7] add macro definitions according to ehci-mxc driver change
2011-07-20 11:08 ` [PATCH 6/7] add macro definitions according to ehci-mxc driver change Tony Lin
2011-07-20 19:43 ` Sascha Hauer
@ 2011-07-21 6:06 ` Lothar Waßmann
1 sibling, 0 replies; 41+ messages in thread
From: Lothar Waßmann @ 2011-07-21 6:06 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
Tony Lin writes:
> Signed-off-by: Tony Lin <tony.lin@freescale.com>
> ---
> arch/arm/mach-mxs/include/mach/hardware.h | 2 ++
> arch/arm/mach-mxs/include/mach/mxs.h | 12 +++++++++++-
> arch/arm/plat-mxc/include/mach/mxc.h | 3 +++
> 3 files changed, 16 insertions(+), 1 deletions(-)
>
> diff --git a/arch/arm/mach-mxs/include/mach/hardware.h b/arch/arm/mach-mxs/include/mach/hardware.h
> index 53e89a0..affa72b 100644
> --- a/arch/arm/mach-mxs/include/mach/hardware.h
> +++ b/arch/arm/mach-mxs/include/mach/hardware.h
> @@ -26,4 +26,6 @@
> #define IOMEM(addr) ((void __force __iomem *)(addr))
> #endif
>
> +#include "mxs.h"
> +
> #endif /* __MACH_MXS_HARDWARE_H__ */
> diff --git a/arch/arm/mach-mxs/include/mach/mxs.h b/arch/arm/mach-mxs/include/mach/mxs.h
> index 35a89dd..6e5928d 100644
> --- a/arch/arm/mach-mxs/include/mach/mxs.h
> +++ b/arch/arm/mach-mxs/include/mach/mxs.h
> @@ -35,7 +35,17 @@
> machine_is_mx28evk() || \
> machine_is_tx28() || \
> 0)
> -
> +#define cpu_is_mx1() (0)
> +#define cpu_is_mx21() (0)
> +#define cpu_is_mx25() (0)
> +#define cpu_is_mx27() (0)
> +#define cpu_is_mx31() (0)
> +#define cpu_is_mx35() (0)
> +#define cpu_is_mx50() (0)
> +#define cpu_is_mx51() (0)
> +#define cpu_is_mx53() (0)
>
No need for parens around bare numbers.
Lothar Wa?mann
--
___________________________________________________________
Ka-Ro electronics GmbH | Pascalstra?e 22 | D - 52076 Aachen
Phone: +49 2408 1402-0 | Fax: +49 2408 1402-10
Gesch?ftsf?hrer: Matthias Kaussen
Handelsregistereintrag: Amtsgericht Aachen, HRB 4996
www.karo-electronics.de | info at karo-electronics.de
___________________________________________________________
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 11:41 ` Wolfram Sang
@ 2011-07-22 2:16 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-22 2:16 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Wolfram Sang [mailto:w.sang at pengutronix.de]
> Sent: Wednesday, July 20, 2011 7:41 PM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; koen.beel.barco at gmail.com; balbi at ti.com;
> linux-arm-kernel at lists.infradead.org
> Subject: Re: [PATCH 2/7] enable usb1 phy power supply
>
> On Wed, Jul 20, 2011 at 07:08:21PM +0800, Tony Lin wrote:
> > configure usb1 phy power enable gpio and enable usb1 phy power
> >
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
> > ---
> > arch/arm/mach-mxs/mach-mx28evk.c | 9 +++++++++
> > 1 files changed, 9 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-mxs/mach-mx28evk.c
> > b/arch/arm/mach-mxs/mach-mx28evk.c
> > index eaaf6ff..6934867 100644
> > --- a/arch/arm/mach-mxs/mach-mx28evk.c
> > +++ b/arch/arm/mach-mxs/mach-mx28evk.c
> > @@ -34,6 +34,7 @@
> > #define MX28EVK_BL_ENABLE MXS_GPIO_NR(3, 18)
> > #define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
> > #define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
> > +#define MX28EVK_USB1_PWR_EN MXS_GPIO_NR(3, 8)
> >
> > #define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
> > #define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
> > @@ -183,6 +184,8 @@ static const iomux_cfg_t mx28evk_pads[]
> > __initconst = {
> >
> > /* led */
> > MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
> > + /* usb1 */
>
> /* usb1 power enable */
>
> > + MX28_PAD_AUART2_RX__GPIO_3_8 | MXS_PAD_CTRL,
> > };
> >
> > /* led */
> > @@ -405,6 +408,12 @@ static void __init mx28evk_init(void)
> > pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
> > mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
> >
> > + ret = gpio_request_one(MX28EVK_USB1_PWR_EN, GPIOF_DIR_OUT,
>
> use GPIOF_OUT_INIT_HIGH here to save the set_value below and have less
> glitch on the line
Ok, thanks for your advice.
>
> > + "usb1-power-en");
> > + if (ret)
> > + pr_warn("failed to request gpio usb1-power-en %d\n", ret);
> > + else
> > + gpio_set_value(MX28EVK_USB1_PWR_EN, 1);
> > gpio_led_register_device(0, &mx28evk_led_data); }
> >
> > --
> > 1.7.0.4
> >
> >
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
> --
> Pengutronix e.K. | Wolfram Sang
> |
> Industrial Linux Solutions | http://www.pengutronix.de/
> |
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 2/7] enable usb1 phy power supply
2011-07-20 19:08 ` Sascha Hauer
@ 2011-07-22 2:20 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-22 2:20 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: linux-arm-kernel-bounces at lists.infradead.org [mailto:linux-arm-
> kernel-bounces at lists.infradead.org] On Behalf Of Sascha Hauer
> Sent: Thursday, July 21, 2011 3:09 AM
> To: Lin Tony-B19295
> Cc: koen.beel.barco at gmail.com; linux-usb at vger.kernel.org; linux-arm-
> kernel at lists.infradead.org; balbi at ti.com
> Subject: Re: [PATCH 2/7] enable usb1 phy power supply
>
> On Wed, Jul 20, 2011 at 07:08:21PM +0800, Tony Lin wrote:
> > configure usb1 phy power enable gpio and enable usb1 phy power
>
> You should add the architecture and board name to the subject so that
> it's clear what this patch is about.
>
> Sascha
>
Ok, I'll do it from next patch, thanks
> >
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
> > ---
> > arch/arm/mach-mxs/mach-mx28evk.c | 9 +++++++++
> > 1 files changed, 9 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-mxs/mach-mx28evk.c
> > b/arch/arm/mach-mxs/mach-mx28evk.c
> > index eaaf6ff..6934867 100644
> > --- a/arch/arm/mach-mxs/mach-mx28evk.c
> > +++ b/arch/arm/mach-mxs/mach-mx28evk.c
> > @@ -34,6 +34,7 @@
> > #define MX28EVK_BL_ENABLE MXS_GPIO_NR(3, 18)
> > #define MX28EVK_LCD_ENABLE MXS_GPIO_NR(3, 30)
> > #define MX28EVK_FEC_PHY_RESET MXS_GPIO_NR(4, 13)
> > +#define MX28EVK_USB1_PWR_EN MXS_GPIO_NR(3, 8)
> >
> > #define MX28EVK_MMC0_WRITE_PROTECT MXS_GPIO_NR(2, 12)
> > #define MX28EVK_MMC1_WRITE_PROTECT MXS_GPIO_NR(0, 28)
> > @@ -183,6 +184,8 @@ static const iomux_cfg_t mx28evk_pads[]
> > __initconst = {
> >
> > /* led */
> > MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
> > + /* usb1 */
> > + MX28_PAD_AUART2_RX__GPIO_3_8 | MXS_PAD_CTRL,
> > };
> >
> > /* led */
> > @@ -405,6 +408,12 @@ static void __init mx28evk_init(void)
> > pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret);
> > mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
> >
> > + ret = gpio_request_one(MX28EVK_USB1_PWR_EN, GPIOF_DIR_OUT,
> > + "usb1-power-en");
> > + if (ret)
> > + pr_warn("failed to request gpio usb1-power-en %d\n", ret);
> > + else
> > + gpio_set_value(MX28EVK_USB1_PWR_EN, 1);
> > gpio_led_register_device(0, &mx28evk_led_data); }
> >
> > --
> > 1.7.0.4
> >
> >
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> >
>
> --
> 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
> |
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 4/7] mx28: add usb host phy functions
2011-07-20 19:26 ` Sascha Hauer
@ 2011-07-22 2:23 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-22 2:23 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Sascha Hauer [mailto:s.hauer at pengutronix.de]
> Sent: Thursday, July 21, 2011 3:26 AM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; koen.beel.barco at gmail.com; balbi at ti.com;
> linux-arm-kernel at lists.infradead.org
> Subject: Re: [PATCH 4/7] mx28: add usb host phy functions
>
> On Wed, Jul 20, 2011 at 07:08:23PM +0800, Tony Lin wrote:
> > add usb phy register definitions and functions usb host driver will
> > use these functions to initialize usb phy and change phy working mode
> >
> >
> > obj-y += devices/
> > diff --git a/arch/arm/mach-mxs/regs-usbphy-mx28.h
> > b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> > new file mode 100644
> > index 0000000..a367927
> > --- /dev/null
> > +++ b/arch/arm/mach-mxs/regs-usbphy-mx28.h
> > @@ -0,0 +1,323 @@
> > +/*
> > + * Freescale USBPHY Register Definitions
> > + *
> > + * Copyright 2008-2011 Freescale Semiconductor, Inc. All Rights
> Reserved.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License as published
> > +by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
> > +02111-1307 USA
> > + *
> > + * This file is created by xml file. Don't Edit it.
>
> Please remove this comment. We can and will change this header if need
> arises.
>
> > + *
> > + * Xml Revision: 1.52
> > + * Template revision: 26195
> > + */
> > +
> > +#ifndef __ARCH_ARM___USBPHY_H
> > +#define __ARCH_ARM___USBPHY_H
> > +
> > +
> > +#define HW_USBPHY_PWD (0x00000000)
> > +#define HW_USBPHY_PWD_SET (0x00000004)
> > +#define HW_USBPHY_PWD_CLR (0x00000008)
> > +#define HW_USBPHY_PWD_TOG (0x0000000c)
> > +
> > +#define BP_USBPHY_PWD_RSVD2 21
> > +#define BM_USBPHY_PWD_RSVD2 0xFFE00000
> > +#define BF_USBPHY_PWD_RSVD2(v) \
> > + (((v) << 21) & BM_USBPHY_PWD_RSVD2)
> > +#define BM_USBPHY_PWD_RXPWDRX 0x00100000
> > +#define BM_USBPHY_PWD_RXPWDDIFF 0x00080000
> > +#define BM_USBPHY_PWD_RXPWD1PT1 0x00040000
> > +#define BM_USBPHY_PWD_RXPWDENV 0x00020000
> > +#define BP_USBPHY_PWD_RSVD1 13
> > +#define BM_USBPHY_PWD_RSVD1 0x0001E000
> > +#define BF_USBPHY_PWD_RSVD1(v) \
> > + (((v) << 13) & BM_USBPHY_PWD_RSVD1)
>
> Please remove all these reserved bits. They only reduce readability
>
>
> > diff --git a/arch/arm/mach-mxs/usb_h1.c b/arch/arm/mach-mxs/usb_h1.c
>
> From what I know the i.MX28 has two identical USB phys. There shouldn't
> be a file handling only one of these.
>
> > new file mode 100644
> > index 0000000..9ca5236
> > --- /dev/null
> > +++ b/arch/arm/mach-mxs/usb_h1.c
> > @@ -0,0 +1,230 @@
> > +/*
> > + * Copyright (C) 2009-2011 Freescale Semiconductor, Inc. All Rights
> Reserved.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License as published
> > +by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > +along
> > + * with this program; if not, write to the Free Software Foundation,
> > +Inc.,
> > + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/types.h>
> > +#include <linux/clk.h>
> > +#include <linux/delay.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/io.h>
> > +#include <linux/err.h>
> > +#include <linux/fsl_devices.h>
> > +#include <linux/gpio.h>
> > +#include <asm/mach-types.h>
> > +#include <asm/mach/arch.h>
> > +#include <mach/irqs.h>
> > +#include <mach/mx28.h>
> > +#include "regs-usbphy-mx28.h"
> > +
> > +/* EHCI registers: */
> > +#define UOG_USBCMD (0x140)/* USB command register */
> > +#define UOG_PORTSC1 (0x184)/* port status and control */
> > +/* x_PORTSCx */
> > +#define PORTSC_PTS_MASK (3 << 30)/* parallel xcvr mask */
> > +#define PORTSC_PTS_UTMI (0 << 30)/* UTMI/UTMI+ */
> > +#define PORTSC_PTW (1 << 28)/* UTMI width */
> > +/* USBCMD */
> > +#define UCMD_RUN_STOP (1 << 0)/* controller run/stop */
> > +#define UCMD_RESET (1 << 1)/* controller reset */
> > +
> > +#define HOSTPHY_CONNECT_STATE (1 << 3)
> > +
> > +static struct clk *usb_clk;
> > +static struct clk *usb_phy_clk;
> > +static int internal_phy_clk_already_on;
>
> Please get rid fo these static variables. The i.MX28 has two USB phys and
> two EHCI cores. All of these should be devices and the context should be
> stored in data private to the driver.
>
> > +
> > +/* The dmamask must be set for EHCI to work */ static u64
> > +ehci_dmamask = ~(u32) 0; static int instance_id = ~(u32) 0;
> > +
> > +static int fsl_platform_get_usb_conn_status(void)
> > +{
> > + u32 status;
> > +
> > + status = __raw_readl(MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + \
> > + HW_USBPHY_STATUS);
> > + return ((status & HOSTPHY_CONNECT_STATE) == 0); }
>
> A function which takes absolutely no context looks suspicious.
>
> > +
> > +/* enable/disable high-speed disconnect detector of phy ctrl */
> > +static void fsl_platform_set_usb_phy_dis(int enable) {
> > + if (enable)
> > + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> > + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) + HW_USBPHY_CTRL_SET);
> > + else
> > + __raw_writel(BM_USBPHY_CTRL_ENHOSTDISCONDETECT,
> > + MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR) +
> HW_USBPHY_CTRL_CLR); }
> > +
> > +static int usb_phy_enable(struct mxc_usbh_platform_data *pdata) {
> > + u32 tmp;
> > + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> > + void __iomem *usb_reg = MX28_IO_ADDRESS(MX28_USBCTRL1_BASE_ADDR);
>
> This function takes device specific context and still it uses hardcoded
> usbphy1 registers.
>
> > + void __iomem *usbcmd, *phy_ctrl, *portsc;
> > + /* Reset USB IP */
> > + usbcmd = usb_reg + UOG_USBCMD;
> > + tmp = __raw_readl(usbcmd); /* usb command */
> > + tmp &= ~UCMD_RUN_STOP;
> > + __raw_writel(tmp, usbcmd);
> > + while (__raw_readl(usbcmd) & UCMD_RUN_STOP)
> > + ;
>
> No potentially endless loops please.
>
> > + tmp |= UCMD_RESET;
> > + __raw_writel(tmp, usbcmd);
> > + while (__raw_readl(usbcmd) & UCMD_RESET)
> > + ;
> > + mdelay(10);
> > + /* Reset USBPHY module */
> > + phy_ctrl = phy_reg + HW_USBPHY_CTRL;
> > + tmp = __raw_readl(phy_ctrl);
> > + tmp |= BM_USBPHY_CTRL_SFTRST;
> > + __raw_writel(tmp, phy_ctrl);
> > + udelay(10);
> > + /* Remove CLKGATE and SFTRST */
> > + tmp = __raw_readl(phy_ctrl);
> > + tmp &= ~(BM_USBPHY_CTRL_CLKGATE | BM_USBPHY_CTRL_SFTRST);
> > + __raw_writel(tmp, phy_ctrl);
> > + udelay(10);
> > + /* set UTMI xcvr */
> > + /* Workaround an IC issue for ehci driver:
> > + * when turn off root hub port power, EHCI set
> > + * PORTSC reserved bits to be 0, but PTW with 0
> > + * means 8 bits tranceiver width, here change
> > + * it back to be 16 bits and do PHY diable and
> > + * then enable.
> > + */
> > + portsc = usb_reg + UOG_PORTSC1;
> > + tmp = __raw_readl(portsc);
> > + tmp &= ~PORTSC_PTS_MASK;
> > + tmp |= (PORTSC_PTS_UTMI | PORTSC_PTW);
> > + __raw_writel(tmp, portsc);
> > + /* Power up the PHY */
> > + __raw_writel(0, phy_reg + HW_USBPHY_PWD);
> > + return 0;
> > +}
> > +
> > +static int fsl_usb_host_init(struct platform_device *pdev) {
> > + struct mxc_usbh_platform_data *pdata = pdev->dev.platform_data;
> > + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> > + u32 tmp;
> > +
> > + usb_phy_enable(pdata);
> > + /* enable FS/LS device */
> > + tmp = __raw_readl(phy_reg + HW_USBPHY_CTRL);
> > + tmp |= (BM_USBPHY_CTRL_ENUTMILEVEL2 | BM_USBPHY_CTRL_ENUTMILEVEL3);
> > + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL);
> > +
> > + return 0;
> > +}
> > +
> > +static void usbh1_internal_phy_clock_gate(bool on) {
> > + u32 tmp;
> > + void __iomem *phy_reg = MX28_IO_ADDRESS(MX28_USBPHY1_BASE_ADDR);
> > +
> > + if (on) {
> > + internal_phy_clk_already_on += 1;
> > + if (internal_phy_clk_already_on == 1) {
> > + tmp = BM_USBPHY_CTRL_SFTRST | BM_USBPHY_CTRL_CLKGATE;
> > + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_CLR);
> > + }
> > + } else {
> > + internal_phy_clk_already_on -= 1;
> > + if (internal_phy_clk_already_on == 0) {
> > + tmp = BM_USBPHY_CTRL_CLKGATE;
> > + __raw_writel(tmp, phy_reg + HW_USBPHY_CTRL_SET);
> > + }
> > + }
> > + if (internal_phy_clk_already_on < 0)
> > + printk(KERN_ERR "please check phy clock ON/OFF sequence\n"); }
> > +static int fsl_usb_host_init_ext(struct platform_device *pdev) {
> > + usb_clk = clk_get(NULL, "usb1");
> > + clk_enable(usb_clk);
> > + clk_put(usb_clk);
> > + usb_phy_clk = clk_get(NULL, "usb1_phy");
> > + clk_enable(usb_phy_clk);
> > + clk_put(usb_phy_clk);
> > +
> > + usbh1_internal_phy_clock_gate(true);
> > + return fsl_usb_host_init(pdev);
> > +}
> > +
> > +static int fsl_usb_host_uninit_ext(struct platform_device *pdev) {
> > + usbh1_internal_phy_clock_gate(false);
> > + clk_disable(usb_phy_clk);
> > + clk_disable(usb_clk);
> > + return 0;
> > +}
> > +
> > +static struct mxc_usbh_platform_data usbh1_config = {
> > + .init = fsl_usb_host_init_ext,
> > + .exit = fsl_usb_host_uninit_ext,
> > + .portsc = MXC_EHCI_MODE_ULPI,
> > + .otg = NULL,
> > + .plt_get_usb_connect_status = fsl_platform_get_usb_conn_status,
> > + .plt_usb_disconnect_detect = fsl_platform_set_usb_phy_dis, };
> > +
> > +/* The resources for kinds of usb devices */ static struct resource
> > +usbh1_resources[] = {
> > + [0] = {
> > + .start = (u32) (MX28_USBCTRL1_BASE_ADDR),
> > + .end = (u32) (MX28_USBCTRL1_BASE_ADDR + 0x1ff),
> > + .flags = IORESOURCE_MEM,
> > + },
> > + [1] = {
> > + .start = MX28_INT_USB1,
> > + .flags = IORESOURCE_IRQ,
> > + },
> > +};
> > +
> > +static int __init usbh1_init(void)
> > +{
> > + struct platform_device *pdev;
> > + int rc;
> > +
> > + if (!cpu_is_mx28())
> > + return 0;
> > +
> > + pdev = platform_device_register_simple("mxc-ehci",
> > + instance_id, usbh1_resources, ARRAY_SIZE(usbh1_resources));
>
> What is this global instance_id you use here? This function is clearly
> called only once, yet it uses a variable which is incremented below and
> then never used again.
>
> > + if (IS_ERR(pdev)) {
> > + pr_debug("can't register Host, %ld\n",
> > + PTR_ERR(pdev));
> > + return -EFAULT;
> > + }
> > +
> > + pdev->dev.coherent_dma_mask = 0xffffffff;
> > + pdev->dev.dma_mask = &ehci_dmamask;
> > +
> > + rc = platform_device_add_data(pdev, &usbh1_config,
> > + sizeof(struct mxc_usbh_platform_data));
>
> I doubt it's allowed to add platform data after registering a device.
> The driver could already be probed after register and bailed out because
> of missing platform data.
>
>
> Overall this needs major rework.
>
> Sascha
Ok, I'll consider all of your recommendations, thanks
>
>
> --
> 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] 41+ messages in thread
* [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28
2011-07-20 13:59 ` Alan Stern
@ 2011-07-22 5:18 ` Lin Tony-B19295
0 siblings, 0 replies; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-22 5:18 UTC (permalink / raw)
To: linux-arm-kernel
> On Wed, 20 Jul 2011, Tony Lin wrote:
>
> > old driver uses some hard coding for clks' name which could not be
> > used for mx28. So workaround these hard codings by judging the cpu is
> > mx28 or not.
> > add platform callback funtions in usb irq handler in the case usb phy
> > need to change its disconnect detector mode after usb device is
> > connected and disconnected. These callbacks also could be used for
> > other machines whose usb phy need such kind of operations
> >
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
>
> ...
>
> > --- a/drivers/usb/host/ehci-mxc.c
> > +++ b/drivers/usb/host/ehci-mxc.c
>
> ...
>
> > +static irqreturn_t fsl_ehci_irq(struct usb_hcd *hcd) {
> > + struct mxc_usbh_platform_data *pdata;
> > + struct ehci_hcd *ehci = hcd_to_ehci(hcd);
> > + u32 status;
> > +
> > + pdata = hcd->self.controller->platform_data;
> > + if (pdata->plt_get_usb_connect_status == NULL || \
> > + pdata->plt_usb_disconnect_detect == NULL)
> > + goto out;
> > +
> > + spin_lock(&ehci->lock);
>
> Do you really need to use this spinlock? I don't see any reason for it.
>
I'll remove it. Thanks for pointing out.
> > + status = ehci_readl(ehci, &ehci->regs->status);
> > + if (status & STS_PCD) {
> > + if (pdata->plt_get_usb_connect_status())
> > + pdata->plt_usb_disconnect_detect(true);
> > + else
> > + pdata->plt_usb_disconnect_detect(false);
>
> How about just this:
>
> pdata->plt_usb_disconnect_detect(
> pdata->plt_get_usb_connect_status());
>
That's better.
> > + }
> > + spin_unlock(&ehci->lock);
> > +out:
> > + return ehci_irq(hcd);
> > +}
>
> Alan Stern
>
^ permalink raw reply [flat|nested] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-20 19:10 ` Sascha Hauer
@ 2011-07-22 6:02 ` Lin Tony-B19295
2011-07-22 9:18 ` Sascha Hauer
0 siblings, 1 reply; 41+ messages in thread
From: Lin Tony-B19295 @ 2011-07-22 6:02 UTC (permalink / raw)
To: linux-arm-kernel
> -----Original Message-----
> From: Sascha Hauer [mailto:s.hauer at pengutronix.de]
> Sent: Thursday, July 21, 2011 3:11 AM
> To: Lin Tony-B19295
> Cc: linux-usb at vger.kernel.org; koen.beel.barco at gmail.com; balbi at ti.com;
> linux-arm-kernel at lists.infradead.org
> Subject: Re: [PATCH 3/7] add usb phy clocks to clock tree
>
> On Wed, Jul 20, 2011 at 07:08:22PM +0800, Tony Lin wrote:
> > Signed-off-by: Tony Lin <tony.lin@freescale.com>
> > ---
> > arch/arm/mach-mxs/clock-mx28.c | 18 ++++++++++++++++++
> > 1 files changed, 18 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/arm/mach-mxs/clock-mx28.c
> > b/arch/arm/mach-mxs/clock-mx28.c index 5dcc59d..6fd0fe6 100644
> > --- a/arch/arm/mach-mxs/clock-mx28.c
> > +++ b/arch/arm/mach-mxs/clock-mx28.c
> > @@ -570,7 +570,23 @@ static struct clk usb1_clk = {
> > .disable = _raw_clk_disable,
> > .parent = &pll1_clk,
> > };
> > +/* usb phy clock for usb0 */
> > +static struct clk usb_phy_clk0 = {
> > + .parent = &pll0_clk,
> > + .enable = _raw_clk_disable, /* EN_USB_CLKS = 1 means ON */
> > + .disable = _raw_clk_enable,
> > + .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL0CTRL0,
> > + .enable_shift = 18,
> > +};
> >
> > +/* usb phy clock for usb1 */
> > +static struct clk usb_phy_clk1 = {
> > + .parent = &pll1_clk,
> > + .enable = _raw_clk_disable,
> > + .disable = _raw_clk_enable,
> > + .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_PLL1CTRL0,
> > + .enable_shift = 18,
> > +};
> > #define _DEFINE_CLOCK(name, er, es, p) \
> > static struct clk name = { \
> > .enable_reg = CLKCTRL_BASE_ADDR + HW_CLKCTRL_##er, \
> > @@ -629,6 +645,8 @@ static struct clk_lookup lookups[] = {
> > _REGISTER_CLOCK("flexcan.1", NULL, can1_clk)
> > _REGISTER_CLOCK(NULL, "usb0", usb0_clk)
> > _REGISTER_CLOCK(NULL, "usb1", usb1_clk)
> > + _REGISTER_CLOCK(NULL, "usb0_phy", usb_phy_clk0)
> > + _REGISTER_CLOCK(NULL, "usb1_phy", usb_phy_clk1)
>
> This looks suspicious. The phys are real devices, but this shows you do
> not intend to use them as devices. Really the phys should be drivers.
>
> Sascha
>
Hi Sascha:
I didn't get it. Shouldn't I register PHY clocks here?
'_REGISTER_CLOCK("mxc-ehci.0", "usb_phy1", usb_phy1_clk)'
This is what mx51/53 did in clock-mx51-mx53.c
BR
Tony
> > _REGISTER_CLOCK("mxs-pwm.0", NULL, pwm_clk)
> > _REGISTER_CLOCK("mxs-pwm.1", NULL, pwm_clk)
> > _REGISTER_CLOCK("mxs-pwm.2", NULL, pwm_clk)
> > --
> > 1.7.0.4
> >
> >
> >
> > _______________________________________________
> > linux-arm-kernel mailing list
> > linux-arm-kernel at lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> >
>
> --
> 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] 41+ messages in thread
* [PATCH 3/7] add usb phy clocks to clock tree
2011-07-22 6:02 ` Lin Tony-B19295
@ 2011-07-22 9:18 ` Sascha Hauer
0 siblings, 0 replies; 41+ messages in thread
From: Sascha Hauer @ 2011-07-22 9:18 UTC (permalink / raw)
To: linux-arm-kernel
On Fri, Jul 22, 2011 at 06:02:00AM +0000, Lin Tony-B19295 wrote:
> > > _REGISTER_CLOCK(NULL, "usb1", usb1_clk)
> > > + _REGISTER_CLOCK(NULL, "usb0_phy", usb_phy_clk0)
> > > + _REGISTER_CLOCK(NULL, "usb1_phy", usb_phy_clk1)
> >
> > This looks suspicious. The phys are real devices, but this shows you do
> > not intend to use them as devices. Really the phys should be drivers.
> >
> > Sascha
> >
> Hi Sascha:
>
> I didn't get it. Shouldn't I register PHY clocks here?
> '_REGISTER_CLOCK("mxc-ehci.0", "usb_phy1", usb_phy1_clk)'
> This is what mx51/53 did in clock-mx51-mx53.c
Yes, you should register them, but like this:
_REGISTER_CLOCK("mxs-usb-phy.0", NULL, usb_phy_clk0)
_REGISTER_CLOCK("mxs-usb-phy.1", NULL, usb_phy_clk1)
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] 41+ messages in thread
end of thread, other threads:[~2011-07-22 9:18 UTC | newest]
Thread overview: 41+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-20 11:08 [PATCH 0/7] ARM: mx28: add usb host function Tony Lin
2011-07-20 10:57 ` Felipe Balbi
2011-07-20 11:08 ` [PATCH 1/7] consolidate definitions and structures to share among platforms Tony Lin
2011-07-20 10:59 ` Felipe Balbi
2011-07-20 11:03 ` Lin Tony-B19295
2011-07-20 11:16 ` Felipe Balbi
2011-07-20 11:21 ` Lin Tony-B19295
2011-07-20 11:08 ` [PATCH 2/7] enable usb1 phy power supply Tony Lin
2011-07-20 11:01 ` Felipe Balbi
2011-07-20 11:41 ` Wolfram Sang
2011-07-22 2:16 ` Lin Tony-B19295
2011-07-20 19:08 ` Sascha Hauer
2011-07-22 2:20 ` Lin Tony-B19295
2011-07-20 11:08 ` [PATCH 3/7] add usb phy clocks to clock tree Tony Lin
2011-07-20 11:02 ` Felipe Balbi
2011-07-20 11:05 ` Lin Tony-B19295
2011-07-20 19:10 ` Sascha Hauer
2011-07-22 6:02 ` Lin Tony-B19295
2011-07-22 9:18 ` Sascha Hauer
2011-07-20 11:08 ` [PATCH 4/7] mx28: add usb host phy functions Tony Lin
2011-07-20 11:12 ` Felipe Balbi
2011-07-20 19:26 ` Sascha Hauer
2011-07-22 2:23 ` Lin Tony-B19295
2011-07-21 6:04 ` Lothar Waßmann
2011-07-20 11:08 ` [PATCH 5/7] ehci mxc: make it more flexible to be used for mx28 Tony Lin
2011-07-20 11:05 ` Arnaud Patard (Rtp)
2011-07-20 11:08 ` Lin Tony-B19295
2011-07-20 11:45 ` Wolfram Sang
2011-07-20 11:14 ` Felipe Balbi
2011-07-20 11:21 ` Lin Tony-B19295
2011-07-20 11:23 ` Felipe Balbi
2011-07-20 11:25 ` Lin Tony-B19295
2011-07-20 11:27 ` Felipe Balbi
2011-07-20 13:59 ` Alan Stern
2011-07-22 5:18 ` Lin Tony-B19295
2011-07-20 19:41 ` Sascha Hauer
2011-07-20 11:08 ` [PATCH 6/7] add macro definitions according to ehci-mxc driver change Tony Lin
2011-07-20 19:43 ` Sascha Hauer
2011-07-21 6:06 ` Lothar Waßmann
2011-07-20 11:08 ` [PATCH 7/7] add usb host function to default config Tony Lin
2011-07-20 20:07 ` [PATCH 0/7] ARM: mx28: add usb host function Sascha Hauer
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).