From: luowei Date: Fri, 14 Mar 2014 11:30:06 +0000 (+0800) Subject: pinctrl:divide address of pinctrl dts X-Git-Tag: firefly_0821_release~6076 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=181391482ce999e5767be02ab74b5a27058cdfb6;p=firefly-linux-kernel-4.4.55.git pinctrl:divide address of pinctrl dts --- diff --git a/arch/arm/boot/dts/rk3188-pinctrl.dtsi b/arch/arm/boot/dts/rk3188-pinctrl.dtsi index e946d705c59e..97901460bb9a 100755 --- a/arch/arm/boot/dts/rk3188-pinctrl.dtsi +++ b/arch/arm/boot/dts/rk3188-pinctrl.dtsi @@ -6,9 +6,11 @@ / { pinctrl@20008000 { compatible = "rockchip,rk3188-pinctrl"; - reg = <0x20008000 0xa0>, - <0x20008164 0x1a0>; - reg-names = "base", "pull"; + reg = <0x20008000 0x60>, + <0x20008060 0x40>, + <0x20008164 0x40>, + <0x200080f4 0x10>; + reg-names = "base", "mux", "pull", "drv"; #address-cells = <1>; #size-cells = <1>; ranges; @@ -17,6 +19,7 @@ compatible = "rockchip,rk3188-gpio-bank0"; reg = <0x2000a000 0x100>, <0x20004064 0x8>; + reg-names = "base", "pull_bank0"; interrupts = ; clocks = <&clk_gates8 9>; diff --git a/arch/arm/boot/dts/rk3288-pinctrl.dtsi b/arch/arm/boot/dts/rk3288-pinctrl.dtsi index 6ca665fc31cd..180982eaeb3b 100755 --- a/arch/arm/boot/dts/rk3288-pinctrl.dtsi +++ b/arch/arm/boot/dts/rk3288-pinctrl.dtsi @@ -6,14 +6,21 @@ / { pinctrl@ff770000 { compatible = "rockchip,rk3288-pinctrl"; - reg = <0xff770000 0x100>; + reg = <0xff770000 0x140>, + <0xff770140 0x80>, + <0xff7701c0 0x80>, + reg-names = "base", "pull", "drv"; #address-cells = <1>; #size-cells = <1>; ranges; gpio0: gpio0@ff750000 { compatible = "rockchip,rk3288-gpio-bank0"; - reg = <0xff770000 0x100>; + reg = <0xff750000 0x100>, + <0xff730080 0x10>, + <0xff730060 0x0c>, + <0xff73006c 0x0c>, + reg-names = "base", "mux_bank0", "pull_bank0", "drv_bank0"; interrupts = ; //clocks = <&clk_gates8 9>; diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 05ef4bdce8a3..ddf44078a3b7 100755 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -109,8 +109,10 @@ enum rockchip_pin_bank_type { * @slock: spinlock for the gpio bank */ struct rockchip_pin_bank { - void __iomem *reg_base; - void __iomem *reg_pull; + void __iomem *reg_base; + void __iomem *reg_mux_bank0; + void __iomem *reg_pull_bank0; + void __iomem *reg_drv_bank0; struct clk *clk; int irq; u32 pin_base; @@ -187,7 +189,11 @@ struct rockchip_pmx_func { struct rockchip_pinctrl { void __iomem *reg_base; + + void __iomem *reg_mux; void __iomem *reg_pull; + void __iomem *reg_drv; + struct device *dev; struct rockchip_pin_ctrl *ctrl; struct pinctrl_desc pctl; @@ -808,7 +814,7 @@ static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, /* The first 12 pins of the first bank are located elsewhere */ if (bank->bank_type == RK3188_BANK0 && pin_num < 12) { - *reg = bank->reg_pull + + *reg = bank->reg_pull_bank0 + ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); *bit = pin_num % RK3188_PULL_PINS_PER_REG; *bit *= RK3188_PULL_BITS_PER_PIN; @@ -2243,33 +2249,78 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank, struct device *dev) { struct resource res; + int rk3188 = 0, rk3288 = 0; + //"base", "mux_bank0", "pull_bank0", "drv_bank0" if (of_address_to_resource(bank->of_node, 0, &res)) { dev_err(dev, "cannot find IO resource for bank %s\n", bank->name); return -ENOENT; } - bank->reg_base = devm_ioremap_resource(dev, &res); if (IS_ERR(bank->reg_base)) return PTR_ERR(bank->reg_base); + + printk("%s:name=%s start=0x%x,end=0x%x\n",__func__,res.name, res.start, res.end); /* * special case, where parts of the pull setting-registers are * part of the PMU register space */ - if (of_device_is_compatible(bank->of_node, - "rockchip,rk3188-gpio-bank0")) { + rk3188 = of_device_is_compatible(bank->of_node, "rockchip,rk3188-gpio-bank0"); + + rk3288 = of_device_is_compatible(bank->of_node, "rockchip,rk3288-gpio-bank0"); + + if(rk3188) + { bank->bank_type = RK3188_BANK0; if (of_address_to_resource(bank->of_node, 1, &res)) { dev_err(dev, "cannot find IO resource for bank %s\n", bank->name); return -ENOENT; } + bank->reg_pull_bank0 = devm_ioremap_resource(dev, &res); + if (IS_ERR(bank->reg_pull_bank0)) + return PTR_ERR(bank->reg_pull_bank0); + + printk("%s:name=%s start=0x%x,end=0x%x\n",__func__,res.name, res.start, res.end); - bank->reg_pull = devm_ioremap_resource(dev, &res); - if (IS_ERR(bank->reg_pull)) - return PTR_ERR(bank->reg_pull); - } else { + } + else if (rk3288) + { + bank->bank_type = RK3288_BANK0; + if (of_address_to_resource(bank->of_node, 1, &res)) { + dev_err(dev, "cannot find IO resource for bank %s\n", bank->name); + return -ENOENT; + } + bank->reg_mux_bank0 = devm_ioremap_resource(dev, &res); + if (IS_ERR(bank->reg_mux_bank0)) + return PTR_ERR(bank->reg_mux_bank0); + + printk("%s:name=%s start=0x%x,end=0x%x\n",__func__,res.name, res.start, res.end); + + if (of_address_to_resource(bank->of_node, 2, &res)) { + dev_err(dev, "cannot find IO resource for bank %s\n", bank->name); + return -ENOENT; + } + bank->reg_pull_bank0 = devm_ioremap_resource(dev, &res); + if (IS_ERR(bank->reg_pull_bank0)) + return PTR_ERR(bank->reg_pull_bank0); + + printk("%s:name=%s start=0x%x,end=0x%x\n",__func__,res.name, res.start, res.end); + + if (of_address_to_resource(bank->of_node, 3, &res)) { + dev_err(dev, "cannot find IO resource for bank %s\n", bank->name); + return -ENOENT; + } + bank->reg_drv_bank0 = devm_ioremap_resource(dev, &res); + if (IS_ERR(bank->reg_drv_bank0)) + return PTR_ERR(bank->reg_drv_bank0); + + printk("%s:name=%s start=0x%x,end=0x%x\n",__func__,res.name, res.start, res.end); + + } + else + { bank->bank_type = COMMON_BANK; } @@ -2420,24 +2471,78 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev) g_info = info; atomic_set(&info->debug_flag, 0); - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - info->reg_base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(info->reg_base)) - return PTR_ERR(info->reg_base); - DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x,\n",__func__, res->name, res->start, res->end); + printk("%s:name=%s,type=%d\n",__func__, ctrl->label, (int)ctrl->type); + + //"base", "mux", "pull", "drv"; + switch(ctrl->type) + { + case RK2928: + case RK3066B: + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + info->reg_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_base)) + return PTR_ERR(info->reg_base); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + break; - /* The RK3188 has its pull registers in a separate place */ - if (ctrl->type == RK3188) { - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - info->reg_pull = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(info->reg_base)) + case RK3188: + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + info->reg_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_base)) + return PTR_ERR(info->reg_base); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + info->reg_mux = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_mux)) + return PTR_ERR(info->reg_mux); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 2); + info->reg_pull = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_pull)) + return PTR_ERR(info->reg_pull); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 3); + info->reg_drv = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_drv)) + return PTR_ERR(info->reg_drv); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + break; + + case RK3288: + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + info->reg_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_base)) return PTR_ERR(info->reg_base); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + info->reg_mux = info->reg_base; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + info->reg_pull = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_pull)) + return PTR_ERR(info->reg_pull); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 2); + info->reg_drv = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->reg_drv)) + return PTR_ERR(info->reg_drv); + DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); + + break; + + defualt: + printk("%s:unknown chip type\n",__func__, ctrl->type); + return -1; - DBG_PINCTRL("%s:name=%s start=0x%x,end=0x%x\n",__func__,res->name, res->start, res->end); } + ret = rockchip_gpiolib_register(pdev, info); if (ret) return ret; @@ -2450,8 +2555,6 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev) pinctrl_debugfs_init(info); - printk("%s:io-con4:0x%08x\n",__func__, readl_relaxed(info->reg_base + 0x104)); - platform_set_drvdata(pdev, info); printk("%s:init ok\n",__func__);