mirror of https://gitee.com/openkylin/linux.git
pinctrl: nomadik: Allow prcm_base to be extracted from Device Tree
The Nomadik Pinctrl driver requires access to some PRCMU registers in order to run with full functionality. When Device Tree is disabled the required PRCMU base address is passed in via platform data, so in order for Device Tree booting to be as functional, we need a similar mechanism to fetch it from Device Tree. The new semantics goes like this: Parse the Device Tree and look for the PRCMU node using a provided Phandle. Obtain the ioremaped address from that node. If one was supplied via platform data over-write it with anything found in Device Tree. Fail if either the prcm_base can't be found if we're running on anything other than an STN8815 ASIC. Signed-off-by: Lee Jones <lee.jones@linaro.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
8979cfef26
commit
32e67eee67
|
@ -25,6 +25,7 @@
|
||||||
#include <linux/irqdomain.h>
|
#include <linux/irqdomain.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
#include <linux/pinctrl/machine.h>
|
#include <linux/pinctrl/machine.h>
|
||||||
#include <linux/pinctrl/pinctrl.h>
|
#include <linux/pinctrl/pinctrl.h>
|
||||||
#include <linux/pinctrl/pinmux.h>
|
#include <linux/pinctrl/pinmux.h>
|
||||||
|
@ -2135,6 +2136,7 @@ static int nmk_pinctrl_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct platform_device_id *platid = platform_get_device_id(pdev);
|
const struct platform_device_id *platid = platform_get_device_id(pdev);
|
||||||
struct device_node *np = pdev->dev.of_node;
|
struct device_node *np = pdev->dev.of_node;
|
||||||
|
struct device_node *prcm_np;
|
||||||
struct nmk_pinctrl *npct;
|
struct nmk_pinctrl *npct;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
unsigned int version = 0;
|
unsigned int version = 0;
|
||||||
|
@ -2163,21 +2165,26 @@ static int nmk_pinctrl_probe(struct platform_device *pdev)
|
||||||
if (version == PINCTRL_NMK_DB8540)
|
if (version == PINCTRL_NMK_DB8540)
|
||||||
nmk_pinctrl_db8540_init(&npct->soc);
|
nmk_pinctrl_db8540_init(&npct->soc);
|
||||||
|
|
||||||
|
if (np) {
|
||||||
|
prcm_np = of_parse_phandle(np, "prcm", 0);
|
||||||
|
if (prcm_np)
|
||||||
|
npct->prcm_base = of_iomap(prcm_np, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allow platform passed information to over-write DT. */
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (res) {
|
if (res)
|
||||||
npct->prcm_base = devm_ioremap(&pdev->dev, res->start,
|
npct->prcm_base = devm_ioremap(&pdev->dev, res->start,
|
||||||
resource_size(res));
|
resource_size(res));
|
||||||
if (!npct->prcm_base) {
|
if (!npct->prcm_base) {
|
||||||
dev_err(&pdev->dev,
|
if (version == PINCTRL_NMK_STN8815) {
|
||||||
"failed to ioremap PRCM registers\n");
|
dev_info(&pdev->dev,
|
||||||
return -ENOMEM;
|
"No PRCM base, "
|
||||||
|
"assuming no ALT-Cx control is available\n");
|
||||||
|
} else {
|
||||||
|
dev_err(&pdev->dev, "missing PRCM base address\n");
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
} else if (version == PINCTRL_NMK_STN8815) {
|
|
||||||
dev_info(&pdev->dev,
|
|
||||||
"No PRCM base, assume no ALT-Cx control is available\n");
|
|
||||||
} else {
|
|
||||||
dev_err(&pdev->dev, "missing PRCM base address\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue