[PATCH 104/133] [Jaunty SRU] ARM.imx51 Freescale:ENGR00112920 MX51: Add GPS to support 2.6.28 kernel

Brad Figg brad.figg at canonical.com
Thu Jul 9 16:49:34 UTC 2009


From: JasonHua <Jason.Hua at freescale.com>

1.add the gps gpio configuration to support 2.6.28 kernel
2.modify the the gps regulator method

Signed-off-by: Jason Hua <r65076 at freescale.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
 arch/arm/mach-mx51/board-mx51_3stack.h |    2 +-
 arch/arm/mach-mx51/dummy_gpio.c        |    6 ++++
 arch/arm/mach-mx51/mx51_3stack.c       |   40 ++++++++++++++++++++++++++++++++
 arch/arm/mach-mx51/mx51_3stack_gpio.c  |   22 ++++++++++++++---
 arch/arm/plat-mxc/include/mach/mxc.h   |    2 +
 drivers/mxc/gps_ioctrl/Kconfig         |    2 +-
 drivers/mxc/gps_ioctrl/agpsgpiodev.c   |   15 ++++-------
 7 files changed, 74 insertions(+), 15 deletions(-)

diff --git a/arch/arm/mach-mx51/board-mx51_3stack.h b/arch/arm/mach-mx51/board-mx51_3stack.h
index cef5b59..52f99e0 100644
--- a/arch/arm/mach-mx51/board-mx51_3stack.h
+++ b/arch/arm/mach-mx51/board-mx51_3stack.h
@@ -73,7 +73,7 @@
 #define UART2_IR		NO_IRDA
 #define UART2_ENABLED		1
 /* UART 3 configuration */
-#define UART3_MODE		MODE_DTE
+#define UART3_MODE		MODE_DCE
 #define UART3_IR		NO_IRDA
 #define UART3_ENABLED		1
 
diff --git a/arch/arm/mach-mx51/dummy_gpio.c b/arch/arm/mach-mx51/dummy_gpio.c
index e91bbb5..5a2c7d0 100644
--- a/arch/arm/mach-mx51/dummy_gpio.c
+++ b/arch/arm/mach-mx51/dummy_gpio.c
@@ -20,6 +20,12 @@ EXPORT_SYMBOL(gpio_uart_active);
 void gpio_uart_inactive(int port, int no_irda) {}
 EXPORT_SYMBOL(gpio_uart_inactive);
 
+void gpio_gps_active(void) {}
+EXPORT_SYMBOL(gpio_gps_active);
+
+void gpio_gps_inactive(void) {}
+EXPORT_SYMBOL(gpio_gps_inactive);
+
 void config_uartdma_event(int port) {}
 EXPORT_SYMBOL(config_uartdma_event);
 
diff --git a/arch/arm/mach-mx51/mx51_3stack.c b/arch/arm/mach-mx51/mx51_3stack.c
index a133e02..0582b2f 100644
--- a/arch/arm/mach-mx51/mx51_3stack.c
+++ b/arch/arm/mach-mx51/mx51_3stack.c
@@ -1077,6 +1077,45 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags,
 #endif
 }
 
+#if defined(CONFIG_GPS_IOCTRL) || defined(CONFIG_GPS_IOCTRL_MODULE)
+static struct mxc_gps_platform_data gps_data = {
+	.core_reg = "VIOHI",
+	.analog_reg = "SW4",
+};
+
+static struct platform_device mxc_gps_device = {
+	.name = "gps_ioctrl",
+	.id = -1,
+	.dev = {
+		.platform_data = &gps_data,
+	},
+};
+
+static void __init mxc_init_gps(void)
+{
+	(void)platform_device_register(&mxc_gps_device);
+}
+
+int gpio_gps_access(int para)
+{
+	iomux_pin_name_t pin;
+	pin = (para & 0x1) ? MX51_PIN_EIM_CS2 : MX51_PIN_EIM_CRE;
+
+	if (para & 0x4) /* Read GPIO */
+		return mxc_get_gpio_datain(pin);
+	else if (para & 0x2) /* Write GPIO */
+		mxc_set_gpio_dataout(pin, 1);
+	else
+		mxc_set_gpio_dataout(pin, 0);
+	return 0;
+}
+EXPORT_SYMBOL(gpio_gps_access);
+#else
+static void __init mxc_init_gps(void)
+{
+}
+#endif
+
 /*!
  * Board specific initialization.
  */
