pinctrl:divide address of pinctrl dts
authorluowei <lw@rock-chips.com>
Fri, 14 Mar 2014 11:30:06 +0000 (19:30 +0800)
committerluowei <lw@rock-chips.com>
Fri, 14 Mar 2014 11:30:06 +0000 (19:30 +0800)
arch/arm/boot/dts/rk3188-pinctrl.dtsi
arch/arm/boot/dts/rk3288-pinctrl.dtsi
drivers/pinctrl/pinctrl-rockchip.c

index e946d705c59e2e3fc7465c8ed4e5d94a6b3e2321..97901460bb9ab45724247e7a037969a1c85d38e7 100755 (executable)
@@ -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 = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
                        clocks = <&clk_gates8 9>;
 
index 6ca665fc31cd00fabd810ef357c5553f25ada555..180982eaeb3bc635681bf272fd438864abba14ab 100755 (executable)
@@ -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 = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
                        //clocks = <&clk_gates8 9>;
 
index 05ef4bdce8a3a143bad5cbe24e358b162b5dda5e..ddf44078a3b7ede266fb1d688d0a315a6f0bff9d 100755 (executable)
@@ -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__);