From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lubomir Rintel Date: Tue, 17 Nov 2020 22:00:09 +0100 Subject: [PATCH RFC 11/20] mmc/jz_mmc: Support wp-gpio/cd-gpio In-Reply-To: <20201117210018.751469-1-lkundrak@v3.sk> References: <20201117210018.751469-1-lkundrak@v3.sk> Message-ID: <20201117210018.751469-12-lkundrak@v3.sk> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de This adds support for using GPIO lines for detecting Write-Protect and Card-Detect status. This way the driver can fail fast if there's no card inserted. Signed-off-by: Lubomir Rintel --- drivers/mmc/jz_mmc.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/mmc/jz_mmc.c b/drivers/mmc/jz_mmc.c index d4b9d15ef2e..03fb506e571 100644 --- a/drivers/mmc/jz_mmc.c +++ b/drivers/mmc/jz_mmc.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -130,6 +131,11 @@ struct jz_mmc_priv { #define JZ_MMC_BUS_WIDTH_4 0x2 #define JZ_MMC_BUS_WIDTH_8 0x3 #define JZ_MMC_SENT_INIT BIT(2) + +#if CONFIG_IS_ENABLED(DM_GPIO) + struct gpio_desc gpio_wp; + struct gpio_desc gpio_cd; +#endif }; static int jz_mmc_clock_rate(void) @@ -438,9 +444,33 @@ static int jz_mmc_dm_set_ios(struct udevice *dev) return jz_mmc_set_ios(mmc, priv); }; +#if CONFIG_IS_ENABLED(DM_GPIO) +static int jz_mmc_dm_get_cd(struct udevice *dev) +{ + struct jz_mmc_priv *priv = dev_get_priv(dev); + + if (priv->gpio_cd.dev) + return dm_gpio_get_value(&priv->gpio_cd); + return -ENOSYS; +} + +static int jz_mmc_dm_get_wp(struct udevice *dev) +{ + struct jz_mmc_priv *priv = dev_get_priv(dev); + + if (priv->gpio_wp.dev) + dm_gpio_get_value(&priv->gpio_wp); + return -ENOSYS; +} +#endif + static const struct dm_mmc_ops jz_msc_ops = { .send_cmd = jz_mmc_dm_send_cmd, .set_ios = jz_mmc_dm_set_ios, +#if CONFIG_IS_ENABLED(DM_GPIO) + .get_cd = jz_mmc_dm_get_cd, + .get_wp = jz_mmc_dm_get_wp, +#endif }; static int jz_mmc_ofdata_to_platdata(struct udevice *dev) @@ -484,6 +514,11 @@ static int jz_mmc_probe(struct udevice *dev) struct jz_mmc_priv *priv = dev_get_priv(dev); struct jz_mmc_plat *plat = dev_get_platdata(dev); +#if CONFIG_IS_ENABLED(DM_GPIO) + gpio_request_by_name(dev, "wp-gpios", 0, &priv->gpio_wp, GPIOD_IS_IN); + gpio_request_by_name(dev, "cd-gpios", 0, &priv->gpio_cd, GPIOD_IS_IN); +#endif + plat->mmc.priv = priv; upriv->mmc = &plat->mmc; return jz_mmc_core_init(&plat->mmc); -- 2.28.0