[U-Boot] [PATCH v3 0/10] mx23/mxs pending patches

This patchset includes the pending patches we have in our tree. It fixes issues for mx23evk and mx23_olinuxino boards.
The DRAM control register change has been kept specific to mx23evk as it breaks mx23_olinuxino (as it than reads only 16MB)
Changes in v3: - Extend code comment to be more verbose (Marek) - Improve commit log - Move code to enable/disable clock to soc_ehci_hcd_{enable,disable}_clock - Proper use mx23 clock registers
Changes in v2: - Extend code comment to explicit say it needs to be there. - Use MUX pin name - Requested by Marek - Avoid wrong clock setting in MX23 - Add changes for allow use of the USB hub - Remove extra newline
Otavio Salvador (10): mxs: Rename CONFIG_SPL_MX28_PSWITCH_WAIT to CONFIG_SPL_MXS_PSWITCH_WAIT mx23: Document the tRAS lockout setting in memory initialization mx23evk: Adjust DRAM control register to use full 128MB of RAM led: Use STATUS_LED_ON and STATUS_LED_OFF when calling __led_set mxs: Fix iomux.h to not break build during assembly stage mx23_olinuxino: Add support for status LED usb: mxs: Adapt code for i.MX23 support mx23evk: Enable USB support mx23_olinuxino: Enable USB support mx23_olinuxino: Add ethernet support
arch/arm/cpu/arm926ejs/mxs/mxs_init.h | 2 +- arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c | 4 ++ arch/arm/cpu/arm926ejs/mxs/spl_power_init.c | 2 +- arch/arm/include/asm/arch-mxs/iomux.h | 5 ++ board/freescale/mx23evk/spl_boot.c | 10 ++++ board/olimex/mx23_olinuxino/mx23_olinuxino.c | 13 +++++ board/olimex/mx23_olinuxino/spl_boot.c | 8 +++ common/cmd_led.c | 6 ++- drivers/usb/host/ehci-mxs.c | 78 ++++++++++++++++++++-------- include/configs/mx23_olinuxino.h | 63 ++++++++++++++++++++-- include/configs/mx23evk.h | 10 ++++ 11 files changed, 172 insertions(+), 29 deletions(-)

The power switch option is compatible with i.MX23 and i.MX28 so the configration option needs to reflect it. We choose 'CONFIG_SPL_MXS_PSWITCH_WAIT' for the option name.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br Acked-by: Marek Vasut marex@denx.de --- Changes in v3: None Changes in v2: None
arch/arm/cpu/arm926ejs/mxs/mxs_init.h | 2 +- arch/arm/cpu/arm926ejs/mxs/spl_power_init.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/mxs/mxs_init.h b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h index 2ddc5bc..084def5 100644 --- a/arch/arm/cpu/arm926ejs/mxs/mxs_init.h +++ b/arch/arm/cpu/arm926ejs/mxs/mxs_init.h @@ -30,7 +30,7 @@ void early_delay(int delay);
void mxs_power_init(void);
-#ifdef CONFIG_SPL_MX28_PSWITCH_WAIT +#ifdef CONFIG_SPL_MXS_PSWITCH_WAIT void mxs_power_wait_pswitch(void); #else static inline void mxs_power_wait_pswitch(void) { } diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c index e9d6302..287c698 100644 --- a/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_power_init.c @@ -921,7 +921,7 @@ void mxs_power_init(void) early_delay(1000); }
-#ifdef CONFIG_SPL_MX28_PSWITCH_WAIT +#ifdef CONFIG_SPL_MXS_PSWITCH_WAIT void mxs_power_wait_pswitch(void) { struct mxs_power_regs *power_regs =

Add a comment about the tRAS lockout setting of HW_DRAM_CTL08 to enable the 'Fast Auto Pre-Charge' found in the memory chip. The setting is applied after memory initialization and it is worth document it.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: - Extend code comment to be more verbose (Marek)
Changes in v2: - Extend code comment to explicit say it needs to be there.
arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c index f8392f6..4db9baa 100644 --- a/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c +++ b/arch/arm/cpu/arm926ejs/mxs/spl_mem_init.c @@ -119,6 +119,10 @@ static void initialize_dram_values(void) writel(dram_vals[i], MXS_DRAM_BASE + (4 * i));
#ifdef CONFIG_MX23 + /* + * Enable tRAS lockout in HW_DRAM_CTL08 ; it must be the last + * element to be set + */ writel((1 << 24), MXS_DRAM_BASE + (4 * 8)); #endif }

