d88746652b
This will simplify the MMC low-level init, and make it more flexible to add support for a newer MMC controller in the following patches. The patch rearranges platform data and gets rid of slot vs controller confusion in the old data structures. Also fix device id numbering in the clock code. Some code snippets are based on an earlier patch by Russell King <linux@arm.linux.org.uk>. Cc: Pierre Ossman <drzeus-mmc@drzeus.cx> Signed-off-by: Tony Lindgren <tony@atomide.com>
66 lines
1.5 KiB
C
66 lines
1.5 KiB
C
/*
|
|
* linux/arch/arm/mach-omap1/board-sx1-mmc.c
|
|
*
|
|
* Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
|
|
* Author: Carlos Eduardo Aguiar <carlos.aguiar@indt.org.br>
|
|
*
|
|
* This code is based on linux/arch/arm/mach-omap1/board-h2-mmc.c, which is:
|
|
* Copyright (C) 2007 Instituto Nokia de Tecnologia - INdT
|
|
*
|
|
* 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 <linux/platform_device.h>
|
|
|
|
#include <mach/hardware.h>
|
|
#include <mach/mmc.h>
|
|
#include <mach/gpio.h>
|
|
|
|
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
|
|
|
static int mmc_set_power(struct device *dev, int slot, int power_on,
|
|
int vdd)
|
|
{
|
|
int err;
|
|
u8 dat = 0;
|
|
|
|
err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
|
|
if (err < 0)
|
|
return err;
|
|
|
|
if (power_on)
|
|
dat |= SOFIA_MMC_POWER;
|
|
else
|
|
dat &= ~SOFIA_MMC_POWER;
|
|
|
|
return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
|
|
}
|
|
|
|
/* Cover switch is at OMAP_MPUIO(3) */
|
|
static struct omap_mmc_platform_data mmc1_data = {
|
|
.nr_slots = 1,
|
|
.slots[0] = {
|
|
.set_power = mmc_set_power,
|
|
.ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 |
|
|
MMC_VDD_32_33 | MMC_VDD_33_34,
|
|
.name = "mmcblk",
|
|
},
|
|
};
|
|
|
|
static struct omap_mmc_platform_data *mmc_data[OMAP15XX_NR_MMC];
|
|
|
|
void __init sx1_mmc_init(void)
|
|
{
|
|
mmc_data[0] = &mmc1_data;
|
|
omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);
|
|
}
|
|
|
|
#else
|
|
|
|
void __init sx1_mmc_init(void)
|
|
{
|
|
}
|
|
|
|
#endif
|