summaryrefslogtreecommitdiff
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorDavid Wu <david.wu@rock-chips.com>2018-10-30 14:45:37 +0800
committerTao Huang <huangtao@rock-chips.com>2018-11-01 16:44:12 +0800
commit8aa4184e0b59d31a961be3e87ec129c2fb50c0ee (patch)
treedb8b3ecde80494ba7fb7e54903dd1a6a8f3e3bb1 /drivers/pinctrl
parent7599dbad393c626f3216935f3fac3d36c1c837b4 (diff)
pinctrl: rockchip: Split the SoC data initialization into two functions
SoC data initialization requires the use of regmap base, but it is no initialized at this time, and regmap base needs to use ctrl data, so splitting it into two functions. Fixes: f82750e61516 ("pinctrl: rockchip: Call rockchip_pinctrl_get_soc_data() after regmap Initialization") Change-Id: Ife46a9ade41f021458336c3480cdf99a96c2f264 Signed-off-by: David Wu <david.wu@rock-chips.com>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/pinctrl-rockchip.c107
1 files changed, 64 insertions, 43 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
index f6a340e05a60..29103c1d4819 100644
--- a/drivers/pinctrl/pinctrl-rockchip.c
+++ b/drivers/pinctrl/pinctrl-rockchip.c
@@ -398,8 +398,9 @@ struct rockchip_pin_ctrl {
struct rockchip_mux_route_data *iomux_routes;
u32 niomux_routes;
- int (*soc_data_init)(struct rockchip_pinctrl *info,
- struct rockchip_pin_ctrl *ctrl);
+ int (*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl);
+
+ int (*soc_data_init)(struct rockchip_pinctrl *info);
void (*pull_calc_reg)(struct rockchip_pin_bank *bank,
int pin_num, struct regmap **regmap,
@@ -4160,29 +4161,12 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank,
static const struct of_device_id rockchip_pinctrl_dt_match[];
-/* SoC data specially handle */
-
-#define RK3308B_GRF_SOC_CON13 0x608
-#define RK3308B_GRF_SOC_CON15 0x610
-
-/* RK3308B_GRF_SOC_CON13 */
-#define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
-#define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
-#define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
-
-/* RK3308B_GRF_SOC_CON15 */
-#define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
-#define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
-#define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
-
-static int rk3308b_soc_data_init(struct rockchip_pinctrl *info,
- struct rockchip_pin_ctrl *ctrl)
+/* Ctrl data specially handle */
+static int rk3308b_ctrl_data_re_init(struct rockchip_pin_ctrl *ctrl)
{
- int ret;
-
/*
* Special for rk3308b, where we need to replace the recalced
- * and routed arrays, and enable the ctrl of selected sources.
+ * and routed arrays.
*/
if (soc_is_rk3308b()) {
ctrl->iomux_recalced = rk3308b_mux_recalced_data;
@@ -4190,19 +4174,6 @@ static int rk3308b_soc_data_init(struct rockchip_pinctrl *info,
ctrl->iomux_routes = rk3308b_mux_route_data;
ctrl->niomux_routes = ARRAY_SIZE(rk3308b_mux_route_data);
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON13,
- RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
- RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
- RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
- if (ret)
- return ret;
-
- ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON15,
- RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
- RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
- RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
- if (ret)
- return ret;
}
return 0;
@@ -4240,9 +4211,9 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(
}
}
- /* Special handle for some Socs */
- if (ctrl->soc_data_init) {
- if (ctrl->soc_data_init(d, ctrl))
+ /* Ctrl data re-initialize for some Socs */
+ if (ctrl->ctrl_data_re_init) {
+ if (ctrl->ctrl_data_re_init(ctrl))
return NULL;
}
@@ -4392,6 +4363,48 @@ static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend,
rockchip_pinctrl_resume);
+/* SoC data specially handle */
+
+/* rk3308b SoC data initialize */
+#define RK3308B_GRF_SOC_CON13 0x608
+#define RK3308B_GRF_SOC_CON15 0x610
+
+/* RK3308B_GRF_SOC_CON13 */
+#define RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL (BIT(16 + 10) | BIT(10))
+#define RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
+#define RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
+
+/* RK3308B_GRF_SOC_CON15 */
+#define RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL (BIT(16 + 11) | BIT(11))
+#define RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL (BIT(16 + 7) | BIT(7))
+#define RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL (BIT(16 + 3) | BIT(3))
+
+static int rk3308b_soc_data_init(struct rockchip_pinctrl *info)
+{
+ int ret;
+
+ /*
+ * Enable the special ctrl of selected sources.
+ */
+ if (soc_is_rk3308b()) {
+ ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON13,
+ RK3308B_GRF_I2C3_IOFUNC_SRC_CTRL |
+ RK3308B_GRF_GPIO2A3_SEL_SRC_CTRL |
+ RK3308B_GRF_GPIO2A2_SEL_SRC_CTRL);
+ if (ret)
+ return ret;
+
+ ret = regmap_write(info->regmap_base, RK3308B_GRF_SOC_CON15,
+ RK3308B_GRF_GPIO2C0_SEL_SRC_CTRL |
+ RK3308B_GRF_GPIO3B3_SEL_SRC_CTRL |
+ RK3308B_GRF_GPIO3B2_SEL_SRC_CTRL);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static int rockchip_pinctrl_probe(struct platform_device *pdev)
{
struct rockchip_pinctrl *info;
@@ -4413,6 +4426,13 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
info->dev = dev;
+ ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
+ if (!ctrl) {
+ dev_err(dev, "driver data not available\n");
+ return -EINVAL;
+ }
+ info->ctrl = ctrl;
+
node = of_parse_phandle(np, "rockchip,grf", 0);
if (node) {
info->regmap_base = syscon_node_to_regmap(node);
@@ -4456,12 +4476,12 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
return PTR_ERR(info->regmap_pmu);
}
- ctrl = rockchip_pinctrl_get_soc_data(info, pdev);
- if (!ctrl) {
- dev_err(dev, "driver data not available\n");
- return -EINVAL;
+ /* Special handle for some Socs */
+ if (ctrl->soc_data_init) {
+ ret = ctrl->soc_data_init(info);
+ if (ret)
+ return ret;
}
- info->ctrl = ctrl;
ret = rockchip_gpiolib_register(pdev, info);
if (ret)
@@ -4773,6 +4793,7 @@ static struct rockchip_pin_ctrl rk3308_pin_ctrl = {
.niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data),
.iomux_routes = rk3308_mux_route_data,
.niomux_routes = ARRAY_SIZE(rk3308_mux_route_data),
+ .ctrl_data_re_init = rk3308b_ctrl_data_re_init,
.soc_data_init = rk3308b_soc_data_init,
.pull_calc_reg = rk3308_calc_pull_reg_and_bit,
.drv_calc_reg = rk3308_calc_drv_reg_and_bit,