Commit a46d5e98 authored by Bjorn Andersson's avatar Bjorn Andersson Committed by Linus Walleij

pinctrl: qcom: Support dispersed tiles

On some new platforms the tiles have been placed too far apart to be
covered in a single ioremap. Turn "regs" into an array of base addresses
and make the pingroup carry the information about which tile the pin
resides in.

For existing platforms we map the first entry regs and the existing
pingroups will all use tile 0, meaning that there's no functional
change.
Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 6c736989
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "../pinctrl-utils.h" #include "../pinctrl-utils.h"
#define MAX_NR_GPIO 300 #define MAX_NR_GPIO 300
#define MAX_NR_TILES 4
#define PS_HOLD_OFFSET 0x820 #define PS_HOLD_OFFSET 0x820
/** /**
...@@ -52,7 +53,7 @@ ...@@ -52,7 +53,7 @@
* @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
* detection. * detection.
* @soc; Reference to soc_data of platform specific data. * @soc; Reference to soc_data of platform specific data.
* @regs: Base address for the TLMM register map. * @regs: Base addresses for the TLMM tiles.
*/ */
struct msm_pinctrl { struct msm_pinctrl {
struct device *dev; struct device *dev;
...@@ -70,19 +71,19 @@ struct msm_pinctrl { ...@@ -70,19 +71,19 @@ struct msm_pinctrl {
DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO); DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
const struct msm_pinctrl_soc_data *soc; const struct msm_pinctrl_soc_data *soc;
void __iomem *regs; void __iomem *regs[MAX_NR_TILES];
}; };
#define MSM_ACCESSOR(name) \ #define MSM_ACCESSOR(name) \
static u32 msm_readl_##name(struct msm_pinctrl *pctrl, \ static u32 msm_readl_##name(struct msm_pinctrl *pctrl, \
const struct msm_pingroup *g) \ const struct msm_pingroup *g) \
{ \ { \
return readl(pctrl->regs + g->name##_reg); \ return readl(pctrl->regs[g->tile] + g->name##_reg); \
} \ } \
static void msm_writel_##name(u32 val, struct msm_pinctrl *pctrl, \ static void msm_writel_##name(u32 val, struct msm_pinctrl *pctrl, \
const struct msm_pingroup *g) \ const struct msm_pingroup *g) \
{ \ { \
writel(val, pctrl->regs + g->name##_reg); \ writel(val, pctrl->regs[g->tile] + g->name##_reg); \
} }
MSM_ACCESSOR(ctl) MSM_ACCESSOR(ctl)
...@@ -1022,7 +1023,7 @@ static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action, ...@@ -1022,7 +1023,7 @@ static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
{ {
struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb); struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
writel(0, pctrl->regs + PS_HOLD_OFFSET); writel(0, pctrl->regs[0] + PS_HOLD_OFFSET);
mdelay(1000); mdelay(1000);
return NOTIFY_DONE; return NOTIFY_DONE;
} }
...@@ -1058,6 +1059,7 @@ int msm_pinctrl_probe(struct platform_device *pdev, ...@@ -1058,6 +1059,7 @@ int msm_pinctrl_probe(struct platform_device *pdev,
struct msm_pinctrl *pctrl; struct msm_pinctrl *pctrl;
struct resource *res; struct resource *res;
int ret; int ret;
int i;
pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
if (!pctrl) if (!pctrl)
...@@ -1069,10 +1071,20 @@ int msm_pinctrl_probe(struct platform_device *pdev, ...@@ -1069,10 +1071,20 @@ int msm_pinctrl_probe(struct platform_device *pdev,
raw_spin_lock_init(&pctrl->lock); raw_spin_lock_init(&pctrl->lock);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (soc_data->tiles) {
pctrl->regs = devm_ioremap_resource(&pdev->dev, res); for (i = 0; i < soc_data->ntiles; i++) {
if (IS_ERR(pctrl->regs)) res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
return PTR_ERR(pctrl->regs); soc_data->tiles[i]);
pctrl->regs[i] = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(pctrl->regs[i]))
return PTR_ERR(pctrl->regs[i]);
}
} else {
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
pctrl->regs[0] = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(pctrl->regs[0]))
return PTR_ERR(pctrl->regs[0]);
}
msm_pinctrl_setup_pm_reset(pctrl); msm_pinctrl_setup_pm_reset(pctrl);
......
...@@ -76,6 +76,8 @@ struct msm_pingroup { ...@@ -76,6 +76,8 @@ struct msm_pingroup {
u32 intr_status_reg; u32 intr_status_reg;
u32 intr_target_reg; u32 intr_target_reg;
unsigned int tile:2;
unsigned mux_bit:5; unsigned mux_bit:5;
unsigned pull_bit:5; unsigned pull_bit:5;
...@@ -117,6 +119,8 @@ struct msm_pinctrl_soc_data { ...@@ -117,6 +119,8 @@ struct msm_pinctrl_soc_data {
unsigned ngroups; unsigned ngroups;
unsigned ngpios; unsigned ngpios;
bool pull_no_keeper; bool pull_no_keeper;
const char **tiles;
unsigned int ntiles;
}; };
int msm_pinctrl_probe(struct platform_device *pdev, int msm_pinctrl_probe(struct platform_device *pdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment