diff options
| author | Pantelis Antoniou <panto@antoniou-consulting.com> | 2014-02-26 19:28:45 +0200 | 
|---|---|---|
| committer | Pantelis Antoniou <panto@antoniou-consulting.com> | 2014-03-24 11:32:10 +0200 | 
| commit | ab769f227f79bedae7840f99b6c0c4d66aafc78e (patch) | |
| tree | 27d83f7ebf9da92a3ad1015cf736b7796e6ab76d /drivers/mmc | |
| parent | 2c072c958bb544c72f0e848375803dbd6971f022 (diff) | |
| download | olio-uboot-2014.01-ab769f227f79bedae7840f99b6c0c4d66aafc78e.tar.xz olio-uboot-2014.01-ab769f227f79bedae7840f99b6c0c4d66aafc78e.zip | |
mmc: Remove ops from struct mmc and put in mmc_ops
Remove the in-structure ops and put them in mmc_ops with
a constant pointer to it.
This makes the mmc structure smaller as well as conserving
code space (in theory).
All in-tree drivers are converted as well; this is done in a
single patch in order to not break git bisect.
Changes since V1:
Fix compilation b0rked issue on omap platforms where OMAP_GPIO was
not set.
Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
Diffstat (limited to 'drivers/mmc')
| -rw-r--r-- | drivers/mmc/arm_pl180_mmci.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/bfin_sdh.c | 11 | ||||
| -rw-r--r-- | drivers/mmc/davinci_mmc.c | 13 | ||||
| -rw-r--r-- | drivers/mmc/dw_mmc.c | 10 | ||||
| -rw-r--r-- | drivers/mmc/fsl_esdhc.c | 14 | ||||
| -rw-r--r-- | drivers/mmc/ftsdc010_mci.c | 11 | ||||
| -rw-r--r-- | drivers/mmc/gen_atmel_mci.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/mmc.c | 21 | ||||
| -rw-r--r-- | drivers/mmc/mmc_spi.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/mxcmmc.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/mxsmmc.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/omap_hsmmc.c | 89 | ||||
| -rw-r--r-- | drivers/mmc/pxa_mmc_gen.c | 11 | ||||
| -rw-r--r-- | drivers/mmc/sdhci.c | 13 | ||||
| -rw-r--r-- | drivers/mmc/sh_mmcif.c | 12 | ||||
| -rw-r--r-- | drivers/mmc/tegra_mmc.c | 19 | 
16 files changed, 171 insertions, 113 deletions
| diff --git a/drivers/mmc/arm_pl180_mmci.c b/drivers/mmc/arm_pl180_mmci.c index 5a55fe73b..4490e9710 100644 --- a/drivers/mmc/arm_pl180_mmci.c +++ b/drivers/mmc/arm_pl180_mmci.c @@ -335,6 +335,12 @@ static void host_set_ios(struct mmc *dev)  	udelay(CLK_CHANGE_DELAY);  } +static const struct mmc_ops arm_pl180_mmci_ops = { +	.send_cmd = host_request, +	.set_ios = host_set_ios, +	.init = mmc_host_reset, +}; +  /*   * mmc_host_init - initialize the mmc controller.   * Set initial clock and power for mmc slot. @@ -360,11 +366,7 @@ int arm_pl180_mmci_init(struct pl180_mmc_host *host)  	sdi_u32 = readl(&host->base->mask0) & ~SDI_MASK0_MASK;  	writel(sdi_u32, &host->base->mask0);  	strncpy(dev->name, host->name, sizeof(dev->name)); -	dev->send_cmd = host_request; -	dev->set_ios = host_set_ios; -	dev->init = mmc_host_reset; -	dev->getcd = NULL; -	dev->getwp = NULL; +	dev->ops = &arm_pl180_mmci_ops;  	dev->host_caps = host->caps;  	dev->voltages = host->voltages;  	dev->f_min = host->clock_min; diff --git a/drivers/mmc/bfin_sdh.c b/drivers/mmc/bfin_sdh.c index bd9b64113..f0871ece3 100644 --- a/drivers/mmc/bfin_sdh.c +++ b/drivers/mmc/bfin_sdh.c @@ -274,6 +274,11 @@ static int bfin_sdh_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops bfin_mmc_ops = { +	.send_cmd	= bfin_sdh_request, +	.set_ios	= bfin_sdh_set_ios, +	.init		= bfin_sdh_init, +};  int bfin_mmc_init(bd_t *bis)  { @@ -284,11 +289,7 @@ int bfin_mmc_init(bd_t *bis)  	if (!mmc)  		return -ENOMEM;  	sprintf(mmc->name, "Blackfin SDH"); -	mmc->send_cmd = bfin_sdh_request; -	mmc->set_ios = bfin_sdh_set_ios; -	mmc->init = bfin_sdh_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &bfin_mmc_ops;  	mmc->host_caps = MMC_MODE_4BIT;  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; diff --git a/drivers/mmc/davinci_mmc.c b/drivers/mmc/davinci_mmc.c index b38096118..29ca4a6ed 100644 --- a/drivers/mmc/davinci_mmc.c +++ b/drivers/mmc/davinci_mmc.c @@ -363,6 +363,12 @@ static void dmmc_set_ios(struct mmc *mmc)  		dmmc_set_clock(mmc, mmc->clock);  } +static const struct mmc_ops dmmc_ops = { +	.send_cmd	= dmmc_send_cmd, +	.set_ios	= dmmc_set_ios, +	.init		= dmmc_init, +}; +  /* Called from board_mmc_init during startup. Can be called multiple times   * depending on the number of slots available on board and controller   */ @@ -375,12 +381,7 @@ int davinci_mmc_init(bd_t *bis, struct davinci_mmc *host)  	sprintf(mmc->name, "davinci");  	mmc->priv = host; -	mmc->send_cmd = dmmc_send_cmd; -	mmc->set_ios = dmmc_set_ios; -	mmc->init = dmmc_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; - +	mmc->ops = &dmmc_ops;  	mmc->f_min = 200000;  	mmc->f_max = 25000000;  	mmc->voltages = host->voltages; diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c index d45c15cfa..2e6576e8d 100644 --- a/drivers/mmc/dw_mmc.c +++ b/drivers/mmc/dw_mmc.c @@ -343,6 +343,12 @@ static int dwmci_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops dwmci_ops = { +	.send_cmd	= dwmci_send_cmd, +	.set_ios	= dwmci_set_ios, +	.init		= dwmci_init, +}; +  int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk)  {  	struct mmc *mmc; @@ -358,9 +364,7 @@ int add_dwmci(struct dwmci_host *host, u32 max_clk, u32 min_clk)  	host->mmc = mmc;  	sprintf(mmc->name, "%s", host->name); -	mmc->send_cmd = dwmci_send_cmd; -	mmc->set_ios = dwmci_set_ios; -	mmc->init = dwmci_init; +	mmc->ops = &dwmci_ops;  	mmc->f_min = min_clk;  	mmc->f_max = max_clk; diff --git a/drivers/mmc/fsl_esdhc.c b/drivers/mmc/fsl_esdhc.c index 7b146a360..861f536ac 100644 --- a/drivers/mmc/fsl_esdhc.c +++ b/drivers/mmc/fsl_esdhc.c @@ -524,6 +524,13 @@ static void esdhc_reset(struct fsl_esdhc *regs)  		printf("MMC/SD: Reset never completed.\n");  } +static const struct mmc_ops esdhc_ops = { +	.send_cmd	= esdhc_send_cmd, +	.set_ios	= esdhc_set_ios, +	.init		= esdhc_init, +	.getcd		= esdhc_getcd, +}; +  int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)  {  	struct fsl_esdhc *regs; @@ -548,12 +555,7 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)  				| SYSCTL_IPGEN | SYSCTL_CKEN);  	mmc->priv = cfg; -	mmc->send_cmd = esdhc_send_cmd; -	mmc->set_ios = esdhc_set_ios; -	mmc->init = esdhc_init; -	mmc->getcd = esdhc_getcd; -	mmc->getwp = NULL; - +	mmc->ops = &esdhc_ops;  	voltage_caps = 0;  	caps = regs->hostcapblt; diff --git a/drivers/mmc/ftsdc010_mci.c b/drivers/mmc/ftsdc010_mci.c index 7600d5ce5..ce43ae1b8 100644 --- a/drivers/mmc/ftsdc010_mci.c +++ b/drivers/mmc/ftsdc010_mci.c @@ -316,6 +316,12 @@ static int ftsdc010_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops ftsdc010_ops = { +	.send_cmd	= ftsdc010_request, +	.set_ios	= ftsdc010_set_ios, +	.init		= ftsdc010_init, +}; +  int ftsdc010_mmc_init(int devid)  {  	struct mmc *mmc; @@ -347,10 +353,7 @@ int ftsdc010_mmc_init(int devid)  	mmc->priv  = chip;  	sprintf(mmc->name, "ftsdc010"); -	mmc->send_cmd  = ftsdc010_request; -	mmc->set_ios   = ftsdc010_set_ios; -	mmc->init      = ftsdc010_init; - +	mmc->ops = &ftsdc010_ops;  	mmc->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz;  	switch (readl(®s->bwr) & FTSDC010_BWR_CAPS_MASK) {  	case FTSDC010_BWR_CAPS_4BIT: diff --git a/drivers/mmc/gen_atmel_mci.c b/drivers/mmc/gen_atmel_mci.c index c11dcd0f9..456f8bfdd 100644 --- a/drivers/mmc/gen_atmel_mci.c +++ b/drivers/mmc/gen_atmel_mci.c @@ -344,6 +344,12 @@ static int mci_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops atmel_mci_ops = { +	.send_cmd	= mci_send_cmd, +	.set_ios	= mci_set_ios, +	.init		= mci_init, +}; +  /*   * This is the only exported function   * @@ -360,11 +366,7 @@ int atmel_mci_init(void *regs)  	strcpy(mmc->name, "mci");  	mmc->priv = regs; -	mmc->send_cmd = mci_send_cmd; -	mmc->set_ios = mci_set_ios; -	mmc->init = mci_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &atmel_mci_ops;  	/* need to be able to pass these in on a board by board basis */  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 8ab0bc948..ac07bb9a2 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -37,8 +37,8 @@ int mmc_getwp(struct mmc *mmc)  	wp = board_mmc_getwp(mmc);  	if (wp < 0) { -		if (mmc->getwp) -			wp = mmc->getwp(mmc); +		if (mmc->ops->getwp) +			wp = mmc->ops->getwp(mmc);  		else  			wp = 0;  	} @@ -63,7 +63,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  	printf("CMD_SEND:%d\n", cmd->cmdidx);  	printf("\t\tARG\t\t\t 0x%08X\n", cmd->cmdarg); -	ret = mmc->send_cmd(mmc, cmd, data); +	ret = mmc->ops->send_cmd(mmc, cmd, data);  	switch (cmd->resp_type) {  		case MMC_RSP_NONE:  			printf("\t\tMMC_RSP_NONE\n"); @@ -106,7 +106,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)  			break;  	}  #else -	ret = mmc->send_cmd(mmc, cmd, data); +	ret = mmc->ops->send_cmd(mmc, cmd, data);  #endif  	return ret;  } @@ -578,8 +578,8 @@ int mmc_getcd(struct mmc *mmc)  	cd = board_mmc_getcd(mmc);  	if (cd < 0) { -		if (mmc->getcd) -			cd = mmc->getcd(mmc); +		if (mmc->ops->getcd) +			cd = mmc->ops->getcd(mmc);  		else  			cd = 1;  	} @@ -751,7 +751,8 @@ static const int multipliers[] = {  static void mmc_set_ios(struct mmc *mmc)  { -	mmc->set_ios(mmc); +	if (mmc->ops->set_ios) +		mmc->ops->set_ios(mmc);  }  void mmc_set_clock(struct mmc *mmc, uint clock) @@ -1207,7 +1208,8 @@ int mmc_start_init(struct mmc *mmc)  {  	int err; -	if (mmc_getcd(mmc) == 0) { +	/* we pretend there's no card when init is NULL */ +	if (mmc_getcd(mmc) == 0 || mmc->ops->init == NULL) {  		mmc->has_init = 0;  #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_LIBCOMMON_SUPPORT)  		printf("MMC: no card present\n"); @@ -1218,7 +1220,8 @@ int mmc_start_init(struct mmc *mmc)  	if (mmc->has_init)  		return 0; -	err = mmc->init(mmc); +	/* made sure it's not NULL earlier */ +	err = mmc->ops->init(mmc);  	if (err)  		return err; diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c index fe6a5a166..0a0f894bc 100644 --- a/drivers/mmc/mmc_spi.c +++ b/drivers/mmc/mmc_spi.c @@ -255,6 +255,12 @@ static int mmc_spi_init_p(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops mmc_spi_ops = { +	.send_cmd	= mmc_spi_request, +	.set_ios	= mmc_spi_set_ios, +	.init		= mmc_spi_init_p, +}; +  struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode)  {  	struct mmc *mmc; @@ -269,11 +275,7 @@ struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode)  		return NULL;  	}  	sprintf(mmc->name, "MMC_SPI"); -	mmc->send_cmd = mmc_spi_request; -	mmc->set_ios = mmc_spi_set_ios; -	mmc->init = mmc_spi_init_p; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &mmc_spi_ops;  	mmc->host_caps = MMC_MODE_SPI;  	mmc->voltages = MMC_SPI_VOLTAGE; diff --git a/drivers/mmc/mxcmmc.c b/drivers/mmc/mxcmmc.c index 4f99617b9..f3e1eed73 100644 --- a/drivers/mmc/mxcmmc.c +++ b/drivers/mmc/mxcmmc.c @@ -485,6 +485,12 @@ static int mxcmci_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops mxcmci_ops = { +	.send_cmd	= mxcmci_request, +	.set_ios	= mxcmci_set_ios, +	.init		= mxcmci_init, +}; +  static int mxcmci_initialize(bd_t *bis)  {  	struct mmc *mmc = NULL; @@ -495,11 +501,7 @@ static int mxcmci_initialize(bd_t *bis)  		return -ENOMEM;  	sprintf(mmc->name, "MXC MCI"); -	mmc->send_cmd = mxcmci_request; -	mmc->set_ios = mxcmci_set_ios; -	mmc->init = mxcmci_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &mxcmci_ops;  	mmc->host_caps = MMC_MODE_4BIT;  	host->base = (struct mxcmci_regs *)CONFIG_MXC_MCI_REGS_BASE; diff --git a/drivers/mmc/mxsmmc.c b/drivers/mmc/mxsmmc.c index 245f9d0c6..97c9ee8fb 100644 --- a/drivers/mmc/mxsmmc.c +++ b/drivers/mmc/mxsmmc.c @@ -363,6 +363,12 @@ static int mxsmmc_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops mxsmmc_ops = { +	.send_cmd	= mxsmmc_send_cmd, +	.set_ios	= mxsmmc_set_ios, +	.init		= mxsmmc_init, +}; +  int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int), int (*cd)(int))  {  	struct mmc *mmc = NULL; @@ -400,11 +406,7 @@ int mxsmmc_initialize(bd_t *bis, int id, int (*wp)(int), int (*cd)(int))  	priv->regs = mxs_ssp_regs_by_bus(id);  	sprintf(mmc->name, "MXS MMC"); -	mmc->send_cmd = mxsmmc_send_cmd; -	mmc->set_ios = mxsmmc_set_ios; -	mmc->init = mxsmmc_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &mxsmmc_ops;  	mmc->priv = priv;  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34; diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c index d3a8b5303..6bf602fea 100644 --- a/drivers/mmc/omap_hsmmc.c +++ b/drivers/mmc/omap_hsmmc.c @@ -35,14 +35,24 @@  #include <asm/arch/mmc_host_def.h>  #include <asm/arch/sys_proto.h> +/* simplify defines to OMAP_HSMMC_USE_GPIO */ +#if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \ +	(defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT)) +#define OMAP_HSMMC_USE_GPIO +#else +#undef OMAP_HSMMC_USE_GPIO +#endif +  /* common definitions for all OMAPs */  #define SYSCTL_SRC	(1 << 25)  #define SYSCTL_SRD	(1 << 26)  struct omap_hsmmc_data {  	struct hsmmc *base_addr; +#ifdef OMAP_HSMMC_USE_GPIO  	int cd_gpio;  	int wp_gpio; +#endif  };  /* If we fail after 1 second wait, something is really bad */ @@ -54,8 +64,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,  static struct mmc hsmmc_dev[3];  static struct omap_hsmmc_data hsmmc_dev_data[3]; -#if (defined(CONFIG_OMAP_GPIO) && !defined(CONFIG_SPL_BUILD)) || \ -	(defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_GPIO_SUPPORT)) +#ifdef OMAP_HSMMC_USE_GPIO  static int omap_mmc_setup_gpio_in(int gpio, const char *label)  {  	if (!gpio_is_valid(gpio)) @@ -69,26 +78,6 @@ static int omap_mmc_setup_gpio_in(int gpio, const char *label)  	return gpio;  } - -static int omap_mmc_getcd(struct mmc *mmc) -{ -	int cd_gpio = ((struct omap_hsmmc_data *)mmc->priv)->cd_gpio; -	return gpio_get_value(cd_gpio); -} - -static int omap_mmc_getwp(struct mmc *mmc) -{ -	int wp_gpio = ((struct omap_hsmmc_data *)mmc->priv)->wp_gpio; -	return gpio_get_value(wp_gpio); -} -#else -static inline int omap_mmc_setup_gpio_in(int gpio, const char *label) -{ -	return -1; -} - -#define omap_mmc_getcd NULL -#define omap_mmc_getwp NULL  #endif  #if defined(CONFIG_OMAP44XX) && defined(CONFIG_TWL6030_POWER) @@ -213,7 +202,7 @@ void mmc_init_stream(struct hsmmc *mmc_base)  } -static int mmc_init_setup(struct mmc *mmc) +static int omap_hsmmc_init_setup(struct mmc *mmc)  {  	struct hsmmc *mmc_base;  	unsigned int reg_val; @@ -322,7 +311,7 @@ static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)  	}  } -static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, +static int omap_hsmmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,  			struct mmc_data *data)  {  	struct hsmmc *mmc_base; @@ -552,7 +541,7 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,  	return 0;  } -static void mmc_set_ios(struct mmc *mmc) +static void omap_hsmmc_set_ios(struct mmc *mmc)  {  	struct hsmmc *mmc_base;  	unsigned int dsor = 0; @@ -606,6 +595,44 @@ static void mmc_set_ios(struct mmc *mmc)  	writel(readl(&mmc_base->sysctl) | CEN_ENABLE, &mmc_base->sysctl);  } +#ifdef OMAP_HSMMC_USE_GPIO +static int omap_hsmmc_getcd(struct mmc *mmc) +{ +	struct omap_hsmmc_data *priv_data = mmc->priv; +	int cd_gpio; + +	/* if no CD return as 1 */ +	cd_gpio = priv_data->cd_gpio; +	if (cd_gpio < 0) +		return 1; + +	return gpio_get_value(cd_gpio); +} + +static int omap_hsmmc_getwp(struct mmc *mmc) +{ +	struct omap_hsmmc_data *priv_data = mmc->priv; +	int wp_gpio; + +	/* if no WP return as 0 */ +	wp_gpio = priv_data->wp_gpio; +	if (wp_gpio < 0) +		return 0; + +	return gpio_get_value(wp_gpio); +} +#endif + +static const struct mmc_ops omap_hsmmc_ops = { +	.send_cmd	= omap_hsmmc_send_cmd, +	.set_ios	= omap_hsmmc_set_ios, +	.init		= omap_hsmmc_init_setup, +#ifdef OMAP_HSMMC_USE_GPIO +	.getcd		= omap_hsmmc_getcd, +	.getwp		= omap_hsmmc_getwp, +#endif +}; +  int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,  		int wp_gpio)  { @@ -615,9 +642,7 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,  			     MMC_MODE_HC;  	sprintf(mmc->name, "OMAP SD/MMC"); -	mmc->send_cmd = mmc_send_cmd; -	mmc->set_ios = mmc_set_ios; -	mmc->init = mmc_init_setup; +	mmc->ops = &omap_hsmmc_ops;  	mmc->priv = priv_data;  	switch (dev_index) { @@ -647,13 +672,11 @@ int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,  		priv_data->base_addr = (struct hsmmc *)OMAP_HSMMC1_BASE;  		return 1;  	} +#ifdef OMAP_HSMMC_USE_GPIO +	/* on error gpio values are set to -1, which is what we want */  	priv_data->cd_gpio = omap_mmc_setup_gpio_in(cd_gpio, "mmc_cd"); -	if (priv_data->cd_gpio != -1) -		mmc->getcd = omap_mmc_getcd; -  	priv_data->wp_gpio = omap_mmc_setup_gpio_in(wp_gpio, "mmc_wp"); -	if (priv_data->wp_gpio != -1) -		mmc->getwp = omap_mmc_getwp; +#endif  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;  	mmc->host_caps = host_caps_val & ~host_caps_mask; diff --git a/drivers/mmc/pxa_mmc_gen.c b/drivers/mmc/pxa_mmc_gen.c index 29f3eaf30..4694c8f42 100644 --- a/drivers/mmc/pxa_mmc_gen.c +++ b/drivers/mmc/pxa_mmc_gen.c @@ -366,6 +366,12 @@ static int pxa_mmc_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops pxa_mmc_ops = { +	.send_cmd	= pxa_mmc_request, +	.set_ios	= pxa_mmc_set_ios, +	.init		= pxa_mmc_init, +}; +  int pxa_mmc_register(int card_index)  {  	struct mmc *mmc; @@ -397,10 +403,7 @@ int pxa_mmc_register(int card_index)  	mmc->priv = priv;  	sprintf(mmc->name, "PXA MMC"); -	mmc->send_cmd	= pxa_mmc_request; -	mmc->set_ios	= pxa_mmc_set_ios; -	mmc->init	= pxa_mmc_init; -	mmc->getcd	= NULL; +	mmc->ops = &pxa_mmc_ops;  	mmc->voltages	= MMC_VDD_32_33 | MMC_VDD_33_34;  	mmc->f_max	= PXAMMC_MAX_SPEED; diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 1e86b92be..c3425a6ce 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -430,6 +430,13 @@ int sdhci_init(struct mmc *mmc)  	return 0;  } + +static const struct mmc_ops sdhci_ops = { +	.send_cmd	= sdhci_send_command, +	.set_ios	= sdhci_set_ios, +	.init		= sdhci_init, +}; +  int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)  {  	struct mmc *mmc; @@ -445,11 +452,7 @@ int add_sdhci(struct sdhci_host *host, u32 max_clk, u32 min_clk)  	host->mmc = mmc;  	sprintf(mmc->name, "%s", host->name); -	mmc->send_cmd = sdhci_send_command; -	mmc->set_ios = sdhci_set_ios; -	mmc->init = sdhci_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &sdhci_ops;  	caps = sdhci_readl(host, SDHCI_CAPABILITIES);  #ifdef CONFIG_MMC_SDMA diff --git a/drivers/mmc/sh_mmcif.c b/drivers/mmc/sh_mmcif.c index 011d4f3e6..6a4860bb3 100644 --- a/drivers/mmc/sh_mmcif.c +++ b/drivers/mmc/sh_mmcif.c @@ -574,6 +574,12 @@ static int sh_mmcif_init(struct mmc *mmc)  	return 0;  } +static const struct mmc_ops sh_mmcif_ops = { +	.send_cmd	= sh_mmcif_request, +	.set_ios	= sh_mmcif_set_ios, +	.init		= sh_mmcif_init, +}; +  int mmcif_mmc_init(void)  {  	int ret = 0; @@ -595,11 +601,7 @@ int mmcif_mmc_init(void)  	mmc->host_caps = MMC_MODE_HS | MMC_MODE_HS_52MHz | MMC_MODE_4BIT |  			 MMC_MODE_8BIT | MMC_MODE_HC;  	memcpy(mmc->name, DRIVER_NAME, sizeof(DRIVER_NAME)); -	mmc->send_cmd = sh_mmcif_request; -	mmc->set_ios = sh_mmcif_set_ios; -	mmc->init = sh_mmcif_init; -	mmc->getcd = NULL; -	mmc->getwp = NULL; +	mmc->ops = &sh_mmcif_ops;  	host->regs = (struct sh_mmcif_regs *)CONFIG_SH_MMCIF_ADDR;  	host->clk = CONFIG_SH_MMCIF_CLK;  	mmc->priv = host; diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c index 3d1ce1263..5f7b590b8 100644 --- a/drivers/mmc/tegra_mmc.c +++ b/drivers/mmc/tegra_mmc.c @@ -314,7 +314,7 @@ static int mmc_send_cmd_bounced(struct mmc *mmc, struct mmc_cmd *cmd,  	return 0;  } -static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, +static int tegra_mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,  			struct mmc_data *data)  {  	void *buf; @@ -396,7 +396,7 @@ out:  	host->clock = clock;  } -static void mmc_set_ios(struct mmc *mmc) +static void tegra_mmc_set_ios(struct mmc *mmc)  {  	struct mmc_host *host = mmc->priv;  	unsigned char ctrl; @@ -464,7 +464,7 @@ static void mmc_reset(struct mmc_host *host, struct mmc *mmc)  	pad_init_mmc(host);  } -static int mmc_core_init(struct mmc *mmc) +static int tegra_mmc_core_init(struct mmc *mmc)  {  	struct mmc_host *host = (struct mmc_host *)mmc->priv;  	unsigned int mask; @@ -521,6 +521,13 @@ int tegra_mmc_getcd(struct mmc *mmc)  	return 1;  } +static const struct mmc_ops tegra_mmc_ops = { +	.send_cmd	= tegra_mmc_send_cmd, +	.set_ios	= tegra_mmc_set_ios, +	.init		= tegra_mmc_core_init, +	.getcd		= tegra_mmc_getcd, +}; +  static int do_mmc_init(int dev_index)  {  	struct mmc_host *host; @@ -558,11 +565,7 @@ static int do_mmc_init(int dev_index)  	sprintf(mmc->name, "Tegra SD/MMC");  	mmc->priv = host; -	mmc->send_cmd = mmc_send_cmd; -	mmc->set_ios = mmc_set_ios; -	mmc->init = mmc_core_init; -	mmc->getcd = tegra_mmc_getcd; -	mmc->getwp = NULL; +	mmc->ops = &tegra_mmc_ops;  	mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;  	mmc->host_caps = 0; |