mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-04-17 11:51:31 +00:00
dm: mmc: sunxi: Pass private data around explicitly
At present the driver-private data is obtained in various functions by various means. With driver model this is provided automatically. Without driver model it comes from a C array declared at the top of the file. Adjust internal functions so that they are passed the private data as a parameter, allowing the caller to obtain it using either means. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
This commit is contained in:
parent
3f5af12a5d
commit
034e226bc7
1 changed files with 42 additions and 29 deletions
|
@ -176,9 +176,8 @@ static int mmc_clk_io_on(int sdc_no)
|
||||||
return mmc_set_mod_clk(priv, 24000000);
|
return mmc_set_mod_clk(priv, 24000000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_update_clk(struct mmc *mmc)
|
static int mmc_update_clk(struct sunxi_mmc_priv *priv)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
unsigned int cmd;
|
unsigned int cmd;
|
||||||
unsigned timeout_msecs = 2000;
|
unsigned timeout_msecs = 2000;
|
||||||
|
|
||||||
|
@ -198,15 +197,14 @@ static int mmc_update_clk(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_config_clock(struct mmc *mmc)
|
static int mmc_config_clock(struct sunxi_mmc_priv *priv, struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
unsigned rval = readl(&priv->reg->clkcr);
|
unsigned rval = readl(&priv->reg->clkcr);
|
||||||
|
|
||||||
/* Disable Clock */
|
/* Disable Clock */
|
||||||
rval &= ~SUNXI_MMC_CLK_ENABLE;
|
rval &= ~SUNXI_MMC_CLK_ENABLE;
|
||||||
writel(rval, &priv->reg->clkcr);
|
writel(rval, &priv->reg->clkcr);
|
||||||
if (mmc_update_clk(mmc))
|
if (mmc_update_clk(priv))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Set mod_clk to new rate */
|
/* Set mod_clk to new rate */
|
||||||
|
@ -220,21 +218,20 @@ static int mmc_config_clock(struct mmc *mmc)
|
||||||
/* Re-enable Clock */
|
/* Re-enable Clock */
|
||||||
rval |= SUNXI_MMC_CLK_ENABLE;
|
rval |= SUNXI_MMC_CLK_ENABLE;
|
||||||
writel(rval, &priv->reg->clkcr);
|
writel(rval, &priv->reg->clkcr);
|
||||||
if (mmc_update_clk(mmc))
|
if (mmc_update_clk(priv))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sunxi_mmc_set_ios(struct mmc *mmc)
|
static int sunxi_mmc_set_ios_common(struct sunxi_mmc_priv *priv,
|
||||||
|
struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
|
|
||||||
debug("set ios: bus_width: %x, clock: %d\n",
|
debug("set ios: bus_width: %x, clock: %d\n",
|
||||||
mmc->bus_width, mmc->clock);
|
mmc->bus_width, mmc->clock);
|
||||||
|
|
||||||
/* Change clock first */
|
/* Change clock first */
|
||||||
if (mmc->clock && mmc_config_clock(mmc) != 0) {
|
if (mmc->clock && mmc_config_clock(priv, mmc) != 0) {
|
||||||
priv->fatal_err = 1;
|
priv->fatal_err = 1;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -261,9 +258,9 @@ static int sunxi_mmc_core_init(struct mmc *mmc)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_trans_data_by_cpu(struct mmc *mmc, struct mmc_data *data)
|
static int mmc_trans_data_by_cpu(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
const int reading = !!(data->flags & MMC_DATA_READ);
|
const int reading = !!(data->flags & MMC_DATA_READ);
|
||||||
const uint32_t status_bit = reading ? SUNXI_MMC_STATUS_FIFO_EMPTY :
|
const uint32_t status_bit = reading ? SUNXI_MMC_STATUS_FIFO_EMPTY :
|
||||||
SUNXI_MMC_STATUS_FIFO_FULL;
|
SUNXI_MMC_STATUS_FIFO_FULL;
|
||||||
|
@ -293,10 +290,9 @@ static int mmc_trans_data_by_cpu(struct mmc *mmc, struct mmc_data *data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_rint_wait(struct mmc *mmc, unsigned int timeout_msecs,
|
static int mmc_rint_wait(struct sunxi_mmc_priv *priv, struct mmc *mmc,
|
||||||
unsigned int done_bit, const char *what)
|
uint timeout_msecs, uint done_bit, const char *what)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
unsigned int status;
|
unsigned int status;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
@ -313,10 +309,10 @@ static int mmc_rint_wait(struct mmc *mmc, unsigned int timeout_msecs,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sunxi_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
static int sunxi_mmc_send_cmd_common(struct sunxi_mmc_priv *priv,
|
||||||
struct mmc_data *data)
|
struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
|
||||||
unsigned int cmdval = SUNXI_MMC_CMD_START;
|
unsigned int cmdval = SUNXI_MMC_CMD_START;
|
||||||
unsigned int timeout_msecs;
|
unsigned int timeout_msecs;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
@ -372,7 +368,7 @@ static int sunxi_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
bytecnt = data->blocksize * data->blocks;
|
bytecnt = data->blocksize * data->blocks;
|
||||||
debug("trans data %d bytes\n", bytecnt);
|
debug("trans data %d bytes\n", bytecnt);
|
||||||
writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
writel(cmdval | cmd->cmdidx, &priv->reg->cmd);
|
||||||
ret = mmc_trans_data_by_cpu(mmc, data);
|
ret = mmc_trans_data_by_cpu(priv, mmc, data);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
error = readl(&priv->reg->rint) &
|
error = readl(&priv->reg->rint) &
|
||||||
SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT;
|
SUNXI_MMC_RINT_INTERRUPT_ERROR_BIT;
|
||||||
|
@ -381,14 +377,15 @@ static int sunxi_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error = mmc_rint_wait(mmc, 1000, SUNXI_MMC_RINT_COMMAND_DONE, "cmd");
|
error = mmc_rint_wait(priv, mmc, 1000, SUNXI_MMC_RINT_COMMAND_DONE,
|
||||||
|
"cmd");
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
timeout_msecs = 120;
|
timeout_msecs = 120;
|
||||||
debug("cacl timeout %x msec\n", timeout_msecs);
|
debug("cacl timeout %x msec\n", timeout_msecs);
|
||||||
error = mmc_rint_wait(mmc, timeout_msecs,
|
error = mmc_rint_wait(priv, mmc, timeout_msecs,
|
||||||
data->blocks > 1 ?
|
data->blocks > 1 ?
|
||||||
SUNXI_MMC_RINT_AUTO_COMMAND_DONE :
|
SUNXI_MMC_RINT_AUTO_COMMAND_DONE :
|
||||||
SUNXI_MMC_RINT_DATA_OVER,
|
SUNXI_MMC_RINT_DATA_OVER,
|
||||||
|
@ -425,7 +422,7 @@ static int sunxi_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
out:
|
out:
|
||||||
if (error < 0) {
|
if (error < 0) {
|
||||||
writel(SUNXI_MMC_GCTRL_RESET, &priv->reg->gctrl);
|
writel(SUNXI_MMC_GCTRL_RESET, &priv->reg->gctrl);
|
||||||
mmc_update_clk(mmc);
|
mmc_update_clk(priv);
|
||||||
}
|
}
|
||||||
writel(0xffffffff, &priv->reg->rint);
|
writel(0xffffffff, &priv->reg->rint);
|
||||||
writel(readl(&priv->reg->gctrl) | SUNXI_MMC_GCTRL_FIFO_RESET,
|
writel(readl(&priv->reg->gctrl) | SUNXI_MMC_GCTRL_FIFO_RESET,
|
||||||
|
@ -434,7 +431,22 @@ out:
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sunxi_mmc_getcd(struct mmc *mmc)
|
static int sunxi_mmc_set_ios_legacy(struct mmc *mmc)
|
||||||
|
{
|
||||||
|
struct sunxi_mmc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return sunxi_mmc_set_ios_common(priv, mmc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sunxi_mmc_send_cmd_legacy(struct mmc *mmc, struct mmc_cmd *cmd,
|
||||||
|
struct mmc_data *data)
|
||||||
|
{
|
||||||
|
struct sunxi_mmc_priv *priv = mmc->priv;
|
||||||
|
|
||||||
|
return sunxi_mmc_send_cmd_common(priv, mmc, cmd, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sunxi_mmc_getcd_legacy(struct mmc *mmc)
|
||||||
{
|
{
|
||||||
struct sunxi_mmc_priv *priv = mmc->priv;
|
struct sunxi_mmc_priv *priv = mmc->priv;
|
||||||
int cd_pin;
|
int cd_pin;
|
||||||
|
@ -447,17 +459,18 @@ static int sunxi_mmc_getcd(struct mmc *mmc)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct mmc_ops sunxi_mmc_ops = {
|
static const struct mmc_ops sunxi_mmc_ops = {
|
||||||
.send_cmd = sunxi_mmc_send_cmd,
|
.send_cmd = sunxi_mmc_send_cmd_legacy,
|
||||||
.set_ios = sunxi_mmc_set_ios,
|
.set_ios = sunxi_mmc_set_ios_legacy,
|
||||||
.init = sunxi_mmc_core_init,
|
.init = sunxi_mmc_core_init,
|
||||||
.getcd = sunxi_mmc_getcd,
|
.getcd = sunxi_mmc_getcd_legacy,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mmc *sunxi_mmc_init(int sdc_no)
|
struct mmc *sunxi_mmc_init(int sdc_no)
|
||||||
{
|
{
|
||||||
struct mmc_config *cfg = &mmc_host[sdc_no].cfg;
|
struct sunxi_mmc_priv *priv = &mmc_host[sdc_no];
|
||||||
|
struct mmc_config *cfg = &priv->cfg;
|
||||||
|
|
||||||
memset(&mmc_host[sdc_no], 0, sizeof(struct sunxi_mmc_priv));
|
memset(priv, '\0', sizeof(struct sunxi_mmc_priv));
|
||||||
|
|
||||||
cfg->name = "SUNXI SD/MMC";
|
cfg->name = "SUNXI SD/MMC";
|
||||||
cfg->ops = &sunxi_mmc_ops;
|
cfg->ops = &sunxi_mmc_ops;
|
||||||
|
@ -479,5 +492,5 @@ struct mmc *sunxi_mmc_init(int sdc_no)
|
||||||
|
|
||||||
mmc_clk_io_on(sdc_no);
|
mmc_clk_io_on(sdc_no);
|
||||||
|
|
||||||
return mmc_create(cfg, &mmc_host[sdc_no]);
|
return mmc_create(cfg, mmc_host);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue