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