@@ -1122,6 +1161,7 @@ static void __init mxc_board_init(void)
 	mxc_init_wm8903();
 	mxc_init_sgtl5000();
 	mxc_init_bluetooth();
+	mxc_init_gps();
 
 	err = mxc_request_iomux(MX51_PIN_EIM_D19, IOMUX_CONFIG_GPIO);
 	if (err)
diff --git a/arch/arm/mach-mx51/mx51_3stack_gpio.c b/arch/arm/mach-mx51/mx51_3stack_gpio.c
index 6174db4..e85979f 100644
--- a/arch/arm/mach-mx51/mx51_3stack_gpio.c
+++ b/arch/arm/mach-mx51/mx51_3stack_gpio.c
@@ -196,7 +196,14 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
 	 (PAD_CTL_PKE_ENABLE | PAD_CTL_100K_PU),
 	 },
 	{
+	 MX51_PIN_EIM_CS2, IOMUX_CONFIG_GPIO,
+	 (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_KEEPER |
+	  PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST),
+	 },
+	{
 	 MX51_PIN_EIM_CRE, IOMUX_CONFIG_GPIO,
+	 (PAD_CTL_DRV_HIGH | PAD_CTL_HYS_NONE | PAD_CTL_PUE_KEEPER |
+	  PAD_CTL_100K_PU | PAD_CTL_PKE_ENABLE | PAD_CTL_SRE_FAST),
 	 },
 	{
 	 MX51_PIN_DI_GP4, IOMUX_CONFIG_ALT2,
@@ -433,14 +440,14 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
 	  PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST),
 	 },
 	{
-	 MX51_PIN_UART3_RXD, IOMUX_CONFIG_ALT0,
+	 MX51_PIN_UART3_RXD, IOMUX_CONFIG_ALT1,
 	 (PAD_CTL_HYS_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
 	  PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST),
 	 MUX_IN_UART3_IPP_UART_RXD_MUX_SELECT_INPUT,
-	 INPUT_CTL_PATH0,
+	 INPUT_CTL_PATH4,
 	 },
 	{
-	 MX51_PIN_UART3_TXD, IOMUX_CONFIG_ALT0,
+	 MX51_PIN_UART3_TXD, IOMUX_CONFIG_ALT1,
 	 (PAD_CTL_HYS_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
 	  PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST),
 	 },
@@ -449,7 +456,7 @@ static struct mxc_iomux_pin_cfg __initdata mxc_iomux_pins[] = {
 	 (PAD_CTL_HYS_NONE | PAD_CTL_PKE_ENABLE | PAD_CTL_PUE_KEEPER |
 	  PAD_CTL_DRV_HIGH | PAD_CTL_SRE_FAST),
 	 MUX_IN_UART3_IPP_UART_RTS_B_SELECT_INPUT,
-	 INPUT_CTL_PATH2,
+	 INPUT_CTL_PATH3,
 	 },
 	{
 	 MX51_PIN_EIM_D24, IOMUX_CONFIG_ALT3,
@@ -722,6 +729,13 @@ void __init mx51_3stack_io_init(void)
 	mxc_set_gpio_direction(MX51_PIN_DI1_D1_CS, 0);
 	mxc_set_gpio_direction(MX51_PIN_DISPB2_SER_DIO, 0);
 	mxc_set_gpio_dataout(MX51_PIN_DISPB2_SER_DIO, 0);
+
+	/* GPS related gpio */
+	mxc_set_gpio_direction(MX51_PIN_EIM_CS2, 0);
+	mxc_set_gpio_dataout(MX51_PIN_EIM_CS2, 0);
+	mxc_set_gpio_direction(MX51_PIN_EIM_CRE, 0);
+	mxc_set_gpio_dataout(MX51_PIN_EIM_CRE, 0);
+	mxc_set_gpio_dataout(MX51_PIN_EIM_CRE, 1);
 }
 
 /* workaround for ecspi chipselect pin may not keep correct level when idle */
