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
					
				|  | @ -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…
	
		Reference in New Issue