mirror of https://gitee.com/openkylin/linux.git
mmc: s3cmci: Use the slot GPIO descriptor
Simplify things by making the S3CMCI driver just use slot GPIO with descriptors instead of passing around the global GPIO numbers that we want to get rid of. Getting the names of the GPIO chips into the machine descriptor tables was a bit of a challenge but I think I have them right. The platform data supports passing in inversion flags, but no platform is using them, and it is highly unlikely that we will add more, so drop them. The long term plan is to let the inversion flags on the GPIO machine descriptor do the job. 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: Jaehoon Chung <jh80.chung@samsung.com> Cc: Sylwester Nawrocki <s.nawrocki@samsung.com> Cc: Sergio Prado <sergio.prado@e-labworks.com> Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
faed930306
commit
d2951dfa07
|
@ -9,7 +9,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/timer.h>
|
||||
|
@ -136,7 +136,16 @@ static struct platform_device at2440evb_device_eth = {
|
|||
};
|
||||
|
||||
static struct s3c24xx_mci_pdata at2440evb_mci_pdata __initdata = {
|
||||
.gpio_detect = S3C2410_GPG(10),
|
||||
/* Intentionally left blank */
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table at2440evb_mci_gpio_table = {
|
||||
.dev_id = "s3c2410-sdi",
|
||||
.table = {
|
||||
/* Card detect S3C2410_GPG(10) */
|
||||
GPIO_LOOKUP("GPG", 10, "cd", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
/* 7" LCD panel */
|
||||
|
@ -200,6 +209,7 @@ static void __init at2440evb_init_time(void)
|
|||
static void __init at2440evb_init(void)
|
||||
{
|
||||
s3c24xx_fb_set_platdata(&at2440evb_fb_info);
|
||||
gpiod_add_lookup_table(&at2440evb_mci_gpio_table);
|
||||
s3c24xx_mci_set_platdata(&at2440evb_mci_pdata);
|
||||
s3c_nand_set_platdata(&at2440evb_nand_info);
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/pwm.h>
|
||||
|
@ -459,12 +460,21 @@ static void h1940_set_mmc_power(unsigned char power_mode, unsigned short vdd)
|
|||
}
|
||||
|
||||
static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = {
|
||||
.gpio_detect = S3C2410_GPF(5),
|
||||
.gpio_wprotect = S3C2410_GPH(8),
|
||||
.set_power = h1940_set_mmc_power,
|
||||
.ocr_avail = MMC_VDD_32_33,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table h1940_mmc_gpio_table = {
|
||||
.dev_id = "s3c2410-sdi",
|
||||
.table = {
|
||||
/* Card detect S3C2410_GPF(5) */
|
||||
GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW),
|
||||
/* Write protect S3C2410_GPH(8) */
|
||||
GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct pwm_lookup h1940_pwm_lookup[] = {
|
||||
PWM_LOOKUP("samsung-pwm", 0, "pwm-backlight", NULL, 36296,
|
||||
PWM_POLARITY_NORMAL),
|
||||
|
@ -680,6 +690,7 @@ static void __init h1940_init(void)
|
|||
u32 tmp;
|
||||
|
||||
s3c24xx_fb_set_platdata(&h1940_fb_info);
|
||||
gpiod_add_lookup_table(&h1940_mmc_gpio_table);
|
||||
s3c24xx_mci_set_platdata(&h1940_mmc_cfg);
|
||||
s3c24xx_udc_set_platdata(&h1940_udc_cfg);
|
||||
s3c24xx_ts_set_platdata(&h1940_ts_cfg);
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/serial_core.h>
|
||||
|
@ -234,13 +235,22 @@ static struct s3c2410fb_mach_info mini2440_fb_info __initdata = {
|
|||
/* MMC/SD */
|
||||
|
||||
static struct s3c24xx_mci_pdata mini2440_mmc_cfg __initdata = {
|
||||
.gpio_detect = S3C2410_GPG(8),
|
||||
.gpio_wprotect = S3C2410_GPH(8),
|
||||
.wprotect_invert = 1,
|
||||
.set_power = NULL,
|
||||
.ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table mini2440_mmc_gpio_table = {
|
||||
.dev_id = "s3c2410-sdi",
|
||||
.table = {
|
||||
/* Card detect S3C2410_GPG(8) */
|
||||
GPIO_LOOKUP("GPG", 8, "cd", GPIO_ACTIVE_LOW),
|
||||
/* Write protect S3C2410_GPH(8) */
|
||||
GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_HIGH),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
/* NAND Flash on MINI2440 board */
|
||||
|
||||
static struct mtd_partition mini2440_default_nand_part[] __initdata = {
|
||||
|
@ -696,6 +706,7 @@ static void __init mini2440_init(void)
|
|||
}
|
||||
|
||||
s3c24xx_udc_set_platdata(&mini2440_udc_cfg);
|
||||
gpiod_add_lookup_table(&mini2440_mmc_gpio_table);
|
||||
s3c24xx_mci_set_platdata(&mini2440_mmc_cfg);
|
||||
s3c_nand_set_platdata(&mini2440_nand_info);
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -350,12 +351,21 @@ static void n30_sdi_set_power(unsigned char power_mode, unsigned short vdd)
|
|||
}
|
||||
|
||||
static struct s3c24xx_mci_pdata n30_mci_cfg __initdata = {
|
||||
.gpio_detect = S3C2410_GPF(1),
|
||||
.gpio_wprotect = S3C2410_GPG(10),
|
||||
.ocr_avail = MMC_VDD_32_33,
|
||||
.set_power = n30_sdi_set_power,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table n30_mci_gpio_table = {
|
||||
.dev_id = "s3c2410-sdi",
|
||||
.table = {
|
||||
/* Card detect S3C2410_GPF(1) */
|
||||
GPIO_LOOKUP("GPF", 1, "cd", GPIO_ACTIVE_LOW),
|
||||
/* Write protect S3C2410_GPG(10) */
|
||||
GPIO_LOOKUP("GPG", 10, "wp", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *n30_devices[] __initdata = {
|
||||
&s3c_device_lcd,
|
||||
&s3c_device_wdt,
|
||||
|
@ -549,6 +559,7 @@ static void __init n30_init(void)
|
|||
|
||||
s3c24xx_fb_set_platdata(&n30_fb_info);
|
||||
s3c24xx_udc_set_platdata(&n30_udc_cfg);
|
||||
gpiod_add_lookup_table(&n30_mci_gpio_table);
|
||||
s3c24xx_mci_set_platdata(&n30_mci_cfg);
|
||||
s3c_i2c0_set_platdata(&n30_i2ccfg);
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/machine.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/serial_s3c.h>
|
||||
|
@ -558,12 +559,21 @@ static void rx1950_set_mmc_power(unsigned char power_mode, unsigned short vdd)
|
|||
}
|
||||
|
||||
static struct s3c24xx_mci_pdata rx1950_mmc_cfg __initdata = {
|
||||
.gpio_detect = S3C2410_GPF(5),
|
||||
.gpio_wprotect = S3C2410_GPH(8),
|
||||
.set_power = rx1950_set_mmc_power,
|
||||
.ocr_avail = MMC_VDD_32_33,
|
||||
};
|
||||
|
||||
static struct gpiod_lookup_table rx1950_mmc_gpio_table = {
|
||||
.dev_id = "s3c2410-sdi",
|
||||
.table = {
|
||||
/* Card detect S3C2410_GPF(5) */
|
||||
GPIO_LOOKUP("GPF", 5, "cd", GPIO_ACTIVE_LOW),
|
||||
/* Write protect S3C2410_GPH(8) */
|
||||
GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW),
|
||||
{ },
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition rx1950_nand_part[] = {
|
||||
[0] = {
|
||||
.name = "Boot0",
|
||||
|
@ -762,6 +772,7 @@ static void __init rx1950_init_machine(void)
|
|||
s3c24xx_fb_set_platdata(&rx1950_lcd_cfg);
|
||||
s3c24xx_udc_set_platdata(&rx1950_udc_cfg);
|
||||
s3c24xx_ts_set_platdata(&rx1950_ts_cfg);
|
||||
gpiod_add_lookup_table(&rx1950_mmc_gpio_table);
|
||||
s3c24xx_mci_set_platdata(&rx1950_mmc_cfg);
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
s3c_nand_set_platdata(&rx1950_nand_info);
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/mmc/slot-gpio.h>
|
||||
|
||||
#include <plat/gpio-cfg.h>
|
||||
|
@ -1545,25 +1544,19 @@ static int s3cmci_probe_pdata(struct s3cmci_host *host)
|
|||
if (pdata->wprotect_invert)
|
||||
mmc->caps2 |= MMC_CAP2_RO_ACTIVE_HIGH;
|
||||
|
||||
if (pdata->detect_invert)
|
||||
mmc->caps2 |= MMC_CAP2_CD_ACTIVE_HIGH;
|
||||
|
||||
if (gpio_is_valid(pdata->gpio_detect)) {
|
||||
ret = mmc_gpio_request_cd(mmc, pdata->gpio_detect, 0);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "error requesting GPIO for CD %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
/* If we get -ENOENT we have no card detect GPIO line */
|
||||
ret = mmc_gpiod_request_cd(mmc, "cd", 0, false, 0, NULL);
|
||||
if (ret != -ENOENT) {
|
||||
dev_err(&pdev->dev, "error requesting GPIO for CD %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (gpio_is_valid(pdata->gpio_wprotect)) {
|
||||
ret = mmc_gpio_request_ro(mmc, pdata->gpio_wprotect);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "error requesting GPIO for WP %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
ret = mmc_gpiod_request_ro(host->mmc, "wp", 0, false, 0, NULL);
|
||||
if (ret != -ENOENT) {
|
||||
dev_err(&pdev->dev, "error requesting GPIO for WP %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
* @no_wprotect: Set this to indicate there is no write-protect switch.
|
||||
* @no_detect: Set this if there is no detect switch.
|
||||
* @wprotect_invert: Invert the default sense of the write protect switch.
|
||||
* @detect_invert: Invert the default sense of the write protect switch.
|
||||
* @use_dma: Set to allow the use of DMA.
|
||||
* @gpio_detect: GPIO number for the card detect line.
|
||||
* @gpio_wprotect: GPIO number for the write protect line.
|
||||
|
@ -31,11 +30,8 @@ struct s3c24xx_mci_pdata {
|
|||
unsigned int no_wprotect:1;
|
||||
unsigned int no_detect:1;
|
||||
unsigned int wprotect_invert:1;
|
||||
unsigned int detect_invert:1; /* set => detect active high */
|
||||
unsigned int use_dma:1;
|
||||
|
||||
unsigned int gpio_detect;
|
||||
unsigned int gpio_wprotect;
|
||||
unsigned long ocr_avail;
|
||||
void (*set_power)(unsigned char power_mode,
|
||||
unsigned short vdd);
|
||||
|
|
Loading…
Reference in New Issue