[PATCH v5 2/5] mmc: block: Support alternative_gpt_sector() operation
From: Dmitry Osipenko <digetx@gmail.com>
Date: 2021-08-18 00:57:15
Also in:
linux-block, linux-tegra
Subsystem:
multimedia card (mmc), secure digital (sd) and sdio subsystem, the rest · Maintainers:
Ulf Hansson, Linus Torvalds
Support generic alternative_gpt_sector() block device operation by invoking a new platform-specific MMC host hook that is also named alternative_gpt_sector(). Signed-off-by: Dmitry Osipenko <digetx@gmail.com> --- drivers/mmc/core/block.c | 30 ++++++++++++++++++++++++++++++ include/linux/mmc/host.h | 4 ++++ 2 files changed, 34 insertions(+)
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 672cc505ce37..8ad1841f0dbd 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c@@ -178,6 +178,7 @@ static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, int disable_multi, struct mmc_queue *mq); static void mmc_blk_hsq_req_done(struct mmc_request *mrq); +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev); static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk) {
@@ -801,6 +802,20 @@ static int mmc_blk_compat_ioctl(struct block_device *bdev, fmode_t mode, } #endif +static int mmc_blk_alternative_gpt_sector(struct block_device *bdev, + sector_t *sector) +{ + struct mmc_card *card = mmc_bdev_to_card(bdev); + + if (!card) + return -ENODEV; + + if (!card->host->ops->alternative_gpt_sector) + return -EOPNOTSUPP; + + return card->host->ops->alternative_gpt_sector(card, sector); +} + static const struct block_device_operations mmc_bdops = { .open = mmc_blk_open, .release = mmc_blk_release,
@@ -810,8 +825,23 @@ static const struct block_device_operations mmc_bdops = { #ifdef CONFIG_COMPAT .compat_ioctl = mmc_blk_compat_ioctl, #endif + .alternative_gpt_sector = mmc_blk_alternative_gpt_sector, }; +static struct mmc_card *mmc_bdev_to_card(struct block_device *bdev) +{ + struct mmc_blk_data *md; + + if (bdev->bd_disk->fops != &mmc_bdops) + return NULL; + + md = mmc_blk_get(bdev->bd_disk); + if (!md) + return NULL; + + return md->queue.card; +} + static int mmc_blk_part_switch_pre(struct mmc_card *card, unsigned int part_type) {
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 0abd47e9ef9b..18281c444bf6 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h@@ -190,6 +190,10 @@ struct mmc_host_ops { /* Initialize an SD express card, mandatory for MMC_CAP2_SD_EXP. */ int (*init_sd_express)(struct mmc_host *host, struct mmc_ios *ios); + + /* Get platform-specific GPT entry location */ + int (*alternative_gpt_sector)(struct mmc_card *card, + sector_t *sector); }; struct mmc_cqe_ops {
--
2.32.0