Adjust HW_DRAM_CTL14 to enable the chip selects to allow usage of full 128MB of RAM.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: None
board/freescale/mx23evk/spl_boot.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/board/freescale/mx23evk/spl_boot.c b/board/freescale/mx23evk/spl_boot.c index 6007433..b6f4e7e 100644 --- a/board/freescale/mx23evk/spl_boot.c +++ b/board/freescale/mx23evk/spl_boot.c @@ -98,6 +98,16 @@ const iomux_cfg_t iomux_setup[] = { (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), };
+#define HW_DRAM_CTL14 (0x38 >> 2) +#define CS_MAP 0x3 +#define INTAREF 0x2 +#define HW_DRAM_CTL14_CONFIG (INTAREF << 8 | CS_MAP) + +void mxs_adjust_memory_params(uint32_t *dram_vals) +{ + dram_vals[HW_DRAM_CTL14] = HW_DRAM_CTL14_CONFIG; +} + void board_init_ll(void) { mxs_common_spl_init(iomux_setup, ARRAY_SIZE(iomux_setup));

This fixes the gpio_led driver which needs to compare againt a STATUS_LED_ON to enable a led.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: None
common/cmd_led.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/common/cmd_led.c b/common/cmd_led.c index 7f5ab43..84f79fa 100644 --- a/common/cmd_led.c +++ b/common/cmd_led.c @@ -110,13 +110,15 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (led_commands[i].on) led_commands[i].on(); else - __led_set(led_commands[i].mask, 1); + __led_set(led_commands[i].mask, + STATUS_LED_ON); break; case LED_OFF: if (led_commands[i].off) led_commands[i].off(); else - __led_set(led_commands[i].mask, 0); + __led_set(led_commands[i].mask, + STATUS_LED_OFF); break; case LED_TOGGLE: if (led_commands[i].toggle)

This fixes the build failure when included in mx23_olinuxino.h board config; the addition of "asm/types.h" is due "u32" being otherwise undefined.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: None
arch/arm/include/asm/arch-mxs/iomux.h | 5 +++++ 1 file changed, 5 insertions(+)
diff --git a/arch/arm/include/asm/arch-mxs/iomux.h b/arch/arm/include/asm/arch-mxs/iomux.h index 7abdf58..4288715 100644 --- a/arch/arm/include/asm/arch-mxs/iomux.h +++ b/arch/arm/include/asm/arch-mxs/iomux.h @@ -21,6 +21,10 @@ #ifndef __MACH_MXS_IOMUX_H__ #define __MACH_MXS_IOMUX_H__
+#ifndef __ASSEMBLY__ + +#include <asm/types.h> + /* * IOMUX/PAD Bit field definitions * @@ -165,4 +169,5 @@ int mxs_iomux_setup_pad(iomux_cfg_t pad); */ int mxs_iomux_setup_multiple_pads(const iomux_cfg_t *pad_list, unsigned count);
+#endif /* __ASSEMBLY__ */ #endif /* __MACH_MXS_IOMUX_H__*/