diff --git a/arch/arm/plat-mxc/include/mach/mxc.h b/arch/arm/plat-mxc/include/mach/mxc.h
index 5830ce1..afd4346 100644
--- a/arch/arm/plat-mxc/include/mach/mxc.h
+++ b/arch/arm/plat-mxc/include/mach/mxc.h
@@ -318,6 +318,8 @@ struct mxc_unifi_platform_data {
 struct mxc_gps_platform_data {
 	char *core_reg;
 	char *analog_reg;
+	struct regulator *gps_regu_core;
+	struct regulator *gps_regu_analog;
 };
 
 struct mxc_mlb_platform_data {
diff --git a/drivers/mxc/gps_ioctrl/Kconfig b/drivers/mxc/gps_ioctrl/Kconfig
index cb2698d..dd84144 100644
--- a/drivers/mxc/gps_ioctrl/Kconfig
+++ b/drivers/mxc/gps_ioctrl/Kconfig
@@ -6,7 +6,7 @@ menu "Broadcom GPS ioctrl support"
 
 config GPS_IOCTRL
 	tristate "GPS ioctrl support"
-	depends on MACH_MX31_3DS || MACH_MX35_3DS || MACH_MX37_3DS
+	depends on MACH_MX31_3DS || MACH_MX35_3DS || MACH_MX37_3DS || MACH_MX51_3DS
 	default m
 	---help---
 	  Say Y to enable Broadcom GPS ioctrl on MXC platform.
diff --git a/drivers/mxc/gps_ioctrl/agpsgpiodev.c b/drivers/mxc/gps_ioctrl/agpsgpiodev.c
index de70630..cf2c2b4 100644
--- a/drivers/mxc/gps_ioctrl/agpsgpiodev.c
+++ b/drivers/mxc/gps_ioctrl/agpsgpiodev.c
@@ -223,25 +223,25 @@ static int __init gps_ioctrl_probe(struct platform_device *pdev)
 
 	/* open GPS GPO3 1v8 for GL gps support */
 	if (mxc_gps_ioctrl_data->core_reg != NULL) {
-		gps_regu =
+		mxc_gps_ioctrl_data->gps_regu_core =
 		    regulator_get(&(pdev->dev), mxc_gps_ioctrl_data->core_reg);
+		gps_regu = mxc_gps_ioctrl_data->gps_regu_core;
 		if (!IS_ERR_VALUE((u32)gps_regu)) {
 			regulator_set_voltage(gps_regu, 1800000, 1800000);
 			regulator_enable(gps_regu);
-			regulator_put(gps_regu);
 		} else {
 			return -1;
 		}
 	}
 	/* open GPS GPO1 2v8 for GL gps support */
 	if (mxc_gps_ioctrl_data->analog_reg != NULL) {
-		gps_regu =
+		mxc_gps_ioctrl_data->gps_regu_analog =
 		    regulator_get(&(pdev->dev),
 				  mxc_gps_ioctrl_data->analog_reg);
+		gps_regu = mxc_gps_ioctrl_data->gps_regu_analog;
 		if (!IS_ERR_VALUE((u32)gps_regu)) {
 			regulator_set_voltage(gps_regu, 2800000, 2800000);
 			regulator_enable(gps_regu);
-			regulator_put(gps_regu);
 		} else {
 			return -1;
 		}
@@ -265,17 +265,14 @@ static int gps_ioctrl_remove(struct platform_device *pdev)
 	gpio_gps_inactive();
 
 	/* close GPS GPO3 1v8 for GL gps */
+	gps_regu = mxc_gps_ioctrl_data->gps_regu_core;
 	if (mxc_gps_ioctrl_data->core_reg != NULL) {
-		gps_regu =
-		    regulator_get(&(pdev->dev), mxc_gps_ioctrl_data->core_reg);
 		regulator_disable(gps_regu);
 		regulator_put(gps_regu);
 	}
 	/* close GPS GPO1 2v8 for GL gps */
+	gps_regu = mxc_gps_ioctrl_data->gps_regu_analog;
 	if (mxc_gps_ioctrl_data->analog_reg != NULL) {
-		gps_regu =
-		    regulator_get(&(pdev->dev),
-				  mxc_gps_ioctrl_data->analog_reg);
 		regulator_disable(gps_regu);
 		regulator_put(gps_regu);
 	}
-- 
1.6.0.4





More information about the kernel-team mailing list