Commit d23d8d7e069c3aca071b7f68d9c15d11f8d4c84d

Authored by Nikita Kiryanov
Committed by Tom Rini
1 parent 5c1214de8c

mmc: add support for write protection

Add generic mmc write protection functionality.

Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>

Showing 16 changed files with 39 additions and 0 deletions Side-by-side Diff

... ... @@ -282,6 +282,13 @@
282 282  
283 283 mmc_init(mmc);
284 284  
  285 + if ((state == MMC_WRITE || state == MMC_ERASE)) {
  286 + if (mmc_getwp(mmc) == 1) {
  287 + printf("Error: card is write protected!\n");
  288 + return 1;
  289 + }
  290 + }
  291 +
285 292 switch (state) {
286 293 case MMC_READ:
287 294 n = mmc->block_dev.block_read(curr_device, blk,
drivers/mmc/arm_pl180_mmci.c
... ... @@ -377,6 +377,7 @@
377 377 dev->set_ios = host_set_ios;
378 378 dev->init = mmc_host_reset;
379 379 dev->getcd = NULL;
  380 + dev->getwp = NULL;
380 381 dev->host_caps = host->caps;
381 382 dev->voltages = host->voltages;
382 383 dev->f_min = host->clock_min;
drivers/mmc/bfin_sdh.c
... ... @@ -251,6 +251,7 @@
251 251 mmc->set_ios = bfin_sdh_set_ios;
252 252 mmc->init = bfin_sdh_init;
253 253 mmc->getcd = NULL;
  254 + mmc->getwp = NULL;
254 255 mmc->host_caps = MMC_MODE_4BIT;
255 256  
256 257 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
drivers/mmc/davinci_mmc.c
... ... @@ -388,6 +388,7 @@
388 388 mmc->set_ios = dmmc_set_ios;
389 389 mmc->init = dmmc_init;
390 390 mmc->getcd = NULL;
  391 + mmc->getwp = NULL;
391 392  
392 393 mmc->f_min = 200000;
393 394 mmc->f_max = 25000000;
drivers/mmc/fsl_esdhc.c
... ... @@ -552,6 +552,7 @@
552 552 mmc->set_ios = esdhc_set_ios;
553 553 mmc->init = esdhc_init;
554 554 mmc->getcd = esdhc_getcd;
  555 + mmc->getwp = NULL;
555 556  
556 557 voltage_caps = 0;
557 558 caps = regs->hostcapblt;
drivers/mmc/ftsdc010_esdhc.c
... ... @@ -666,6 +666,7 @@
666 666 mmc->set_ios = ftsdc010_set_ios;
667 667 mmc->init = ftsdc010_core_init;
668 668 mmc->getcd = NULL;
  669 + mmc->getwp = NULL;
669 670  
670 671 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
671 672  
drivers/mmc/gen_atmel_mci.c
... ... @@ -349,6 +349,7 @@
349 349 mmc->set_ios = mci_set_ios;
350 350 mmc->init = mci_init;
351 351 mmc->getcd = NULL;
  352 + mmc->getwp = NULL;
352 353  
353 354 /* need to be able to pass these in on a board by board basis */
354 355 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
... ... @@ -40,6 +40,23 @@
40 40 static struct list_head mmc_devices;
41 41 static int cur_dev_num = -1;
42 42  
  43 +int __weak board_mmc_getwp(struct mmc *mmc)
  44 +{
  45 + return -1;
  46 +}
  47 +
  48 +int mmc_getwp(struct mmc *mmc)
  49 +{
  50 + int wp;
  51 +
  52 + wp = board_mmc_getwp(mmc);
  53 +
  54 + if ((wp < 0) && mmc->getwp)
  55 + wp = mmc->getwp(mmc);
  56 +
  57 + return wp;
  58 +}
  59 +
43 60 int __board_mmc_getcd(struct mmc *mmc) {
44 61 return -1;
45 62 }
drivers/mmc/mmc_spi.c
... ... @@ -273,6 +273,7 @@
273 273 mmc->set_ios = mmc_spi_set_ios;
274 274 mmc->init = mmc_spi_init_p;
275 275 mmc->getcd = NULL;
  276 + mmc->getwp = NULL;
276 277 mmc->host_caps = MMC_MODE_SPI;
277 278  
278 279 mmc->voltages = MMC_SPI_VOLTAGE;
drivers/mmc/mxcmmc.c
... ... @@ -499,6 +499,7 @@
499 499 mmc->set_ios = mxcmci_set_ios;
500 500 mmc->init = mxcmci_init;
501 501 mmc->getcd = NULL;
  502 + mmc->getwp = NULL;
502 503 mmc->host_caps = MMC_MODE_4BIT;
503 504  
504 505 host->base = (struct mxcmci_regs *)CONFIG_MXC_MCI_REGS_BASE;
drivers/mmc/mxsmmc.c
... ... @@ -432,6 +432,7 @@
432 432 mmc->set_ios = mxsmmc_set_ios;
433 433 mmc->init = mxsmmc_init;
434 434 mmc->getcd = NULL;
  435 + mmc->getwp = NULL;
435 436 mmc->priv = priv;
436 437  
437 438 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
drivers/mmc/omap_hsmmc.c
... ... @@ -590,6 +590,7 @@
590 590 mmc->set_ios = mmc_set_ios;
591 591 mmc->init = mmc_init_setup;
592 592 mmc->getcd = omap_mmc_getcd;
  593 + mmc->getwp = NULL;
593 594 mmc->priv = priv_data;
594 595  
595 596 switch (dev_index) {
... ... @@ -438,6 +438,7 @@
438 438 mmc->set_ios = sdhci_set_ios;
439 439 mmc->init = sdhci_init;
440 440 mmc->getcd = NULL;
  441 + mmc->getwp = NULL;
441 442  
442 443 caps = sdhci_readl(host, SDHCI_CAPABILITIES);
443 444 #ifdef CONFIG_MMC_SDMA
drivers/mmc/sh_mmcif.c
... ... @@ -599,6 +599,7 @@
599 599 mmc->set_ios = sh_mmcif_set_ios;
600 600 mmc->init = sh_mmcif_init;
601 601 mmc->getcd = NULL;
  602 + mmc->getwp = NULL;
602 603 host->regs = (struct sh_mmcif_regs *)CONFIG_SH_MMCIF_ADDR;
603 604 host->clk = CONFIG_SH_MMCIF_CLK;
604 605 mmc->priv = host;
drivers/mmc/tegra_mmc.c
... ... @@ -563,6 +563,7 @@
563 563 mmc->set_ios = mmc_set_ios;
564 564 mmc->init = mmc_core_init;
565 565 mmc->getcd = tegra_mmc_getcd;
  566 + mmc->getwp = NULL;
566 567  
567 568 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
568 569 mmc->host_caps = 0;
... ... @@ -259,6 +259,7 @@
259 259 void (*set_ios)(struct mmc *mmc);
260 260 int (*init)(struct mmc *mmc);
261 261 int (*getcd)(struct mmc *mmc);
  262 + int (*getwp)(struct mmc *mmc);
262 263 uint b_max;
263 264 };
264 265  
... ... @@ -274,6 +275,7 @@
274 275 int board_mmc_getcd(struct mmc *mmc);
275 276 int mmc_switch_part(int dev_num, unsigned int part_num);
276 277 int mmc_getcd(struct mmc *mmc);
  278 +int mmc_getwp(struct mmc *mmc);
277 279 void spl_mmc_load(void) __noreturn;
278 280  
279 281 #ifdef CONFIG_GENERIC_MMC