Skip to contentSkip to conversation

mx51evk: Make use of the i.MX GPIO API

PATCH New Fabio Estevam 2 participants 2 messages May 19, 2011 – May 20, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mx51evk: Make use of the i.MX GPIO API

Make use of the i.MX GPIO API.

While at it created a separate function for the FEC PHY reset, so that it can be decoupled from the power_init function.

---
 board/freescale/mx51evk/mx51evk.c |   33 +++++++++++++++++----------------
 1 files changed, 17 insertions(+), 16 deletions(-)
board/freescale/mx51evk/mx51evk.c +17 -16
index ef7c6e4..2dabef9 100644
@@ -33,6 +33,11 @@
 #include <fsl_esdhc.h>
 #include <fsl_pmic.h>
 #include <mc13892.h>
+#include <mxc_gpio.h>
+
+#define MX51EVK_PHY_RESET	(1 * 32 + 14)	/* GPIO2_14 */
+#define MX51EVK_SD1_CD		(0 * 32 + 0)	/* GPIO1_0 */
+#define MX51EVK_SD2_CD		(0 * 32 + 6)	/* GPIO1_6 */
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -261,27 +266,22 @@ static void power_init(void)
 	pmic_reg_write(REG_MODE_1, val);
 	udelay(200);
 
-	reg = readl(GPIO2_BASE_ADDR + 0x0);
-	reg &= ~0x4000;  /* Lower reset line */
-	writel(reg, GPIO2_BASE_ADDR + 0x0);
-
-	reg = readl(GPIO2_BASE_ADDR + 0x4);
-	reg |= 0x4000;	/* configure GPIO lines as output */
-	writel(reg, GPIO2_BASE_ADDR + 0x4);
-
-	/* Reset the ethernet controller over GPIO */
-	writel(0x1, IOMUXC_BASE_ADDR + 0x0AC);
-
 	/* Enable VGEN3, VCAM, VAUDIO, VVIDEO, VSD regulators */
 	val = VGEN3EN | VGEN3CONFIG | VCAMEN | VCAMCONFIG |
 		VVIDEOEN | VAUDIOEN  | VSDEN;
 	pmic_reg_write(REG_MODE_1, val);
+}
+
+static void reset_phy_fec(void)
+{
+	mxc_request_iomux(MX51_PIN_EIM_A20, IOMUX_CONFIG_ALT1);
+	mxc_gpio_direction(MX51EVK_PHY_RESET, MXC_GPIO_DIRECTION_OUT);
 
+	mxc_gpio_set(MX51EVK_PHY_RESET, 0);	/* Lower reset line */
+
 	udelay(500);
 
-	reg = readl(GPIO2_BASE_ADDR + 0x0);
-	reg |= 0x4000;
-	writel(reg, GPIO2_BASE_ADDR + 0x0);
+	mxc_gpio_set(MX51EVK_PHY_RESET, 1);	/* Set reset line to high */
 }
 
 #ifdef CONFIG_FSL_ESDHC
@@ -290,9 +290,9 @@ int board_mmc_getcd(u8 *cd, struct mmc *mmc)
 	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
 
 	if (cfg->esdhc_base == MMC_SDHC1_BASE_ADDR)
-		*cd = readl(GPIO1_BASE_ADDR) & 0x01;
+		*cd = mxc_gpio_get(MX51EVK_SD1_CD);
 	else
-		*cd = readl(GPIO1_BASE_ADDR) & 0x40;
+		*cd = mxc_gpio_get(MX51EVK_SD2_CD);
 
 	return 0;
 }
@@ -414,6 +414,7 @@ int board_mmc_init(bd_t *bis)
 int board_early_init_f(void)
 {
 	setup_iomux_uart();
+	reset_phy_fec();
 	setup_iomux_fec();
 
 	return 0;
Signature · 1 line
1.6.0.4
#1 lore raw

PATCH 1/1 mx51evk: Make use of the i.MX GPIO API

Quoted 1 line · Fabio Estevam

Make use of the i.MX GPIO API.

Hi Fabio,

thanks for cleanup this code.

Quoted 50 lines

While at it created a separate function for the FEC PHY reset, so that it can be decoupled from the power_init function.

---
 board/freescale/mx51evk/mx51evk.c |   33 +++++++++++++++++----------------
 1 files changed, 17 insertions(+), 16 deletions(-)
board/freescale/mx51evk/mx51evk.c +11 -11
index ef7c6e4..2dabef9 100644
@@ -33,6 +33,11 @@
 #include <fsl_esdhc.h>
 #include <fsl_pmic.h>
 #include <mc13892.h>
+#include <mxc_gpio.h>
+
+#define MX51EVK_PHY_RESET	(1 * 32 + 14)	/* GPIO2_14 */
+#define MX51EVK_SD1_CD		(0 * 32 + 0)	/* GPIO1_0 */
+#define MX51EVK_SD2_CD		(0 * 32 + 6)	/* GPIO1_6 */
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -261,27 +266,22 @@ static void power_init(void)
 	pmic_reg_write(REG_MODE_1, val);
 	udelay(200);
 
-	reg = readl(GPIO2_BASE_ADDR + 0x0);
-	reg &= ~0x4000;  /* Lower reset line */
-	writel(reg, GPIO2_BASE_ADDR + 0x0);
-
-	reg = readl(GPIO2_BASE_ADDR + 0x4);
-	reg |= 0x4000;	/* configure GPIO lines as output */
-	writel(reg, GPIO2_BASE_ADDR + 0x4);
-
-	/* Reset the ethernet controller over GPIO */
-	writel(0x1, IOMUXC_BASE_ADDR + 0x0AC);
-
 	/* Enable VGEN3, VCAM, VAUDIO, VVIDEO, VSD regulators */
 	val = VGEN3EN | VGEN3CONFIG | VCAMEN | VCAMCONFIG |
 		VVIDEOEN | VAUDIOEN  | VSDEN;
 	pmic_reg_write(REG_MODE_1, val);
+}
+
+static void reset_phy_fec(void)
+{
+	mxc_request_iomux(MX51_PIN_EIM_A20, IOMUX_CONFIG_ALT1);
+	mxc_gpio_direction(MX51EVK_PHY_RESET, MXC_GPIO_DIRECTION_OUT);

board/freescale/mx51evk/mx51evk.c static void power_init(void) · line 285

Quoted 10 lines
board/freescale/mx51evk/mx51evk.c +3 -3
 
+	mxc_gpio_set(MX51EVK_PHY_RESET, 0);	/* Lower reset line */
+
 	udelay(500);
 
-	reg = readl(GPIO2_BASE_ADDR + 0x0);
-	reg |= 0x4000;
-	writel(reg, GPIO2_BASE_ADDR + 0x0);
+	mxc_gpio_set(MX51EVK_PHY_RESET, 1);	/* Set reset line to high */
 }

Something is not clear to me. To get the same functionality, I am expecting that the phy is reset, then the PMIC is programmed, and at the end the phy is freed from reset.

You add reset_phy_fec(), that sets the phy in reset. In actual code, at the end of power_init the phy is out of reset. Now who remove the reset ? I do not see in your code.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
=====================================================================