This allow user to know if the bootloader is running, even without a serial console.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: - Use MUX pin name - Requested by Marek
board/olimex/mx23_olinuxino/mx23_olinuxino.c | 7 +++++++ board/olimex/mx23_olinuxino/spl_boot.c | 4 ++++ include/configs/mx23_olinuxino.h | 14 ++++++++++++++ 3 files changed, 25 insertions(+)
diff --git a/board/olimex/mx23_olinuxino/mx23_olinuxino.c b/board/olimex/mx23_olinuxino/mx23_olinuxino.c index 6a6053b..2501417 100644 --- a/board/olimex/mx23_olinuxino/mx23_olinuxino.c +++ b/board/olimex/mx23_olinuxino/mx23_olinuxino.c @@ -28,6 +28,9 @@ #include <asm/arch/imx-regs.h> #include <asm/arch/clock.h> #include <asm/arch/sys_proto.h> +#ifdef CONFIG_STATUS_LED +#include <status_led.h> +#endif
DECLARE_GLOBAL_DATA_PTR;
@@ -67,5 +70,9 @@ int board_init(void) /* Adress of boot parameters */ gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
+#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT) + status_led_set(STATUS_LED_BOOT, STATUS_LED_STATE); +#endif + return 0; } diff --git a/board/olimex/mx23_olinuxino/spl_boot.c b/board/olimex/mx23_olinuxino/spl_boot.c index 7def8bc..3bbf5ad 100644 --- a/board/olimex/mx23_olinuxino/spl_boot.c +++ b/board/olimex/mx23_olinuxino/spl_boot.c @@ -84,6 +84,10 @@ const iomux_cfg_t iomux_setup[] = { MX23_PAD_EMI_RASN__EMI_RASN | MUX_CONFIG_EMI, MX23_PAD_EMI_WEN__EMI_WEN | MUX_CONFIG_EMI,
+ /* Green LED */ + MX23_PAD_SSP1_DETECT__GPIO_2_1 | + (MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL), + /* MMC 0 */ MX23_PAD_SSP1_CMD__SSP1_CMD | MUX_CONFIG_SSP, MX23_PAD_SSP1_DATA0__SSP1_DATA0 | MUX_CONFIG_SSP, diff --git a/include/configs/mx23_olinuxino.h b/include/configs/mx23_olinuxino.h index 7983c5d..d019944 100644 --- a/include/configs/mx23_olinuxino.h +++ b/include/configs/mx23_olinuxino.h @@ -19,6 +19,8 @@ #ifndef __MX23_OLINUXINO_CONFIG_H__ #define __MX23_OLINUXINO_CONFIG_H__
+#include <asm/arch/iomux-mx23.h> + /* * SoC configurations */ @@ -56,6 +58,7 @@ #define CONFIG_CMD_EXT2 #define CONFIG_CMD_FAT #define CONFIG_CMD_GPIO +#define CONFIG_CMD_LED #define CONFIG_CMD_MMC
/* @@ -112,6 +115,17 @@ #define CONFIG_BAUDRATE 115200 /* Default baud rate */
/* + * Status LED + */ +#define CONFIG_STATUS_LED +#define CONFIG_GPIO_LED +#define CONFIG_BOARD_SPECIFIC_LED +#define STATUS_LED_BOOT 0 +#define STATUS_LED_BIT MX23_PAD_SSP1_DETECT__GPIO_2_1 +#define STATUS_LED_STATE STATUS_LED_ON +#define STATUS_LED_PERIOD (CONFIG_SYS_HZ / 2) + +/* * MMC Driver */ #ifdef CONFIG_CMD_MMC

