mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 00:47:26 +00:00
MMC: davinici_mmc: Enable CD and WP with DM and OF_CONTROL
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 by da8xx_gpio. Signed-off-by: Adam Ford <aford173@gmail.com>
This commit is contained in:
parent
819ad5f625
commit
04355de71d
1 changed files with 41 additions and 0 deletions
|
@ -15,6 +15,7 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/arch/sdmmc_defs.h>
|
#include <asm/arch/sdmmc_defs.h>
|
||||||
|
#include <asm-generic/gpio.h>
|
||||||
|
|
||||||
#define DAVINCI_MAX_BLOCKS (32)
|
#define DAVINCI_MAX_BLOCKS (32)
|
||||||
#define WATCHDOG_COUNT (100000)
|
#define WATCHDOG_COUNT (100000)
|
||||||
|
@ -35,6 +36,8 @@ struct davinci_mmc_priv {
|
||||||
struct davinci_mmc_regs *reg_base; /* Register base address */
|
struct davinci_mmc_regs *reg_base; /* Register base address */
|
||||||
uint input_clk; /* Input clock to MMC controller */
|
uint input_clk; /* Input clock to MMC controller */
|
||||||
uint version; /* MMC Controller version */
|
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
|
struct davinci_mmc_plat
|
||||||
|
@ -425,9 +428,41 @@ static const struct mmc_ops dmmc_ops = {
|
||||||
.init = dmmc_init,
|
.init = dmmc_init,
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
static int davinci_mmc_getcd(struct udevice *dev)
|
||||||
|
{
|
||||||
|
int value = -1;
|
||||||
|
#if CONFIG_IS_ENABLED(DM_GPIO)
|
||||||
|
struct davinci_mmc_priv *priv = dev_get_priv(dev);
|
||||||
|
value = dm_gpio_get_value(&priv->cd_gpio);
|
||||||
|
#endif
|
||||||
|
/* if no CD return as 1 */
|
||||||
|
if (value < 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int davinci_mmc_getwp(struct udevice *dev)
|
||||||
|
{
|
||||||
|
int value = -1;
|
||||||
|
#if CONFIG_IS_ENABLED(DM_GPIO)
|
||||||
|
struct davinci_mmc_priv *priv = dev_get_priv(dev);
|
||||||
|
|
||||||
|
value = dm_gpio_get_value(&priv->wp_gpio);
|
||||||
|
#endif
|
||||||
|
/* if no WP return as 0 */
|
||||||
|
if (value < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct dm_mmc_ops davinci_mmc_ops = {
|
static const struct dm_mmc_ops davinci_mmc_ops = {
|
||||||
.send_cmd = davinci_mmc_send_cmd,
|
.send_cmd = davinci_mmc_send_cmd,
|
||||||
.set_ios = davinci_mmc_set_ios,
|
.set_ios = davinci_mmc_set_ios,
|
||||||
|
.get_cd = davinci_mmc_getcd,
|
||||||
|
.get_wp = davinci_mmc_getwp,
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -475,6 +510,12 @@ static int davinci_mmc_probe(struct udevice *dev)
|
||||||
priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
|
priv->reg_base = (struct davinci_mmc_regs *)dev_read_addr(dev);
|
||||||
priv->input_clk = clk_get(DAVINCI_MMCSD_CLKID);
|
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;
|
upriv->mmc = &plat->mmc;
|
||||||
|
|
||||||
return davinci_dm_mmc_init(dev);
|
return davinci_dm_mmc_init(dev);
|
||||||
|
|
Loading…
Reference in a new issue