summaryrefslogtreecommitdiff
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorDario Binacchi <dariobin@libero.it>2021-04-11 10:39:41 +0300
committerLokesh Vutla <lokeshvutla@ti.com>2021-04-12 08:47:15 +0300
commit9b884e79a6ac8cededabc3eced318d212a9c8fc3 (patch)
treefe249106143f7caa8a468a895ab99f7bdf6135ab /drivers/pinctrl
parent6719294694bf65c1ec9b0ccd15e204f46eb0d6b0 (diff)
downloadu-boot-9b884e79a6ac8cededabc3eced318d212a9c8fc3.tar.xz
pinctrl: single: fix offset management
The pinmux configuration DT node of a peripheral does not define a physical address but an offset. Only by adding it to the base address of the controller it is possible to calculate the physical address of the register to be configured. Printing an offset also requires a different formatting option than a physical address. Signed-off-by: Dario Binacchi <dariobin@libero.it> Reviewed-by: Pratyush Yadav <p.yadav@ti.com>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/pinctrl-single.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
index 49ed15211d..935b5e920d 100644
--- a/drivers/pinctrl/pinctrl-single.c
+++ b/drivers/pinctrl/pinctrl-single.c
@@ -77,15 +77,17 @@ static int single_configure_pins(struct udevice *dev,
struct single_pdata *pdata = dev_get_plat(dev);
int n, count = size / sizeof(struct single_fdt_pin_cfg);
phys_addr_t reg;
- u32 val;
+ u32 offset, val;
for (n = 0; n < count; n++, pins++) {
- reg = fdt32_to_cpu(pins->reg);
- if ((reg < 0) || (reg > pdata->offset)) {
- dev_dbg(dev, " invalid register offset 0x%pa\n", &reg);
+ offset = fdt32_to_cpu(pins->reg);
+ if (offset < 0 || offset > pdata->offset) {
+ dev_dbg(dev, " invalid register offset 0x%x\n",
+ offset);
continue;
}
- reg += pdata->base;
+
+ reg = pdata->base + offset;
val = fdt32_to_cpu(pins->val) & pdata->mask;
switch (pdata->width) {
case 16:
@@ -111,15 +113,17 @@ static int single_configure_bits(struct udevice *dev,
struct single_pdata *pdata = dev_get_plat(dev);
int n, count = size / sizeof(struct single_fdt_bits_cfg);
phys_addr_t reg;
- u32 val, mask;
+ u32 offset, val, mask;
for (n = 0; n < count; n++, pins++) {
- reg = fdt32_to_cpu(pins->reg);
- if ((reg < 0) || (reg > pdata->offset)) {
- dev_dbg(dev, " invalid register offset 0x%pa\n", &reg);
+ offset = fdt32_to_cpu(pins->reg);
+ if (offset < 0 || offset > pdata->offset) {
+ dev_dbg(dev, " invalid register offset 0x%x\n",
+ offset);
continue;
}
- reg += pdata->base;
+
+ reg = pdata->base + offset;
mask = fdt32_to_cpu(pins->mask);
val = fdt32_to_cpu(pins->val) & mask;