The i.MX23 just one USB port so we shouldn't mess up with PLL1CTRL and USB1 port when building for i.MX23.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: - Improve commit log - Move code to enable/disable clock to soc_ehci_hcd_{enable,disable}_clock - Proper use mx23 clock registers
Changes in v2: - Avoid wrong clock setting in MX23
drivers/usb/host/ehci-mxs.c | 78 ++++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 22 deletions(-)
diff --git a/drivers/usb/host/ehci-mxs.c b/drivers/usb/host/ehci-mxs.c index 5062af5..5e41a38 100644 --- a/drivers/usb/host/ehci-mxs.c +++ b/drivers/usb/host/ehci-mxs.c @@ -23,7 +23,11 @@ #include <asm/io.h> #include <asm/arch/regs-common.h> #include <asm/arch/regs-base.h> +#if defined(CONFIG_MX23) +#include <asm/arch/regs-clkctrl-mx23.h> +#elif defined(CONFIG_MX28) #include <asm/arch/regs-clkctrl-mx28.h> +#endif #include <asm/arch/regs-usb.h> #include <asm/arch/regs-usbphy.h>
@@ -50,10 +54,12 @@ int mxs_ehci_get_port(struct ehci_mxs *mxs_usb, int port) usb_base = MXS_USBCTRL0_BASE; phy_base = MXS_USBPHY0_BASE; break; +#ifdef CONFIG_MX28 case 1: usb_base = MXS_USBCTRL1_BASE; phy_base = MXS_USBPHY1_BASE; break; +#endif default: printf("CONFIG_EHCI_MXS_PORT (port = %d)\n", port); return -1; @@ -67,18 +73,63 @@ int mxs_ehci_get_port(struct ehci_mxs *mxs_usb, int port) /* This DIGCTL register ungates clock to USB */ #define HW_DIGCTL_CTRL 0x8001c000 #define HW_DIGCTL_CTRL_USB0_CLKGATE (1 << 2) +#ifdef CONFIG_MX28 #define HW_DIGCTL_CTRL_USB1_CLKGATE (1 << 16) +#endif
-int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +static void soc_ehci_hcd_enable_clock(void) { + struct mxs_register_32 *digctl_ctrl = + (struct mxs_register_32 *)HW_DIGCTL_CTRL; + struct mxs_clkctrl_regs *clkctrl_regs = + (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
- int ret; - uint32_t usb_base, cap_base; +#if defined(CONFIG_MX23) + writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER, + &clkctrl_regs->hw_clkctrl_pll0ctrl0_set); + + writel(HW_DIGCTL_CTRL_USB0_CLKGATE, &digctl_ctrl->reg_clr); +#elif defined(CONFIG_MX28) + writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER, + &clkctrl_regs->hw_clkctrl_pll0ctrl0_set); + writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS | CLKCTRL_PLL1CTRL0_POWER, + &clkctrl_regs->hw_clkctrl_pll1ctrl0_set); + + writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE, + &digctl_ctrl->reg_clr); +#endif +} + +static void soc_ehci_hcd_disable_clock(void) +{ struct mxs_register_32 *digctl_ctrl = (struct mxs_register_32 *)HW_DIGCTL_CTRL; struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
+#if defined(CONFIG_MX23) + writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS, + &clkctrl_regs->hw_clkctrl_pll0ctrl0_clr); + + /* Gate off the USB clock */ + writel(HW_DIGCTL_CTRL_USB0_CLKGATE, &digctl_ctrl->reg_set); +#elif defined(CONFIG_MX28) + writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS, + &clkctrl_regs->hw_clkctrl_pll0ctrl0_clr); + writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS, + &clkctrl_regs->hw_clkctrl_pll1ctrl0_clr); + + /* Gate off the USB clock */ + writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE, + &digctl_ctrl->reg_set); +#endif +} + +int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +{ + int ret; + uint32_t usb_base, cap_base; + ret = mxs_ehci_get_port(&ehci_mxs, CONFIG_EHCI_MXS_PORT); if (ret) return ret; @@ -90,13 +141,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) &ehci_mxs.phy_regs->hw_usbphy_ctrl_clr);
/* Enable USB clock */ - writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER, - &clkctrl_regs->hw_clkctrl_pll0ctrl0_set); - writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS | CLKCTRL_PLL1CTRL0_POWER, - &clkctrl_regs->hw_clkctrl_pll1ctrl0_set); - - writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE, - &digctl_ctrl->reg_clr); + soc_ehci_hcd_enable_clock();
/* Start USB PHY */ writel(0, &ehci_mxs.phy_regs->hw_usbphy_pwd); @@ -118,10 +163,6 @@ int ehci_hcd_stop(int index) { int ret; uint32_t usb_base, cap_base, tmp; - struct mxs_register_32 *digctl_ctrl = - (struct mxs_register_32 *)HW_DIGCTL_CTRL; - struct mxs_clkctrl_regs *clkctrl_regs = - (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE; struct ehci_hccr *hccr; struct ehci_hcor *hcor;
@@ -147,14 +188,7 @@ int ehci_hcd_stop(int index) writel(tmp, &ehci_mxs.phy_regs->hw_usbphy_pwd);
/* Disable USB clock */ - writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS, - &clkctrl_regs->hw_clkctrl_pll0ctrl0_clr); - writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS, - &clkctrl_regs->hw_clkctrl_pll1ctrl0_clr); - - /* Gate off the USB clock */ - writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE, - &digctl_ctrl->reg_set); + soc_ehci_hcd_disable_clock();
return 0; }

On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador otavio@ossystems.com.br wrote:
The i.MX23 just one USB port so we shouldn't mess up with PLL1CTRL and
I think "MX23 has just one USB port" would be better.
-int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +static void soc_ehci_hcd_enable_clock(void)
Since this is mxs specific a better name would be: mxs_ehci_hcd_enable_clock

