Adds mmc multislot support for Nokia 770 machines. Without this, I can't use the MMC slot at all. Also, I had to hardcode some GPIO pin values as it's not really easy to use the ones from the OMAP_TAG_MMC ATAG in places like the set_power() hook. Signed-off-by: Arnaud Patard <arnaud.patard@xxxxxxxxxxx> ---
--- arch/arm/mach-omap1/Makefile | 2 1 + 1 - 0 ! arch/arm/mach-omap1/board-nokia770-mmc.c | 105 105 + 0 - 0 ! arch/arm/mach-omap1/board-nokia770.c | 18 18 + 0 - 0 ! include/asm-arm/arch-omap/board-nokia.h | 2 2 + 0 - 0 ! 4 files changed, 126 insertions(+), 1 deletion(-) Index: kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/board-nokia770.c =================================================================== --- kernel-source-rx-34-2.6.21.0.orig/arch/arm/mach-omap1/board-nokia770.c 2007-12-02 15:23:38.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/board-nokia770.c 2007-12-02 20:55:04.000000000 +0100 @@ -40,6 +40,7 @@ #include "../plat-omap/dsp/dsp_common.h" #define ADS7846_PENDOWN_GPIO 15 +#define N770_COVER_GPIO 23 static void __init omap_nokia770_init_irq(void) { @@ -239,6 +240,19 @@ static struct omap_board_config_kernel n { OMAP_TAG_MMC, &nokia770_mmc_config }, }; +static struct omap_gpio_switch nokia770_gpio_switches[] __initdata = { + { + .name = "mmc_slot", + .gpio = N770_COVER_GPIO, + .type = OMAP_GPIO_SWITCH_TYPE_COVER, + .flags = OMAP_GPIO_SWITCH_FLAG_INVERTED, + .debounce_rising = 100, + .debounce_falling = 0, + .notify = nokia770_mmc_slot_cover_handler, + .notify_data = NULL, + }, +}; + #if defined(CONFIG_OMAP_DSP) /* * audio power control @@ -362,6 +376,8 @@ static __init int omap_dsp_init(void) } #endif /* CONFIG_OMAP_DSP */ +extern void __init nokia770_mmc_init(void); + static void __init omap_nokia770_init(void) { nokia770_config[0].data = &nokia770_usb_config; @@ -377,6 +393,8 @@ static void __init omap_nokia770_init(vo hwa742_dev_init(); ads7846_dev_init(); mipid_dev_init(); + nokia770_mmc_init(); + omap_register_gpio_switches(nokia770_gpio_switches,ARRAY_SIZE(nokia770_gpio_switches)); } static void __init omap_nokia770_map_io(void) Index: kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/board-nokia770-mmc.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/board-nokia770-mmc.c 2007-12-02 21:42:31.000000000 +0100 @@ -0,0 +1,105 @@ +/* + * arch/arm/mach-omap1/board-nokia770-mmc.c + * + * Arnaud Patard <arnaud.patard@xxxxxxxxxxx> + * + * Based on arch/arm/mach-omap1/board-h2-mmc.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <asm/arch/mmc.h> +#include <asm/arch/gpio.h> + +/* having to hardcode it while it's in the TAG information is quite bad */ +#define N770_POWER_PIN 41 + +#ifdef CONFIG_MMC_OMAP +static int slot_cover_open; +static struct device *mmc_device; + +static int nokia770_mmc_set_power(struct device *dev, int slot, int power_on, + int vdd) +{ +#ifdef CONFIG_MMC_DEBUG + dev_dbg(dev, "Set slot %d power: %s (vdd %d)\n", slot + 1, + power_on ? "on" : "off", vdd); +#endif + if (slot != 0) { + dev_err(dev, "No such slot %d\n", slot + 1); + return -ENODEV; + } + if (power_on) + omap_set_gpio_dataout(N770_POWER_PIN, 1); + else + omap_set_gpio_dataout(N770_POWER_PIN, 0); + + return 0; +} + +static int nokia770_mmc_get_cover_state(struct device *dev, int slot) +{ + BUG_ON(slot != 0); + + return slot_cover_open; +} + +void nokia770_mmc_slot_cover_handler(void *arg, int state) +{ + if (mmc_device == NULL) + return; + + slot_cover_open = state; + omap_mmc_notify_cover_event(mmc_device, 0, state); +} + +static int nokia770_mmc_late_init(struct device *dev) +{ + int ret = 0; + + mmc_device = dev; + + return ret; +} + +static void nokia770_mmc_cleanup(struct device *dev) +{ +} + +static struct omap_mmc_platform_data nokia770_mmc_data = { + .nr_slots = 1, + .switch_slot = NULL, + .init = nokia770_mmc_late_init, + .cleanup = nokia770_mmc_cleanup, + .slots[0] = { + .set_power = nokia770_mmc_set_power, + .set_bus_mode = NULL, + .get_ro = NULL, + .get_cover_state = nokia770_mmc_get_cover_state, + .ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 | + MMC_VDD_32_33 | MMC_VDD_33_34, + .name = "external", + }, +}; + +void __init nokia770_mmc_init(void) +{ + omap_set_mmc_info(2, &nokia770_mmc_data); + if (omap_request_gpio(N770_POWER_PIN) < 0) + WARN_ON("can't request mmc power pin !"); + omap_set_gpio_dataout(N770_POWER_PIN, 0); + omap_set_gpio_direction(N770_POWER_PIN, 0); +} + +#else + +void __init nokia770_mmc_init(void) +{ +} + +void nokia770_mmc_slot_cover_handler(void *arg, int state) +{ +} +#endif Index: kernel-source-rx-34-2.6.21.0/include/asm-arm/arch-omap/board-nokia.h =================================================================== --- kernel-source-rx-34-2.6.21.0.orig/include/asm-arm/arch-omap/board-nokia.h 2007-12-02 15:23:38.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/include/asm-arm/arch-omap/board-nokia.h 2007-12-02 15:48:47.000000000 +0100 @@ -24,6 +24,8 @@ extern int n800_audio_enable(struct dsp_ extern int n800_audio_disable(struct dsp_kfunc_device *kdev, int stage); extern void n800_mmc_slot1_cover_handler(void *arg, int state); +extern void nokia770_mmc_slot_cover_handler(void *arg, int state); + #define OMAP_TAG_NOKIA_BT 0x4e01 #define OMAP_TAG_WLAN_CX3110X 0x4e02 #define OMAP_TAG_CBUS 0x4e03 Index: kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/Makefile =================================================================== --- kernel-source-rx-34-2.6.21.0.orig/arch/arm/mach-omap1/Makefile 2007-11-29 00:03:29.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/arch/arm/mach-omap1/Makefile 2007-12-02 20:52:07.000000000 +0100 @@ -30,7 +30,7 @@ obj-$(CONFIG_MACH_VOICEBLUE) += board-v obj-$(CONFIG_MACH_OMAP_PALMTE) += board-palmte.o obj-$(CONFIG_MACH_OMAP_PALMZ71) += board-palmz71.o obj-$(CONFIG_MACH_OMAP_PALMTT) += board-palmtt.o -obj-$(CONFIG_MACH_NOKIA770) += board-nokia770.o +obj-$(CONFIG_MACH_NOKIA770) += board-nokia770.o board-nokia770-mmc.o obj-$(CONFIG_MACH_AMS_DELTA) += board-ams-delta.o obj-$(CONFIG_MACH_SX1) += board-sx1.o