Patchwork [U-Boot,2/3] wandboard: Add support for carrier board MicroSD card

login
register
mail settings
Submitter Otavio Salvador
Date April 15, 2013, 1:35 p.m.
Message ID <1366032948-9920-2-git-send-email-otavio@ossystems.com.br>
Download mbox | patch
Permalink /patch/236610/
State Superseded
Delegated to: Stefano Babic
Headers show

Comments

Otavio Salvador - April 15, 2013, 1:35 p.m.
Allow use of the carrier board MicroSD card available in the
Wandboard; this allow for loading alternative system from the other
card for testing or upgrade proposes.

Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
---
 arch/arm/include/asm/arch-mx6/mx6dl_pins.h |  7 ++++
 board/wandboard/wandboard.c                | 58 ++++++++++++++++++++++++++----
 include/configs/wandboard.h                |  1 +
 3 files changed, 59 insertions(+), 7 deletions(-)
Fabio Estevam - April 15, 2013, 1:54 p.m.
On Mon, Apr 15, 2013 at 10:35 AM, Otavio Salvador
<otavio@ossystems.com.br> wrote:

>  int board_mmc_init(bd_t *bis)
>  {
> -       imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
> -
> -       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
> -       usdhc_cfg[0].max_bus_width = 4;
> -       gpio_direction_input(USDHC3_CD_GPIO);
> +       int i;
> +
> +       /*
> +        * According to the board_mmc_init() the following map is done:
> +        * (U-boot device node)    (Physical Port)
> +        * mmc0                    SOM MicroSD
> +        * mmc1                    Carrier board MicroSD
> +        */
> +       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
> +               switch (i) {
> +               case 0:
> +                       imx_iomux_v3_setup_multiple_pads(
> +                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
> +                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
> +                       usdhc_cfg[0].max_bus_width = 4;
> +                       gpio_direction_input(USDHC3_CD_GPIO);
> +                       break;
> +               case 1:
> +                       imx_iomux_v3_setup_multiple_pads(
> +                               usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
> +                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
> +                       usdhc_cfg[1].max_bus_width = 4;
> +                       gpio_direction_input(USDHC1_CD_GPIO);
> +                       break;
> +               default:
> +                       printf("Warning: you configured more USDHC controllers"
> +                                  "(%d) than supported by the board\n", i + 1);
> +                       return 0;

This should be an error. What about return -EINVAL ?

> +               }
> +
> +               if (fsl_esdhc_initialize(bis, &usdhc_cfg[i]))
> +                       printf("Warning: failed to initialize mmc dev %d\n", i);
> +       }
>
> -       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
> +       return 0;

With this change, you never return an error.
Otavio Salvador - April 15, 2013, 2:06 p.m.
On Mon, Apr 15, 2013 at 10:54 AM, Fabio Estevam <festevam@gmail.com> wrote:
> On Mon, Apr 15, 2013 at 10:35 AM, Otavio Salvador
> <otavio@ossystems.com.br> wrote:
>
>>  int board_mmc_init(bd_t *bis)
>>  {
>> -       imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
>> -
>> -       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
>> -       usdhc_cfg[0].max_bus_width = 4;
>> -       gpio_direction_input(USDHC3_CD_GPIO);
>> +       int i;
>> +
>> +       /*
>> +        * According to the board_mmc_init() the following map is done:
>> +        * (U-boot device node)    (Physical Port)
>> +        * mmc0                    SOM MicroSD
>> +        * mmc1                    Carrier board MicroSD
>> +        */
>> +       for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
>> +               switch (i) {
>> +               case 0:
>> +                       imx_iomux_v3_setup_multiple_pads(
>> +                               usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
>> +                       usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
>> +                       usdhc_cfg[0].max_bus_width = 4;
>> +                       gpio_direction_input(USDHC3_CD_GPIO);
>> +                       break;
>> +               case 1:
>> +                       imx_iomux_v3_setup_multiple_pads(
>> +                               usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
>> +                       usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
>> +                       usdhc_cfg[1].max_bus_width = 4;
>> +                       gpio_direction_input(USDHC1_CD_GPIO);
>> +                       break;
>> +               default:
>> +                       printf("Warning: you configured more USDHC controllers"
>> +                                  "(%d) than supported by the board\n", i + 1);
>> +                       return 0;
>
> This should be an error. What about return -EINVAL ?

Agreed, fixed locally.

>> +               }
>> +
>> +               if (fsl_esdhc_initialize(bis, &usdhc_cfg[i]))
>> +                       printf("Warning: failed to initialize mmc dev %d\n", i);
>> +       }
>>
>> -       return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
>> +       return 0;
>
> With this change, you never return an error.

Should we fail if *any* fail?

--
Otavio Salvador                             O.S. Systems
E-mail: otavio@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854              http://projetos.ossystems.com.br
Fabio Estevam - April 15, 2013, 3 p.m.
On Mon, Apr 15, 2013 at 11:06 AM, Otavio Salvador
<otavio@ossystems.com.br> wrote:

> Should we fail if *any* fail?

Yes, I think so.
Wolfgang Denk - April 16, 2013, 5:34 a.m.
Dear Otavio Salvador,

In message <CAP9ODKqFSMHot7tCTuxV+c14385GGd4v0onsocd4wDGcghDzKw@mail.gmail.com> you wrote:
>
> > This should be an error. What about return -EINVAL ?
> 
> Agreed, fixed locally.

To make it more clear: this should be a compile-time error, not
detected at runtime.

> > With this change, you never return an error.
> 
> Should we fail if *any* fail?

Yes, this is the good old rule of defensive programming: as soon as
you detect any kind of (critical) error, you print an error message
and bail out.

Best regards,

Wolfgang Denk

Patch

diff --git a/arch/arm/include/asm/arch-mx6/mx6dl_pins.h b/arch/arm/include/asm/arch-mx6/mx6dl_pins.h
index b8e6bf0..8cedbdc 100644
--- a/arch/arm/include/asm/arch-mx6/mx6dl_pins.h
+++ b/arch/arm/include/asm/arch-mx6/mx6dl_pins.h
@@ -103,6 +103,7 @@  enum {
 	MX6_PAD_GPIO_17__GPIO_7_12		= IOMUX_PAD(0x05E8, 0x0218, 5, 0x0000, 0, 0),
 	MX6_PAD_GPIO_18__GPIO_7_13		= IOMUX_PAD(0x05EC, 0x021C, 5, 0x0000, 0, 0),
 	MX6_PAD_GPIO_19__GPIO_4_5		= IOMUX_PAD(0x05F0, 0x0220, 5, 0x0000, 0, 0),
+	MX6_PAD_GPIO_2__GPIO_1_2		= IOMUX_PAD(0x05F4, 0x0224, 5, 0x0000, 0, 0),
 	MX6_PAD_GPIO_5__GPIO_1_5		= IOMUX_PAD(0x0600, 0x0230, 5, 0x0000, 0, 0),
 	MX6_PAD_GPIO_5__I2C3_SCL		= IOMUX_PAD(0x0600, 0x0230, 6 | IOMUX_CONFIG_SION, 0x0878, 2, 0),
 	MX6_PAD_KEY_COL3__I2C2_SCL		= IOMUX_PAD(0x0638, 0x0250, 4 | IOMUX_CONFIG_SION, 0x0870, 1, 0),
@@ -135,8 +136,14 @@  enum {
 	MX6_PAD_RGMII_TD3__ENET_RGMII_TD3	= IOMUX_PAD(0x06B8, 0x02D0, 1, 0x0000, 0, 0),
 	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	= IOMUX_PAD(0x06BC, 0x02D4, 1, 0x0000, 0, 0),
 	MX6_PAD_RGMII_TXC__ENET_RGMII_TXC	= IOMUX_PAD(0x06C0, 0x02D8, 1, 0x0000, 0, 0),
+	MX6_PAD_SD1_CLK__USDHC1_CLK		= IOMUX_PAD(0x06C4, 0x02DC, 0, 0x0928, 1, 0),
+	MX6_PAD_SD1_CMD__USDHC1_CMD		= IOMUX_PAD(0x06C8, 0x02E0, 0 | IOMUX_CONFIG_SION, 0x0000, 0, 0),
 	MX6_PAD_SD1_CMD__GPIO_1_18		= IOMUX_PAD(0x06C8, 0x02E0, 5, 0x0000, 0, 0),
 	MX6_PAD_SD1_DAT3__GPIO_1_21		= IOMUX_PAD(0x06D8, 0x02F0, 5, 0x0000, 0, 0),
+	MX6_PAD_SD1_DAT0__USDHC1_DAT0		= IOMUX_PAD(0x06CC, 0x02E4, 0, 0x0000, 0, 0),
+	MX6_PAD_SD1_DAT1__USDHC1_DAT1		= IOMUX_PAD(0x06D0, 0x02E8, 0, 0x0000, 0, 0),
+	MX6_PAD_SD1_DAT2__USDHC1_DAT2		= IOMUX_PAD(0x06D4, 0x02EC, 0, 0x0000, 0, 0),
+	MX6_PAD_SD1_DAT3__USDHC1_DAT3		= IOMUX_PAD(0x06D8, 0x02F0, 0, 0x0000, 0, 0),
 	MX6_PAD_SD3_CLK__USDHC3_CLK		= IOMUX_PAD(0x06F4, 0x030C, 0, 0x0934, 1, 0),
 	MX6_PAD_SD3_CMD__USDHC3_CMD		= IOMUX_PAD(0x06F8, 0x0310, 0 | IOMUX_CONFIG_SION, 0x0000, 0, 0),
 	MX6_PAD_SD3_DAT0__USDHC3_DAT0		= IOMUX_PAD(0x06FC, 0x0314, 0, 0x0000, 0, 0),
diff --git a/board/wandboard/wandboard.c b/board/wandboard/wandboard.c
index a8f6ba2..5d98244 100644
--- a/board/wandboard/wandboard.c
+++ b/board/wandboard/wandboard.c
@@ -52,6 +52,18 @@  static iomux_v3_cfg_t const uart1_pads[] = {
 	MX6_PAD_CSI0_DAT11__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
+iomux_v3_cfg_t const usdhc1_pads[] = {
+	MX6_PAD_SD1_CLK__USDHC1_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_CMD__USDHC1_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT0__USDHC1_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT1__USDHC1_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT2__USDHC1_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	MX6_PAD_SD1_DAT3__USDHC1_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
+	/* Carrier MicroSD Card Detect */
+	MX6_PAD_GPIO_2__GPIO_1_2      | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+#define USDHC1_CD_GPIO IMX_GPIO_NR(1, 2)
 #define USDHC3_CD_GPIO IMX_GPIO_NR(3, 9)
 
 static iomux_v3_cfg_t const usdhc3_pads[] = {
@@ -100,8 +112,9 @@  static void setup_iomux_enet(void)
 	gpio_set_value(ETH_PHY_RESET, 1);
 }
 
-static struct fsl_esdhc_cfg usdhc_cfg[1] = {
+static struct fsl_esdhc_cfg usdhc_cfg[2] = {
 	{USDHC3_BASE_ADDR},
+	{USDHC1_BASE_ADDR},
 };
 
 int board_mmc_getcd(struct mmc *mmc)
@@ -110,6 +123,9 @@  int board_mmc_getcd(struct mmc *mmc)
 	int ret = 0;
 
 	switch (cfg->esdhc_base) {
+	case USDHC1_BASE_ADDR:
+		ret = !gpio_get_value(USDHC1_CD_GPIO);
+		break;
 	case USDHC3_BASE_ADDR:
 		ret = !gpio_get_value(USDHC3_CD_GPIO);
 		break;
@@ -120,13 +136,41 @@  int board_mmc_getcd(struct mmc *mmc)
 
 int board_mmc_init(bd_t *bis)
 {
-	imx_iomux_v3_setup_multiple_pads(usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
-
-	usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
-	usdhc_cfg[0].max_bus_width = 4;
-	gpio_direction_input(USDHC3_CD_GPIO);
+	int i;
+
+	/*
+	 * According to the board_mmc_init() the following map is done:
+	 * (U-boot device node)    (Physical Port)
+	 * mmc0                    SOM MicroSD
+	 * mmc1                    Carrier board MicroSD
+	 */
+	for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
+		switch (i) {
+		case 0:
+			imx_iomux_v3_setup_multiple_pads(
+				usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
+			usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
+			usdhc_cfg[0].max_bus_width = 4;
+			gpio_direction_input(USDHC3_CD_GPIO);
+			break;
+		case 1:
+			imx_iomux_v3_setup_multiple_pads(
+				usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
+			usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
+			usdhc_cfg[1].max_bus_width = 4;
+			gpio_direction_input(USDHC1_CD_GPIO);
+			break;
+		default:
+			printf("Warning: you configured more USDHC controllers"
+				   "(%d) than supported by the board\n", i + 1);
+			return 0;
+		}
+
+		if (fsl_esdhc_initialize(bis, &usdhc_cfg[i]))
+			printf("Warning: failed to initialize mmc dev %d\n", i);
+	}
 
-	return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
+	return 0;
 }
 
 static int mx6_rgmii_rework(struct phy_device *phydev)
diff --git a/include/configs/wandboard.h b/include/configs/wandboard.h
index 120e3f6..161b400 100644
--- a/include/configs/wandboard.h
+++ b/include/configs/wandboard.h
@@ -57,6 +57,7 @@ 
 /* MMC Configuration */
 #define CONFIG_FSL_ESDHC
 #define CONFIG_FSL_USDHC
+#define CONFIG_SYS_FSL_USDHC_NUM	2
 #define CONFIG_SYS_FSL_ESDHC_ADDR	0
 
 #define CONFIG_MMC