On Sun, Feb 17, 2013 at 5:03 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador otavio@ossystems.com.br wrote:
The i.MX23 just one USB port so we shouldn't mess up with PLL1CTRL and
I think "MX23 has just one USB port" would be better.
-int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +static void soc_ehci_hcd_enable_clock(void)
Since this is mxs specific a better name would be: mxs_ehci_hcd_enable_clock
I did it but mxs gives the impression it does mostly the same in both socs; as the code is mostly different between both I choose soc so it is clear it is for the soc it is being build.
That was my thought... what do you think?

On Sun, Feb 17, 2013 at 5:07 PM, Otavio Salvador otavio@ossystems.com.br wrote:
I did it but mxs gives the impression it does mostly the same in both socs; as the code is mostly different between both I choose soc so it is clear it is for the soc it is being build.
That was my thought... what do you think?
When I read "soc_ehci_hcd_enable_clock" I tend to think that this is a core USB function.
When I read "mxs_ehci_hcd_enable_clock" it's clear to me that this relates only to mx23/mx28.
Even if it handles the differences between mx23/mx28, I would prefer it with a "mxs" prefix.

On Sun, Feb 17, 2013 at 5:11 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 5:07 PM, Otavio Salvador otavio@ossystems.com.br wrote:
I did it but mxs gives the impression it does mostly the same in both socs; as the code is mostly different between both I choose soc so it is clear it is for the soc it is being build.
That was my thought... what do you think?
When I read "soc_ehci_hcd_enable_clock" I tend to think that this is a core USB function.
When I read "mxs_ehci_hcd_enable_clock" it's clear to me that this relates only to mx23/mx28.
Even if it handles the differences between mx23/mx28, I would prefer it with a "mxs" prefix.
Fine; I can prepare it for v4; I will wait for Marek's comments to try to avoid a v5 ;-)

