Commit 1f797edc authored by Linus Walleij's avatar Linus Walleij Committed by Ulf Hansson

mmc: block: Refactor mmc_blk_part_switch()

Instead of passing a struct mmc_blk_data * to mmc_blk_part_switch()
let's pass the actual partition type we want to switch to. This
is necessary in order not to have a block device with a backing
mmc_blk_data and request queue and all for every hardware partition,
such as RPMB.
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 61fe0e2b
...@@ -127,7 +127,7 @@ module_param(perdev_minors, int, 0444); ...@@ -127,7 +127,7 @@ module_param(perdev_minors, int, 0444);
MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device"); MODULE_PARM_DESC(perdev_minors, "Minors numbers to allocate per device");
static inline int mmc_blk_part_switch(struct mmc_card *card, static inline int mmc_blk_part_switch(struct mmc_card *card,
struct mmc_blk_data *md); unsigned int part_type);
static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk) static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
{ {
...@@ -488,7 +488,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, ...@@ -488,7 +488,7 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
mrq.cmd = &cmd; mrq.cmd = &cmd;
err = mmc_blk_part_switch(card, md); err = mmc_blk_part_switch(card, md->part_type);
if (err) if (err)
return err; return err;
...@@ -768,29 +768,29 @@ static int mmc_blk_part_switch_post(struct mmc_card *card, ...@@ -768,29 +768,29 @@ static int mmc_blk_part_switch_post(struct mmc_card *card,
} }
static inline int mmc_blk_part_switch(struct mmc_card *card, static inline int mmc_blk_part_switch(struct mmc_card *card,
struct mmc_blk_data *md) unsigned int part_type)
{ {
int ret = 0; int ret = 0;
struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev); struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev);
if (main_md->part_curr == md->part_type) if (main_md->part_curr == part_type)
return 0; return 0;
if (mmc_card_mmc(card)) { if (mmc_card_mmc(card)) {
u8 part_config = card->ext_csd.part_config; u8 part_config = card->ext_csd.part_config;
ret = mmc_blk_part_switch_pre(card, md->part_type); ret = mmc_blk_part_switch_pre(card, part_type);
if (ret) if (ret)
return ret; return ret;
part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
part_config |= md->part_type; part_config |= part_type;
ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_PART_CONFIG, part_config, EXT_CSD_PART_CONFIG, part_config,
card->ext_csd.part_time); card->ext_csd.part_time);
if (ret) { if (ret) {
mmc_blk_part_switch_post(card, md->part_type); mmc_blk_part_switch_post(card, part_type);
return ret; return ret;
} }
...@@ -799,7 +799,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card, ...@@ -799,7 +799,7 @@ static inline int mmc_blk_part_switch(struct mmc_card *card,
ret = mmc_blk_part_switch_post(card, main_md->part_curr); ret = mmc_blk_part_switch_post(card, main_md->part_curr);
} }
main_md->part_curr = md->part_type; main_md->part_curr = part_type;
return ret; return ret;
} }
...@@ -1142,7 +1142,7 @@ static int mmc_blk_reset(struct mmc_blk_data *md, struct mmc_host *host, ...@@ -1142,7 +1142,7 @@ static int mmc_blk_reset(struct mmc_blk_data *md, struct mmc_host *host,
int part_err; int part_err;
main_md->part_curr = main_md->part_type; main_md->part_curr = main_md->part_type;
part_err = mmc_blk_part_switch(host->card, md); part_err = mmc_blk_part_switch(host->card, md->part_type);
if (part_err) { if (part_err) {
/* /*
* We have failed to get back into the correct * We have failed to get back into the correct
...@@ -1181,6 +1181,7 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req) ...@@ -1181,6 +1181,7 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
struct mmc_queue_req *mq_rq; struct mmc_queue_req *mq_rq;
struct mmc_card *card = mq->card; struct mmc_card *card = mq->card;
struct mmc_blk_data *md = mq->blkdata; struct mmc_blk_data *md = mq->blkdata;
struct mmc_blk_data *main_md = dev_get_drvdata(&card->dev);
struct mmc_blk_ioc_data **idata; struct mmc_blk_ioc_data **idata;
u8 **ext_csd; u8 **ext_csd;
u32 status; u32 status;
...@@ -1199,7 +1200,7 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req) ...@@ -1199,7 +1200,7 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
} }
/* Always switch back to main area after RPMB access */ /* Always switch back to main area after RPMB access */
if (md->area_type & MMC_BLK_DATA_AREA_RPMB) if (md->area_type & MMC_BLK_DATA_AREA_RPMB)
mmc_blk_part_switch(card, dev_get_drvdata(&card->dev)); mmc_blk_part_switch(card, main_md->part_type);
break; break;
case MMC_DRV_OP_BOOT_WP: case MMC_DRV_OP_BOOT_WP:
ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,
...@@ -1959,7 +1960,7 @@ void mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) ...@@ -1959,7 +1960,7 @@ void mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
/* claim host only for the first request */ /* claim host only for the first request */
mmc_get_card(card); mmc_get_card(card);
ret = mmc_blk_part_switch(card, md); ret = mmc_blk_part_switch(card, md->part_type);
if (ret) { if (ret) {
if (req) { if (req) {
blk_end_request_all(req, BLK_STS_IOERR); blk_end_request_all(req, BLK_STS_IOERR);
...@@ -2493,7 +2494,7 @@ static void mmc_blk_remove(struct mmc_card *card) ...@@ -2493,7 +2494,7 @@ static void mmc_blk_remove(struct mmc_card *card)
mmc_blk_remove_parts(card, md); mmc_blk_remove_parts(card, md);
pm_runtime_get_sync(&card->dev); pm_runtime_get_sync(&card->dev);
mmc_claim_host(card->host); mmc_claim_host(card->host);
mmc_blk_part_switch(card, md); mmc_blk_part_switch(card, md->part_type);
mmc_release_host(card->host); mmc_release_host(card->host);
if (card->type != MMC_TYPE_SD_COMBO) if (card->type != MMC_TYPE_SD_COMBO)
pm_runtime_disable(&card->dev); pm_runtime_disable(&card->dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment