[PATCH 09/14] soc: aspeed: convert LPC and P2A control mmap hooks to mmap_prepare

From: Lorenzo Stoakes (ARM)

Date: Thu Nov 05 2026 - 16:11:15 EST


Move from the deprecated mmap hook to the new mmap_prepare hook for both
the LPC control and P2A control drivers.

Both remap a range of their reserved memory region, so use the PFN remap
mmap action to do so, retaining the -EAGAIN error on failure via the action
error override.

Signed-off-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
---
drivers/soc/aspeed/aspeed-lpc-ctrl.c | 20 +++++++++-----------
drivers/soc/aspeed/aspeed-p2a-ctrl.c | 22 ++++++++--------------
2 files changed, 17 insertions(+), 25 deletions(-)

diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c
index 4d8574cac703..9258762354cc 100644
--- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c
+++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c
@@ -47,22 +47,20 @@ static struct aspeed_lpc_ctrl *file_aspeed_lpc_ctrl(struct file *file)
miscdev);
}

-static int aspeed_lpc_ctrl_mmap(struct file *file, struct vm_area_struct *vma)
+static int aspeed_lpc_ctrl_mmap_prepare(struct vm_area_desc *desc)
{
- struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file);
- unsigned long vsize = vma->vm_end - vma->vm_start;
- pgprot_t prot = vma->vm_page_prot;
+ struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(desc->file);

- if (vma->vm_pgoff + vma_pages(vma) > lpc_ctrl->mem_size >> PAGE_SHIFT)
+ if (desc->pgoff + vma_desc_pages(desc) >
+ lpc_ctrl->mem_size >> PAGE_SHIFT)
return -EINVAL;

/* ast2400/2500 AHB accesses are not cache coherent */
- prot = pgprot_noncached(prot);
+ desc->page_prot = pgprot_noncached(desc->page_prot);

- if (remap_pfn_range(vma, vma->vm_start,
- (lpc_ctrl->mem_base >> PAGE_SHIFT) + vma->vm_pgoff,
- vsize, prot))
- return -EAGAIN;
+ mmap_action_remap_full(desc,
+ (lpc_ctrl->mem_base >> PAGE_SHIFT) + desc->pgoff);
+ desc->action.error_override = -EAGAIN;

return 0;
}
@@ -216,7 +214,7 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,

static const struct file_operations aspeed_lpc_ctrl_fops = {
.owner = THIS_MODULE,
- .mmap = aspeed_lpc_ctrl_mmap,
+ .mmap_prepare = aspeed_lpc_ctrl_mmap_prepare,
.unlocked_ioctl = aspeed_lpc_ctrl_ioctl,
};

diff --git a/drivers/soc/aspeed/aspeed-p2a-ctrl.c b/drivers/soc/aspeed/aspeed-p2a-ctrl.c
index b6b7b80f842a..ad59ff28c013 100644
--- a/drivers/soc/aspeed/aspeed-p2a-ctrl.c
+++ b/drivers/soc/aspeed/aspeed-p2a-ctrl.c
@@ -97,29 +97,23 @@ static void aspeed_p2a_disable_bridge(struct aspeed_p2a_ctrl *p2a_ctrl)
regmap_update_bits(p2a_ctrl->regmap, SCU180, SCU180_ENP2A, 0);
}

-static int aspeed_p2a_mmap(struct file *file, struct vm_area_struct *vma)
+static int aspeed_p2a_mmap_prepare(struct vm_area_desc *desc)
{
- unsigned long vsize;
- pgprot_t prot;
- struct aspeed_p2a_user *priv = file->private_data;
+ struct aspeed_p2a_user *priv = desc->file->private_data;
struct aspeed_p2a_ctrl *ctrl = priv->parent;

if (ctrl->mem_base == 0 && ctrl->mem_size == 0)
return -EINVAL;

- vsize = vma->vm_end - vma->vm_start;
- prot = vma->vm_page_prot;
-
- if (vma->vm_pgoff + vma_pages(vma) > ctrl->mem_size >> PAGE_SHIFT)
+ if (desc->pgoff + vma_desc_pages(desc) > ctrl->mem_size >> PAGE_SHIFT)
return -EINVAL;

/* ast2400/2500 AHB accesses are not cache coherent */
- prot = pgprot_noncached(prot);
+ desc->page_prot = pgprot_noncached(desc->page_prot);

- if (remap_pfn_range(vma, vma->vm_start,
- (ctrl->mem_base >> PAGE_SHIFT) + vma->vm_pgoff,
- vsize, prot))
- return -EAGAIN;
+ mmap_action_remap_full(desc,
+ (ctrl->mem_base >> PAGE_SHIFT) + desc->pgoff);
+ desc->action.error_override = -EAGAIN;

return 0;
}
@@ -308,7 +302,7 @@ static int aspeed_p2a_release(struct inode *inode, struct file *file)

static const struct file_operations aspeed_p2a_ctrl_fops = {
.owner = THIS_MODULE,
- .mmap = aspeed_p2a_mmap,
+ .mmap_prepare = aspeed_p2a_mmap_prepare,
.unlocked_ioctl = aspeed_p2a_ioctl,
.open = aspeed_p2a_open,
.release = aspeed_p2a_release,

--
2.56.0