diff options
author | Philipp Zabel <philipp.zabel@gmail.com> | 2008-04-09 19:24:55 +0100 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-04-19 11:29:07 +0100 |
commit | bdb0c16acb51b7bf15d626848f287691ef39dbe8 (patch) | |
tree | 52e333deb09d45eedd96723e39794c1c81f353e1 | |
parent | aa7975901b949501d47af8225f23bee1116cd441 (diff) |
[ARM] 4950/1: magician: enable MMC support
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/configs/magician_defconfig | 16 | ||||
-rw-r--r-- | arch/arm/mach-pxa/magician.c | 40 |
2 files changed, 55 insertions, 1 deletions
diff --git a/arch/arm/configs/magician_defconfig b/arch/arm/configs/magician_defconfig index b9b234bdb36..b35958b50c6 100644 --- a/arch/arm/configs/magician_defconfig +++ b/arch/arm/configs/magician_defconfig @@ -836,7 +836,21 @@ CONFIG_SND_PXA2XX_SOC=m # CONFIG_HID_SUPPORT is not set CONFIG_HID=m # CONFIG_USB_SUPPORT is not set -# CONFIG_MMC is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +CONFIG_SDIO_UART=m + +# +# MMC/SD Host Controller Drivers +# +CONFIG_MMC_PXA=y # CONFIG_NEW_LEDS is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index 159f6dc4543..a931c384d49 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c @@ -31,6 +31,7 @@ #include <asm/arch/pxa-regs.h> #include <asm/arch/pxafb.h> #include <asm/arch/i2c.h> +#include <asm/arch/mmc.h> #include <asm/arch/irda.h> #include <asm/arch/ohci.h> @@ -202,6 +203,44 @@ static struct platform_device backlight = { /* + * MMC/SD + */ + +static int magician_mci_init(struct device *dev, + irq_handler_t detect_irq, void *data) +{ + return request_irq(IRQ_MAGICIAN_SD, detect_irq, + IRQF_DISABLED | IRQF_SAMPLE_RANDOM, + "MMC card detect", data); +} + +static void magician_mci_setpower(struct device *dev, unsigned int vdd) +{ + struct pxamci_platform_data *pdata = dev->platform_data; + + gpio_set_value(EGPIO_MAGICIAN_SD_POWER, (1 << vdd) & pdata->ocr_mask); +} + +static int magician_mci_get_ro(struct device *dev) +{ + return (!gpio_get_value(EGPIO_MAGICIAN_nSD_READONLY)); +} + +static void magician_mci_exit(struct device *dev, void *data) +{ + free_irq(IRQ_MAGICIAN_SD, data); +} + +static struct pxamci_platform_data magician_mci_info = { + .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, + .init = magician_mci_init, + .get_ro = magician_mci_get_ro, + .setpower = magician_mci_setpower, + .exit = magician_mci_exit, +}; + + +/* * USB OHCI */ @@ -267,6 +306,7 @@ static void __init magician_init(void) { platform_add_devices(devices, ARRAY_SIZE(devices)); pxa_set_i2c_info(NULL); + pxa_set_mci_info(&magician_mci_info); pxa_set_ohci_info(&magician_ohci_info); pxa_set_ficp_info(&magician_ficp_info); set_pxa_fb_info(&toppoly_info); |