[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