From 8e6e06c71b9d21d85a3ae652868e2802c054a08a Mon Sep 17 00:00:00 2001 From: Tony Lindgren Date: Thu, 11 Sep 2008 17:23:52 -0700 Subject: [PATCH] ARM: OMAP: Clean-up MMC device init Clean-up MMC device init: - Initialize devices in mach-omap1/devices.c and mach-omap2/devices.c instead of plat-omap/devices.c - Remove old struct omap_mmc_config, use struct omap_mmc_platform_data instead Note that this removes the second omap-hsmmc controller init for overo. This needs to be fixed properly by changing hsmmc_init() to accept board specific struct omap_mmc_platform_data. Signed-off-by: Tony Lindgren --- arch/arm/mach-omap1/board-h2-mmc.c | 5 +- arch/arm/mach-omap1/board-h2.c | 10 -- arch/arm/mach-omap1/board-h3-mmc.c | 5 +- arch/arm/mach-omap1/board-h3.c | 10 -- arch/arm/mach-omap1/board-innovator.c | 19 ++- arch/arm/mach-omap1/board-nokia770.c | 33 ++-- arch/arm/mach-omap1/board-palmte.c | 17 +- arch/arm/mach-omap1/board-palmz71.c | 19 ++- arch/arm/mach-omap1/board-sx1-mmc.c | 6 +- arch/arm/mach-omap1/board-sx1.c | 11 -- arch/arm/mach-omap1/board-voiceblue.c | 16 +- arch/arm/mach-omap1/devices.c | 131 +++++++++++++++ arch/arm/mach-omap2/board-2430sdp.c | 8 - arch/arm/mach-omap2/board-3430sdp.c | 10 +- arch/arm/mach-omap2/board-apollon-mmc.c | 15 +- arch/arm/mach-omap2/board-apollon.c | 13 -- arch/arm/mach-omap2/board-generic.c | 11 -- arch/arm/mach-omap2/board-h4-mmc.c | 14 +- arch/arm/mach-omap2/board-h4.c | 21 --- arch/arm/mach-omap2/board-ldp.c | 8 - arch/arm/mach-omap2/board-n800-mmc.c | 16 +- arch/arm/mach-omap2/board-n800.c | 10 -- arch/arm/mach-omap2/board-omap2evm.c | 8 - arch/arm/mach-omap2/board-omap3beagle.c | 8 - arch/arm/mach-omap2/board-omap3evm.c | 8 - arch/arm/mach-omap2/board-overo.c | 12 -- arch/arm/mach-omap2/devices.c | 111 +++++++++++++ arch/arm/mach-omap2/hsmmc.c | 4 +- arch/arm/plat-omap/devices.c | 212 ++---------------------- arch/arm/plat-omap/include/mach/board.h | 22 --- arch/arm/plat-omap/include/mach/mmc.h | 43 ++++- drivers/mmc/host/omap.c | 2 +- drivers/mmc/host/omap_hsmmc.c | 2 +- 33 files changed, 407 insertions(+), 433 deletions(-) diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c index ab9ee5820c4..37031e01773 100644 --- a/arch/arm/mach-omap1/board-h2-mmc.c +++ b/arch/arm/mach-omap1/board-h2-mmc.c @@ -14,6 +14,7 @@ #include #include +#include #ifdef CONFIG_MMC_OMAP static int slot_cover_open; @@ -83,6 +84,8 @@ static struct omap_mmc_platform_data h2_mmc_data = { .init = h2_mmc_late_init, .cleanup = h2_mmc_cleanup, .slots[0] = { + .enabled = 1, + .wire4 = 1, .set_power = h2_mmc_set_power, .set_bus_mode = h2_mmc_set_bus_mode, .get_ro = NULL, @@ -95,7 +98,7 @@ static struct omap_mmc_platform_data h2_mmc_data = { void __init h2_mmc_init(void) { - omap_set_mmc_info(1, &h2_mmc_data); + omap1_init_mmc(&h2_mmc_data); } #else diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 1055de1ae4d..ac51d255aa0 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -470,15 +470,6 @@ static struct omap_usb_config h2_usb_config __initdata = { .pins[1] = 3, }; -static struct omap_mmc_config h2_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - -extern struct omap_mmc_platform_data h2_mmc_data; - static struct omap_uart_config h2_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), }; @@ -489,7 +480,6 @@ static struct omap_lcd_config h2_lcd_config __initdata = { static struct omap_board_config_kernel h2_config[] __initdata = { { OMAP_TAG_USB, &h2_usb_config }, - { OMAP_TAG_MMC, &h2_mmc_config }, { OMAP_TAG_UART, &h2_uart_config }, { OMAP_TAG_LCD, &h2_lcd_config }, }; diff --git a/arch/arm/mach-omap1/board-h3-mmc.c b/arch/arm/mach-omap1/board-h3-mmc.c index 36085819098..44e9d536587 100644 --- a/arch/arm/mach-omap1/board-h3-mmc.c +++ b/arch/arm/mach-omap1/board-h3-mmc.c @@ -14,6 +14,7 @@ #include #include +#include #ifdef CONFIG_MMC_OMAP static int slot_cover_open; @@ -87,6 +88,8 @@ static struct omap_mmc_platform_data h3_mmc_data = { .init = h3_mmc_late_init, .cleanup = h3_mmc_cleanup, .slots[0] = { + .enabled = 1, + .wire4 = 1, .set_power = h3_mmc_set_power, .set_bus_mode = h3_mmc_set_bus_mode, .get_ro = NULL, @@ -99,7 +102,7 @@ static struct omap_mmc_platform_data h3_mmc_data = { void __init h3_mmc_init(void) { - omap_set_mmc_info(1, &h3_mmc_data); + omap1_init_mmc(&h3_mmc_data); } #else diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 7516d21af86..0c1b001626f 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -462,15 +462,6 @@ static struct omap_usb_config h3_usb_config __initdata = { .pins[1] = 3, }; -static struct omap_mmc_config h3_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - -extern struct omap_mmc_platform_data h3_mmc_data; - static struct omap_uart_config h3_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), }; @@ -481,7 +472,6 @@ static struct omap_lcd_config h3_lcd_config __initdata = { static struct omap_board_config_kernel h3_config[] __initdata = { { OMAP_TAG_USB, &h3_usb_config }, - { OMAP_TAG_MMC, &h3_mmc_config }, { OMAP_TAG_UART, &h3_uart_config }, { OMAP_TAG_LCD, &h3_lcd_config }, }; diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index cbc11be5cd2..9ed0feff6fb 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -39,6 +39,7 @@ #include #include #include +#include static int innovator_keymap[] = { KEY(0, 0, KEY_F1), @@ -360,13 +361,15 @@ static struct omap_lcd_config innovator1610_lcd_config __initdata = { }; #endif -static struct omap_mmc_config innovator_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - .wp_pin = OMAP_MPUIO(3), - .power_pin = -1, /* FPGA F3 UIO42 */ - .switch_pin = -1, /* FPGA F4 UIO43 */ +static struct omap_mmc_platform_data innovator_mmc_data = { + .nr_slots = 1, + .slots[0] = { + .enabled = 1, + .wire4 = 1, + .wp_pin = OMAP_MPUIO(3), + .power_pin = -1, /* FPGA F3 UIO42 */ + .switch_pin = -1, /* FPGA F4 UIO43 */ + .name = "mmcblk", }, }; @@ -377,7 +380,6 @@ static struct omap_uart_config innovator_uart_config __initdata = { static struct omap_board_config_kernel innovator_config[] = { { OMAP_TAG_USB, NULL }, { OMAP_TAG_LCD, NULL }, - { OMAP_TAG_MMC, &innovator_mmc_config }, { OMAP_TAG_UART, &innovator_uart_config }, }; @@ -412,6 +414,7 @@ static void __init innovator_init(void) omap_board_config_size = ARRAY_SIZE(innovator_config); omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); + omap1_init_mmc(&innovator_mmc_data); } static void __init innovator_map_io(void) diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 0e297f3de01..6e96a9d81ad 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -36,6 +36,7 @@ #include #include #include +#include #define ADS7846_PENDOWN_GPIO 15 @@ -215,26 +216,29 @@ static struct omap_usb_config nokia770_usb_config __initdata = { .pins[0] = 6, }; -static struct omap_mmc_config nokia770_mmc_config __initdata = { - .mmc[0] = { - .enabled = 0, - .wire4 = 0, - .wp_pin = -1, - .power_pin = -1, - .switch_pin = -1, +static struct omap_mmc_platform_data nokia770_mmc_data = { + .nr_slots = 2, + .slots[0] = { + .enabled = 0, + .wire4 = 0, + .wp_pin = -1, + .power_pin = -1, + .switch_pin = -1, + .name = "mmcblk", }, - .mmc[1] = { - .enabled = 0, - .wire4 = 0, - .wp_pin = -1, - .power_pin = -1, - .switch_pin = -1, + .slots[1] = { + .enabled = 0, + .wire4 = 0, + .wp_pin = -1, + .power_pin = -1, + .switch_pin = -1, + .name = "mmcblk", }, + }; static struct omap_board_config_kernel nokia770_config[] __initdata = { { OMAP_TAG_USB, NULL }, - { OMAP_TAG_MMC, &nokia770_mmc_config }, }; #if defined(CONFIG_OMAP_DSP) @@ -378,6 +382,7 @@ static void __init omap_nokia770_init(void) hwa742_dev_init(); ads7846_dev_init(); mipid_dev_init(); + omap1_init_mmc(&nokia770_mmc_data); } static void __init omap_nokia770_map_io(void) diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 4b2c62b3853..992ade0aa80 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -45,6 +45,7 @@ #include #include #include +#include static void __init omap_palmte_init_irq(void) { @@ -196,12 +197,14 @@ static struct omap_usb_config palmte_usb_config __initdata = { .pins[0] = 2, }; -static struct omap_mmc_config palmte_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .wp_pin = PALMTE_MMC_WP_GPIO, - .power_pin = PALMTE_MMC_POWER_GPIO, - .switch_pin = PALMTE_MMC_SWITCH_GPIO, +static struct omap_mmc_platform_data palmzte_mmc_data = { + .nr_slots = 1, + .slots[0] = { + .enabled = 1, + .wp_pin = PALMTE_MMC_WP_GPIO, + .power_pin = PALMTE_MMC_POWER_GPIO, + .switch_pin = PALMTE_MMC_SWITCH_GPIO, + .name = "mmcblk", }, }; @@ -317,7 +320,6 @@ static void palmte_get_power_status(struct apm_power_info *info, int *battery) static struct omap_board_config_kernel palmte_config[] __initdata = { { OMAP_TAG_USB, &palmte_usb_config }, - { OMAP_TAG_MMC, &palmte_mmc_config }, { OMAP_TAG_LCD, &palmte_lcd_config }, { OMAP_TAG_UART, &palmte_uart_config }, }; @@ -408,6 +410,7 @@ static void __init omap_palmte_init(void) palmte_misc_gpio_setup(); omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); + omap1_init_mmc(&palmte_mmc_data); } static void __init omap_palmte_map_io(void) diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index e719294250b..5c75b9a4d52 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include @@ -267,13 +268,15 @@ static struct omap_usb_config palmz71_usb_config __initdata = { .pins[0] = 2, }; -static struct omap_mmc_config palmz71_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .wire4 = 0, - .wp_pin = PALMZ71_MMC_WP_GPIO, - .power_pin = -1, - .switch_pin = PALMZ71_MMC_IN_GPIO, +static struct omap_mmc_platform_data palmz71_mmc_data = { + .nr_slots = 1, + .slots[0] = { + .enabled = 1, + .wire4 = 0, + .wp_pin = PALMZ71_MMC_WP_GPIO, + .power_pin = -1, + .switch_pin = PALMZ71_MMC_IN_GPIO, + .name = "mmcblk", }, }; @@ -287,7 +290,6 @@ static struct omap_uart_config palmz71_uart_config __initdata = { static struct omap_board_config_kernel palmz71_config[] __initdata = { {OMAP_TAG_USB, &palmz71_usb_config}, - {OMAP_TAG_MMC, &palmz71_mmc_config}, {OMAP_TAG_LCD, &palmz71_lcd_config}, {OMAP_TAG_UART, &palmz71_uart_config}, }; @@ -365,6 +367,7 @@ omap_palmz71_init(void) omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); palmz71_gpio_setup(0); + omap1_init_mmc(&palmz71_mmc_data); } static void __init diff --git a/arch/arm/mach-omap1/board-sx1-mmc.c b/arch/arm/mach-omap1/board-sx1-mmc.c index 0be4ebaa284..524d22de1d5 100644 --- a/arch/arm/mach-omap1/board-sx1-mmc.c +++ b/arch/arm/mach-omap1/board-sx1-mmc.c @@ -12,6 +12,8 @@ * published by the Free Software Foundation. */ +#include + #include #include #include @@ -97,6 +99,8 @@ static struct omap_mmc_platform_data sx1_mmc_data = { .init = sx1_mmc_late_init, .cleanup = sx1_mmc_cleanup, .slots[0] = { + .enabled = 1, + .wire4 = 0, .set_power = sx1_mmc_set_power, .set_bus_mode = sx1_mmc_set_bus_mode, .get_ro = NULL, @@ -109,7 +113,7 @@ static struct omap_mmc_platform_data sx1_mmc_data = { void __init sx1_mmc_init(void) { - omap_set_mmc_info(1, &sx1_mmc_data); + omap1_init_mmc(&sx1_mmc_data); } #else diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index d3156b8451d..0d235e7facd 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c @@ -379,15 +379,6 @@ static struct omap_usb_config sx1_usb_config __initdata = { .pins[2] = 0, }; -/*----------- MMC -------------------------*/ - -static struct omap_mmc_config sx1_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 0, - }, -}; - /*----------- LCD -------------------------*/ static struct platform_device sx1_lcd_device = { @@ -415,7 +406,6 @@ static struct omap_uart_config sx1_uart_config __initdata = { static struct omap_board_config_kernel sx1_config[] __initdata = { { OMAP_TAG_USB, &sx1_usb_config }, - { OMAP_TAG_MMC, &sx1_mmc_config }, { OMAP_TAG_LCD, &sx1_lcd_config }, { OMAP_TAG_UART, &sx1_uart_config }, }; @@ -458,7 +448,6 @@ static void __init omap_sx1_init(void) omap_set_gpio_dataout(1, 1);/*A_IRDA_OFF = 1 */ omap_set_gpio_dataout(11, 0);/*A_SWITCH = 0 */ omap_set_gpio_dataout(15, 0);/*A_USB_ON = 0 */ - } /*----------------------------------------*/ static void __init omap_sx1_init_irq(void) diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 53650072ff4..57be5298f53 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -34,6 +34,7 @@ #include #include #include +#include static struct plat_serial8250_port voiceblue_ports[] = { { @@ -140,11 +141,13 @@ static struct omap_usb_config voiceblue_usb_config __initdata = { .pins[2] = 6, }; -static struct omap_mmc_config voiceblue_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .power_pin = 2, - .switch_pin = -1, +static struct omap_mmc_platform_data voiceblue_mmc_data = { + .nr_slots = 1, + .slots[0] = { + .enabled = 1, + .power_pin = 2, + .switch_pin = -1, + .name = "mmcblk", }, }; @@ -154,7 +157,6 @@ static struct omap_uart_config voiceblue_uart_config __initdata = { static struct omap_board_config_kernel voiceblue_config[] = { { OMAP_TAG_USB, &voiceblue_usb_config }, - { OMAP_TAG_MMC, &voiceblue_mmc_config }, { OMAP_TAG_UART, &voiceblue_uart_config }, }; @@ -202,6 +204,8 @@ static void __init voiceblue_init(void) * (it is connected through invertor) */ omap_writeb(0x00, OMAP_LPG1_LCR); omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */ + + omap1_init_mmc(&voiceblue_mmc_data); } static void __init voiceblue_map_io(void) diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 79cfe0147d9..97b472c25cd 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -22,6 +22,7 @@ #include #include #include +#include /*-------------------------------------------------------------------------*/ @@ -99,6 +100,136 @@ static inline void omap_init_mbox(void) static inline void omap_init_mbox(void) { } #endif +/*-------------------------------------------------------------------------*/ + +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) + +#define OMAP1_MMC1_BASE 0xfffb7800 +#define OMAP1_MMC1_END (OMAP1_MMC1_BASE + 0x7f) +#define OMAP1_MMC1_INT INT_MMC + +#define OMAP1_MMC2_BASE 0xfffb7c00 /* omap16xx only */ +#define OMAP1_MMC2_END (OMAP1_MMC2_BASE + 0x7f) +#define OMAP1_MMC2_INT INT_1610_MMC2 + +static u64 omap1_mmc1_dmamask = 0xffffffff; + +static struct resource omap1_mmc1_resources[] = { + { + .start = OMAP1_MMC1_BASE, + .end = OMAP1_MMC1_END, + .flags = IORESOURCE_MEM, + }, + { + .start = OMAP1_MMC1_INT, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device omap1_mmc1_device = { + .name = "mmci-omap", + .id = 1, + .dev = { + .dma_mask = &omap1_mmc1_dmamask, + }, + .num_resources = ARRAY_SIZE(omap1_mmc1_resources), + .resource = omap1_mmc1_resources, +}; + +#if defined(CONFIG_ARCH_OMAP16XX) + +static u64 omap1_mmc2_dmamask = 0xffffffff; + +static struct resource omap1_mmc2_resources[] = { + { + .start = OMAP1_MMC2_BASE, + .end = OMAP1_MMC2_END, + .flags = IORESOURCE_MEM, + }, + { + .start = OMAP1_MMC2_INT, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device omap1_mmc2_device = { + .name = "mmci-omap", + .id = 2, + .dev = { + .dma_mask = &omap1_mmc2_dmamask, + }, + .num_resources = ARRAY_SIZE(omap1_mmc2_resources), + .resource = omap1_mmc2_resources, +}; +#define OMAP1_MMC2_DEVICE &omap1_mmc2_device +#else +#define OMAP1_MMC2_DEVICE &omap1_mmc1_device /* Dummy */ +#endif + +static inline void omap1_mmc_mux(struct omap_mmc_platform_data *info) +{ + if (info->slots[0].enabled) { + omap_cfg_reg(MMC_CMD); + omap_cfg_reg(MMC_CLK); + omap_cfg_reg(MMC_DAT0); + if (cpu_is_omap1710()) { + omap_cfg_reg(M15_1710_MMC_CLKI); + omap_cfg_reg(P19_1710_MMC_CMDDIR); + omap_cfg_reg(P20_1710_MMC_DATDIR0); + } + if (info->slots[0].wire4) { + omap_cfg_reg(MMC_DAT1); + /* NOTE: DAT2 can be on W10 (here) or M15 */ + if (!info->slots[0].nomux) + omap_cfg_reg(MMC_DAT2); + omap_cfg_reg(MMC_DAT3); + } + } + + /* Block 2 is on newer chips, and has many pinout options */ + if (cpu_is_omap16xx() && info->slots[1].enabled) { + if (!info->slots[1].nomux) { + omap_cfg_reg(Y8_1610_MMC2_CMD); + omap_cfg_reg(Y10_1610_MMC2_CLK); + omap_cfg_reg(R18_1610_MMC2_CLKIN); + omap_cfg_reg(W8_1610_MMC2_DAT0); + if (info->slots[1].wire4) { + omap_cfg_reg(V8_1610_MMC2_DAT1); + omap_cfg_reg(W15_1610_MMC2_DAT2); + omap_cfg_reg(R10_1610_MMC2_DAT3); + } + + /* These are needed for the level shifter */ + omap_cfg_reg(V9_1610_MMC2_CMDDIR); + omap_cfg_reg(V5_1610_MMC2_DATDIR0); + omap_cfg_reg(W19_1610_MMC2_DATDIR1); + } + + /* Feedback clock must be set on OMAP-1710 MMC2 */ + if (cpu_is_omap1710()) + omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), + MOD_CONF_CTRL_1); + } +} + +void omap1_init_mmc(struct omap_mmc_platform_data *info) +{ + if (!info) + return; + + omap1_mmc_mux(info); + platform_set_drvdata(&omap1_mmc1_device, info); + + if (cpu_is_omap16xx()) + platform_set_drvdata(OMAP1_MMC2_DEVICE, info); + + omap_init_mmc(info, &omap1_mmc1_device, OMAP1_MMC2_DEVICE); +} + +#endif + +/*-------------------------------------------------------------------------*/ + #if defined(CONFIG_OMAP_STI) #define OMAP1_STI_BASE 0xfffea000 diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 94e202df370..22aa28c7fcb 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c @@ -365,18 +365,10 @@ struct omap_serial_console_config sdp2430_serial_console_config __initdata = { .console_speed = 115200, }; -static struct omap_mmc_config sdp2430_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct omap_board_config_kernel sdp2430_config[] __initdata = { {OMAP_TAG_UART, &sdp2430_uart_config}, {OMAP_TAG_LCD, &sdp2430_lcd_config}, {OMAP_TAG_SERIAL_CONSOLE, &sdp2430_serial_console_config}, - {OMAP_TAG_MMC, &sdp2430_mmc_config}, }; static int __init omap2430_i2c_init(void) diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index d27158ec314..a9f368b4e10 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c @@ -329,17 +329,9 @@ static struct omap_lcd_config sdp3430_lcd_config __initdata = { .ctrl_name = "internal", }; -static struct omap_mmc_config sdp3430_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct omap_board_config_kernel sdp3430_config[] __initdata = { { OMAP_TAG_UART, &sdp3430_uart_config }, - {OMAP_TAG_LCD, &sdp3430_lcd_config}, - {OMAP_TAG_MMC, &sdp3430_mmc_config }, + { OMAP_TAG_LCD, &sdp3430_lcd_config }, }; static int __init omap3430_i2c_init(void) diff --git a/arch/arm/mach-omap2/board-apollon-mmc.c b/arch/arm/mach-omap2/board-apollon-mmc.c index 71fccd9b3f3..a33e8ca9114 100644 --- a/arch/arm/mach-omap2/board-apollon-mmc.c +++ b/arch/arm/mach-omap2/board-apollon-mmc.c @@ -10,6 +10,7 @@ */ #include +#include #include #include @@ -58,12 +59,24 @@ static void apollon_mmc_cleanup(struct device *dev) { } +/* + * Note: If you want to detect card feature, please assign GPIO 37 + */ static struct omap_mmc_platform_data apollon_mmc_data = { .nr_slots = 1, .switch_slot = NULL, .init = apollon_mmc_late_init, .cleanup = apollon_mmc_cleanup, .slots[0] = { + .enabled = 1, + .wire4 = 1, + + /* + * Use internal loop-back in MMC/SDIO Module Input Clock + * selection + */ + .internal_clock = 1, + .set_power = apollon_mmc_set_power, .set_bus_mode = apollon_mmc_set_bus_mode, .get_ro = NULL, @@ -76,7 +89,7 @@ static struct omap_mmc_platform_data apollon_mmc_data = { void __init apollon_mmc_init(void) { - omap_set_mmc_info(1, &apollon_mmc_data); + omap2_init_mmc(&apollon_mmc_data); } #else /* !CONFIG_MMC_OMAP */ diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c index e76328062c0..1f3af4825e7 100644 --- a/arch/arm/mach-omap2/board-apollon.c +++ b/arch/arm/mach-omap2/board-apollon.c @@ -351,18 +351,6 @@ static struct omap_uart_config apollon_uart_config __initdata = { .enabled_uarts = (1 << 0) | (0 << 1) | (0 << 2), }; -/* - * Note: If you want to detect card feature, please assign GPIO 37 - */ -static struct omap_mmc_config apollon_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - /* Use internal loop-back in MMC/SDIO Module Input Clock selection */ - .internal_clock = 1, - }, -}; - static struct omap_usb_config apollon_usb_config __initdata = { .register_dev = 1, .hmc_mode = 0x14, /* 0:dev 1:host1 2:disable */ @@ -376,7 +364,6 @@ static struct omap_lcd_config apollon_lcd_config __initdata = { static struct omap_board_config_kernel apollon_config[] __initdata = { { OMAP_TAG_UART, &apollon_uart_config }, - { OMAP_TAG_MMC, &apollon_mmc_config }, { OMAP_TAG_USB, &apollon_usb_config }, { OMAP_TAG_LCD, &apollon_lcd_config }, }; diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 70931b58207..0e353b3611f 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -41,19 +41,8 @@ static struct omap_uart_config generic_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), }; -static struct omap_mmc_config generic_mmc_config __initdata = { - .mmc [0] = { - .enabled = 0, - .wire4 = 0, - .wp_pin = -1, - .power_pin = -1, - .switch_pin = -1, - }, -}; - static struct omap_board_config_kernel generic_config[] __initdata = { { OMAP_TAG_UART, &generic_uart_config }, - { OMAP_TAG_MMC, &generic_mmc_config }, }; static void __init omap_generic_init(void) diff --git a/arch/arm/mach-omap2/board-h4-mmc.c b/arch/arm/mach-omap2/board-h4-mmc.c index 0916a3ca5df..169c5ee8b74 100644 --- a/arch/arm/mach-omap2/board-h4-mmc.c +++ b/arch/arm/mach-omap2/board-h4-mmc.c @@ -14,12 +14,14 @@ * published by the Free Software Foundation. */ -#include - -#include #include +#include #include +#include + +#include + #ifdef CONFIG_MMC_OMAP /* Bit mask for slots detection interrupts */ @@ -228,6 +230,8 @@ static struct omap_mmc_platform_data h4_mmc_data = { .init = h4_mmc_late_init, .cleanup = h4_mmc_cleanup, .slots[0] = { + .enabled = 1, + .wire4 = 1, .set_power = h4_mmc_set_power, .set_bus_mode = h4_mmc_set_bus_mode, .get_ro = NULL, @@ -238,6 +242,8 @@ static struct omap_mmc_platform_data h4_mmc_data = { .name = "slot1", }, .slots[1] = { + .enabled = 1, + .wire4 = 1, .set_power = h4_mmc_set_power, .set_bus_mode = h4_mmc_set_bus_mode, .get_ro = NULL, @@ -253,7 +259,7 @@ static struct omap_mmc_platform_data h4_mmc_data = { void __init h4_mmc_init(void) { - omap_set_mmc_info(1, &h4_mmc_data); + omap2_init_mmc(&h4_mmc_data); } #else diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 54ecab9ed5a..c65358b2c2b 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -391,19 +391,6 @@ static struct omap_uart_config h4_uart_config __initdata = { #endif }; -static struct omap_mmc_config h4_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, - .mmc [1] = { - .enabled = 1, - .wire4 = 1, - }, -}; - -extern struct omap_mmc_platform_data h4_mmc_data; - static struct omap_lcd_config h4_lcd_config __initdata = { .ctrl_name = "internal", }; @@ -470,7 +457,6 @@ static struct spi_board_info h4_spi_board_info[] __initdata = { static struct omap_board_config_kernel h4_config[] __initdata = { { OMAP_TAG_UART, &h4_uart_config }, - { OMAP_TAG_MMC, &h4_mmc_config }, { OMAP_TAG_LCD, &h4_lcd_config }, { OMAP_TAG_USB, &h4_usb_config }, }; @@ -664,13 +650,6 @@ static struct i2c_board_info __initdata h4_i2c_board_info[] = { #endif }; -static struct i2c_board_info __initdata h4_i2c_board_info[] = { - { - I2C_BOARD_INFO("isp1301_omap", 0x2d), - .irq = OMAP_GPIO_IRQ(125), - }, -}; - static void __init omap_h4_init(void) { /* diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 987f86039d6..ffd27d676ce 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c @@ -201,16 +201,8 @@ static struct omap_uart_config ldp_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), }; -static struct omap_mmc_config ldp_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct omap_board_config_kernel ldp_config[] __initdata = { { OMAP_TAG_UART, &ldp_uart_config }, - { OMAP_TAG_MMC, &ldp_mmc_config }, }; static int __init omap_i2c_init(void) diff --git a/arch/arm/mach-omap2/board-n800-mmc.c b/arch/arm/mach-omap2/board-n800-mmc.c index dac159f2f9a..bcbba9440bf 100644 --- a/arch/arm/mach-omap2/board-n800-mmc.c +++ b/arch/arm/mach-omap2/board-n800-mmc.c @@ -9,13 +9,16 @@ * published by the Free Software Foundation. */ -#include -#include - -#include #include +#include #include +#include + +#include +#include +#include + #ifdef CONFIG_MMC_OMAP static const int slot_switch_gpio = 96; @@ -301,6 +304,8 @@ static struct omap_mmc_platform_data n800_mmc_data = { .shutdown = n800_mmc_shutdown, .max_freq = 24000000, .slots[0] = { + .enabled = 1, + .wire4 = 1, .set_power = n800_mmc_set_power, .set_bus_mode = n800_mmc_set_bus_mode, .get_ro = NULL, @@ -339,7 +344,6 @@ void __init n800_mmc_init(void) n800_mmc_data.slots[1].ban_openended = 1; } - omap_set_mmc_info(1, &n800_mmc_data); if (omap_request_gpio(slot_switch_gpio) < 0) BUG(); omap_set_gpio_dataout(slot_switch_gpio, 0); @@ -356,6 +360,8 @@ void __init n800_mmc_init(void) omap_set_gpio_dataout(n810_slot2_pw_vdd, 0); omap_set_gpio_direction(n810_slot2_pw_vdd, 0); } + + omap2_init_mmc(&n800_mmc_data); } #else diff --git a/arch/arm/mach-omap2/board-n800.c b/arch/arm/mach-omap2/board-n800.c index 1df9f3dcc28..2c64d2d47ed 100644 --- a/arch/arm/mach-omap2/board-n800.c +++ b/arch/arm/mach-omap2/board-n800.c @@ -265,22 +265,12 @@ static void __init blizzard_dev_init(void) omapfb_set_ctrl_platform_data(&n800_blizzard_data); } -static struct omap_mmc_config n800_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - -extern struct omap_mmc_platform_data n800_mmc_data; - static struct omap_board_config_kernel n800_config[] __initdata = { { OMAP_TAG_UART, &n800_uart_config }, { OMAP_TAG_FBMEM, &n800_fbmem0_config }, { OMAP_TAG_FBMEM, &n800_fbmem1_config }, { OMAP_TAG_FBMEM, &n800_fbmem2_config }, { OMAP_TAG_TMP105, &n800_tmp105_config }, - { OMAP_TAG_MMC, &n800_mmc_config }, }; static struct tsc2301_platform_data tsc2301_config = { diff --git a/arch/arm/mach-omap2/board-omap2evm.c b/arch/arm/mach-omap2/board-omap2evm.c index 138e80c33fc..d55f6f7b7e8 100644 --- a/arch/arm/mach-omap2/board-omap2evm.c +++ b/arch/arm/mach-omap2/board-omap2evm.c @@ -229,17 +229,9 @@ static struct omap_uart_config omap2_evm_uart_config __initdata = { .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), }; -static struct omap_mmc_config omap2_evm_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct omap_board_config_kernel omap2_evm_config[] __initdata = { { OMAP_TAG_UART, &omap2_evm_uart_config }, { OMAP_TAG_LCD, &omap2_evm_lcd_config }, - { OMAP_TAG_MMC, &omap2_evm_mmc_config }, }; static int __init omap2_evm_i2c_init(void) diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 9babe44a883..4d0818d0252 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c @@ -125,13 +125,6 @@ static void __init omap3_beagle_init_irq(void) omap_gpio_init(); } -static struct omap_mmc_config omap3beagle_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct platform_device omap3_beagle_twl4030rtc_device = { .name = "twl4030_rtc", .id = -1, @@ -196,7 +189,6 @@ static struct platform_device keys_gpio = { static struct omap_board_config_kernel omap3_beagle_config[] __initdata = { { OMAP_TAG_UART, &omap3_beagle_uart_config }, - { OMAP_TAG_MMC, &omap3beagle_mmc_config }, { OMAP_TAG_LCD, &omap3_beagle_lcd_config }, }; diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 9a4784ead48..ee8a84d3a43 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c @@ -96,13 +96,6 @@ static int __init omap3_evm_i2c_init(void) return 0; } -static struct omap_mmc_config omap3_evm_mmc_config __initdata = { - .mmc [0] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct platform_device omap3_evm_lcd_device = { .name = "omap3evm_lcd", .id = -1, @@ -208,7 +201,6 @@ static void __init omap3_evm_init_irq(void) static struct omap_board_config_kernel omap3_evm_config[] __initdata = { { OMAP_TAG_UART, &omap3_evm_uart_config }, - { OMAP_TAG_MMC, &omap3_evm_mmc_config }, { OMAP_TAG_LCD, &omap3_evm_lcd_config }, }; diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index 175a444089c..396ec33d5c4 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c @@ -158,17 +158,6 @@ static void __init overo_init_irq(void) omap_gpio_init(); } -static struct omap_mmc_config overo_mmc_config __initdata = { - .mmc[0] = { - .enabled = 1, - .wire4 = 1, - }, - .mmc[1] = { - .enabled = 1, - .wire4 = 1, - }, -}; - static struct platform_device overo_twl4030rtc_device = { .name = "twl4030_rtc", .id = -1, @@ -185,7 +174,6 @@ static struct omap_lcd_config overo_lcd_config __initdata = { static struct omap_board_config_kernel overo_config[] __initdata = { { OMAP_TAG_UART, &overo_uart_config }, - { OMAP_TAG_MMC, &overo_mmc_config }, { OMAP_TAG_LCD, &overo_lcd_config }, }; diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index f0e601c78c4..ba0e098cc0f 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -19,11 +19,13 @@ #include #include +#include #include #include #include #include #include +#include #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) @@ -354,6 +356,115 @@ static void omap_init_sha1_md5(void) static inline void omap_init_sha1_md5(void) { } #endif +/*-------------------------------------------------------------------------*/ + +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ + defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) + +#define OMAP2_MMC1_BASE 0x4809c000 +#define OMAP2_MMC1_END (OMAP2_MMC1_BASE + 0x1fc) +#define OMAP2_MMC1_INT INT_24XX_MMC_IRQ + +#define OMAP2_MMC2_BASE 0x480b4000 +#define OMAP2_MMC2_END (OMAP2_MMC2_BASE + 0x1fc) +#define OMAP2_MMC2_INT INT_24XX_MMC2_IRQ + +static u64 omap2_mmc1_dmamask = 0xffffffff; + +static struct resource omap2_mmc1_resources[] = { + { + .start = OMAP2_MMC1_BASE, + .end = OMAP2_MMC1_END, + .flags = IORESOURCE_MEM, + }, + { + .start = OMAP2_MMC1_INT, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device omap2_mmc1_device = { + .name = "mmci-omap", + .id = 1, + .dev = { + .dma_mask = &omap2_mmc1_dmamask, + }, + .num_resources = ARRAY_SIZE(omap2_mmc1_resources), + .resource = omap2_mmc1_resources, +}; + +static u64 omap2_mmc2_dmamask = 0xffffffff; + +static struct resource omap2_mmc2_resources[] = { + { + .start = OMAP2_MMC2_BASE, + .end = OMAP2_MMC2_END, + .flags = IORESOURCE_MEM, + }, + { + .start = OMAP2_MMC2_INT, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device omap2_mmc2_device = { + .name = "mmci-omap", + .id = 2, + .dev = { + .dma_mask = &omap2_mmc2_dmamask, + }, + .num_resources = ARRAY_SIZE(omap2_mmc2_resources), + .resource = omap2_mmc2_resources, +}; + +static inline void omap2_mmc_mux(struct omap_mmc_platform_data *info) +{ + if (!cpu_is_omap2420()) + return; + + if (info->slots[0].enabled) { + omap_cfg_reg(H18_24XX_MMC_CMD); + omap_cfg_reg(H15_24XX_MMC_CLKI); + omap_cfg_reg(G19_24XX_MMC_CLKO); + omap_cfg_reg(F20_24XX_MMC_DAT0); + omap_cfg_reg(F19_24XX_MMC_DAT_DIR0); + omap_cfg_reg(G18_24XX_MMC_CMD_DIR); + if (info->slots[0].wire4) { + omap_cfg_reg(H14_24XX_MMC_DAT1); + omap_cfg_reg(E19_24XX_MMC_DAT2); + omap_cfg_reg(D19_24XX_MMC_DAT3); + omap_cfg_reg(E20_24XX_MMC_DAT_DIR1); + omap_cfg_reg(F18_24XX_MMC_DAT_DIR2); + omap_cfg_reg(E18_24XX_MMC_DAT_DIR3); + } + + /* + * Use internal loop-back in MMC/SDIO Module Input Clock + * selection + */ + if (info->slots[0].internal_clock) { + u32 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); + v |= (1 << 24); + omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); + } + } +} + +void omap2_init_mmc(struct omap_mmc_platform_data *info) +{ + if (!info) + return; + + omap2_mmc_mux(info); + omap2_mmc1_device.dev.platform_data = info; + omap2_mmc2_device.dev.platform_data = info; + omap_init_mmc(info, &omap2_mmc1_device, &omap2_mmc2_device); +} + +#endif + +/*-------------------------------------------------------------------------*/ + #if defined(CONFIG_HDQ_MASTER_OMAP) || defined(CONFIG_HDQ_MASTER_OMAP_MODULE) #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430) #define OMAP_HDQ_BASE 0x480B2000 diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 3805b930e0a..7334d86aa87 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c @@ -265,6 +265,8 @@ static struct omap_mmc_platform_data hsmmc_data = { .resume = hsmmc_resume, #endif .slots[0] = { + .enabled = 1, + .wire4 = 1, .set_power = hsmmc_set_power, .set_bus_mode = NULL, .get_ro = NULL, @@ -280,7 +282,7 @@ static struct omap_mmc_platform_data hsmmc_data = { void __init hsmmc_init(void) { - omap_set_mmc_info(1, &hsmmc_data); + omap2_init_mmc(&hsmmc_data); } #else diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 5312677053a..f633697aa50 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -21,7 +21,6 @@ #include #include -#include #include #include #include @@ -195,212 +194,22 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config, #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) -#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) -#define OMAP_MMC1_BASE 0x4809c000 -#define OMAP_MMC1_END (OMAP_MMC1_BASE + 0x1fc) -#define OMAP_MMC1_INT INT_24XX_MMC_IRQ - -#define OMAP_MMC2_BASE 0x480b4000 -#define OMAP_MMC2_END (OMAP_MMC2_BASE + 0x1fc) -#define OMAP_MMC2_INT INT_24XX_MMC2_IRQ - -#else - -#define OMAP_MMC1_BASE 0xfffb7800 -#define OMAP_MMC1_END (OMAP_MMC1_BASE + 0x7f) -#define OMAP_MMC1_INT INT_MMC - -#define OMAP_MMC2_BASE 0xfffb7c00 /* omap16xx only */ -#define OMAP_MMC2_END (OMAP_MMC2_BASE + 0x7f) -#define OMAP_MMC2_INT INT_1610_MMC2 - -#endif - -static struct omap_mmc_platform_data mmc1_data; - -static u64 mmc1_dmamask = 0xffffffff; - -static struct resource mmc1_resources[] = { - { - .start = OMAP_MMC1_BASE, - .end = OMAP_MMC1_END, - .flags = IORESOURCE_MEM, - }, - { - .start = OMAP_MMC1_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device mmc_omap_device1 = { - .name = "mmci-omap", - .id = 1, - .dev = { - .dma_mask = &mmc1_dmamask, - .platform_data = &mmc1_data, - }, - .num_resources = ARRAY_SIZE(mmc1_resources), - .resource = mmc1_resources, -}; - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ - defined(CONFIG_ARCH_OMAP34XX) - -static struct omap_mmc_platform_data mmc2_data; - -static u64 mmc2_dmamask = 0xffffffff; - -static struct resource mmc2_resources[] = { - { - .start = OMAP_MMC2_BASE, - .end = OMAP_MMC2_END, - .flags = IORESOURCE_MEM, - }, - { - .start = OMAP_MMC2_INT, - .flags = IORESOURCE_IRQ, - }, -}; - -static struct platform_device mmc_omap_device2 = { - .name = "mmci-omap", - .id = 2, - .dev = { - .dma_mask = &mmc2_dmamask, - .platform_data = &mmc2_data, - }, - .num_resources = ARRAY_SIZE(mmc2_resources), - .resource = mmc2_resources, -}; -#endif - -static inline void omap_init_mmc_conf(const struct omap_mmc_config *mmc_conf) -{ - if (cpu_is_omap2430() || cpu_is_omap34xx()) - return; - - if (mmc_conf->mmc[0].enabled) { - if (cpu_is_omap24xx()) { - omap_cfg_reg(H18_24XX_MMC_CMD); - omap_cfg_reg(H15_24XX_MMC_CLKI); - omap_cfg_reg(G19_24XX_MMC_CLKO); - omap_cfg_reg(F20_24XX_MMC_DAT0); - omap_cfg_reg(F19_24XX_MMC_DAT_DIR0); - omap_cfg_reg(G18_24XX_MMC_CMD_DIR); - } else { - omap_cfg_reg(MMC_CMD); - omap_cfg_reg(MMC_CLK); - omap_cfg_reg(MMC_DAT0); - if (cpu_is_omap1710()) { - omap_cfg_reg(M15_1710_MMC_CLKI); - omap_cfg_reg(P19_1710_MMC_CMDDIR); - omap_cfg_reg(P20_1710_MMC_DATDIR0); - } - } - if (mmc_conf->mmc[0].wire4) { - if (cpu_is_omap24xx()) { - omap_cfg_reg(H14_24XX_MMC_DAT1); - omap_cfg_reg(E19_24XX_MMC_DAT2); - omap_cfg_reg(D19_24XX_MMC_DAT3); - omap_cfg_reg(E20_24XX_MMC_DAT_DIR1); - omap_cfg_reg(F18_24XX_MMC_DAT_DIR2); - omap_cfg_reg(E18_24XX_MMC_DAT_DIR3); - } else { - omap_cfg_reg(MMC_DAT1); - /* NOTE: DAT2 can be on W10 (here) or M15 */ - if (!mmc_conf->mmc[0].nomux) - omap_cfg_reg(MMC_DAT2); - omap_cfg_reg(MMC_DAT3); - } - } -#if defined(CONFIG_ARCH_OMAP2420) - if (mmc_conf->mmc[0].internal_clock) { - /* - * Use internal loop-back in MMC/SDIO - * Module Input Clock selection - */ - if (cpu_is_omap24xx()) { - u32 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); - v |= (1 << 24); /* not used in 243x */ - omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); - } - } -#endif - } - -#ifdef CONFIG_ARCH_OMAP16XX - /* block 2 is on newer chips, and has many pinout options */ - if (mmc_conf->mmc[1].enabled) { - if (!mmc_conf->mmc[1].nomux) { - omap_cfg_reg(Y8_1610_MMC2_CMD); - omap_cfg_reg(Y10_1610_MMC2_CLK); - omap_cfg_reg(R18_1610_MMC2_CLKIN); - omap_cfg_reg(W8_1610_MMC2_DAT0); - if (mmc_conf->mmc[1].wire4) { - omap_cfg_reg(V8_1610_MMC2_DAT1); - omap_cfg_reg(W15_1610_MMC2_DAT2); - omap_cfg_reg(R10_1610_MMC2_DAT3); - } - - /* These are needed for the level shifter */ - omap_cfg_reg(V9_1610_MMC2_CMDDIR); - omap_cfg_reg(V5_1610_MMC2_DATDIR0); - omap_cfg_reg(W19_1610_MMC2_DATDIR1); - } - - /* Feedback clock must be set on OMAP-1710 MMC2 */ - if (cpu_is_omap1710()) - omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), - MOD_CONF_CTRL_1); - } -#endif -} - -static void __init omap_init_mmc(void) +/* + * Register MMC devices. Called from mach-omap1 and mach-omap2 device init. + */ +void omap_init_mmc(struct omap_mmc_platform_data *info, + struct platform_device *pdev1, struct platform_device *pdev2) { - const struct omap_mmc_config *mmc_conf; - - /* NOTE: assumes MMC was never (wrongly) enabled */ - mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config); - if (!mmc_conf) + if (!info) return; - omap_init_mmc_conf(mmc_conf); - - if (mmc_conf->mmc[0].enabled) { - mmc1_data.conf = mmc_conf->mmc[0]; - (void) platform_device_register(&mmc_omap_device1); - } - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ - defined(CONFIG_ARCH_OMAP34XX) - if (mmc_conf->mmc[1].enabled) { - mmc2_data.conf = mmc_conf->mmc[1]; - (void) platform_device_register(&mmc_omap_device2); - } -#endif -} + if (info->slots[0].enabled && pdev1) + (void) platform_device_register(pdev1); -void omap_set_mmc_info(int host, const struct omap_mmc_platform_data *info) -{ - switch (host) { - case 1: - mmc1_data = *info; - break; -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ - defined(CONFIG_ARCH_OMAP34XX) - case 2: - mmc2_data = *info; - break; -#endif - default: - BUG(); - } + if (info->slots[1].enabled && pdev2) + (void) platform_device_register(pdev2); } -#else -static inline void omap_init_mmc(void) {} -void omap_set_mmc_info(int host, const struct omap_mmc_platform_data *info) {} #endif /*-------------------------------------------------------------------------*/ @@ -545,7 +354,6 @@ static int __init omap_init_devices(void) */ omap_init_dsp(); omap_init_kp(); - omap_init_mmc(); omap_init_uwire(); omap_init_wdt(); omap_init_rng(); diff --git a/arch/arm/plat-omap/include/mach/board.h b/arch/arm/plat-omap/include/mach/board.h index a1a66ac8576..2ba5e5dffad 100644 --- a/arch/arm/plat-omap/include/mach/board.h +++ b/arch/arm/plat-omap/include/mach/board.h @@ -16,7 +16,6 @@ /* Different peripheral ids */ #define OMAP_TAG_CLOCK 0x4f01 -#define OMAP_TAG_MMC 0x4f02 #define OMAP_TAG_SERIAL_CONSOLE 0x4f03 #define OMAP_TAG_USB 0x4f04 #define OMAP_TAG_LCD 0x4f05 @@ -38,27 +37,6 @@ struct omap_clock_config { u8 system_clock_type; }; -struct omap_mmc_conf { - unsigned enabled:1; - /* nomux means "standard" muxing is wrong on this board, and that - * board-specific code handled it before common init logic. - */ - unsigned nomux:1; - /* switch pin can be for card detect (default) or card cover */ - unsigned cover:1; - /* 4 wire signaling is optional, and is only used for SD/SDIO */ - unsigned wire4:1; - /* use the internal clock */ - unsigned internal_clock:1; - s16 power_pin; - s16 switch_pin; - s16 wp_pin; -}; - -struct omap_mmc_config { - struct omap_mmc_conf mmc[2]; -}; - struct omap_serial_console_config { u8 console_uart; u32 console_speed; diff --git a/arch/arm/plat-omap/include/mach/mmc.h b/arch/arm/plat-omap/include/mach/mmc.h index c4830153a4f..af391e6a16d 100644 --- a/arch/arm/plat-omap/include/mach/mmc.h +++ b/arch/arm/plat-omap/include/mach/mmc.h @@ -20,7 +20,6 @@ #define OMAP_MMC_MAX_SLOTS 2 struct omap_mmc_platform_data { - struct omap_mmc_conf conf; /* number of slots on board */ unsigned nr_slots:2; @@ -42,6 +41,27 @@ struct omap_mmc_platform_data { int (*resume)(struct device *dev, int slot); struct omap_mmc_slot_data { + + unsigned enabled:1; + + /* + * nomux means "standard" muxing is wrong on this board, and + * that board-specific code handled it before common init logic. + */ + unsigned nomux:1; + + /* switch pin can be for card detect (default) or card cover */ + unsigned cover:1; + + /* 4 wire signaling is optional, and is only used for SD/SDIO */ + unsigned wire4:1; + + /* use the internal clock */ + unsigned internal_clock:1; + s16 power_pin; + s16 switch_pin; + s16 wp_pin; + int (* set_bus_mode)(struct device *dev, int slot, int bus_mode); int (* set_power)(struct device *dev, int slot, int power_on, int vdd); int (* get_ro)(struct device *dev, int slot); @@ -66,11 +86,28 @@ struct omap_mmc_platform_data { } slots[OMAP_MMC_MAX_SLOTS]; }; -extern void omap_set_mmc_info(int host, const struct omap_mmc_platform_data *info); - /* called from board-specific card detection service routine */ extern void omap_mmc_notify_cover_event(struct device *dev, int slot, int is_closed); +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ + defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) +void omap1_init_mmc(struct omap_mmc_platform_data *info); +void omap2_init_mmc(struct omap_mmc_platform_data *info); +void omap_init_mmc(struct omap_mmc_platform_data *info, + struct platform_device *pdev1, struct platform_device *pdev2); +#else +static inline void omap1_init_mmc(struct omap_mmc_platform_data *info) +{ +} +static inline void omap2_init_mmc(struct omap_mmc_platform_data *info) +{ +} +static inline void omap_init_mmc(struct omap_mmc_platform_data *info, + struct platform_device *pdev1, struct platform_device *pdev2) +{ +} +#endif + #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) void __init hsmmc_init(void); #endif diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 1b9fc3c6b87..608829423c2 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -1317,7 +1317,7 @@ static int __init mmc_omap_new_slot(struct mmc_omap_host *host, int id) host->slots[id] = slot; mmc->caps = 0; - if (host->pdata->conf.wire4) + if (host->pdata->slots[id].wire4) mmc->caps |= MMC_CAP_4_BIT_DATA; mmc->ops = &mmc_omap_ops; diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index dc8a13950ee..997f0dccd42 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -881,7 +881,7 @@ static int __init omap_mmc_probe(struct platform_device *pdev) mmc->ocr_avail = mmc_slot(host).ocr_mask; mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; - if (pdata->conf.wire4) + if (pdata->slots[host->slot_id].wire4) mmc->caps |= MMC_CAP_4_BIT_DATA; /* Only MMC1 supports 3.0V */ -- 2.41.1