From 5d4081964ec7cc2288f75d3cf5949bd2daa2737e Mon Sep 17 00:00:00 2001 From: xbw Date: Wed, 21 Sep 2011 14:25:53 +0800 Subject: [PATCH] add the feature of write-protect for sdcard --- arch/arm/mach-rk29/board-rk29-ddr3sdk.c | 13 +++++++++ arch/arm/mach-rk29/include/mach/board.h | 1 + drivers/mmc/host/Kconfig | 13 +++++++++ drivers/mmc/host/rk29_sdmmc.c | 39 ++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 4 deletions(-) mode change 100644 => 100755 arch/arm/mach-rk29/include/mach/board.h mode change 100644 => 100755 drivers/mmc/host/Kconfig diff --git a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c index 7e8c3ce90ed8..6976859a2105 100755 --- a/arch/arm/mach-rk29/board-rk29-ddr3sdk.c +++ b/arch/arm/mach-rk29/board-rk29-ddr3sdk.c @@ -1869,6 +1869,12 @@ struct rk29_sdmmc_platform_data default_sdmmc0_data = { #endif .detect_irq = RK29_PIN2_PA2, // INVALID_GPIO .enable_sd_wakeup = 0, + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) + .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. +#else + .write_prt = INVALID_GPIO, +#endif }; #endif #ifdef CONFIG_SDMMC1_RK29 @@ -1912,6 +1918,13 @@ struct rk29_sdmmc_platform_data default_sdmmc1_data = { #if 0 .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N, #endif + +#if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + .write_prt = RK29_PIN6_PB0,//According to your own project to set the value of write-protect-pin. +#else + .write_prt = INVALID_GPIO, +#endif + }; #endif diff --git a/arch/arm/mach-rk29/include/mach/board.h b/arch/arm/mach-rk29/include/mach/board.h old mode 100644 new mode 100755 index c97306d4af19..efd21ecc328e --- a/arch/arm/mach-rk29/include/mach/board.h +++ b/arch/arm/mach-rk29/include/mach/board.h @@ -143,6 +143,7 @@ struct rk29_sdmmc_platform_data { int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id); int detect_irq; int enable_sd_wakeup; + int write_prt; }; struct rk29_i2c_platform_data { int bus_num; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig old mode 100644 new mode 100755 index c5886cdd7201..85df780a5e0a --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -24,6 +24,13 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC0 controller on Rk29 processors. + + config SDMMC0_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC0" + depends on SDMMC0_RK29 + help + You will add the feature of write-protect for sdmmc-card if you say Yes. + Please note that this feature requires hardware support. # config EMMC_RK29 # tristate "RK29 EMMC controller support(sdmmc)" # default y @@ -36,6 +43,12 @@ if SDMMC_RK29 depends on ARCH_RK29 help This supports the use of the SDMMC1 controller on Rk29 processors. + config SDMMC1_RK29_WRITE_PROTECT + bool "Write-protect for SDMMC1" + depends on SDMMC1_RK29 + help + You will add the feature of write-protect for sdio-card if you say Yes. + Please note that this feature requires hardware support. endif config MMC_ARMMMCI diff --git a/drivers/mmc/host/rk29_sdmmc.c b/drivers/mmc/host/rk29_sdmmc.c index c9ed1c8522cb..ca13c9553815 100755 --- a/drivers/mmc/host/rk29_sdmmc.c +++ b/drivers/mmc/host/rk29_sdmmc.c @@ -61,7 +61,7 @@ int debug_level = 7; #define xbwprintk(n, arg...) #endif -#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN /*| SDMMC_INT_RTO*/ | SDMMC_INT_HLE ) +#define RK29_SDMMC_ERROR_FLAGS (SDMMC_INT_FRUN | SDMMC_INT_HLE ) #define RK29_SDMMC_INTMASK_USEDMA (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD) #define RK29_SDMMC_INTMASK_USEIO (SDMMC_INT_CMD_DONE | SDMMC_INT_DTO | RK29_SDMMC_ERROR_FLAGS | SDMMC_INT_CD| SDMMC_INT_TXDR | SDMMC_INT_RXDR ) @@ -72,7 +72,7 @@ int debug_level = 7; #define RK29_SDMMC_WAIT_DTO_INTERNVAL 1500 //The time interval from the CMD_DONE_INT to DTO_INT #define RK29_SDMMC_REMOVAL_DELAY 2000 //The time interval from the CD_INT to detect_timer react. -#define RK29_SDMMC_VERSION "Ver.2.07 The last modify date is 2011-09-09,modifyed by XBW." +#define RK29_SDMMC_VERSION "Ver.2.08 The last modify date is 2011-09-21,modifyed by XBW." #define RK29_CTRL_SDMMC_ID 0 //mainly used by SDMMC #define RK29_CTRL_SDIO1_ID 1 //mainly used by sdio-wifi @@ -197,10 +197,16 @@ struct rk29_sdmmc { unsigned int oldstatus; unsigned int complete_done; unsigned int retryfunc; + #ifdef CONFIG_PM int gpio_irq; int gpio_det; #endif + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int write_protect; +#endif + }; @@ -2074,10 +2080,26 @@ out: static int rk29_sdmmc_get_ro(struct mmc_host *mmc) { - struct rk29_sdmmc *host = mmc_priv(mmc); + struct rk29_sdmmc *host = mmc_priv(mmc); + +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + int ret; + + if(INVALID_GPIO == host->write_protect) + ret = 0;//no write-protect + else + ret = gpio_get_value(host->write_protect)?0:1; + + xbwprintk(7,"%s..%d.. write_prt_pin=%d, get_ro=%d ===xbw[%s]===\n",\ + __FUNCTION__, __LINE__,host->write_protect, ret, host->dma_name); + + return ret; + +#else u32 wrtprt = rk29_sdmmc_read(host->regs, SDMMC_WRTPRT); - + return (wrtprt & SDMMC_WRITE_PROTECT)?1:0; +#endif } @@ -3027,6 +3049,15 @@ static int rk29_sdmmc_probe(struct platform_device *pdev) host->dma_addr = regs->start + SDMMC_DATA; } +#if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT) || defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT) + host->write_protect = pdata->write_prt; + if(INVALID_GPIO != host->write_protect) + { + gpio_direction_input(host->write_protect); + } + +#endif + rk29_sdmmc_hw_init(host); ret = request_irq(irq, rk29_sdmmc_interrupt, 0, dev_name(&pdev->dev), host); -- 2.34.1