Dear Otavio Salvador,
The i.MX23 just one USB port so we shouldn't mess up with PLL1CTRL and USB1 port when building for i.MX23.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br
Changes in v3:
- Improve commit log
- Move code to enable/disable clock to soc_ehci_hcd_{enable,disable}_clock
- Proper use mx23 clock registers
Changes in v2:
- Avoid wrong clock setting in MX23
drivers/usb/host/ehci-mxs.c | 78 ++++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 22 deletions(-)
diff --git a/drivers/usb/host/ehci-mxs.c b/drivers/usb/host/ehci-mxs.c index 5062af5..5e41a38 100644 --- a/drivers/usb/host/ehci-mxs.c +++ b/drivers/usb/host/ehci-mxs.c @@ -23,7 +23,11 @@ #include <asm/io.h> #include <asm/arch/regs-common.h> #include <asm/arch/regs-base.h> +#if defined(CONFIG_MX23) +#include <asm/arch/regs-clkctrl-mx23.h> +#elif defined(CONFIG_MX28) #include <asm/arch/regs-clkctrl-mx28.h> +#endif #include <asm/arch/regs-usb.h> #include <asm/arch/regs-usbphy.h>
@@ -50,10 +54,12 @@ int mxs_ehci_get_port(struct ehci_mxs *mxs_usb, int port) usb_base = MXS_USBCTRL0_BASE; phy_base = MXS_USBPHY0_BASE; break; +#ifdef CONFIG_MX28 case 1: usb_base = MXS_USBCTRL1_BASE; phy_base = MXS_USBPHY1_BASE; break; +#endif default: printf("CONFIG_EHCI_MXS_PORT (port = %d)\n", port); return -1; @@ -67,18 +73,63 @@ int mxs_ehci_get_port(struct ehci_mxs *mxs_usb, int port) /* This DIGCTL register ungates clock to USB */ #define HW_DIGCTL_CTRL 0x8001c000 #define HW_DIGCTL_CTRL_USB0_CLKGATE (1 << 2) +#ifdef CONFIG_MX28 #define HW_DIGCTL_CTRL_USB1_CLKGATE (1 << 16) +#endif
-int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +static void soc_ehci_hcd_enable_clock(void) {
- struct mxs_register_32 *digctl_ctrl =
(struct mxs_register_32 *)HW_DIGCTL_CTRL;
- struct mxs_clkctrl_regs *clkctrl_regs =
(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
- int ret;
- uint32_t usb_base, cap_base;
+#if defined(CONFIG_MX23)
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_set);
This stuff above ^
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE, &digctl_ctrl->reg_clr);
+#elif defined(CONFIG_MX28)
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_set);
And here ^ looks like the same code, no?
btw. can this not be nicely factored away one simple ifdef CONFIG_MX28 ?
- writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS | CLKCTRL_PLL1CTRL0_POWER,
&clkctrl_regs->hw_clkctrl_pll1ctrl0_set);
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE,
&digctl_ctrl->reg_clr);
+#endif +}
+static void soc_ehci_hcd_disable_clock(void) +{ struct mxs_register_32 *digctl_ctrl = (struct mxs_register_32 *)HW_DIGCTL_CTRL; struct mxs_clkctrl_regs *clkctrl_regs = (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
+#if defined(CONFIG_MX23)
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_clr);
- /* Gate off the USB clock */
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE, &digctl_ctrl->reg_set);
+#elif defined(CONFIG_MX28)
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_clr);
- writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS,
&clkctrl_regs->hw_clkctrl_pll1ctrl0_clr);
- /* Gate off the USB clock */
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE,
&digctl_ctrl->reg_set);
+#endif +}
+int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) +{
- int ret;
- uint32_t usb_base, cap_base;
- ret = mxs_ehci_get_port(&ehci_mxs, CONFIG_EHCI_MXS_PORT); if (ret) return ret;
@@ -90,13 +141,7 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor) &ehci_mxs.phy_regs->hw_usbphy_ctrl_clr);
/* Enable USB clock */
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS | CLKCTRL_PLL0CTRL0_POWER,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_set);
- writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS | CLKCTRL_PLL1CTRL0_POWER,
&clkctrl_regs->hw_clkctrl_pll1ctrl0_set);
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE,
&digctl_ctrl->reg_clr);
soc_ehci_hcd_enable_clock();
/* Start USB PHY */ writel(0, &ehci_mxs.phy_regs->hw_usbphy_pwd);
@@ -118,10 +163,6 @@ int ehci_hcd_stop(int index) { int ret; uint32_t usb_base, cap_base, tmp;
- struct mxs_register_32 *digctl_ctrl =
(struct mxs_register_32 *)HW_DIGCTL_CTRL;
- struct mxs_clkctrl_regs *clkctrl_regs =
struct ehci_hccr *hccr; struct ehci_hcor *hcor;(struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
@@ -147,14 +188,7 @@ int ehci_hcd_stop(int index) writel(tmp, &ehci_mxs.phy_regs->hw_usbphy_pwd);
/* Disable USB clock */
- writel(CLKCTRL_PLL0CTRL0_EN_USB_CLKS,
&clkctrl_regs->hw_clkctrl_pll0ctrl0_clr);
- writel(CLKCTRL_PLL1CTRL0_EN_USB_CLKS,
&clkctrl_regs->hw_clkctrl_pll1ctrl0_clr);
- /* Gate off the USB clock */
- writel(HW_DIGCTL_CTRL_USB0_CLKGATE | HW_DIGCTL_CTRL_USB1_CLKGATE,
&digctl_ctrl->reg_set);
soc_ehci_hcd_disable_clock();
return 0;
}

This enabled USB support for the mx23evk board.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: None
include/configs/mx23evk.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/include/configs/mx23evk.h b/include/configs/mx23evk.h index d206c95..99dfb8f 100644 --- a/include/configs/mx23evk.h +++ b/include/configs/mx23evk.h @@ -58,6 +58,7 @@ #define CONFIG_CMD_FAT #define CONFIG_CMD_GPIO #define CONFIG_CMD_MMC +#define CONFIG_CMD_USB #define CONFIG_CMD_BOOTZ
/* Memory configurations */ @@ -122,6 +123,15 @@ #define CONFIG_MXS_MMC #endif
+/* USB */ +#ifdef CONFIG_CMD_USB +#define CONFIG_USB_EHCI +#define CONFIG_USB_EHCI_MXS +#define CONFIG_EHCI_MXS_PORT 0 +#define CONFIG_EHCI_IS_TDI +#define CONFIG_USB_STORAGE +#endif + /* Boot Linux */ #define CONFIG_CMDLINE_TAG #define CONFIG_SETUP_MEMORY_TAGS

This enabled USB support for the mx23_olinuxino board.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: - Add changes for allow use of the USB hub
board/olimex/mx23_olinuxino/mx23_olinuxino.c | 6 ++++++ board/olimex/mx23_olinuxino/spl_boot.c | 4 ++++ include/configs/mx23_olinuxino.h | 10 ++++++++++ 3 files changed, 20 insertions(+)
diff --git a/board/olimex/mx23_olinuxino/mx23_olinuxino.c b/board/olimex/mx23_olinuxino/mx23_olinuxino.c index 2501417..9ed7718 100644 --- a/board/olimex/mx23_olinuxino/mx23_olinuxino.c +++ b/board/olimex/mx23_olinuxino/mx23_olinuxino.c @@ -23,6 +23,7 @@ */
#include <common.h> +#include <asm/gpio.h> #include <asm/io.h> #include <asm/arch/iomux-mx23.h> #include <asm/arch/imx-regs.h> @@ -45,6 +46,11 @@ int board_early_init_f(void) /* SSP0 clock at 96MHz */ mxs_set_sspclk(MXC_SSPCLK0, 96000, 0);
+#ifdef CONFIG_CMD_USB + /* Enable LAN9512 */ + gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1); +#endif + return 0; }
diff --git a/board/olimex/mx23_olinuxino/spl_boot.c b/board/olimex/mx23_olinuxino/spl_boot.c index 3bbf5ad..a96c293 100644 --- a/board/olimex/mx23_olinuxino/spl_boot.c +++ b/board/olimex/mx23_olinuxino/spl_boot.c @@ -95,6 +95,10 @@ const iomux_cfg_t iomux_setup[] = { MX23_PAD_SSP1_DATA2__SSP1_DATA2 | MUX_CONFIG_SSP, MX23_PAD_SSP1_DATA3__SSP1_DATA3 | MUX_CONFIG_SSP, MX23_PAD_SSP1_SCK__SSP1_SCK | MUX_CONFIG_SSP, + + /* Ethernet */ + MX23_PAD_GPMI_ALE__GPIO_0_17 | + (MXS_PAD_3V3 | MXS_PAD_12MA | MXS_PAD_NOPULL), };
void board_init_ll(void) diff --git a/include/configs/mx23_olinuxino.h b/include/configs/mx23_olinuxino.h index d019944..e081c49 100644 --- a/include/configs/mx23_olinuxino.h +++ b/include/configs/mx23_olinuxino.h @@ -60,6 +60,7 @@ #define CONFIG_CMD_GPIO #define CONFIG_CMD_LED #define CONFIG_CMD_MMC +#define CONFIG_CMD_USB
/* * Memory configurations @@ -140,6 +141,15 @@ */ #define CONFIG_APBH_DMA
+/* USB */ +#ifdef CONFIG_CMD_USB +#define CONFIG_USB_EHCI +#define CONFIG_USB_EHCI_MXS +#define CONFIG_EHCI_MXS_PORT 0 +#define CONFIG_EHCI_IS_TDI +#define CONFIG_USB_STORAGE +#endif + /* * Boot Linux */

On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.

On Mon, Feb 18, 2013 at 8:16 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.
Awesome; I have added it to v5. Thx!

Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 8:16 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador
otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.
Awesome; I have added it to v5. Thx!
This will bring in quite a lot of inconsistency, will it not?
Best regards, Marek Vasut

On Mon, Feb 18, 2013 at 10:38 PM, Marek Vasut marex@denx.de wrote:
Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 8:16 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador
otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.
Awesome; I have added it to v5. Thx!
This will bring in quite a lot of inconsistency, will it not?
Really? why?

Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 10:38 PM, Marek Vasut marex@denx.de wrote:
Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 8:16 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador
otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.
Awesome; I have added it to v5. Thx!
This will bring in quite a lot of inconsistency, will it not?
Really? why?
Because this will not be used globally with all GPIOs, but only locally for this one case. So my suggestion is to postpone this change and do this in one large swipe afterwards.
Best regards, Marek Vasut

On Tue, Feb 19, 2013 at 9:21 AM, Marek Vasut marex@denx.de wrote:
Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 10:38 PM, Marek Vasut marex@denx.de wrote:
Dear Otavio Salvador,
On Mon, Feb 18, 2013 at 8:16 PM, Fabio Estevam festevam@gmail.com wrote:
On Sun, Feb 17, 2013 at 4:45 PM, Otavio Salvador
otavio@ossystems.com.br wrote:
+#ifdef CONFIG_CMD_USB
/* Enable LAN9512 */
gpio_direction_output(MX23_PAD_GPMI_ALE__GPIO_0_17, 1);
+#endif
What about doing like we do with other imx devices and write something like:
gpio_direction_output(MXS_GPIO_NR(0, 17), 1);
,where
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
This also aligns with the kernel style.
Awesome; I have added it to v5. Thx!
This will bring in quite a lot of inconsistency, will it not?
Really? why?
Because this will not be used globally with all GPIOs, but only locally for this one case. So my suggestion is to postpone this change and do this in one large swipe afterwards.
I see; I agree with you.

On Tue, Feb 19, 2013 at 10:22 AM, Otavio Salvador otavio@ossystems.com.br wrote:
Because this will not be used globally with all GPIOs, but only locally for this one case. So my suggestion is to postpone this change and do this in one large swipe afterwards.
I see; I agree with you.
I can take care of this GPIO change later then.

This adds support to the LAN9512 chip included in the board and extend the environment to easy netboot use.
Signed-off-by: Otavio Salvador otavio@ossystems.com.br --- Changes in v3: None Changes in v2: - Remove extra newline
include/configs/mx23_olinuxino.h | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-)
diff --git a/include/configs/mx23_olinuxino.h b/include/configs/mx23_olinuxino.h index e081c49..dfba0fc 100644 --- a/include/configs/mx23_olinuxino.h +++ b/include/configs/mx23_olinuxino.h @@ -55,11 +55,13 @@ #define CONFIG_DOS_PARTITION
#define CONFIG_CMD_CACHE +#define CONFIG_CMD_DHCP #define CONFIG_CMD_EXT2 #define CONFIG_CMD_FAT #define CONFIG_CMD_GPIO #define CONFIG_CMD_LED #define CONFIG_CMD_MMC +#define CONFIG_CMD_NET #define CONFIG_CMD_USB
/* @@ -150,6 +152,12 @@ #define CONFIG_USB_STORAGE #endif
+/* Ethernet */ +#ifdef CONFIG_CMD_NET +#define CONFIG_USB_HOST_ETHER +#define CONFIG_USB_ETHER_SMSC95XX +#endif + /* * Boot Linux */ @@ -191,6 +199,7 @@ "fdt_file=imx23-olinuxino.dtb\0" \ "fdt_addr=0x41000000\0" \ "boot_fdt=try\0" \ + "ip_dyn=yes\0" \ "mmcdev=0\0" \ "mmcpart=2\0" \ "mmcroot=/dev/mmcblk0p3 rw rootwait\0" \ @@ -216,6 +225,31 @@ "fi; " \ "else " \ "bootm; " \ + "fi;\0" \ + "netargs=setenv bootargs console=${console_mainline},${baudrate} " \ + "root=/dev/nfs " \ + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \ + "netboot=echo Booting from net ...; " \ + "usb start; " \ + "run netargs; " \ + "if test ${ip_dyn} = yes; then " \ + "setenv get_cmd dhcp; " \ + "else " \ + "setenv get_cmd tftp; " \ + "fi; " \ + "${get_cmd} ${uimage}; " \ + "if test ${boot_fdt} = yes; then " \ + "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \ + "bootm ${loadaddr} - ${fdt_addr}; " \ + "else " \ + "if test ${boot_fdt} = try; then " \ + "bootm; " \ + "else " \ + "echo WARN: Cannot load the DT; " \ + "fi;" \ + "fi; " \ + "else " \ + "bootm; " \ "fi;\0"
#define CONFIG_BOOTCOMMAND \ @@ -225,10 +259,9 @@ "else " \ "if run loaduimage; then " \ "run mmcboot; " \ - "else " \ - "echo ERR: Fail to boot from MMC; " \ + "else run netboot; " \ "fi; " \ "fi; " \ - "else exit; fi" + "else run netboot; fi"
#endif /* __MX23_OLINUXINO_CONFIG_H__ */
participants (3)
-
Fabio Estevam
-
Marek Vasut
-
Otavio Salvador