Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cd434833 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

Merge branch 'hsmmc-init' of...

parents 7e1548a5 917fa280
Loading
Loading
Loading
Loading
+32 −57
Original line number Diff line number Diff line
@@ -12,90 +12,68 @@
 * published by the Free Software Foundation.
 */

#include <linux/platform_device.h>

#include <linux/i2c/tps65010.h>

#include <mach/mmc.h>
#include <mach/gpio.h>

#ifdef CONFIG_MMC_OMAP
static int slot_cover_open;
static struct device *mmc_device;
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)

static int h2_mmc_set_power(struct device *dev, int slot, int power_on,
static int 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;
	}

	return 0;
}

static int h2_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
{
#ifdef CONFIG_MMC_DEBUG
	dev_dbg(dev, "Set slot %d bus_mode %s\n", slot + 1,
		bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
#endif
	if (slot != 0) {
		dev_err(dev, "No such slot %d\n", slot + 1);
		return -ENODEV;
	}
	if (power_on)
		gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 1);
	else
		gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);

	return 0;
}

static int h2_mmc_get_cover_state(struct device *dev, int slot)
{
	BUG_ON(slot != 0);

	return slot_cover_open;
}

void h2_mmc_slot_cover_handler(void *arg, int state)
static int mmc_late_init(struct device *dev)
{
	if (mmc_device == NULL)
		return;
	int ret;

	slot_cover_open = state;
	omap_mmc_notify_cover_event(mmc_device, 0, state);
}

static int h2_mmc_late_init(struct device *dev)
{
	int ret = 0;
	ret = gpio_request(H2_TPS_GPIO_MMC_PWR_EN, "MMC power");
	if (ret < 0)
		return ret;

	mmc_device = dev;
	gpio_direction_output(H2_TPS_GPIO_MMC_PWR_EN, 0);

	return ret;
}

static void h2_mmc_cleanup(struct device *dev)
static void mmc_shutdown(struct device *dev)
{
	gpio_free(H2_TPS_GPIO_MMC_PWR_EN);
}

static struct omap_mmc_platform_data h2_mmc_data = {
/*
 * H2 could use the following functions tested:
 * - mmc_get_cover_state that uses OMAP_MPUIO(1)
 * - mmc_get_wp that uses OMAP_MPUIO(3)
 */
static struct omap_mmc_platform_data mmc1_data = {
	.nr_slots                       = 1,
	.switch_slot                    = NULL,
	.init                           = h2_mmc_late_init,
	.cleanup                        = h2_mmc_cleanup,
	.init				= mmc_late_init,
	.shutdown			= mmc_shutdown,
	.dma_mask			= 0xffffffff,
	.slots[0]       = {
		.set_power              = h2_mmc_set_power,
		.set_bus_mode           = h2_mmc_set_bus_mode,
		.get_ro                 = NULL,
		.get_cover_state        = h2_mmc_get_cover_state,
		.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[OMAP16XX_NR_MMC];

void __init h2_mmc_init(void)
{
	omap_set_mmc_info(1, &h2_mmc_data);
	mmc_data[0] = &mmc1_data;
	omap1_init_mmc(mmc_data, OMAP16XX_NR_MMC);
}

#else
@@ -104,7 +82,4 @@ void __init h2_mmc_init(void)
{
}

void h2_mmc_slot_cover_handler(void *arg, int state)
{
}
#endif
+15 −10
Original line number Diff line number Diff line
@@ -345,10 +345,25 @@ static void __init h2_init_smc91x(void)
	}
}

static int tps_setup(struct i2c_client *client, void *context)
{
	tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V |
				TPS_LDO1_ENABLE | TPS_VLDO1_3_0V);

	return 0;
}

static struct tps65010_board tps_board = {
	.base		= H2_TPS_GPIO_BASE,
	.outmask	= 0x0f,
	.setup		= tps_setup,
};

static struct i2c_board_info __initdata h2_i2c_board_info[] = {
	{
		I2C_BOARD_INFO("tps65010", 0x48),
		.irq            = OMAP_GPIO_IRQ(58),
		.platform_data	= &tps_board,
	}, {
		I2C_BOARD_INFO("isp1301_omap", 0x2d),
		.irq		= OMAP_GPIO_IRQ(2),
@@ -378,15 +393,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)),
};
@@ -397,7 +403,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 },
};
+29 −71
Original line number Diff line number Diff line
@@ -12,94 +12,55 @@
 * published by the Free Software Foundation.
 */

#include <linux/platform_device.h>

