Commit 5716fb9b authored by Linus Walleij's avatar Linus Walleij Committed by Ulf Hansson
Browse files

mmc: spi: Convert to use GPIO descriptors



Switch the SPI MMC driver to use GPIO descriptors internally
and just look those up using the standard slot GPIO
functions mmc_gpiod_request_cd() and mmc_gpiod_request_ro().
Make sure to request index 0 and 1 in accordance with the
SPI MMC DT binding, and add the same GPIOs in machine
descriptor tables on all boards that use SPI MMC in
board files.

The lines are flagged as GPIO_ACTIVE_[LOW|HIGH] as that is
what they are, and since we can now rely on the descriptors
to have the right polarity, we set the
"override_active_level" to false in mmc_gpiod_request_cd()
and mmc_gpiod_request_ro().

Cc: Hartley Sweeten <hsweeten@visionengravers.com> # Vision EP9307
Cc: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent b0d06f1c
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <linux/platform_data/video-ep93xx.h>
#include <linux/platform_data/spi-ep93xx.h>
#include <linux/gpio.h>
#include <linux/gpio/machine.h>

#include <mach/hardware.h>
#include <mach/gpio-ep93xx.h>
@@ -45,9 +46,15 @@ static struct ep93xxfb_mach_info __initdata simone_fb_info = {
static struct mmc_spi_platform_data simone_mmc_spi_data = {
	.detect_delay	= 500,
	.ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
	.flags		= MMC_SPI_USE_CD_GPIO,
	.cd_gpio	= EP93XX_GPIO_LINE_EGPIO0,
	.cd_debounce	= 1,
};

static struct gpiod_lookup_table simone_mmc_spi_gpio_table = {
	.dev_id = "mmc_spi.0", /* "mmc_spi" @ CS0 */
	.table = {
		/* Card detect */
		GPIO_LOOKUP_IDX("A", 0, NULL, 0, GPIO_ACTIVE_LOW),
		{ },
	},
};

static struct spi_board_info simone_spi_devices[] __initdata = {
@@ -105,6 +112,7 @@ static void __init simone_init_machine(void)
	ep93xx_register_fb(&simone_fb_info);
	ep93xx_register_i2c(simone_i2c_board_info,
			    ARRAY_SIZE(simone_i2c_board_info));
	gpiod_add_lookup_table(&simone_mmc_spi_gpio_table);
	ep93xx_register_spi(&simone_spi_info, simone_spi_devices,
			    ARRAY_SIZE(simone_spi_devices));
	simone_register_audio();
+13 −4
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/gpio/machine.h>
#include <linux/fb.h>
#include <linux/io.h>
#include <linux/mtd/partitions.h>
@@ -202,13 +203,20 @@ static struct mmc_spi_platform_data vision_spi_mmc_data = {
	.detect_delay	= 100,
	.powerup_msecs	= 100,
	.ocr_mask	= MMC_VDD_32_33 | MMC_VDD_33_34,
	.flags		= MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO,
	.cd_gpio	= EP93XX_GPIO_LINE_EGPIO15,
	.cd_debounce	= 1,
	.ro_gpio	= EP93XX_GPIO_LINE_F(0),
	.caps2		= MMC_CAP2_RO_ACTIVE_HIGH,
};

static struct gpiod_lookup_table vision_spi_mmc_gpio_table = {
	.dev_id = "mmc_spi.2", /* "mmc_spi @ CS2 */
	.table = {
		/* Card detect */
		GPIO_LOOKUP_IDX("B", 7, NULL, 0, GPIO_ACTIVE_LOW),
		/* Write protect */
		GPIO_LOOKUP_IDX("F", 0, NULL, 1, GPIO_ACTIVE_HIGH),
		{ },
	},
};

/*************************************************************************
 * SPI Bus
 *************************************************************************/
@@ -286,6 +294,7 @@ static void __init vision_init_machine(void)

	ep93xx_register_i2c(vision_i2c_info,
				ARRAY_SIZE(vision_i2c_info));
	gpiod_add_lookup_table(&vision_spi_mmc_gpio_table);
	ep93xx_register_spi(&vision_spi_master, vision_spi_board_info,
				ARRAY_SIZE(vision_spi_board_info));
	vision_register_i2s();
+14 −3
Original line number Diff line number Diff line
@@ -776,9 +776,19 @@ static struct mmc_spi_platform_data mmc_spi_info = {
	.caps2 = MMC_CAP2_RO_ACTIVE_HIGH,
	.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */
	.setpower = mmc_spi_setpower,
	.flags = MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO,
	.cd_gpio = GPIO_PTY7,
	.ro_gpio = GPIO_PTY6,
};

static struct gpiod_lookup_table mmc_spi_gpio_table = {
	.dev_id = "mmc_spi.0", /* device "mmc_spi" @ CS0 */
	.table = {
		/* Card detect */
		GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY7, NULL, 0,
				GPIO_ACTIVE_LOW),
		/* Write protect */
		GPIO_LOOKUP_IDX("sh7724_pfc", GPIO_PTY6, NULL, 1,
				GPIO_ACTIVE_HIGH),
		{ },
	},
};

static struct spi_board_info spi_bus[] = {
@@ -1282,6 +1292,7 @@ static int __init arch_setup(void)
	gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
	gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */

	gpiod_add_lookup_table(&mmc_spi_gpio_table);
	spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
#endif

+15 −12
Original line number Diff line number Diff line
@@ -1434,13 +1434,16 @@ static int mmc_spi_probe(struct spi_device *spi)
	if (status != 0)
		goto fail_add_host;

	if (host->pdata && host->pdata->flags & MMC_SPI_USE_CD_GPIO) {
		status = mmc_gpio_request_cd(mmc, host->pdata->cd_gpio,
					     host->pdata->cd_debounce);
		if (status != 0)
	/*
	 * Index 0 is card detect
	 * Old boardfiles were specifying 1 ms as debounce
	 */
	status = mmc_gpiod_request_cd(mmc, NULL, 0, false, 1, NULL);
	if (status == -EPROBE_DEFER)
		goto fail_add_host;

		/* The platform has a CD GPIO signal that may support
	if (!status) {
		/*
		 * The platform has a CD GPIO signal that may support
		 * interrupts, so let mmc_gpiod_request_cd_irq() decide
		 * if polling is needed or not.
		 */
@@ -1448,12 +1451,12 @@ static int mmc_spi_probe(struct spi_device *spi)
		mmc_gpiod_request_cd_irq(mmc);
	}

	if (host->pdata && host->pdata->flags & MMC_SPI_USE_RO_GPIO) {
		has_ro = true;
		status = mmc_gpio_request_ro(mmc, host->pdata->ro_gpio);
		if (status != 0)
	/* Index 1 is write protect/read only */
	status = mmc_gpiod_request_ro(mmc, NULL, 1, false, 0, NULL);
	if (status == -EPROBE_DEFER)
		goto fail_add_host;
	}
	if (!status)
		has_ro = true;

	dev_info(&spi->dev, "SD/MMC host %s%s%s%s%s\n",
			dev_name(&mmc->class_dev),
+0 −34
Original line number Diff line number Diff line
@@ -16,9 +16,7 @@
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/spi/spi.h>
#include <linux/spi/mmc_spi.h>
@@ -32,15 +30,7 @@

MODULE_LICENSE("GPL");

enum {
	CD_GPIO = 0,
	WP_GPIO,
	NUM_GPIOS,
};

struct of_mmc_spi {
	int gpios[NUM_GPIOS];
	bool alow_gpios[NUM_GPIOS];
	int detect_irq;
	struct mmc_spi_platform_data pdata;
};
@@ -102,30 +92,6 @@ struct mmc_spi_platform_data *mmc_spi_get_pdata(struct spi_device *spi)
		oms->pdata.ocr_mask |= mask;
	}

	for (i = 0; i < ARRAY_SIZE(oms->gpios); i++) {
		enum of_gpio_flags gpio_flags;

		oms->gpios[i] = of_get_gpio_flags(np, i, &gpio_flags);
		if (!gpio_is_valid(oms->gpios[i]))
			continue;

		if (gpio_flags & OF_GPIO_ACTIVE_LOW)
			oms->alow_gpios[i] = true;
	}

	if (gpio_is_valid(oms->gpios[CD_GPIO])) {
		oms->pdata.cd_gpio = oms->gpios[CD_GPIO];
		oms->pdata.flags |= MMC_SPI_USE_CD_GPIO;
		if (!oms->alow_gpios[CD_GPIO])
			oms->pdata.caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
	}
	if (gpio_is_valid(oms->gpios[WP_GPIO])) {
		oms->pdata.ro_gpio = oms->gpios[WP_GPIO];
		oms->pdata.flags |= MMC_SPI_USE_RO_GPIO;
		if (!oms->alow_gpios[WP_GPIO])
			oms->pdata.caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
	}

	oms->detect_irq = irq_of_parse_and_map(np, 0);
	if (oms->detect_irq != 0) {
		oms->pdata.init = of_mmc_spi_init;
Loading