Message ID | 20180817042603.24984-1-aford173@gmail.com |
---|---|
State | Superseded |
Delegated to: | Tom Rini |
Headers | show |
Series | [U-Boot] MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL | expand |
On Thu, 2018-08-16 at 23:26 -0500, Adam Ford wrote: > When used with a device tree, this will extract the card detect > and write protect pins from the device tree and configure them > accordingly. This assumes the GPIO_ACTIVE_LOW/HIGH is supported > byt da8xx_gpio. > > Signed-off-by: Adam Ford <aford173@gmail.com> > > diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c > index db950ea5ec..01d60f394f 100644 > --- a/drivers/mmc/davinci_mmc.c > +++ b/drivers/mmc/davinci_mmc.c > @@ -15,6 +15,7 @@ > #include <malloc.h> > #include <asm/io.h> > #include <asm/arch/sdmmc_defs.h> > +#include <asm-generic/gpio.h> > > #define DAVINCI_MAX_BLOCKS (32) > #define WATCHDOG_COUNT (100000) > @@ -35,6 +36,8 @@ struct davinci_mmc_priv { > struct davinci_mmc_regs *reg_base; /* Register base > address */ > uint input_clk; /* Input clock to MMC > controller */ > uint version; /* MMC Controller version */ > + struct gpio_desc cd_gpio; /* Card Detect GPIO */ > + struct gpio_desc wp_gpio; /* Write Protect GPIO */ > }; > > struct davinci_mmc_plat > @@ -425,9 +428,38 @@ static const struct mmc_ops dmmc_ops = { > .init = dmmc_init, > }; > #else > + The two new functions here - davinci_mmc_getcd() and davinci_mmc_getwp() - also need to be wrapped in a check for DM_GPIO being enabled, otherwise dm_gpio_get_value() isn't built. > +static int davinci_mmc_getcd(struct udevice *dev) > +{ > + struct davinci_mmc_priv *priv = dev_get_priv(dev); > + int value; > + > + value = dm_gpio_get_value(&priv->cd_gpio); > + /* if no CD return as 1 */ > + if (value < 0) > + return 1; > + > + return value; > +} > + > +static int davinci_mmc_getwp(struct udevice *dev) > +{ > + struct davinci_mmc_priv *priv = dev_get_priv(dev); > + int value; > + > + value = dm_gpio_get_value(&priv->wp_gpio); > + /* if no WP return as 0 */ > + if (value < 0) > + return 0; > + > + return value; > +} > + > static const struct dm_mmc_ops davinci_mmc_ops = { > .send_cmd = davinci_mmc_send_cmd, > .set_ios = davinci_mmc_set_ios, > + .get_cd = davinci_mmc_getcd, > + .get_wp = davinci_mmc_getwp, Again the assignment of .get_cd and .get_wp need to be wrapped in a check for DM_GPIO. > }; > #endif > > @@ -475,6 +507,12 @@ static int davinci_mmc_probe(struct udevice > *dev) > priv->reg_base = (struct davinci_mmc_regs > *)dev_read_addr(dev); > priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID); > > +#if CONFIG_IS_ENABLED(DM_GPIO) > + /* These GPIOs are optional */ > + gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, > GPIOD_IS_IN); > + gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, > GPIOD_IS_IN); > +#endif > + > upriv->mmc = &plat->mmc; > > return davinci_dm_mmc_init(dev);
On Thu, Aug 23, 2018 at 7:19 AM Peter Howard <pjh@northern-ridge.com.au> wrote: > > On Thu, 2018-08-16 at 23:26 -0500, Adam Ford wrote: > > When used with a device tree, this will extract the card detect > > and write protect pins from the device tree and configure them > > accordingly. This assumes the GPIO_ACTIVE_LOW/HIGH is supported > > byt da8xx_gpio. > > > > Signed-off-by: Adam Ford <aford173@gmail.com> > > > > diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c > > index db950ea5ec..01d60f394f 100644 > > --- a/drivers/mmc/davinci_mmc.c > > +++ b/drivers/mmc/davinci_mmc.c > > @@ -15,6 +15,7 @@ > > #include <malloc.h> > > #include <asm/io.h> > > #include <asm/arch/sdmmc_defs.h> > > +#include <asm-generic/gpio.h> > > > > #define DAVINCI_MAX_BLOCKS (32) > > #define WATCHDOG_COUNT (100000) > > @@ -35,6 +36,8 @@ struct davinci_mmc_priv { > > struct davinci_mmc_regs *reg_base; /* Register base > > address */ > > uint input_clk; /* Input clock to MMC > > controller */ > > uint version; /* MMC Controller version */ > > + struct gpio_desc cd_gpio; /* Card Detect GPIO */ > > + struct gpio_desc wp_gpio; /* Write Protect GPIO */ > > }; > > > > struct davinci_mmc_plat > > @@ -425,9 +428,38 @@ static const struct mmc_ops dmmc_ops = { > > .init = dmmc_init, > > }; > > #else > > + > > The two new functions here - davinci_mmc_getcd() and > davinci_mmc_getwp() - also need to be wrapped in a check for DM_GPIO > being enabled, otherwise dm_gpio_get_value() isn't built. Good catch. I'm on vacation now in London, but I'll be home Sept 4. I should be able to post a V2 around then. adam > > > > +static int davinci_mmc_getcd(struct udevice *dev) > > +{ > > + struct davinci_mmc_priv *priv = dev_get_priv(dev); > > + int value; > > + > > + value = dm_gpio_get_value(&priv->cd_gpio); > > + /* if no CD return as 1 */ > > + if (value < 0) > > + return 1; > > + > > + return value; > > +} > > + > > +static int davinci_mmc_getwp(struct udevice *dev) > > +{ > > + struct davinci_mmc_priv *priv = dev_get_priv(dev); > > + int value; > > + > > + value = dm_gpio_get_value(&priv->wp_gpio); > > + /* if no WP return as 0 */ > > + if (value < 0) > > + return 0; > > + > > + return value; > > +} > > + > > static const struct dm_mmc_ops davinci_mmc_ops = { > > .send_cmd = davinci_mmc_send_cmd, > > .set_ios = davinci_mmc_set_ios, > > + .get_cd = davinci_mmc_getcd, > > + .get_wp = davinci_mmc_getwp, > > Again the assignment of .get_cd and .get_wp need to be wrapped in a > check for DM_GPIO. > > > }; > > #endif > > > > @@ -475,6 +507,12 @@ static int davinci_mmc_probe(struct udevice > > *dev) > > priv->reg_base = (struct davinci_mmc_regs > > *)dev_read_addr(dev); > > priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID); > > > > +#if CONFIG_IS_ENABLED(DM_GPIO) > > + /* These GPIOs are optional */ > > + gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, > > GPIOD_IS_IN); > > + gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, > > GPIOD_IS_IN); > > +#endif > > + > > upriv->mmc = &plat->mmc; > > > > return davinci_dm_mmc_init(dev);
diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c index db950ea5ec..01d60f394f 100644 --- a/drivers/mmc/davinci_mmc.c +++ b/drivers/mmc/davinci_mmc.c @@ -15,6 +15,7 @@ #include <malloc.h> #include <asm/io.h> #include <asm/arch/sdmmc_defs.h> +#include <asm-generic/gpio.h> #define DAVINCI_MAX_BLOCKS (32) #define WATCHDOG_COUNT (100000) @@ -35,6 +36,8 @@ struct davinci_mmc_priv { struct davinci_mmc_regs *reg_base; /* Register base address */ uint input_clk; /* Input clock to MMC controller */ uint version; /* MMC Controller version */ + struct gpio_desc cd_gpio; /* Card Detect GPIO */ + struct gpio_desc wp_gpio; /* Write Protect GPIO */ }; struct davinci_mmc_plat @@ -425,9 +428,38 @@ static const struct mmc_ops dmmc_ops = { .init = dmmc_init, }; #else + +static int davinci_mmc_getcd(struct udevice *dev) +{ + struct davinci_mmc_priv *priv = dev_get_priv(dev); + int value; + + value = dm_gpio_get_value(&priv->cd_gpio); + /* if no CD return as 1 */ + if (value < 0) + return 1; + + return value; +} + +static int davinci_mmc_getwp(struct udevice *dev) +{ + struct davinci_mmc_priv *priv = dev_get_priv(dev); + int value; + + value = dm_gpio_get_value(&priv->wp_gpio); + /* if no WP return as 0 */ + if (value < 0) + return 0; + + return value; +} + static const struct dm_mmc_ops davinci_mmc_ops = { .send_cmd = davinci_mmc_send_cmd, .set_ios = davinci_mmc_set_ios, + .get_cd = davinci_mmc_getcd, + .get_wp = davinci_mmc_getwp, }; #endif @@ -475,6 +507,12 @@ static int davinci_mmc_probe(struct udevice *dev) priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev); priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID); +#if CONFIG_IS_ENABLED(DM_GPIO) + /* These GPIOs are optional */ + gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN); + gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN); +#endif + upriv->mmc = &plat->mmc; return davinci_dm_mmc_init(dev);
When used with a device tree, this will extract the card detect and write protect pins from the device tree and configure them accordingly. This assumes the GPIO_ACTIVE_LOW/HIGH is supported byt da8xx_gpio. Signed-off-by: Adam Ford <aford173@gmail.com>