#include <linux/i2c/tps65010.h>

#include <mach/mmc.h>
#include <mach/gpio.h>

#ifdef CONFIG_MMC_OMAP
static int slot_cover_open;
static struct device *mmc_device;
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)

static int h3_mmc_set_power(struct device *dev, int slot, int power_on,
static int 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)
		gpio_direction_output(H3_TPS_GPIO_MMC_PWR_EN, 1);
	else
		gpio_direction_output(H3_TPS_GPIO_MMC_PWR_EN, 0);

	return 0;
}

static int h3_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
{
	int ret = 0;

#ifdef CONFIG_MMC_DEBUG
	dev_dbg(dev, "Set slot %d bus_mode %s\n", slot + 1,
		bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
#endif
	if (slot != 0) {
		dev_err(dev, "No such slot %d\n", slot + 1);
		return -ENODEV;
	}

	/* Treated on upper level */

	return bus_mode;
}

static int h3_mmc_get_cover_state(struct device *dev, int slot)
{
	BUG_ON(slot != 0);

	return slot_cover_open;
}

void h3_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 h3_mmc_late_init(struct device *dev)
{
	int ret = 0;

	mmc_device = dev;

	return ret;
}

static void h3_mmc_cleanup(struct device *dev)
{
}

static struct omap_mmc_platform_data h3_mmc_data = {
/*
 * H3 could use the following functions tested:
 * - mmc_get_cover_state that uses OMAP_MPUIO(1)
 * - mmc_get_wp that maybe uses OMAP_MPUIO(3)
 */
static struct omap_mmc_platform_data mmc1_data = {
	.nr_slots                       = 1,
	.switch_slot                    = NULL,
	.init                           = h3_mmc_late_init,
	.cleanup                        = h3_mmc_cleanup,
	.dma_mask			= 0xffffffff,
	.slots[0]       = {
		.set_power              = h3_mmc_set_power,
		.set_bus_mode           = h3_mmc_set_bus_mode,
		.get_ro                 = NULL,
		.get_cover_state        = h3_mmc_get_cover_state,
		.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[OMAP16XX_NR_MMC];

void __init h3_mmc_init(void)
{
	omap_set_mmc_info(1, &h3_mmc_data);
	int ret;

	ret = gpio_request(H3_TPS_GPIO_MMC_PWR_EN, "MMC power");
	if (ret < 0)
		return;
	gpio_direction_output(H3_TPS_GPIO_MMC_PWR_EN, 0);

	mmc_data[0] = &mmc1_data;
	omap1_init_mmc(mmc_data, OMAP16XX_NR_MMC);
}

#else
@@ -108,7 +69,4 @@ void __init h3_mmc_init(void)
{
}

void h3_mmc_slot_cover_handler(void *arg, int state)
{
}
#endif
+0 −10
Original line number Diff line number Diff line
@@ -447,15 +447,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)),
};
@@ -466,7 +457,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 },
};
+42 −8
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
#include <mach/common.h>
#include <mach/mcbsp.h>
#include <mach/omap-alsa.h>
#include <mach/mmc.h>

static int innovator_keymap[] = {
	KEY(0, 0, KEY_F1),
@@ -360,16 +361,49 @@ 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 */
#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)
{
	if (power_on)
		fpga_write(fpga_read(OMAP1510_FPGA_POWER) | (1 << 3),
				OMAP1510_FPGA_POWER);
	else
		fpga_write(fpga_read(OMAP1510_FPGA_POWER) & ~(1 << 3),
				OMAP1510_FPGA_POWER);

	return 0;
}

/*
 * Innovator could use the following functions tested:
 * - mmc_get_wp that uses OMAP_MPUIO(3)
 * - mmc_get_cover_state that uses FPGA F4 UIO43
 */
static struct omap_mmc_platform_data mmc1_data = {
	.nr_slots                       = 1,
	.slots[0]       = {
		.set_power		= mmc_set_power,
		.wires			= 4,
		.name                   = "mmcblk",
	},
};

static struct omap_mmc_platform_data *mmc_data[OMAP16XX_NR_MMC];

void __init innovator_mmc_init(void)
{
	mmc_data[0] = &mmc1_data;
	omap1_init_mmc(mmc_data, OMAP15XX_NR_MMC);
}

#else
static inline void innovator_mmc_init(void)
{
}
#endif

static struct omap_uart_config innovator_uart_config __initdata = {
	.enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
};
@@ -377,7 +411,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 +445,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);
	innovator_mmc_init();
}

static void __init innovator_map_io(void)
Loading