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@xxxxxxxxx> --- 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