[PATCH 3/3] mx51: Move OTG initialisation for all boards to a single file

Sascha Hauer s.hauer at pengutronix.de
Thu Oct 7 03:48:53 EDT 2010


Added Daniel to Cc as he might say something here aswell.

On Thu, Oct 07, 2010 at 03:58:48AM +0300, Amit Kucheria wrote:
> The OTG initialisation is the same for all MX51 boards currently known. Move
> to a common file.
> 
> Signed-off-by: Amit Kucheria <amit.kucheria at linaro.org>
> ---
>  arch/arm/mach-mx5/Makefile             |    2 +-
>  arch/arm/mach-mx5/board-cpuimx51.c     |   25 +-------------------
>  arch/arm/mach-mx5/board-mx51_babbage.c |   25 +-------------------
>  arch/arm/mach-mx5/board-mx51_efikamx.c |   23 +-----------------
>  arch/arm/mach-mx5/usb.c                |   40 ++++++++++++++++++++++++++++++++
>  5 files changed, 44 insertions(+), 71 deletions(-)
>  create mode 100644 arch/arm/mach-mx5/usb.c
> 
> diff --git a/arch/arm/mach-mx5/Makefile b/arch/arm/mach-mx5/Makefile
> index d1aac9c..1daba15 100644
> --- a/arch/arm/mach-mx5/Makefile
> +++ b/arch/arm/mach-mx5/Makefile
> @@ -3,7 +3,7 @@
>  #
>

[snip]

>  {
>  	u32 v;
> diff --git a/arch/arm/mach-mx5/board-mx51_efikamx.c b/arch/arm/mach-mx5/board-mx51_efikamx.c
> index b00502a..93734ae 100644
> --- a/arch/arm/mach-mx5/board-mx51_efikamx.c
> +++ b/arch/arm/mach-mx5/board-mx51_efikamx.c
> @@ -37,7 +37,7 @@
>  #include "devices-imx51.h"
>  #include "devices.h"
>  
> -#define	MX51_USB_PLL_DIV_24_MHZ	0x01
> +extern int initialize_otg_port(struct platform_device *pdev);
>  
>  static struct pad_desc mx51efikamx_pads[] = {
>  	/* UART1 */
> @@ -65,27 +65,6 @@ static inline void mxc_init_imx_uart(void)
>  }
>  #endif /* SERIAL_IMX */
>  
> -/* This function is board specific as the bit mask for the plldiv will also
> - * be different for other Freescale SoCs, thus a common bitmask is not
> - * possible and cannot get place in /plat-mxc/ehci.c.
> - */
> -static int initialize_otg_port(struct platform_device *pdev)
> -{
> -	u32 v;
> -	void __iomem *usb_base;
> -	void __iomem *usbother_base;
> -	usb_base = ioremap(MX51_OTG_BASE_ADDR, SZ_4K);
> -	usbother_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
> -
> -	/* Set the PHY clock to 19.2MHz */
> -	v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
> -	v &= ~MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
> -	v |= MX51_USB_PLL_DIV_24_MHZ;
> -	__raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
> -	iounmap(usb_base);
> -	return 0;
> -}
> -
>  static struct mxc_usbh_platform_data dr_utmi_config = {
>  	.init   = initialize_otg_port,
>  	.portsc = MXC_EHCI_UTMI_16BIT,
> diff --git a/arch/arm/mach-mx5/usb.c b/arch/arm/mach-mx5/usb.c
> new file mode 100644
> index 0000000..277f957
> --- /dev/null
> +++ b/arch/arm/mach-mx5/usb.c
> @@ -0,0 +1,40 @@
> +/*
> + * Copyright (C) 2010 Linaro Limited
> + *
> + * The code contained herein is licensed under the GNU General Public
> + * License. You may obtain a copy of the GNU General Public License
> + * Version 2 or later at the following locations:
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +
> +#include <linux/platform_device.h>
> +#include <linux/io.h>
> +
> +#include <mach/hardware.h>
> +#include <mach/mxc_ehci.h>
> +
> +#define	MX51_USB_PLL_DIV_24_MHZ	0x01
> +
> +/* This function is SoC specific as the bit mask for the plldiv will also
> + * be different for other Freescale SoCs, thus a common bitmask is not
> + * possible and cannot get place in /plat-mxc/ehci.c.
> + */
> +int initialize_otg_port(struct platform_device *pdev)
> +{

First of all please do not introduce global functions without the
correct prefix, mx51_ in this case.

I have recently looked at the way the USB phy settings are handled on
i.MX and it's coming to its limits. Currently the phy settings are coded
into generic flags, passed to the usb driver which then calls
mxc_initialize_usb_hw() which dispatches the different SoCs and translates
the generic flags back into SoC specific ones.  While this was doable
until now it fails badly on i.MX51 as we see here.
The phy settings are totally static to a given board, so we could simply
let the board call a mx51_init_usb_phy() which gets a pointer to a
struct with all relevant register settings. And we could pass this
function SoC specific register settings without having to encode them
into generic flags and decode them again later.

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 |



More information about the linux-arm-kernel mailing list