13d0407baSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 23d0407baSopenharmony_ci/* 33d0407baSopenharmony_ci * Pinctrl driver for Rockchip SoCs 43d0407baSopenharmony_ci * 53d0407baSopenharmony_ci * Copyright (c) 2013 MundoReader S.L. 63d0407baSopenharmony_ci * Author: Heiko Stuebner <heiko@sntech.de> 73d0407baSopenharmony_ci * 83d0407baSopenharmony_ci * With some ideas taken from pinctrl-samsung: 93d0407baSopenharmony_ci * Copyright (c) 2012 Samsung Electronics Co., Ltd. 103d0407baSopenharmony_ci * http://www.samsung.com 113d0407baSopenharmony_ci * Copyright (c) 2012 Linaro Ltd 123d0407baSopenharmony_ci * https://www.linaro.org 133d0407baSopenharmony_ci * 143d0407baSopenharmony_ci * and pinctrl-at91: 153d0407baSopenharmony_ci * Copyright (C) 2011-2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> 163d0407baSopenharmony_ci */ 173d0407baSopenharmony_ci 183d0407baSopenharmony_ci#include <linux/init.h> 193d0407baSopenharmony_ci#include <linux/module.h> 203d0407baSopenharmony_ci#include <linux/platform_device.h> 213d0407baSopenharmony_ci#include <linux/io.h> 223d0407baSopenharmony_ci#include <linux/bitops.h> 233d0407baSopenharmony_ci#include <linux/gpio.h> 243d0407baSopenharmony_ci#include <linux/of_address.h> 253d0407baSopenharmony_ci#include <linux/of_irq.h> 263d0407baSopenharmony_ci#include <linux/of_device.h> 273d0407baSopenharmony_ci#include <linux/pinctrl/machine.h> 283d0407baSopenharmony_ci#include <linux/pinctrl/pinconf.h> 293d0407baSopenharmony_ci#include <linux/pinctrl/pinctrl.h> 303d0407baSopenharmony_ci#include <linux/pinctrl/pinmux.h> 313d0407baSopenharmony_ci#include <linux/pinctrl/pinconf-generic.h> 323d0407baSopenharmony_ci#include <linux/irqchip/chained_irq.h> 333d0407baSopenharmony_ci#include <linux/clk.h> 343d0407baSopenharmony_ci#include <linux/regmap.h> 353d0407baSopenharmony_ci#include <linux/mfd/syscon.h> 363d0407baSopenharmony_ci#include <linux/rockchip/cpu.h> 373d0407baSopenharmony_ci#include <dt-bindings/pinctrl/rockchip.h> 383d0407baSopenharmony_ci 393d0407baSopenharmony_ci#include "core.h" 403d0407baSopenharmony_ci#include "pinconf.h" 413d0407baSopenharmony_ci#include "pinctrl-rockchip.h" 423d0407baSopenharmony_ci 433d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_ZERO 0 443d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_ONE 1 453d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWO 2 463d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_THREE 3 473d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_FOUR 4 483d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_FIVE 5 493d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_SIX 6 503d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_SEVEN 7 513d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_EIGHT 8 523d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_NINE 9 533d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TEN 10 543d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_ELEVEN 11 553d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWELVE 12 563d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_THIRTEEN 13 573d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_FOURTEEN 14 583d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_FIFTEEN 15 593d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_SIXTEEN 16 603d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_EIGHTEEN 18 613d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_NINTEEN 19 623d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTY 20 633d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYONE 21 643d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYTWO 22 653d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYTHREE 23 663d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYFOUR 24 673d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYSIX 26 683d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_TWENTYSEVEN 27 693d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_THIRTY 30 703d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_THIRTYONE 31 713d0407baSopenharmony_ci#define PINCTRL_ROCKCHIP_THIRTYTWO 32 723d0407baSopenharmony_ci 733d0407baSopenharmony_ci/** 743d0407baSopenharmony_ci * Generate a bitmask for setting a value (v) with a write mask bit in hiword 753d0407baSopenharmony_ci * register 31:16 area. 763d0407baSopenharmony_ci */ 773d0407baSopenharmony_ci#define WRITE_MASK_VAL(h, l, v) (GENMASK(((h) + 16), ((l) + 16)) | (((v) << (l)) & GENMASK((h), (l)))) 783d0407baSopenharmony_ci 793d0407baSopenharmony_ci/* 803d0407baSopenharmony_ci * Encode variants of iomux registers into a type variable 813d0407baSopenharmony_ci */ 823d0407baSopenharmony_ci#define IOMUX_GPIO_ONLY BIT(0) 833d0407baSopenharmony_ci#define IOMUX_WIDTH_4BIT BIT(1) 843d0407baSopenharmony_ci#define IOMUX_SOURCE_PMU BIT(2) 853d0407baSopenharmony_ci#define IOMUX_UNROUTED BIT(3) 863d0407baSopenharmony_ci#define IOMUX_WIDTH_3BIT BIT(4) 873d0407baSopenharmony_ci#define IOMUX_WIDTH_2BIT BIT(5) 883d0407baSopenharmony_ci#define IOMUX_WRITABLE_32BIT BIT(6) 893d0407baSopenharmony_ci#define IOMUX_L_SOURCE_PMU BIT(7) 903d0407baSopenharmony_ci 913d0407baSopenharmony_ci#define PIN_BANK(id, pins, label) \ 923d0407baSopenharmony_ci { \ 933d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 943d0407baSopenharmony_ci .iomux = { \ 953d0407baSopenharmony_ci {.offset = -1}, \ 963d0407baSopenharmony_ci {.offset = -1}, \ 973d0407baSopenharmony_ci {.offset = -1}, \ 983d0407baSopenharmony_ci {.offset = -1}, \ 993d0407baSopenharmony_ci }, \ 1003d0407baSopenharmony_ci } 1013d0407baSopenharmony_ci 1023d0407baSopenharmony_ci#define PIN_BANK_IOMUX_FLAGS(id, pins, label, iom0, iom1, iom2, iom3) \ 1033d0407baSopenharmony_ci { \ 1043d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1053d0407baSopenharmony_ci .iomux = { \ 1063d0407baSopenharmony_ci {.type = (iom0), .offset = -1}, \ 1073d0407baSopenharmony_ci {.type = (iom1), .offset = -1}, \ 1083d0407baSopenharmony_ci {.type = (iom2), .offset = -1}, \ 1093d0407baSopenharmony_ci {.type = (iom3), .offset = -1}, \ 1103d0407baSopenharmony_ci }, \ 1113d0407baSopenharmony_ci } 1123d0407baSopenharmony_ci 1133d0407baSopenharmony_ci#define PIN_BANK_IOMUX_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, iom3, offset0, offset1, offset2, offset3) \ 1143d0407baSopenharmony_ci { \ 1153d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1163d0407baSopenharmony_ci .iomux = { \ 1173d0407baSopenharmony_ci {.type = (iom0), .offset = (offset0)}, \ 1183d0407baSopenharmony_ci {.type = (iom1), .offset = (offset1)}, \ 1193d0407baSopenharmony_ci {.type = (iom2), .offset = (offset2)}, \ 1203d0407baSopenharmony_ci {.type = (iom3), .offset = (offset3)}, \ 1213d0407baSopenharmony_ci }, \ 1223d0407baSopenharmony_ci } 1233d0407baSopenharmony_ci 1243d0407baSopenharmony_ci#define PIN_BANK_DRV_FLAGS(id, pins, label, type0, type1, type2, type3) \ 1253d0407baSopenharmony_ci { \ 1263d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1273d0407baSopenharmony_ci .iomux = \ 1283d0407baSopenharmony_ci { \ 1293d0407baSopenharmony_ci {.offset = -1}, \ 1303d0407baSopenharmony_ci {.offset = -1}, \ 1313d0407baSopenharmony_ci {.offset = -1}, \ 1323d0407baSopenharmony_ci {.offset = -1}, \ 1333d0407baSopenharmony_ci }, \ 1343d0407baSopenharmony_ci .drv = { \ 1353d0407baSopenharmony_ci {.drv_type = (type0), .offset = -1}, \ 1363d0407baSopenharmony_ci {.drv_type = (type1), .offset = -1}, \ 1373d0407baSopenharmony_ci {.drv_type = (type2), .offset = -1}, \ 1383d0407baSopenharmony_ci {.drv_type = (type3), .offset = -1}, \ 1393d0407baSopenharmony_ci }, \ 1403d0407baSopenharmony_ci } 1413d0407baSopenharmony_ci 1423d0407baSopenharmony_ci#define PIN_BANK_DRV_FLAGS_PULL_FLAGS(id, pins, label, drv0, drv1, drv2, drv3, pull0, pull1, pull2, pull3) \ 1433d0407baSopenharmony_ci { \ 1443d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1453d0407baSopenharmony_ci .iomux = \ 1463d0407baSopenharmony_ci { \ 1473d0407baSopenharmony_ci {.offset = -1}, \ 1483d0407baSopenharmony_ci {.offset = -1}, \ 1493d0407baSopenharmony_ci {.offset = -1}, \ 1503d0407baSopenharmony_ci {.offset = -1}, \ 1513d0407baSopenharmony_ci }, \ 1523d0407baSopenharmony_ci .drv = \ 1533d0407baSopenharmony_ci { \ 1543d0407baSopenharmony_ci {.drv_type = (drv0), .offset = -1}, \ 1553d0407baSopenharmony_ci {.drv_type = (drv1), .offset = -1}, \ 1563d0407baSopenharmony_ci {.drv_type = (drv2), .offset = -1}, \ 1573d0407baSopenharmony_ci {.drv_type = (drv3), .offset = -1}, \ 1583d0407baSopenharmony_ci }, \ 1593d0407baSopenharmony_ci .pull_type[0] = (pull0), .pull_type[1] = (pull1), .pull_type[2] = (pull2), .pull_type[3] = (pull3), \ 1603d0407baSopenharmony_ci } 1613d0407baSopenharmony_ci 1623d0407baSopenharmony_ci#define PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(id, pins, label, iom0, iom1, iom2, iom3, drv0, drv1, drv2, drv3, offset0, \ 1633d0407baSopenharmony_ci offset1, offset2, offset3) \ 1643d0407baSopenharmony_ci { \ 1653d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1663d0407baSopenharmony_ci .iomux = \ 1673d0407baSopenharmony_ci { \ 1683d0407baSopenharmony_ci {.type = (iom0), .offset = -1}, \ 1693d0407baSopenharmony_ci {.type = (iom1), .offset = -1}, \ 1703d0407baSopenharmony_ci {.type = (iom2), .offset = -1}, \ 1713d0407baSopenharmony_ci {.type = (iom3), .offset = -1}, \ 1723d0407baSopenharmony_ci }, \ 1733d0407baSopenharmony_ci .drv = { \ 1743d0407baSopenharmony_ci {.drv_type = (drv0), .offset = (offset0)}, \ 1753d0407baSopenharmony_ci {.drv_type = (drv1), .offset = (offset1)}, \ 1763d0407baSopenharmony_ci {.drv_type = (drv2), .offset = (offset2)}, \ 1773d0407baSopenharmony_ci {.drv_type = (drv3), .offset = (offset3)}, \ 1783d0407baSopenharmony_ci }, \ 1793d0407baSopenharmony_ci } 1803d0407baSopenharmony_ci 1813d0407baSopenharmony_ci#define PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS(id, pins, label, iom0, iom1, iom2, iom3, drv0, drv1, drv2, \ 1823d0407baSopenharmony_ci drv3, offset0, offset1, offset2, offset3, pull0, pull1, \ 1833d0407baSopenharmony_ci pull2, pull3) \ 1843d0407baSopenharmony_ci { \ 1853d0407baSopenharmony_ci .bank_num = (id), .nr_pins = (pins), .name = (label), \ 1863d0407baSopenharmony_ci .iomux = \ 1873d0407baSopenharmony_ci { \ 1883d0407baSopenharmony_ci {.type = (iom0), .offset = -1}, \ 1893d0407baSopenharmony_ci {.type = (iom1), .offset = -1}, \ 1903d0407baSopenharmony_ci {.type = (iom2), .offset = -1}, \ 1913d0407baSopenharmony_ci {.type = (iom3), .offset = -1}, \ 1923d0407baSopenharmony_ci }, \ 1933d0407baSopenharmony_ci .drv = \ 1943d0407baSopenharmony_ci { \ 1953d0407baSopenharmony_ci {.drv_type = (drv0), .offset = (offset0)}, \ 1963d0407baSopenharmony_ci {.drv_type = (drv1), .offset = (offset1)}, \ 1973d0407baSopenharmony_ci {.drv_type = (drv2), .offset = (offset2)}, \ 1983d0407baSopenharmony_ci {.drv_type = (drv3), .offset = (offset3)}, \ 1993d0407baSopenharmony_ci }, \ 2003d0407baSopenharmony_ci .pull_type[0] = (pull0), .pull_type[1] = (pull1), .pull_type[2] = (pull2), .pull_type[3] = (pull3), \ 2013d0407baSopenharmony_ci } 2023d0407baSopenharmony_ci 2033d0407baSopenharmony_ci#define PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, FLAG) \ 2043d0407baSopenharmony_ci { \ 2053d0407baSopenharmony_ci .bank_num = (ID), .pin = (PIN), .func = (FUNC), .route_offset = (REG), .route_val = (VAL), \ 2063d0407baSopenharmony_ci .route_location = (FLAG), \ 2073d0407baSopenharmony_ci } 2083d0407baSopenharmony_ci 2093d0407baSopenharmony_ci#define RK_MUXROUTE_SAME(ID, PIN, FUNC, REG, VAL) PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_SAME) 2103d0407baSopenharmony_ci 2113d0407baSopenharmony_ci#define RK_MUXROUTE_GRF(ID, PIN, FUNC, REG, VAL) PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_GRF) 2123d0407baSopenharmony_ci 2133d0407baSopenharmony_ci#define RK_MUXROUTE_PMU(ID, PIN, FUNC, REG, VAL) PIN_BANK_MUX_ROUTE_FLAGS(ID, PIN, FUNC, REG, VAL, ROCKCHIP_ROUTE_PMU) 2143d0407baSopenharmony_ci 2153d0407baSopenharmony_cistatic struct regmap_config rockchip_regmap_config = { 2163d0407baSopenharmony_ci .reg_bits = PINCTRL_ROCKCHIP_THIRTYTWO, 2173d0407baSopenharmony_ci .val_bits = PINCTRL_ROCKCHIP_THIRTYTWO, 2183d0407baSopenharmony_ci .reg_stride = PINCTRL_ROCKCHIP_FOUR, 2193d0407baSopenharmony_ci}; 2203d0407baSopenharmony_ci 2213d0407baSopenharmony_cistatic inline const struct rockchip_pin_group *pinctrl_name_to_group(const struct rockchip_pinctrl *info, 2223d0407baSopenharmony_ci const char *name) 2233d0407baSopenharmony_ci{ 2243d0407baSopenharmony_ci int i; 2253d0407baSopenharmony_ci 2263d0407baSopenharmony_ci for (i = 0; i < info->ngroups; i++) { 2273d0407baSopenharmony_ci if (!strcmp(info->groups[i].name, name)) { 2283d0407baSopenharmony_ci return &info->groups[i]; 2293d0407baSopenharmony_ci } 2303d0407baSopenharmony_ci } 2313d0407baSopenharmony_ci 2323d0407baSopenharmony_ci return NULL; 2333d0407baSopenharmony_ci} 2343d0407baSopenharmony_ci 2353d0407baSopenharmony_ci/* 2363d0407baSopenharmony_ci * given a pin number that is local to a pin controller, find out the pin bank 2373d0407baSopenharmony_ci * and the register base of the pin bank. 2383d0407baSopenharmony_ci */ 2393d0407baSopenharmony_cistatic struct rockchip_pin_bank *pin_to_bank(struct rockchip_pinctrl *info, unsigned pin) 2403d0407baSopenharmony_ci{ 2413d0407baSopenharmony_ci struct rockchip_pin_bank *b = info->ctrl->pin_banks; 2423d0407baSopenharmony_ci 2433d0407baSopenharmony_ci while (pin >= (b->pin_base + b->nr_pins)) { 2443d0407baSopenharmony_ci b++; 2453d0407baSopenharmony_ci } 2463d0407baSopenharmony_ci 2473d0407baSopenharmony_ci return b; 2483d0407baSopenharmony_ci} 2493d0407baSopenharmony_ci 2503d0407baSopenharmony_cistatic struct rockchip_pin_bank *bank_num_to_bank(struct rockchip_pinctrl *info, unsigned num) 2513d0407baSopenharmony_ci{ 2523d0407baSopenharmony_ci struct rockchip_pin_bank *b = info->ctrl->pin_banks; 2533d0407baSopenharmony_ci int i; 2543d0407baSopenharmony_ci 2553d0407baSopenharmony_ci for (i = 0; i < info->ctrl->nr_banks; i++, b++) { 2563d0407baSopenharmony_ci if (b->bank_num == num) { 2573d0407baSopenharmony_ci return b; 2583d0407baSopenharmony_ci } 2593d0407baSopenharmony_ci } 2603d0407baSopenharmony_ci 2613d0407baSopenharmony_ci return ERR_PTR(-EINVAL); 2623d0407baSopenharmony_ci} 2633d0407baSopenharmony_ci 2643d0407baSopenharmony_ci/* 2653d0407baSopenharmony_ci * Pinctrl_ops handling 2663d0407baSopenharmony_ci */ 2673d0407baSopenharmony_ci 2683d0407baSopenharmony_cistatic int rockchip_get_groups_count(struct pinctrl_dev *pctldev) 2693d0407baSopenharmony_ci{ 2703d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 2713d0407baSopenharmony_ci 2723d0407baSopenharmony_ci return info->ngroups; 2733d0407baSopenharmony_ci} 2743d0407baSopenharmony_ci 2753d0407baSopenharmony_cistatic const char *rockchip_get_group_name(struct pinctrl_dev *pctldev, unsigned selector) 2763d0407baSopenharmony_ci{ 2773d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 2783d0407baSopenharmony_ci 2793d0407baSopenharmony_ci return info->groups[selector].name; 2803d0407baSopenharmony_ci} 2813d0407baSopenharmony_ci 2823d0407baSopenharmony_cistatic int rockchip_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, const unsigned **pins, 2833d0407baSopenharmony_ci unsigned *npins) 2843d0407baSopenharmony_ci{ 2853d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 2863d0407baSopenharmony_ci 2873d0407baSopenharmony_ci if (selector >= info->ngroups) { 2883d0407baSopenharmony_ci return -EINVAL; 2893d0407baSopenharmony_ci } 2903d0407baSopenharmony_ci 2913d0407baSopenharmony_ci *pins = info->groups[selector].pins; 2923d0407baSopenharmony_ci *npins = info->groups[selector].npins; 2933d0407baSopenharmony_ci 2943d0407baSopenharmony_ci return 0; 2953d0407baSopenharmony_ci} 2963d0407baSopenharmony_ci 2973d0407baSopenharmony_cistatic int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev, struct device_node *np, struct pinctrl_map **map, 2983d0407baSopenharmony_ci unsigned *num_maps) 2993d0407baSopenharmony_ci{ 3003d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 3013d0407baSopenharmony_ci const struct rockchip_pin_group *grp; 3023d0407baSopenharmony_ci struct pinctrl_map *new_map; 3033d0407baSopenharmony_ci struct device_node *parent; 3043d0407baSopenharmony_ci int map_num = 1; 3053d0407baSopenharmony_ci int i; 3063d0407baSopenharmony_ci 3073d0407baSopenharmony_ci /* 3083d0407baSopenharmony_ci * first find the group of this node and check if we need to create 3093d0407baSopenharmony_ci * config maps for pins 3103d0407baSopenharmony_ci */ 3113d0407baSopenharmony_ci grp = pinctrl_name_to_group(info, np->name); 3123d0407baSopenharmony_ci if (!grp) { 3133d0407baSopenharmony_ci dev_err(info->dev, "unable to find group for node %pOFn\n", np); 3143d0407baSopenharmony_ci return -EINVAL; 3153d0407baSopenharmony_ci } 3163d0407baSopenharmony_ci 3173d0407baSopenharmony_ci map_num += grp->npins; 3183d0407baSopenharmony_ci 3193d0407baSopenharmony_ci new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL); 3203d0407baSopenharmony_ci if (!new_map) { 3213d0407baSopenharmony_ci return -ENOMEM; 3223d0407baSopenharmony_ci } 3233d0407baSopenharmony_ci 3243d0407baSopenharmony_ci *map = new_map; 3253d0407baSopenharmony_ci *num_maps = map_num; 3263d0407baSopenharmony_ci 3273d0407baSopenharmony_ci /* create mux map */ 3283d0407baSopenharmony_ci parent = of_get_parent(np); 3293d0407baSopenharmony_ci if (!parent) { 3303d0407baSopenharmony_ci kfree(new_map); 3313d0407baSopenharmony_ci return -EINVAL; 3323d0407baSopenharmony_ci } 3333d0407baSopenharmony_ci new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; 3343d0407baSopenharmony_ci new_map[0].data.mux.function = parent->name; 3353d0407baSopenharmony_ci new_map[0].data.mux.group = np->name; 3363d0407baSopenharmony_ci of_node_put(parent); 3373d0407baSopenharmony_ci 3383d0407baSopenharmony_ci /* create config map */ 3393d0407baSopenharmony_ci new_map++; 3403d0407baSopenharmony_ci for (i = 0; i < grp->npins; i++) { 3413d0407baSopenharmony_ci new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN; 3423d0407baSopenharmony_ci new_map[i].data.configs.group_or_pin = pin_get_name(pctldev, grp->pins[i]); 3433d0407baSopenharmony_ci new_map[i].data.configs.configs = grp->data[i].configs; 3443d0407baSopenharmony_ci new_map[i].data.configs.num_configs = grp->data[i].nconfigs; 3453d0407baSopenharmony_ci } 3463d0407baSopenharmony_ci 3473d0407baSopenharmony_ci dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n", (*map)->data.mux.function, (*map)->data.mux.group, 3483d0407baSopenharmony_ci map_num); 3493d0407baSopenharmony_ci 3503d0407baSopenharmony_ci return 0; 3513d0407baSopenharmony_ci} 3523d0407baSopenharmony_ci 3533d0407baSopenharmony_cistatic void rockchip_dt_free_map(struct pinctrl_dev *pctldev, struct pinctrl_map *map, unsigned num_maps) 3543d0407baSopenharmony_ci{ 3553d0407baSopenharmony_ci kfree(map); 3563d0407baSopenharmony_ci} 3573d0407baSopenharmony_ci 3583d0407baSopenharmony_cistatic const struct pinctrl_ops rockchip_pctrl_ops = { 3593d0407baSopenharmony_ci .get_groups_count = rockchip_get_groups_count, 3603d0407baSopenharmony_ci .get_group_name = rockchip_get_group_name, 3613d0407baSopenharmony_ci .get_group_pins = rockchip_get_group_pins, 3623d0407baSopenharmony_ci .dt_node_to_map = rockchip_dt_node_to_map, 3633d0407baSopenharmony_ci .dt_free_map = rockchip_dt_free_map, 3643d0407baSopenharmony_ci}; 3653d0407baSopenharmony_ci 3663d0407baSopenharmony_ci/* 3673d0407baSopenharmony_ci * Hardware access 3683d0407baSopenharmony_ci */ 3693d0407baSopenharmony_ci 3703d0407baSopenharmony_cistatic struct rockchip_mux_recalced_data rv1108_mux_recalced_data[] = { 3713d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 3723d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_ZERO, 3733d0407baSopenharmony_ci .reg = 0x418, 3743d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 3753d0407baSopenharmony_ci .mask = 0x3}, 3763d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, .pin = PINCTRL_ROCKCHIP_ONE, .reg = 0x418, .bit = PINCTRL_ROCKCHIP_TWO, .mask = 0x3}, 3773d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, .pin = PINCTRL_ROCKCHIP_TWO, .reg = 0x418, .bit = PINCTRL_ROCKCHIP_FOUR, .mask = 0x3}, 3783d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 3793d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_THREE, 3803d0407baSopenharmony_ci .reg = 0x418, 3813d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_SIX, 3823d0407baSopenharmony_ci .mask = 0x3}, 3833d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 3843d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_FOUR, 3853d0407baSopenharmony_ci .reg = 0x418, 3863d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 3873d0407baSopenharmony_ci .mask = 0x3}, 3883d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, .pin = PINCTRL_ROCKCHIP_FIVE, .reg = 0x418, .bit = PINCTRL_ROCKCHIP_TEN, .mask = 0x3}, 3893d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 3903d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_SIX, 3913d0407baSopenharmony_ci .reg = 0x418, 3923d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 3933d0407baSopenharmony_ci .mask = 0x3}, 3943d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 3953d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_SEVEN, 3963d0407baSopenharmony_ci .reg = 0x418, 3973d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOURTEEN, 3983d0407baSopenharmony_ci .mask = 0x3}, 3993d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4003d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_EIGHT, 4013d0407baSopenharmony_ci .reg = 0x41c, 4023d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 4033d0407baSopenharmony_ci .mask = 0x3}, 4043d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, .pin = PINCTRL_ROCKCHIP_NINE, .reg = 0x41c, .bit = PINCTRL_ROCKCHIP_TWO, .mask = 0x3}, 4053d0407baSopenharmony_ci}; 4063d0407baSopenharmony_ci 4073d0407baSopenharmony_cistatic struct rockchip_mux_recalced_data rv1126_mux_recalced_data[] = { 4083d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ZERO, .pin = 20, .reg = 0x10000, .bit = PINCTRL_ROCKCHIP_ZERO, .mask = 0xf}, 4093d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ZERO, 4103d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYONE, 4113d0407baSopenharmony_ci .reg = 0x10000, 4123d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 4133d0407baSopenharmony_ci .mask = 0xf}, 4143d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ZERO, 4153d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTWO, 4163d0407baSopenharmony_ci .reg = 0x10000, 4173d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 4183d0407baSopenharmony_ci .mask = 0xf}, 4193d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ZERO, 4203d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTHREE, 4213d0407baSopenharmony_ci .reg = 0x10000, 4223d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 4233d0407baSopenharmony_ci .mask = 0xf}, 4243d0407baSopenharmony_ci}; 4253d0407baSopenharmony_ci 4263d0407baSopenharmony_cistatic struct rockchip_mux_recalced_data rk3128_mux_recalced_data[] = { 4273d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, .pin = 20, .reg = 0xe8, .bit = PINCTRL_ROCKCHIP_ZERO, .mask = 0x7}, 4283d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 4293d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYONE, 4303d0407baSopenharmony_ci .reg = 0xe8, 4313d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 4323d0407baSopenharmony_ci .mask = 0x7}, 4333d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 4343d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTWO, 4353d0407baSopenharmony_ci .reg = 0xe8, 4363d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 4373d0407baSopenharmony_ci .mask = 0x7}, 4383d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 4393d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTHREE, 4403d0407baSopenharmony_ci .reg = 0xe8, 4413d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 4423d0407baSopenharmony_ci .mask = 0x7}, 4433d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 4443d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYFOUR, 4453d0407baSopenharmony_ci .reg = 0xd4, 4463d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 4473d0407baSopenharmony_ci .mask = 0x7}, 4483d0407baSopenharmony_ci}; 4493d0407baSopenharmony_ci 4503d0407baSopenharmony_cistatic struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = { 4513d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4523d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_FOURTEEN, 4533d0407baSopenharmony_ci .reg = 0x28, 4543d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 4553d0407baSopenharmony_ci .mask = 0xf}, 4563d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4573d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_FIFTEEN, 4583d0407baSopenharmony_ci .reg = 0x2c, 4593d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 4603d0407baSopenharmony_ci .mask = 0x3}, 4613d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4623d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_EIGHTEEN, 4633d0407baSopenharmony_ci .reg = 0x30, 4643d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 4653d0407baSopenharmony_ci .mask = 0xf}, 4663d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4673d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_NINTEEN, 4683d0407baSopenharmony_ci .reg = 0x30, 4693d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 4703d0407baSopenharmony_ci .mask = 0xf}, 4713d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, .pin = 20, .reg = 0x30, .bit = PINCTRL_ROCKCHIP_TWELVE, .mask = 0xf}, 4723d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4733d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYONE, 4743d0407baSopenharmony_ci .reg = 0x34, 4753d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 4763d0407baSopenharmony_ci .mask = 0xf}, 4773d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4783d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTWO, 4793d0407baSopenharmony_ci .reg = 0x34, 4803d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 4813d0407baSopenharmony_ci .mask = 0xf}, 4823d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_ONE, 4833d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTHREE, 4843d0407baSopenharmony_ci .reg = 0x34, 4853d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 4863d0407baSopenharmony_ci .mask = 0xf}, 4873d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_THREE, 4883d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWELVE, 4893d0407baSopenharmony_ci .reg = 0x68, 4903d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 4913d0407baSopenharmony_ci .mask = 0xf}, 4923d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_THREE, 4933d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_THIRTEEN, 4943d0407baSopenharmony_ci .reg = 0x68, 4953d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 4963d0407baSopenharmony_ci .mask = 0xf}, 4973d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, .pin = PINCTRL_ROCKCHIP_TWO, .reg = 0x608, .bit = PINCTRL_ROCKCHIP_ZERO, .mask = 0x7}, 4983d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 4993d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_THREE, 5003d0407baSopenharmony_ci .reg = 0x608, 5013d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 5023d0407baSopenharmony_ci .mask = 0x7}, 5033d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5043d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_SIXTEEN, 5053d0407baSopenharmony_ci .reg = 0x610, 5063d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 5073d0407baSopenharmony_ci .mask = 0x7}, 5083d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_THREE, 5093d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TEN, 5103d0407baSopenharmony_ci .reg = 0x610, 5113d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 5123d0407baSopenharmony_ci .mask = 0x7}, 5133d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_THREE, 5143d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_ELEVEN, 5153d0407baSopenharmony_ci .reg = 0x610, 5163d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOUR, 5173d0407baSopenharmony_ci .mask = 0x7}, 5183d0407baSopenharmony_ci}; 5193d0407baSopenharmony_ci 5203d0407baSopenharmony_cistatic struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = { 5213d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5223d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_EIGHT, 5233d0407baSopenharmony_ci .reg = 0x24, 5243d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 5253d0407baSopenharmony_ci .mask = 0x3}, 5263d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, .pin = PINCTRL_ROCKCHIP_NINE, .reg = 0x24, .bit = PINCTRL_ROCKCHIP_TWO, .mask = 0x3}, 5273d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, .pin = PINCTRL_ROCKCHIP_TEN, .reg = 0x24, .bit = PINCTRL_ROCKCHIP_FOUR, .mask = 0x3}, 5283d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5293d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_ELEVEN, 5303d0407baSopenharmony_ci .reg = 0x24, 5313d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_SIX, 5323d0407baSopenharmony_ci .mask = 0x3}, 5333d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5343d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWELVE, 5353d0407baSopenharmony_ci .reg = 0x24, 5363d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_EIGHT, 5373d0407baSopenharmony_ci .mask = 0x3}, 5383d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5393d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_THIRTEEN, 5403d0407baSopenharmony_ci .reg = 0x24, 5413d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TEN, 5423d0407baSopenharmony_ci .mask = 0x3}, 5433d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5443d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_FOURTEEN, 5453d0407baSopenharmony_ci .reg = 0x24, 5463d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_TWELVE, 5473d0407baSopenharmony_ci .mask = 0x3}, 5483d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5493d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_FIFTEEN, 5503d0407baSopenharmony_ci .reg = 0x28, 5513d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_ZERO, 5523d0407baSopenharmony_ci .mask = 0x7}, 5533d0407baSopenharmony_ci {.num = PINCTRL_ROCKCHIP_TWO, 5543d0407baSopenharmony_ci .pin = PINCTRL_ROCKCHIP_TWENTYTHREE, 5553d0407baSopenharmony_ci .reg = 0x30, 5563d0407baSopenharmony_ci .bit = PINCTRL_ROCKCHIP_FOURTEEN, 5573d0407baSopenharmony_ci .mask = 0x3}, 5583d0407baSopenharmony_ci}; 5593d0407baSopenharmony_ci 5603d0407baSopenharmony_cistatic struct rockchip_mux_route_data rv1126_mux_route_data[] = { 5613d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5623d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PD2, PINCTRL_ROCKCHIP_ONE, 0x10260, 5633d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* I2S0_MCLK_M0 */ 5643d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5653d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB0, PINCTRL_ROCKCHIP_THREE, 0x10260, 5663d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* I2S0_MCLK_M1 */ 5673d0407baSopenharmony_ci 5683d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5693d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PD4, PINCTRL_ROCKCHIP_FOUR, 0x10260, 5703d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* I2S1_MCLK_M0 */ 5713d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5723d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD5, PINCTRL_ROCKCHIP_TWO, 0x10260, 5733d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* I2S1_MCLK_M1 */ 5743d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5753d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PC7, PINCTRL_ROCKCHIP_SIX, 0x10260, 5763d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO)), /* I2S1_MCLK_M2 */ 5773d0407baSopenharmony_ci 5783d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5793d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD0, PINCTRL_ROCKCHIP_ONE, 0x10260, 5803d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* I2S2_MCLK_M0 */ 5813d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5823d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB3, PINCTRL_ROCKCHIP_TWO, 0x10260, 5833d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* I2S2_MCLK_M1 */ 5843d0407baSopenharmony_ci 5853d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5863d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PD4, PINCTRL_ROCKCHIP_TWO, 0x10260, 5873d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* PDM_CLK0_M0 */ 5883d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5893d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC0, PINCTRL_ROCKCHIP_THREE, 0x10260, 5903d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* PDM_CLK0_M1 */ 5913d0407baSopenharmony_ci 5923d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5933d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC6, PINCTRL_ROCKCHIP_ONE, 0x10264, 5943d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* CIF_CLKOUT_M0 */ 5953d0407baSopenharmony_ci RK_MUXROUTE_GRF( 5963d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD1, PINCTRL_ROCKCHIP_THREE, 0x10264, 5973d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* CIF_CLKOUT_M1 */ 5983d0407baSopenharmony_ci 5993d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6003d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA4, PINCTRL_ROCKCHIP_FIVE, 0x10264, 6013d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* I2C3_SCL_M0 */ 6023d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6033d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD4, PINCTRL_ROCKCHIP_SEVEN, 0x10264, 6043d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* I2C3_SCL_M1 */ 6053d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6063d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD6, PINCTRL_ROCKCHIP_THREE, 0x10264, 6073d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_TWO)), /* I2C3_SCL_M2 */ 6083d0407baSopenharmony_ci 6093d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6103d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA0, PINCTRL_ROCKCHIP_SEVEN, 0x10264, 6113d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* I2C4_SCL_M0 */ 6123d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_FOUR, RK_PA0, PINCTRL_ROCKCHIP_FOUR, 0x10264, 6133d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* I2C4_SCL_M1 */ 6143d0407baSopenharmony_ci 6153d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6163d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA5, PINCTRL_ROCKCHIP_SEVEN, 0x10264, 6173d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* I2C5_SCL_M0 */ 6183d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6193d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB0, PINCTRL_ROCKCHIP_FIVE, 0x10264, 6203d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* I2C5_SCL_M1 */ 6213d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6223d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD0, PINCTRL_ROCKCHIP_FOUR, 0x10264, 6233d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_TWO)), /* I2C5_SCL_M2 */ 6243d0407baSopenharmony_ci 6253d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6263d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC0, PINCTRL_ROCKCHIP_FIVE, 0x10264, 6273d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* SPI1_CLK_M0 */ 6283d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6293d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_THREE, 0x10264, 6303d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* SPI1_CLK_M1 */ 6313d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6323d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD5, PINCTRL_ROCKCHIP_SIX, 0x10264, 6333d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TWO)), /* SPI1_CLK_M2 */ 6343d0407baSopenharmony_ci 6353d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6363d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC0, PINCTRL_ROCKCHIP_TWO, 0x10264, 6373d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* RGMII_CLK_M0 */ 6383d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6393d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB7, PINCTRL_ROCKCHIP_TWO, 0x10264, 6403d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* RGMII_CLK_M1 */ 6413d0407baSopenharmony_ci 6423d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6433d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA1, PINCTRL_ROCKCHIP_THREE, 0x10264, 6443d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_ZERO)), /* CAN_TXD_M0 */ 6453d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6463d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA7, PINCTRL_ROCKCHIP_FIVE, 0x10264, 6473d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_ONE)), /* CAN_TXD_M1 */ 6483d0407baSopenharmony_ci 6493d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA4, PINCTRL_ROCKCHIP_SIX, 0x10268, 6503d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PWM8_M0 */ 6513d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_TWO, RK_PD7, PINCTRL_ROCKCHIP_FIVE, 0x10268, 6523d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PWM8_M1 */ 6533d0407baSopenharmony_ci 6543d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA5, PINCTRL_ROCKCHIP_SIX, 0x10268, 6553d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* PWM9_M0 */ 6563d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_TWO, RK_PD6, PINCTRL_ROCKCHIP_FIVE, 0x10268, 6573d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* PWM9_M1 */ 6583d0407baSopenharmony_ci 6593d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA6, PINCTRL_ROCKCHIP_SIX, 0x10268, 6603d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* PWM10_M0 */ 6613d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_TWO, RK_PD5, PINCTRL_ROCKCHIP_FIVE, 0x10268, 6623d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* PWM10_M1 */ 6633d0407baSopenharmony_ci 6643d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6653d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA7, PINCTRL_ROCKCHIP_SIX, 0x10268, 6663d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* PWM11_IR_M0 */ 6673d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA1, PINCTRL_ROCKCHIP_FIVE, 0x10268, 6683d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* PWM11_IR_M1 */ 6693d0407baSopenharmony_ci 6703d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6713d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA5, PINCTRL_ROCKCHIP_THREE, 0x10268, 6723d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* UART2_TX_M0 */ 6733d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6743d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA2, PINCTRL_ROCKCHIP_ONE, 0x10268, 6753d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* UART2_TX_M1 */ 6763d0407baSopenharmony_ci 6773d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6783d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC6, PINCTRL_ROCKCHIP_THREE, 0x10268, 6793d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* UART3_TX_M0 */ 6803d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6813d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA7, PINCTRL_ROCKCHIP_TWO, 0x10268, 6823d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* UART3_TX_M1 */ 6833d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6843d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA0, PINCTRL_ROCKCHIP_FOUR, 0x10268, 6853d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TWO)), /* UART3_TX_M2 */ 6863d0407baSopenharmony_ci 6873d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6883d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA4, PINCTRL_ROCKCHIP_FOUR, 0x10268, 6893d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* UART4_TX_M0 */ 6903d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6913d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA6, PINCTRL_ROCKCHIP_FOUR, 0x10268, 6923d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* UART4_TX_M1 */ 6933d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6943d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD5, PINCTRL_ROCKCHIP_THREE, 0x10268, 6953d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THIRTEEN, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWO)), /* UART4_TX_M2 */ 6963d0407baSopenharmony_ci 6973d0407baSopenharmony_ci RK_MUXROUTE_GRF( 6983d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA6, PINCTRL_ROCKCHIP_FOUR, 0x10268, 6993d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIFTEEN, PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_ZERO)), /* UART5_TX_M0 */ 7003d0407baSopenharmony_ci RK_MUXROUTE_GRF( 7013d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB0, PINCTRL_ROCKCHIP_FOUR, 0x10268, 7023d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIFTEEN, PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_ONE)), /* UART5_TX_M1 */ 7033d0407baSopenharmony_ci RK_MUXROUTE_GRF( 7043d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA0, PINCTRL_ROCKCHIP_THREE, 0x10268, 7053d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIFTEEN, PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_TWO)), /* UART5_TX_M2 */ 7063d0407baSopenharmony_ci 7073d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PB6, PINCTRL_ROCKCHIP_THREE, 0x0114, 7083d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PWM0_M0 */ 7093d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PB3, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7103d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PWM0_M1 */ 7113d0407baSopenharmony_ci 7123d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PB7, PINCTRL_ROCKCHIP_THREE, 0x0114, 7133d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* PWM1_M0 */ 7143d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PB2, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7153d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* PWM1_M1 */ 7163d0407baSopenharmony_ci 7173d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PC0, PINCTRL_ROCKCHIP_THREE, 0x0114, 7183d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* PWM2_M0 */ 7193d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PB1, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7203d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* PWM2_M1 */ 7213d0407baSopenharmony_ci 7223d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PC1, PINCTRL_ROCKCHIP_THREE, 0x0114, 7233d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* PWM3_IR_M0 */ 7243d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PB0, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7253d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* PWM3_IR_M1 */ 7263d0407baSopenharmony_ci 7273d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7283d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC2, PINCTRL_ROCKCHIP_THREE, 0x0114, 7293d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* PWM4_M0 */ 7303d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PA7, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7313d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* PWM4_M1 */ 7323d0407baSopenharmony_ci 7333d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PC3, PINCTRL_ROCKCHIP_THREE, 0x0114, 7343d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* PWM5_M0 */ 7353d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_TWO, RK_PA6, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7363d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* PWM5_M1 */ 7373d0407baSopenharmony_ci 7383d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7393d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB2, PINCTRL_ROCKCHIP_THREE, 0x0114, 7403d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* PWM6_M0 */ 7413d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7423d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD4, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7433d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* PWM6_M1 */ 7443d0407baSopenharmony_ci 7453d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7463d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB1, PINCTRL_ROCKCHIP_THREE, 0x0114, 7473d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_ZERO)), /* PWM7_IR_M0 */ 7483d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7493d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA0, PINCTRL_ROCKCHIP_FIVE, 0x0114, 7503d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_ONE)), /* PWM7_IR_M1 */ 7513d0407baSopenharmony_ci 7523d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7533d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB0, PINCTRL_ROCKCHIP_ONE, 0x0118, 7543d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* SPI0_CLK_M0 */ 7553d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7563d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA1, PINCTRL_ROCKCHIP_ONE, 0x0118, 7573d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* SPI0_CLK_M1 */ 7583d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7593d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB2, PINCTRL_ROCKCHIP_SIX, 0x0118, 7603d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_TWO)), /* SPI0_CLK_M2 */ 7613d0407baSopenharmony_ci 7623d0407baSopenharmony_ci RK_MUXROUTE_PMU( 7633d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB6, PINCTRL_ROCKCHIP_TWO, 0x0118, 7643d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* UART1_TX_M0 */ 7653d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ONE, RK_PD0, PINCTRL_ROCKCHIP_FIVE, 0x0118, 7663d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* UART1_TX_M1 */ 7673d0407baSopenharmony_ci}; 7683d0407baSopenharmony_ci 7693d0407baSopenharmony_cistatic void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin, int *reg, u8 *bit, int *mask) 7703d0407baSopenharmony_ci{ 7713d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 7723d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 7733d0407baSopenharmony_ci struct rockchip_mux_recalced_data *data; 7743d0407baSopenharmony_ci int i; 7753d0407baSopenharmony_ci 7763d0407baSopenharmony_ci for (i = 0; i < ctrl->niomux_recalced; i++) { 7773d0407baSopenharmony_ci data = &ctrl->iomux_recalced[i]; 7783d0407baSopenharmony_ci if (data->num == bank->bank_num && data->pin == pin) { 7793d0407baSopenharmony_ci break; 7803d0407baSopenharmony_ci } 7813d0407baSopenharmony_ci } 7823d0407baSopenharmony_ci 7833d0407baSopenharmony_ci if (i >= ctrl->niomux_recalced) { 7843d0407baSopenharmony_ci return; 7853d0407baSopenharmony_ci } 7863d0407baSopenharmony_ci 7873d0407baSopenharmony_ci *reg = data->reg; 7883d0407baSopenharmony_ci *mask = data->mask; 7893d0407baSopenharmony_ci *bit = data->bit; 7903d0407baSopenharmony_ci} 7913d0407baSopenharmony_ci 7923d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk1808_mux_route_data[] = { 7933d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PB4, PINCTRL_ROCKCHIP_TWO, 0x190, 7943d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* i2c2m0_sda */ 7953d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB5, PINCTRL_ROCKCHIP_TWO, 0x190, 7963d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 7973d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THREE)), /* i2c2m1_sda */ 7983d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA6, PINCTRL_ROCKCHIP_TWO, 0x190, 7993d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR)), /* spi2m0_miso */ 8003d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x190, 8013d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR) | 8023d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOUR)), /* spi2m1_miso */ 8033d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PB7, PINCTRL_ROCKCHIP_TWO, 0x190, 8043d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE)), /* spi1m0_miso */ 8053d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PD2, PINCTRL_ROCKCHIP_THREE, 0x190, 8063d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE) | 8073d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FIVE)), /* spi1m1_miso */ 8083d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PB0, PINCTRL_ROCKCHIP_TWO, 0x190, 8093d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN)), /* uart1_rxm0 */ 8103d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB4, PINCTRL_ROCKCHIP_THREE, 0x190, 8113d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN) | 8123d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THIRTEEN)), /* uart1_rxm1 */ 8133d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PA3, PINCTRL_ROCKCHIP_TWO, 0x190, 8143d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN) | 8153d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIFTEEN)), /* uart2_rxm0 */ 8163d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PD1, PINCTRL_ROCKCHIP_TWO, 0x190, 8173d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN) | 8183d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIFTEEN) | 8193d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOURTEEN)), /* uart2_rxm1 */ 8203d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PA4, PINCTRL_ROCKCHIP_TWO, 0x190, 8213d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN) | 8223d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIFTEEN) | 8233d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FIFTEEN)), /* uart2_rxm2 */ 8243d0407baSopenharmony_ci}; 8253d0407baSopenharmony_ci 8263d0407baSopenharmony_cistatic struct rockchip_mux_route_data px30_mux_route_data[] = { 8273d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA0, PINCTRL_ROCKCHIP_ONE, 0x184, 8283d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN)), /* cif-d2m0 */ 8293d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PA3, PINCTRL_ROCKCHIP_THREE, 0x184, 8303d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN) | 8313d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SEVEN)), /* cif-d2m1 */ 8323d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PC6, PINCTRL_ROCKCHIP_TWO, 0x184, 8333d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT)), /* pdm-m0 */ 8343d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PC6, PINCTRL_ROCKCHIP_ONE, 0x184, 8353d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | BIT(PINCTRL_ROCKCHIP_EIGHT)), /* pdm-m1 */ 8363d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PD3, PINCTRL_ROCKCHIP_TWO, 0x184, 8373d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN)), /* uart2-rxm0 */ 8383d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PB6, PINCTRL_ROCKCHIP_TWO, 0x184, 8393d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | BIT(PINCTRL_ROCKCHIP_TEN)), /* uart2-rxm1 */ 8403d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PC1, PINCTRL_ROCKCHIP_TWO, 0x184, 8413d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE)), /* uart3-rxm0 */ 8423d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB7, PINCTRL_ROCKCHIP_TWO, 0x184, 8433d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE) | 8443d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_NINE)), /* uart3-rxm1 */ 8453d0407baSopenharmony_ci}; 8463d0407baSopenharmony_ci 8473d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3128_mux_route_data[] = { 8483d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB2, PINCTRL_ROCKCHIP_ONE, 0x144, 8493d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 8503d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR)), /* spi-0 */ 8513d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PD3, PINCTRL_ROCKCHIP_THREE, 0x144, 8523d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 8533d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR) | 8543d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THREE)), /* spi-1 */ 8553d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB5, PINCTRL_ROCKCHIP_TWO, 0x144, 8563d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 8573d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR) | 8583d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOUR)), /* spi-2 */ 8593d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA5, PINCTRL_ROCKCHIP_ONE, 0x144, 8603d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE)), /* i2s-0 */ 8613d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB6, PINCTRL_ROCKCHIP_ONE, 0x144, 8623d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE) | BIT(PINCTRL_ROCKCHIP_FIVE)), /* i2s-1 */ 8633d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_TWO, 0x144, 8643d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SIX)), /* emmc-0 */ 8653d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_TWO, 0x144, 8663d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SIX) | BIT(PINCTRL_ROCKCHIP_SIX)), /* emmc-1 */ 8673d0407baSopenharmony_ci}; 8683d0407baSopenharmony_ci 8693d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3188_mux_route_data[] = { 8703d0407baSopenharmony_ci RK_MUXROUTE_SAME( 8713d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PD0, PINCTRL_ROCKCHIP_ONE, 0xa0, 8723d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN)), /* non-iomuxed emmc/flash pins on flash-dqs */ 8733d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PD0, PINCTRL_ROCKCHIP_TWO, 0xa0, 8743d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 8753d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_ELEVEN)), /* non-iomuxed emmc/flash pins on emmc-clk */ 8763d0407baSopenharmony_ci}; 8773d0407baSopenharmony_ci 8783d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3228_mux_route_data[] = { 8793d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PD2, PINCTRL_ROCKCHIP_ONE, 0x50, 8803d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN)), /* pwm0-0 */ 8813d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PC5, PINCTRL_ROCKCHIP_ONE, 0x50, 8823d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN) | BIT(PINCTRL_ROCKCHIP_ZERO)), /* pwm0-1 */ 8833d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PD3, PINCTRL_ROCKCHIP_ONE, 0x50, 8843d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ONE)), /* pwm1-0 */ 8853d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PD6, PINCTRL_ROCKCHIP_TWO, 0x50, 8863d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ONE) | BIT(PINCTRL_ROCKCHIP_ONE)), /* pwm1-1 */ 8873d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PD4, PINCTRL_ROCKCHIP_ONE, 0x50, 8883d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO)), /* pwm2-0 */ 8893d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB4, PINCTRL_ROCKCHIP_TWO, 0x50, 8903d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO) | BIT(PINCTRL_ROCKCHIP_TWO)), /* pwm2-1 */ 8913d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PD2, PINCTRL_ROCKCHIP_ONE, 0x50, 8923d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* pwm3-0 */ 8933d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB3, PINCTRL_ROCKCHIP_TWO, 0x50, 8943d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | BIT(PINCTRL_ROCKCHIP_THREE)), /* pwm3-1 */ 8953d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA1, PINCTRL_ROCKCHIP_ONE, 0x50, 8963d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR)), /* sdio-0_d0 */ 8973d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PA2, PINCTRL_ROCKCHIP_ONE, 0x50, 8983d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR) | 8993d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOUR)), /* sdio-1_d0 */ 9003d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB5, PINCTRL_ROCKCHIP_TWO, 0x50, 9013d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE)), /* spi-0_rx */ 9023d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA0, PINCTRL_ROCKCHIP_TWO, 0x50, 9033d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE) | BIT(PINCTRL_ROCKCHIP_FIVE)), /* spi-1_rx */ 9043d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_TWO, 0x50, 9053d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN)), /* emmc-0_cmd */ 9063d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_TWO, 0x50, 9073d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN) | 9083d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SEVEN)), /* emmc-1_cmd */ 9093d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC3, PINCTRL_ROCKCHIP_TWO, 0x50, 9103d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT)), /* uart2-0_rx */ 9113d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB2, PINCTRL_ROCKCHIP_TWO, 0x50, 9123d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | 9133d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_EIGHT)), /* uart2-1_rx */ 9143d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB2, PINCTRL_ROCKCHIP_ONE, 0x50, 9153d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN)), /* uart1-0_rx */ 9163d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PB5, PINCTRL_ROCKCHIP_ONE, 0x50, 9173d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 9183d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_ELEVEN)), /* uart1-1_rx */ 9193d0407baSopenharmony_ci}; 9203d0407baSopenharmony_ci 9213d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3288_mux_route_data[] = { 9223d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_SEVEN, RK_PC0, PINCTRL_ROCKCHIP_TWO, 0x264, 9233d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9243d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWELVE)), /* edphdmi_cecinoutt1 */ 9253d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_SEVEN, RK_PC7, PINCTRL_ROCKCHIP_FOUR, 0x264, 9263d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE)), /* edphdmi_cecinout */ 9273d0407baSopenharmony_ci}; 9283d0407baSopenharmony_ci 9293d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3308_mux_route_data[] = { 9303d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PC3, PINCTRL_ROCKCHIP_ONE, 0x314, 9313d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ZERO) | BIT(PINCTRL_ROCKCHIP_ZERO)), /* rtc_clk */ 9323d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_TWO, 0x314, 9333d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO) | 9343d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* uart2_rxm0 */ 9353d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PD2, PINCTRL_ROCKCHIP_TWO, 0x314, 9363d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO) | 9373d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 9383d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWO)), /* uart2_rxm1 */ 9393d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB7, PINCTRL_ROCKCHIP_TWO, 0x608, 9403d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | 9413d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE)), /* i2c3_sdam0 */ 9423d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PB4, PINCTRL_ROCKCHIP_TWO, 0x608, 9433d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | 9443d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE) | 9453d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_EIGHT)), /* i2c3_sdam1 */ 9463d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA0, PINCTRL_ROCKCHIP_THREE, 0x608, 9473d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | 9483d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE) | 9493d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_NINE)), /* i2c3_sdam2 */ 9503d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA3, PINCTRL_ROCKCHIP_TWO, 0x308, 9513d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* i2s-8ch-1-sclktxm0 */ 9523d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA4, PINCTRL_ROCKCHIP_TWO, 0x308, 9533d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* i2s-8ch-1-sclkrxm0 */ 9543d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB5, PINCTRL_ROCKCHIP_TWO, 0x308, 9553d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 9563d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THREE)), /* i2s-8ch-1-sclktxm1 */ 9573d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB6, PINCTRL_ROCKCHIP_TWO, 0x308, 9583d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 9593d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THREE)), /* i2s-8ch-1-sclkrxm1 */ 9603d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x308, 9613d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9623d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN)), /* pdm-clkm0 */ 9633d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB6, PINCTRL_ROCKCHIP_FOUR, 0x308, 9643d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9653d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN) | 9663d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWELVE)), /* pdm-clkm1 */ 9673d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA6, PINCTRL_ROCKCHIP_TWO, 0x308, 9683d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9693d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN) | 9703d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THIRTEEN)), /* pdm-clkm2 */ 9713d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x600, 9723d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO) | 9733d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWO)), /* pdm-clkm-m2 */ 9743d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PB2, PINCTRL_ROCKCHIP_THREE, 0x314, 9753d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE)), /* spi1_miso */ 9763d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_TWO, 0x314, 9773d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE) | 9783d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_NINE)), /* spi1_miso_m1 */ 9793d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB3, PINCTRL_ROCKCHIP_THREE, 0x314, 9803d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 9813d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN)), /* owire_m0 */ 9823d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_SEVEN, 0x314, 9833d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 9843d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 9853d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TEN)), /* owire_m1 */ 9863d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA2, PINCTRL_ROCKCHIP_FIVE, 0x314, 9873d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 9883d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 9893d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_ELEVEN)), /* owire_m2 */ 9903d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PB3, PINCTRL_ROCKCHIP_TWO, 0x314, 9913d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9923d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN)), /* can_rxd_m0 */ 9933d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC6, PINCTRL_ROCKCHIP_FIVE, 0x314, 9943d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9953d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN) | 9963d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWELVE)), /* can_rxd_m1 */ 9973d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA2, PINCTRL_ROCKCHIP_FOUR, 0x314, 9983d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWELVE) | 9993d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THIRTEEN) | 10003d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THIRTEEN)), /* can_rxd_m2 */ 10013d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC4, PINCTRL_ROCKCHIP_THREE, 0x314, 10023d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN)), /* mac_rxd0_m0 */ 10033d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PA2, PINCTRL_ROCKCHIP_TWO, 0x314, 10043d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN) | 10053d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOURTEEN)), /* mac_rxd0_m1 */ 10063d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PB4, PINCTRL_ROCKCHIP_FOUR, 0x314, 10073d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIFTEEN)), /* uart3_rx */ 10083d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ZERO, RK_PC1, PINCTRL_ROCKCHIP_THREE, 0x314, 10093d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIFTEEN) | 10103d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FIFTEEN)), /* uart3_rx_m1 */ 10113d0407baSopenharmony_ci}; 10123d0407baSopenharmony_ci 10133d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3328_mux_route_data[] = { 10143d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PA1, PINCTRL_ROCKCHIP_TWO, 0x50, 10153d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN) | 10163d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ONE)), /* uart2dbg_rxm0 */ 10173d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PA1, PINCTRL_ROCKCHIP_ONE, 0x50, 10183d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN) | BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ONE) | 10193d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_ZERO)), /* uart2dbg_rxm1 */ 10203d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB3, PINCTRL_ROCKCHIP_TWO, 0x50, 10213d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TWO) | 10223d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TWO)), /* gmac-m1_rxd0 */ 10233d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PB6, PINCTRL_ROCKCHIP_TWO, 0x50, 10243d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 10253d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TEN)), /* gmac-m1-optimized_rxd3 */ 10263d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PC3, PINCTRL_ROCKCHIP_TWO, 0x50, 10273d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE)), /* pdm_sdi0m0 */ 10283d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PC7, PINCTRL_ROCKCHIP_THREE, 0x50, 10293d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | 10303d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_THREE)), /* pdm_sdi0m1 */ 10313d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PA2, PINCTRL_ROCKCHIP_FOUR, 0x50, 10323d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOUR) | 10333d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FIVE) | 10343d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FIVE)), /* spi_rxdm2 */ 10353d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_ONE, RK_PD0, PINCTRL_ROCKCHIP_ONE, 0x50, 10363d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SIX)), /* i2s2_sdim0 */ 10373d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_THREE, RK_PA2, PINCTRL_ROCKCHIP_SIX, 0x50, 10383d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SIX) | BIT(PINCTRL_ROCKCHIP_SIX)), /* i2s2_sdim1 */ 10393d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PC6, PINCTRL_ROCKCHIP_THREE, 0x50, 10403d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN) | 10413d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SEVEN)), /* card_iom1 */ 10423d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PC0, PINCTRL_ROCKCHIP_THREE, 0x50, 10433d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_EIGHT) | 10443d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_EIGHT)), /* tsp_d5m1 */ 10453d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PC0, PINCTRL_ROCKCHIP_FOUR, 0x50, 10463d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_NINE) | 10473d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_NINE)), /* cif_data5m1 */ 10483d0407baSopenharmony_ci}; 10493d0407baSopenharmony_ci 10503d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3399_mux_route_data[] = { 10513d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PB0, PINCTRL_ROCKCHIP_TWO, 0xe21c, 10523d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 10533d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN)), /* uart2dbga_rx */ 10543d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PC0, PINCTRL_ROCKCHIP_TWO, 0xe21c, 10553d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 10563d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 10573d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_TEN)), /* uart2dbgb_rx */ 10583d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PC3, PINCTRL_ROCKCHIP_ONE, 0xe21c, 10593d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | 10603d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | 10613d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_ELEVEN)), /* uart2dbgc_rx */ 10623d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_TWO, RK_PD2, PINCTRL_ROCKCHIP_TWO, 0xe21c, 10633d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN)), /* pcie_clkreqn */ 10643d0407baSopenharmony_ci RK_MUXROUTE_SAME(PINCTRL_ROCKCHIP_FOUR, RK_PD0, PINCTRL_ROCKCHIP_ONE, 0xe21c, 10653d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_FOURTEEN) | 10663d0407baSopenharmony_ci BIT(PINCTRL_ROCKCHIP_FOURTEEN)), /* pcie_clkreqnb */ 10673d0407baSopenharmony_ci}; 10683d0407baSopenharmony_ci 10693d0407baSopenharmony_cistatic struct rockchip_mux_route_data rk3568_mux_route_data[] = { 10703d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10713d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB7, PINCTRL_ROCKCHIP_ONE, 0x0110, 10723d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PWM0 IO mux M0 */ 10733d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10743d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC7, PINCTRL_ROCKCHIP_TWO, 0x0110, 10753d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PWM0 IO mux M1 */ 10763d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10773d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC0, PINCTRL_ROCKCHIP_ONE, 0x0110, 10783d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* PWM1 IO mux M0 */ 10793d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10803d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB5, PINCTRL_ROCKCHIP_FOUR, 0x0110, 10813d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* PWM1 IO mux M1 */ 10823d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10833d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC1, PINCTRL_ROCKCHIP_ONE, 0x0110, 10843d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* PWM2 IO mux M0 */ 10853d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10863d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB6, PINCTRL_ROCKCHIP_FOUR, 0x0110, 10873d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* PWM2 IO mux M1 */ 10883d0407baSopenharmony_ci RK_MUXROUTE_PMU( 10893d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB3, PINCTRL_ROCKCHIP_TWO, 0x0300, 10903d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* CAN0 IO mux M0 */ 10913d0407baSopenharmony_ci RK_MUXROUTE_GRF( 10923d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA1, PINCTRL_ROCKCHIP_FOUR, 0x0300, 10933d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* CAN0 IO mux M1 */ 10943d0407baSopenharmony_ci RK_MUXROUTE_GRF( 10953d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA1, PINCTRL_ROCKCHIP_THREE, 0x0300, 10963d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* CAN1 IO mux M0 */ 10973d0407baSopenharmony_ci RK_MUXROUTE_GRF( 10983d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC3, PINCTRL_ROCKCHIP_THREE, 0x0300, 10993d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* CAN1 IO mux M1 */ 11003d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11013d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PB5, PINCTRL_ROCKCHIP_THREE, 0x0300, 11023d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* CAN2 IO mux M0 */ 11033d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11043d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB2, PINCTRL_ROCKCHIP_FOUR, 0x0300, 11053d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* CAN2 IO mux M1 */ 11063d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11073d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC4, PINCTRL_ROCKCHIP_ONE, 0x0300, 11083d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* HPDIN IO mux M0 */ 11093d0407baSopenharmony_ci RK_MUXROUTE_PMU( 11103d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC2, PINCTRL_ROCKCHIP_TWO, 0x0300, 11113d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* HPDIN IO mux M1 */ 11123d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11133d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB1, PINCTRL_ROCKCHIP_THREE, 0x0300, 11143d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* GMAC1 IO mux M0 */ 11153d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11163d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PA7, PINCTRL_ROCKCHIP_THREE, 0x0300, 11173d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* GMAC1 IO mux M1 */ 11183d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11193d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PD1, PINCTRL_ROCKCHIP_ONE, 0x0300, 11203d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* HDMITX IO mux M0 */ 11213d0407baSopenharmony_ci RK_MUXROUTE_PMU( 11223d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PC7, PINCTRL_ROCKCHIP_ONE, 0x0300, 11233d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* HDMITX IO mux M1 */ 11243d0407baSopenharmony_ci RK_MUXROUTE_PMU(PINCTRL_ROCKCHIP_ZERO, RK_PB6, PINCTRL_ROCKCHIP_ONE, 0x0300, 11253d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 11263d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO)), /* I2C2 IO mux M0 */ 11273d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_FOUR, RK_PB4, PINCTRL_ROCKCHIP_ONE, 0x0300, 11283d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 11293d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE)), /* I2C2 IO mux M1 */ 11303d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11313d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA0, PINCTRL_ROCKCHIP_ONE, 0x0304, 11323d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* I2C3 IO mux M0 */ 11333d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11343d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB6, PINCTRL_ROCKCHIP_FOUR, 0x0304, 11353d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* I2C3 IO mux M1 */ 11363d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11373d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PB2, PINCTRL_ROCKCHIP_ONE, 0x0304, 11383d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* I2C4 IO mux M0 */ 11393d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11403d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB1, PINCTRL_ROCKCHIP_TWO, 0x0304, 11413d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* I2C4 IO mux M1 */ 11423d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11433d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB4, PINCTRL_ROCKCHIP_FOUR, 0x0304, 11443d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* I2C5 IO mux M0 */ 11453d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11463d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PD0, PINCTRL_ROCKCHIP_TWO, 0x0304, 11473d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* I2C5 IO mux M1 */ 11483d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PB1, PINCTRL_ROCKCHIP_FIVE, 0x0304, 11493d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 11503d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO)), /* PWM8 IO mux M0 */ 11513d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_ONE, RK_PD5, PINCTRL_ROCKCHIP_FOUR, 0x0304, 11523d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 11533d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE)), /* PWM8 IO mux M1 */ 11543d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11553d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB2, PINCTRL_ROCKCHIP_FIVE, 0x0308, 11563d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PWM9 IO mux M0 */ 11573d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11583d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD6, PINCTRL_ROCKCHIP_FOUR, 0x0308, 11593d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PWM9 IO mux M1 */ 11603d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11613d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB5, PINCTRL_ROCKCHIP_FIVE, 0x0308, 11623d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* PWM10 IO mux M0 */ 11633d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11643d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA1, PINCTRL_ROCKCHIP_TWO, 0x0308, 11653d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* PWM10 IO mux M1 */ 11663d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11673d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB6, PINCTRL_ROCKCHIP_FIVE, 0x0308, 11683d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* PWM11 IO mux M0 */ 11693d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11703d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC0, PINCTRL_ROCKCHIP_THREE, 0x0308, 11713d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* PWM11 IO mux M1 */ 11723d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11733d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB7, PINCTRL_ROCKCHIP_TWO, 0x0308, 11743d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* PWM12 IO mux M0 */ 11753d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11763d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC5, PINCTRL_ROCKCHIP_ONE, 0x0308, 11773d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* PWM12 IO mux M1 */ 11783d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11793d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC0, PINCTRL_ROCKCHIP_TWO, 0x0308, 11803d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* PWM13 IO mux M0 */ 11813d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11823d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC6, PINCTRL_ROCKCHIP_ONE, 0x0308, 11833d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* PWM13 IO mux M1 */ 11843d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11853d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC4, PINCTRL_ROCKCHIP_ONE, 0x0308, 11863d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* PWM14 IO mux M0 */ 11873d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11883d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC2, PINCTRL_ROCKCHIP_ONE, 0x0308, 11893d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* PWM14 IO mux M1 */ 11903d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11913d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC5, PINCTRL_ROCKCHIP_ONE, 0x0308, 11923d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* PWM15 IO mux M0 */ 11933d0407baSopenharmony_ci RK_MUXROUTE_GRF( 11943d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC3, PINCTRL_ROCKCHIP_ONE, 0x0308, 11953d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* PWM15 IO mux M1 */ 11963d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PD2, PINCTRL_ROCKCHIP_THREE, 0x0308, 11973d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 11983d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO)), /* SDMMC2 IO mux M0 */ 11993d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA5, PINCTRL_ROCKCHIP_FIVE, 0x0308, 12003d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 12013d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE)), /* SDMMC2 IO mux M1 */ 12023d0407baSopenharmony_ci RK_MUXROUTE_PMU( 12033d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PB5, PINCTRL_ROCKCHIP_TWO, 0x030c, 12043d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* SPI0 IO mux M0 */ 12053d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12063d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD3, PINCTRL_ROCKCHIP_THREE, 0x030c, 12073d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* SPI0 IO mux M1 */ 12083d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12093d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB5, PINCTRL_ROCKCHIP_THREE, 0x030c, 12103d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* SPI1 IO mux M0 */ 12113d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12123d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC3, PINCTRL_ROCKCHIP_THREE, 0x030c, 12133d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* SPI1 IO mux M1 */ 12143d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12153d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PC1, PINCTRL_ROCKCHIP_FOUR, 0x030c, 12163d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* SPI2 IO mux M0 */ 12173d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12183d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PA0, PINCTRL_ROCKCHIP_THREE, 0x030c, 12193d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* SPI2 IO mux M1 */ 12203d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12213d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PB3, PINCTRL_ROCKCHIP_FOUR, 0x030c, 12223d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* SPI3 IO mux M0 */ 12233d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12243d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC2, PINCTRL_ROCKCHIP_TWO, 0x030c, 12253d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* SPI3 IO mux M1 */ 12263d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12273d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB4, PINCTRL_ROCKCHIP_TWO, 0x030c, 12283d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* UART1 IO mux M0 */ 12293d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12303d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PD6, PINCTRL_ROCKCHIP_FOUR, 0x030c, 12313d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* UART1 IO mux M1 */ 12323d0407baSopenharmony_ci RK_MUXROUTE_PMU( 12333d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PD1, PINCTRL_ROCKCHIP_ONE, 0x030c, 12343d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* UART2 IO mux M0 */ 12353d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12363d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD5, PINCTRL_ROCKCHIP_TWO, 0x030c, 12373d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* UART2 IO mux M1 */ 12383d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12393d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA1, PINCTRL_ROCKCHIP_TWO, 0x030c, 12403d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* UART3 IO mux M0 */ 12413d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12423d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PB7, PINCTRL_ROCKCHIP_FOUR, 0x030c, 12433d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* UART3 IO mux M1 */ 12443d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_ONE, RK_PA6, PINCTRL_ROCKCHIP_TWO, 0x030c, 12453d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 12463d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO)), /* UART4 IO mux M0 */ 12473d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PB2, PINCTRL_ROCKCHIP_FOUR, 0x030c, 12483d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 12493d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE)), /* UART4 IO mux M1 */ 12503d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12513d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA2, PINCTRL_ROCKCHIP_THREE, 0x0310, 12523d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* UART5 IO mux M0 */ 12533d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12543d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC2, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12553d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* UART5 IO mux M1 */ 12563d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12573d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x0310, 12583d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* UART6 IO mux M0 */ 12593d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12603d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PD5, PINCTRL_ROCKCHIP_THREE, 0x0310, 12613d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* UART6 IO mux M1 */ 12623d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12633d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PA6, PINCTRL_ROCKCHIP_THREE, 0x0310, 12643d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* UART7 IO mux M0 */ 12653d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12663d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC4, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12673d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* UART7 IO mux M1 */ 12683d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12693d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PA2, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12703d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_TWO)), /* UART7 IO mux M2 */ 12713d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12723d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PC5, PINCTRL_ROCKCHIP_THREE, 0x0310, 12733d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* UART8 IO mux M0 */ 12743d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12753d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD7, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12763d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* UART8 IO mux M1 */ 12773d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12783d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PB0, PINCTRL_ROCKCHIP_THREE, 0x0310, 12793d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ZERO)), /* UART9 IO mux M0 */ 12803d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12813d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC5, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12823d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_ONE)), /* UART9 IO mux M1 */ 12833d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12843d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PA4, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12853d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_TWO)), /* UART9 IO mux M2 */ 12863d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12873d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA2, PINCTRL_ROCKCHIP_ONE, 0x0310, 12883d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ZERO)), /* I2S1 IO mux M0 */ 12893d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12903d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC6, PINCTRL_ROCKCHIP_FOUR, 0x0310, 12913d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_ONE)), /* I2S1 IO mux M1 */ 12923d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12933d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD0, PINCTRL_ROCKCHIP_FIVE, 0x0310, 12943d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ELEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TWO)), /* I2S1 IO mux M2 */ 12953d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12963d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PC1, PINCTRL_ROCKCHIP_ONE, 0x0310, 12973d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ZERO)), /* I2S2 IO mux M0 */ 12983d0407baSopenharmony_ci RK_MUXROUTE_GRF( 12993d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PB6, PINCTRL_ROCKCHIP_FIVE, 0x0310, 13003d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_TWELVE, PINCTRL_ROCKCHIP_ONE)), /* I2S2 IO mux M1 */ 13013d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_THREE, RK_PA2, PINCTRL_ROCKCHIP_FOUR, 0x0310, 13023d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 13033d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO)), /* I2S3 IO mux M0 */ 13043d0407baSopenharmony_ci RK_MUXROUTE_GRF(PINCTRL_ROCKCHIP_FOUR, RK_PC2, PINCTRL_ROCKCHIP_FIVE, 0x0310, 13053d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_FOURTEEN, 13063d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE)), /* I2S3 IO mux M1 */ 13073d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13083d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x0314, 13093d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PDM IO mux M0 */ 13103d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13113d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA6, PINCTRL_ROCKCHIP_THREE, 0x0314, 13123d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ZERO)), /* PDM IO mux M0 */ 13133d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13143d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PD6, PINCTRL_ROCKCHIP_FIVE, 0x0314, 13153d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PDM IO mux M1 */ 13163d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13173d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PA0, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13183d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_ONE)), /* PDM IO mux M1 */ 13193d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13203d0407baSopenharmony_ci PINCTRL_ROCKCHIP_THREE, RK_PC4, PINCTRL_ROCKCHIP_FIVE, 0x0314, 13213d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_TWO)), /* PDM IO mux M2 */ 13223d0407baSopenharmony_ci RK_MUXROUTE_PMU( 13233d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PA5, PINCTRL_ROCKCHIP_THREE, 0x0314, 13243d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ZERO)), /* PCIE20 IO mux M0 */ 13253d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13263d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD0, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13273d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_ONE)), /* PCIE20 IO mux M1 */ 13283d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13293d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PB0, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13303d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_TWO)), /* PCIE20 IO mux M2 */ 13313d0407baSopenharmony_ci RK_MUXROUTE_PMU( 13323d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PA4, PINCTRL_ROCKCHIP_THREE, 0x0314, 13333d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ZERO)), /* PCIE30X1 IO mux M0 */ 13343d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13353d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD2, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13363d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_ONE)), /* PCIE30X1 IO mux M1 */ 13373d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13383d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ONE, RK_PA5, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13393d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_TWO)), /* PCIE30X1 IO mux M2 */ 13403d0407baSopenharmony_ci RK_MUXROUTE_PMU( 13413d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, RK_PA6, PINCTRL_ROCKCHIP_TWO, 0x0314, 13423d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SEVEN, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ZERO)), /* PCIE30X2 IO mux M0 */ 13433d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13443d0407baSopenharmony_ci PINCTRL_ROCKCHIP_TWO, RK_PD4, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13453d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SEVEN, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_ONE)), /* PCIE30X2 IO mux M1 */ 13463d0407baSopenharmony_ci RK_MUXROUTE_GRF( 13473d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR, RK_PC2, PINCTRL_ROCKCHIP_FOUR, 0x0314, 13483d0407baSopenharmony_ci WRITE_MASK_VAL(PINCTRL_ROCKCHIP_SEVEN, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_TWO)), /* PCIE30X2 IO mux M2 */ 13493d0407baSopenharmony_ci}; 13503d0407baSopenharmony_ci 13513d0407baSopenharmony_cistatic bool rockchip_get_mux_route(struct rockchip_pin_bank *bank, int pin, int mux, u32 *loc, u32 *reg, u32 *value) 13523d0407baSopenharmony_ci{ 13533d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 13543d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 13553d0407baSopenharmony_ci struct rockchip_mux_route_data *data; 13563d0407baSopenharmony_ci int i; 13573d0407baSopenharmony_ci 13583d0407baSopenharmony_ci for (i = 0; i < ctrl->niomux_routes; i++) { 13593d0407baSopenharmony_ci data = &ctrl->iomux_routes[i]; 13603d0407baSopenharmony_ci if ((data->bank_num == bank->bank_num) && (data->pin == pin) && (data->func == mux)) { 13613d0407baSopenharmony_ci break; 13623d0407baSopenharmony_ci } 13633d0407baSopenharmony_ci } 13643d0407baSopenharmony_ci 13653d0407baSopenharmony_ci if (i >= ctrl->niomux_routes) { 13663d0407baSopenharmony_ci return false; 13673d0407baSopenharmony_ci } 13683d0407baSopenharmony_ci 13693d0407baSopenharmony_ci *loc = data->route_location; 13703d0407baSopenharmony_ci *reg = data->route_offset; 13713d0407baSopenharmony_ci *value = data->route_val; 13723d0407baSopenharmony_ci 13733d0407baSopenharmony_ci return true; 13743d0407baSopenharmony_ci} 13753d0407baSopenharmony_ci 13763d0407baSopenharmony_cistatic int rockchip_get_mux(struct rockchip_pin_bank *bank, int pin) 13773d0407baSopenharmony_ci{ 13783d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 13793d0407baSopenharmony_ci int iomux_num = (pin / PINCTRL_ROCKCHIP_EIGHT); 13803d0407baSopenharmony_ci struct regmap *regmap; 13813d0407baSopenharmony_ci unsigned int val; 13823d0407baSopenharmony_ci int reg, ret, mask, mux_type; 13833d0407baSopenharmony_ci u8 bit; 13843d0407baSopenharmony_ci 13853d0407baSopenharmony_ci if (iomux_num > PINCTRL_ROCKCHIP_THREE) { 13863d0407baSopenharmony_ci return -EINVAL; 13873d0407baSopenharmony_ci } 13883d0407baSopenharmony_ci 13893d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 13903d0407baSopenharmony_ci dev_err(info->dev, "pin %d is unrouted\n", pin); 13913d0407baSopenharmony_ci return -EINVAL; 13923d0407baSopenharmony_ci } 13933d0407baSopenharmony_ci 13943d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 13953d0407baSopenharmony_ci return RK_FUNC_GPIO; 13963d0407baSopenharmony_ci } 13973d0407baSopenharmony_ci 13983d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) { 13993d0407baSopenharmony_ci regmap = info->regmap_pmu; 14003d0407baSopenharmony_ci } else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) { 14013d0407baSopenharmony_ci regmap = (pin % PINCTRL_ROCKCHIP_EIGHT < PINCTRL_ROCKCHIP_FOUR) ? info->regmap_pmu : info->regmap_base; 14023d0407baSopenharmony_ci } else { 14033d0407baSopenharmony_ci regmap = info->regmap_base; 14043d0407baSopenharmony_ci } 14053d0407baSopenharmony_ci 14063d0407baSopenharmony_ci /* get basic quadrupel of mux registers and the correct reg inside */ 14073d0407baSopenharmony_ci mux_type = bank->iomux[iomux_num].type; 14083d0407baSopenharmony_ci reg = bank->iomux[iomux_num].offset; 14093d0407baSopenharmony_ci if (mux_type & IOMUX_WIDTH_4BIT) { 14103d0407baSopenharmony_ci if ((pin % PINCTRL_ROCKCHIP_EIGHT) >= PINCTRL_ROCKCHIP_FOUR) { 14113d0407baSopenharmony_ci reg += 0x4; 14123d0407baSopenharmony_ci } 14133d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_FOUR) * PINCTRL_ROCKCHIP_FOUR; 14143d0407baSopenharmony_ci mask = 0xf; 14153d0407baSopenharmony_ci } else if (mux_type & IOMUX_WIDTH_3BIT) { 14163d0407baSopenharmony_ci if ((pin % PINCTRL_ROCKCHIP_EIGHT) >= PINCTRL_ROCKCHIP_FIVE) { 14173d0407baSopenharmony_ci reg += 0x4; 14183d0407baSopenharmony_ci } 14193d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_EIGHT % PINCTRL_ROCKCHIP_FIVE) * PINCTRL_ROCKCHIP_THREE; 14203d0407baSopenharmony_ci mask = 0x7; 14213d0407baSopenharmony_ci } else { 14223d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_EIGHT) * 0x2; 14233d0407baSopenharmony_ci mask = 0x3; 14243d0407baSopenharmony_ci } 14253d0407baSopenharmony_ci 14263d0407baSopenharmony_ci if (bank->recalced_mask & BIT(pin)) { 14273d0407baSopenharmony_ci rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 14283d0407baSopenharmony_ci } 14293d0407baSopenharmony_ci 14303d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &val); 14313d0407baSopenharmony_ci if (ret) { 14323d0407baSopenharmony_ci return ret; 14333d0407baSopenharmony_ci } 14343d0407baSopenharmony_ci 14353d0407baSopenharmony_ci return ((val >> bit) & mask); 14363d0407baSopenharmony_ci} 14373d0407baSopenharmony_ci 14383d0407baSopenharmony_cistatic int rockchip_verify_mux(struct rockchip_pin_bank *bank, int pin, int mux) 14393d0407baSopenharmony_ci{ 14403d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 14413d0407baSopenharmony_ci int iomux_num = (pin / PINCTRL_ROCKCHIP_EIGHT); 14423d0407baSopenharmony_ci 14433d0407baSopenharmony_ci if (iomux_num > PINCTRL_ROCKCHIP_THREE) { 14443d0407baSopenharmony_ci return -EINVAL; 14453d0407baSopenharmony_ci } 14463d0407baSopenharmony_ci 14473d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_UNROUTED) { 14483d0407baSopenharmony_ci dev_err(info->dev, "pin %d is unrouted\n", pin); 14493d0407baSopenharmony_ci return -EINVAL; 14503d0407baSopenharmony_ci } 14513d0407baSopenharmony_ci 14523d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 14533d0407baSopenharmony_ci if (mux != RK_FUNC_GPIO) { 14543d0407baSopenharmony_ci dev_err(info->dev, "pin %d only supports a gpio mux\n", pin); 14553d0407baSopenharmony_ci return -ENOTSUPP; 14563d0407baSopenharmony_ci } 14573d0407baSopenharmony_ci } 14583d0407baSopenharmony_ci 14593d0407baSopenharmony_ci return 0; 14603d0407baSopenharmony_ci} 14613d0407baSopenharmony_ci 14623d0407baSopenharmony_ci/* 14633d0407baSopenharmony_ci * Set a new mux function for a pin. 14643d0407baSopenharmony_ci * 14653d0407baSopenharmony_ci * The register is divided into the upper and lower 16 bit. When changing 14663d0407baSopenharmony_ci * a value, the previous register value is not read and changed. Instead 14673d0407baSopenharmony_ci * it seems the changed bits are marked in the upper 16 bit, while the 14683d0407baSopenharmony_ci * changed value gets set in the same offset in the lower 16 bit. 14693d0407baSopenharmony_ci * All pin settings seem to be 2 bit wide in both the upper and lower 14703d0407baSopenharmony_ci * parts. 14713d0407baSopenharmony_ci * @bank: pin bank to change 14723d0407baSopenharmony_ci * @pin: pin to change 14733d0407baSopenharmony_ci * @mux: new mux function to set 14743d0407baSopenharmony_ci */ 14753d0407baSopenharmony_cistatic int rockchip_set_mux(struct rockchip_pin_bank *bank, int pin, int mux) 14763d0407baSopenharmony_ci{ 14773d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 14783d0407baSopenharmony_ci int iomux_num = (pin / PINCTRL_ROCKCHIP_EIGHT); 14793d0407baSopenharmony_ci struct regmap *regmap; 14803d0407baSopenharmony_ci int reg, ret, mask, mux_type; 14813d0407baSopenharmony_ci u8 bit; 14823d0407baSopenharmony_ci u32 data, rmask, route_location, route_reg, route_val; 14833d0407baSopenharmony_ci 14843d0407baSopenharmony_ci ret = rockchip_verify_mux(bank, pin, mux); 14853d0407baSopenharmony_ci if (ret < 0) { 14863d0407baSopenharmony_ci return ret; 14873d0407baSopenharmony_ci } 14883d0407baSopenharmony_ci 14893d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_GPIO_ONLY) { 14903d0407baSopenharmony_ci return 0; 14913d0407baSopenharmony_ci } 14923d0407baSopenharmony_ci 14933d0407baSopenharmony_ci dev_dbg(info->dev, "setting mux of GPIO%d-%d to %d\n", bank->bank_num, pin, mux); 14943d0407baSopenharmony_ci 14953d0407baSopenharmony_ci if (bank->iomux[iomux_num].type & IOMUX_SOURCE_PMU) { 14963d0407baSopenharmony_ci regmap = info->regmap_pmu; 14973d0407baSopenharmony_ci } else if (bank->iomux[iomux_num].type & IOMUX_L_SOURCE_PMU) { 14983d0407baSopenharmony_ci regmap = (pin % PINCTRL_ROCKCHIP_EIGHT < PINCTRL_ROCKCHIP_FOUR) ? info->regmap_pmu : info->regmap_base; 14993d0407baSopenharmony_ci } else { 15003d0407baSopenharmony_ci regmap = info->regmap_base; 15013d0407baSopenharmony_ci } 15023d0407baSopenharmony_ci 15033d0407baSopenharmony_ci /* get basic quadrupel of mux registers and the correct reg inside */ 15043d0407baSopenharmony_ci mux_type = bank->iomux[iomux_num].type; 15053d0407baSopenharmony_ci reg = bank->iomux[iomux_num].offset; 15063d0407baSopenharmony_ci if (mux_type & IOMUX_WIDTH_4BIT) { 15073d0407baSopenharmony_ci if ((pin % PINCTRL_ROCKCHIP_EIGHT) >= PINCTRL_ROCKCHIP_FOUR) { 15083d0407baSopenharmony_ci reg += 0x4; 15093d0407baSopenharmony_ci } 15103d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_FOUR) * PINCTRL_ROCKCHIP_FOUR; 15113d0407baSopenharmony_ci mask = 0xf; 15123d0407baSopenharmony_ci } else if (mux_type & IOMUX_WIDTH_3BIT) { 15133d0407baSopenharmony_ci if ((pin % PINCTRL_ROCKCHIP_EIGHT) >= PINCTRL_ROCKCHIP_FIVE) { 15143d0407baSopenharmony_ci reg += 0x4; 15153d0407baSopenharmony_ci } 15163d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_EIGHT % PINCTRL_ROCKCHIP_FIVE) * PINCTRL_ROCKCHIP_THREE; 15173d0407baSopenharmony_ci mask = 0x7; 15183d0407baSopenharmony_ci } else { 15193d0407baSopenharmony_ci bit = (pin % PINCTRL_ROCKCHIP_EIGHT) * 0x2; 15203d0407baSopenharmony_ci mask = 0x3; 15213d0407baSopenharmony_ci } 15223d0407baSopenharmony_ci 15233d0407baSopenharmony_ci if (bank->recalced_mask & BIT(pin)) { 15243d0407baSopenharmony_ci rockchip_get_recalced_mux(bank, pin, ®, &bit, &mask); 15253d0407baSopenharmony_ci } 15263d0407baSopenharmony_ci 15273d0407baSopenharmony_ci if (mux > mask) { 15283d0407baSopenharmony_ci return -EINVAL; 15293d0407baSopenharmony_ci } 15303d0407baSopenharmony_ci 15313d0407baSopenharmony_ci if (bank->route_mask & BIT(pin)) { 15323d0407baSopenharmony_ci if (rockchip_get_mux_route(bank, pin, mux, &route_location, &route_reg, &route_val)) { 15333d0407baSopenharmony_ci struct regmap *route_regmap = regmap; 15343d0407baSopenharmony_ci 15353d0407baSopenharmony_ci /* handle special locations */ 15363d0407baSopenharmony_ci switch (route_location) { 15373d0407baSopenharmony_ci case ROCKCHIP_ROUTE_PMU: 15383d0407baSopenharmony_ci route_regmap = info->regmap_pmu; 15393d0407baSopenharmony_ci break; 15403d0407baSopenharmony_ci case ROCKCHIP_ROUTE_GRF: 15413d0407baSopenharmony_ci route_regmap = info->regmap_base; 15423d0407baSopenharmony_ci break; 15433d0407baSopenharmony_ci } 15443d0407baSopenharmony_ci 15453d0407baSopenharmony_ci ret = regmap_write(route_regmap, route_reg, route_val); 15463d0407baSopenharmony_ci if (ret) { 15473d0407baSopenharmony_ci return ret; 15483d0407baSopenharmony_ci } 15493d0407baSopenharmony_ci } 15503d0407baSopenharmony_ci } 15513d0407baSopenharmony_ci 15523d0407baSopenharmony_ci if (mux_type & IOMUX_WRITABLE_32BIT) { 15533d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 15543d0407baSopenharmony_ci if (ret) { 15553d0407baSopenharmony_ci return ret; 15563d0407baSopenharmony_ci } 15573d0407baSopenharmony_ci 15583d0407baSopenharmony_ci data &= ~(mask << bit); 15593d0407baSopenharmony_ci data |= (mux & mask) << bit; 15603d0407baSopenharmony_ci ret = regmap_write(regmap, reg, data); 15613d0407baSopenharmony_ci } else { 15623d0407baSopenharmony_ci data = (mask << (bit + PINCTRL_ROCKCHIP_SIXTEEN)); 15633d0407baSopenharmony_ci rmask = data | (data >> PINCTRL_ROCKCHIP_SIXTEEN); 15643d0407baSopenharmony_ci data |= (mux & mask) << bit; 15653d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, data); 15663d0407baSopenharmony_ci } 15673d0407baSopenharmony_ci 15683d0407baSopenharmony_ci return ret; 15693d0407baSopenharmony_ci} 15703d0407baSopenharmony_ci 15713d0407baSopenharmony_ci#define PX30_PULL_PMU_OFFSET 0x10 15723d0407baSopenharmony_ci#define PX30_PULL_GRF_OFFSET 0x60 15733d0407baSopenharmony_ci#define PX30_PULL_BITS_PER_PIN 2 15743d0407baSopenharmony_ci#define PX30_PULL_PINS_PER_REG 8 15753d0407baSopenharmony_ci#define PX30_PULL_BANK_STRIDE 16 15763d0407baSopenharmony_ci 15773d0407baSopenharmony_cistatic void px30_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 15783d0407baSopenharmony_ci u8 *bit) 15793d0407baSopenharmony_ci{ 15803d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 15813d0407baSopenharmony_ci 15823d0407baSopenharmony_ci /* The first 32 pins of the first bank are located in PMU */ 15833d0407baSopenharmony_ci if (bank->bank_num == 0) { 15843d0407baSopenharmony_ci *regmap = info->regmap_pmu; 15853d0407baSopenharmony_ci *reg = PX30_PULL_PMU_OFFSET; 15863d0407baSopenharmony_ci } else { 15873d0407baSopenharmony_ci *regmap = info->regmap_base; 15883d0407baSopenharmony_ci *reg = PX30_PULL_GRF_OFFSET; 15893d0407baSopenharmony_ci 15903d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 15913d0407baSopenharmony_ci *reg -= 0x10; 15923d0407baSopenharmony_ci *reg += bank->bank_num * PX30_PULL_BANK_STRIDE; 15933d0407baSopenharmony_ci } 15943d0407baSopenharmony_ci 15953d0407baSopenharmony_ci *reg += ((pin_num / PX30_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 15963d0407baSopenharmony_ci *bit = (pin_num % PX30_PULL_PINS_PER_REG); 15973d0407baSopenharmony_ci *bit *= PX30_PULL_BITS_PER_PIN; 15983d0407baSopenharmony_ci} 15993d0407baSopenharmony_ci 16003d0407baSopenharmony_ci#define PX30_DRV_PMU_OFFSET 0x20 16013d0407baSopenharmony_ci#define PX30_DRV_GRF_OFFSET 0xf0 16023d0407baSopenharmony_ci#define PX30_DRV_BITS_PER_PIN 2 16033d0407baSopenharmony_ci#define PX30_DRV_PINS_PER_REG 8 16043d0407baSopenharmony_ci#define PX30_DRV_BANK_STRIDE 16 16053d0407baSopenharmony_ci 16063d0407baSopenharmony_cistatic void px30_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 16073d0407baSopenharmony_ci u8 *bit) 16083d0407baSopenharmony_ci{ 16093d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 16103d0407baSopenharmony_ci 16113d0407baSopenharmony_ci /* The first 32 pins of the first bank are located in PMU */ 16123d0407baSopenharmony_ci if (bank->bank_num == 0) { 16133d0407baSopenharmony_ci *regmap = info->regmap_pmu; 16143d0407baSopenharmony_ci *reg = PX30_DRV_PMU_OFFSET; 16153d0407baSopenharmony_ci } else { 16163d0407baSopenharmony_ci *regmap = info->regmap_base; 16173d0407baSopenharmony_ci *reg = PX30_DRV_GRF_OFFSET; 16183d0407baSopenharmony_ci 16193d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 16203d0407baSopenharmony_ci *reg -= 0x10; 16213d0407baSopenharmony_ci *reg += bank->bank_num * PX30_DRV_BANK_STRIDE; 16223d0407baSopenharmony_ci } 16233d0407baSopenharmony_ci 16243d0407baSopenharmony_ci *reg += ((pin_num / PX30_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 16253d0407baSopenharmony_ci *bit = (pin_num % PX30_DRV_PINS_PER_REG); 16263d0407baSopenharmony_ci *bit *= PX30_DRV_BITS_PER_PIN; 16273d0407baSopenharmony_ci} 16283d0407baSopenharmony_ci 16293d0407baSopenharmony_ci#define PX30_SCHMITT_PMU_OFFSET 0x38 16303d0407baSopenharmony_ci#define PX30_SCHMITT_GRF_OFFSET 0xc0 16313d0407baSopenharmony_ci#define PX30_SCHMITT_PINS_PER_PMU_REG 16 16323d0407baSopenharmony_ci#define PX30_SCHMITT_BANK_STRIDE 16 16333d0407baSopenharmony_ci#define PX30_SCHMITT_PINS_PER_GRF_REG 8 16343d0407baSopenharmony_ci 16353d0407baSopenharmony_cistatic int px30_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 16363d0407baSopenharmony_ci u8 *bit) 16373d0407baSopenharmony_ci{ 16383d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 16393d0407baSopenharmony_ci int pins_per_reg; 16403d0407baSopenharmony_ci 16413d0407baSopenharmony_ci if (bank->bank_num == 0) { 16423d0407baSopenharmony_ci *regmap = info->regmap_pmu; 16433d0407baSopenharmony_ci *reg = PX30_SCHMITT_PMU_OFFSET; 16443d0407baSopenharmony_ci pins_per_reg = PX30_SCHMITT_PINS_PER_PMU_REG; 16453d0407baSopenharmony_ci } else { 16463d0407baSopenharmony_ci *regmap = info->regmap_base; 16473d0407baSopenharmony_ci *reg = PX30_SCHMITT_GRF_OFFSET; 16483d0407baSopenharmony_ci pins_per_reg = PX30_SCHMITT_PINS_PER_GRF_REG; 16493d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * PX30_SCHMITT_BANK_STRIDE; 16503d0407baSopenharmony_ci } 16513d0407baSopenharmony_ci 16523d0407baSopenharmony_ci *reg += ((pin_num / pins_per_reg) * PINCTRL_ROCKCHIP_FOUR); 16533d0407baSopenharmony_ci *bit = pin_num % pins_per_reg; 16543d0407baSopenharmony_ci 16553d0407baSopenharmony_ci return 0; 16563d0407baSopenharmony_ci} 16573d0407baSopenharmony_ci 16583d0407baSopenharmony_ci#define RV1108_PULL_PMU_OFFSET 0x10 16593d0407baSopenharmony_ci#define RV1108_PULL_OFFSET 0x110 16603d0407baSopenharmony_ci#define RV1108_PULL_PINS_PER_REG 8 16613d0407baSopenharmony_ci#define RV1108_PULL_BITS_PER_PIN 2 16623d0407baSopenharmony_ci#define RV1108_PULL_BANK_STRIDE 16 16633d0407baSopenharmony_ci 16643d0407baSopenharmony_cistatic void rv1108_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 16653d0407baSopenharmony_ci u8 *bit) 16663d0407baSopenharmony_ci{ 16673d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 16683d0407baSopenharmony_ci 16693d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 16703d0407baSopenharmony_ci if (bank->bank_num == 0) { 16713d0407baSopenharmony_ci *regmap = info->regmap_pmu; 16723d0407baSopenharmony_ci *reg = RV1108_PULL_PMU_OFFSET; 16733d0407baSopenharmony_ci } else { 16743d0407baSopenharmony_ci *reg = RV1108_PULL_OFFSET; 16753d0407baSopenharmony_ci *regmap = info->regmap_base; 16763d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 16773d0407baSopenharmony_ci *reg -= 0x10; 16783d0407baSopenharmony_ci *reg += bank->bank_num * RV1108_PULL_BANK_STRIDE; 16793d0407baSopenharmony_ci } 16803d0407baSopenharmony_ci 16813d0407baSopenharmony_ci *reg += ((pin_num / RV1108_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 16823d0407baSopenharmony_ci *bit = (pin_num % RV1108_PULL_PINS_PER_REG); 16833d0407baSopenharmony_ci *bit *= RV1108_PULL_BITS_PER_PIN; 16843d0407baSopenharmony_ci} 16853d0407baSopenharmony_ci 16863d0407baSopenharmony_ci#define RV1108_DRV_PMU_OFFSET 0x20 16873d0407baSopenharmony_ci#define RV1108_DRV_GRF_OFFSET 0x210 16883d0407baSopenharmony_ci#define RV1108_DRV_BITS_PER_PIN 2 16893d0407baSopenharmony_ci#define RV1108_DRV_PINS_PER_REG 8 16903d0407baSopenharmony_ci#define RV1108_DRV_BANK_STRIDE 16 16913d0407baSopenharmony_ci 16923d0407baSopenharmony_cistatic void rv1108_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 16933d0407baSopenharmony_ci u8 *bit) 16943d0407baSopenharmony_ci{ 16953d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 16963d0407baSopenharmony_ci 16973d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 16983d0407baSopenharmony_ci if (bank->bank_num == 0) { 16993d0407baSopenharmony_ci *regmap = info->regmap_pmu; 17003d0407baSopenharmony_ci *reg = RV1108_DRV_PMU_OFFSET; 17013d0407baSopenharmony_ci } else { 17023d0407baSopenharmony_ci *regmap = info->regmap_base; 17033d0407baSopenharmony_ci *reg = RV1108_DRV_GRF_OFFSET; 17043d0407baSopenharmony_ci 17053d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 17063d0407baSopenharmony_ci *reg -= 0x10; 17073d0407baSopenharmony_ci *reg += bank->bank_num * RV1108_DRV_BANK_STRIDE; 17083d0407baSopenharmony_ci } 17093d0407baSopenharmony_ci 17103d0407baSopenharmony_ci *reg += ((pin_num / RV1108_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 17113d0407baSopenharmony_ci *bit = pin_num % RV1108_DRV_PINS_PER_REG; 17123d0407baSopenharmony_ci *bit *= RV1108_DRV_BITS_PER_PIN; 17133d0407baSopenharmony_ci} 17143d0407baSopenharmony_ci 17153d0407baSopenharmony_ci#define RV1108_SCHMITT_PMU_OFFSET 0x30 17163d0407baSopenharmony_ci#define RV1108_SCHMITT_GRF_OFFSET 0x388 17173d0407baSopenharmony_ci#define RV1108_SCHMITT_BANK_STRIDE 8 17183d0407baSopenharmony_ci#define RV1108_SCHMITT_PINS_PER_GRF_REG 16 17193d0407baSopenharmony_ci#define RV1108_SCHMITT_PINS_PER_PMU_REG 8 17203d0407baSopenharmony_ci 17213d0407baSopenharmony_cistatic int rv1108_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 17223d0407baSopenharmony_ci int *reg, u8 *bit) 17233d0407baSopenharmony_ci{ 17243d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 17253d0407baSopenharmony_ci int pins_per_reg; 17263d0407baSopenharmony_ci 17273d0407baSopenharmony_ci if (bank->bank_num == 0) { 17283d0407baSopenharmony_ci *regmap = info->regmap_pmu; 17293d0407baSopenharmony_ci *reg = RV1108_SCHMITT_PMU_OFFSET; 17303d0407baSopenharmony_ci pins_per_reg = RV1108_SCHMITT_PINS_PER_PMU_REG; 17313d0407baSopenharmony_ci } else { 17323d0407baSopenharmony_ci *regmap = info->regmap_base; 17333d0407baSopenharmony_ci *reg = RV1108_SCHMITT_GRF_OFFSET; 17343d0407baSopenharmony_ci pins_per_reg = RV1108_SCHMITT_PINS_PER_GRF_REG; 17353d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RV1108_SCHMITT_BANK_STRIDE; 17363d0407baSopenharmony_ci } 17373d0407baSopenharmony_ci *reg += ((pin_num / pins_per_reg) * PINCTRL_ROCKCHIP_FOUR); 17383d0407baSopenharmony_ci *bit = pin_num % pins_per_reg; 17393d0407baSopenharmony_ci 17403d0407baSopenharmony_ci return 0; 17413d0407baSopenharmony_ci} 17423d0407baSopenharmony_ci 17433d0407baSopenharmony_ci#define RV1126_PULL_PMU_OFFSET 0x40 17443d0407baSopenharmony_ci#define RV1126_PULL_GRF_GPIO1A0_OFFSET 0x10108 17453d0407baSopenharmony_ci#define RV1126_PULL_PINS_PER_REG 8 17463d0407baSopenharmony_ci#define RV1126_PULL_BITS_PER_PIN 2 17473d0407baSopenharmony_ci#define RV1126_PULL_BANK_STRIDE 16 17483d0407baSopenharmony_ci#define RV1126_GPIO_C4_D7(p) (p >= 20 && p <= PINCTRL_ROCKCHIP_THIRTYONE) /* GPIO0_C4 ~ GPIO0_D7 */ 17493d0407baSopenharmony_ci 17503d0407baSopenharmony_cistatic void rv1126_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 17513d0407baSopenharmony_ci u8 *bit) 17523d0407baSopenharmony_ci{ 17533d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 17543d0407baSopenharmony_ci 17553d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 17563d0407baSopenharmony_ci if (bank->bank_num == 0) { 17573d0407baSopenharmony_ci if (RV1126_GPIO_C4_D7(pin_num)) { 17583d0407baSopenharmony_ci *regmap = info->regmap_base; 17593d0407baSopenharmony_ci *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 17603d0407baSopenharmony_ci *reg -= (((PINCTRL_ROCKCHIP_THIRTYONE - pin_num) / RV1126_PULL_PINS_PER_REG + PINCTRL_ROCKCHIP_ONE) * 17613d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR); 17623d0407baSopenharmony_ci *bit = pin_num % RV1126_PULL_PINS_PER_REG; 17633d0407baSopenharmony_ci *bit *= RV1126_PULL_BITS_PER_PIN; 17643d0407baSopenharmony_ci return; 17653d0407baSopenharmony_ci } 17663d0407baSopenharmony_ci *regmap = info->regmap_pmu; 17673d0407baSopenharmony_ci *reg = RV1126_PULL_PMU_OFFSET; 17683d0407baSopenharmony_ci } else { 17693d0407baSopenharmony_ci *reg = RV1126_PULL_GRF_GPIO1A0_OFFSET; 17703d0407baSopenharmony_ci *regmap = info->regmap_base; 17713d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RV1126_PULL_BANK_STRIDE; 17723d0407baSopenharmony_ci } 17733d0407baSopenharmony_ci 17743d0407baSopenharmony_ci *reg += ((pin_num / RV1126_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 17753d0407baSopenharmony_ci *bit = (pin_num % RV1126_PULL_PINS_PER_REG); 17763d0407baSopenharmony_ci *bit *= RV1126_PULL_BITS_PER_PIN; 17773d0407baSopenharmony_ci} 17783d0407baSopenharmony_ci 17793d0407baSopenharmony_ci#define RV1126_DRV_PMU_OFFSET 0x20 17803d0407baSopenharmony_ci#define RV1126_DRV_GRF_GPIO1A0_OFFSET 0x10090 17813d0407baSopenharmony_ci#define RV1126_DRV_BITS_PER_PIN 4 17823d0407baSopenharmony_ci#define RV1126_DRV_PINS_PER_REG 4 17833d0407baSopenharmony_ci#define RV1126_DRV_BANK_STRIDE 32 17843d0407baSopenharmony_ci 17853d0407baSopenharmony_cistatic void rv1126_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 17863d0407baSopenharmony_ci u8 *bit) 17873d0407baSopenharmony_ci{ 17883d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 17893d0407baSopenharmony_ci 17903d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 17913d0407baSopenharmony_ci if (bank->bank_num == 0) { 17923d0407baSopenharmony_ci if (RV1126_GPIO_C4_D7(pin_num)) { 17933d0407baSopenharmony_ci *regmap = info->regmap_base; 17943d0407baSopenharmony_ci *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 17953d0407baSopenharmony_ci *reg -= (((PINCTRL_ROCKCHIP_THIRTYONE - pin_num) / RV1126_DRV_PINS_PER_REG + PINCTRL_ROCKCHIP_ONE) * 17963d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR); 17973d0407baSopenharmony_ci *reg -= 0x4; 17983d0407baSopenharmony_ci *bit = pin_num % RV1126_DRV_PINS_PER_REG; 17993d0407baSopenharmony_ci *bit *= RV1126_DRV_BITS_PER_PIN; 18003d0407baSopenharmony_ci return; 18013d0407baSopenharmony_ci } 18023d0407baSopenharmony_ci *regmap = info->regmap_pmu; 18033d0407baSopenharmony_ci *reg = RV1126_DRV_PMU_OFFSET; 18043d0407baSopenharmony_ci } else { 18053d0407baSopenharmony_ci *regmap = info->regmap_base; 18063d0407baSopenharmony_ci *reg = RV1126_DRV_GRF_GPIO1A0_OFFSET; 18073d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RV1126_DRV_BANK_STRIDE; 18083d0407baSopenharmony_ci } 18093d0407baSopenharmony_ci 18103d0407baSopenharmony_ci *reg += ((pin_num / RV1126_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 18113d0407baSopenharmony_ci *bit = pin_num % RV1126_DRV_PINS_PER_REG; 18123d0407baSopenharmony_ci *bit *= RV1126_DRV_BITS_PER_PIN; 18133d0407baSopenharmony_ci} 18143d0407baSopenharmony_ci 18153d0407baSopenharmony_ci#define RV1126_SCHMITT_PMU_OFFSET 0x60 18163d0407baSopenharmony_ci#define RV1126_SCHMITT_GRF_GPIO1A0_OFFSET 0x10188 18173d0407baSopenharmony_ci#define RV1126_SCHMITT_BANK_STRIDE 16 18183d0407baSopenharmony_ci#define RV1126_SCHMITT_PINS_PER_GRF_REG 8 18193d0407baSopenharmony_ci#define RV1126_SCHMITT_PINS_PER_PMU_REG 8 18203d0407baSopenharmony_ci 18213d0407baSopenharmony_cistatic int rv1126_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 18223d0407baSopenharmony_ci int *reg, u8 *bit) 18233d0407baSopenharmony_ci{ 18243d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 18253d0407baSopenharmony_ci int pins_per_reg; 18263d0407baSopenharmony_ci 18273d0407baSopenharmony_ci if (bank->bank_num == 0) { 18283d0407baSopenharmony_ci if (RV1126_GPIO_C4_D7(pin_num)) { 18293d0407baSopenharmony_ci *regmap = info->regmap_base; 18303d0407baSopenharmony_ci *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 18313d0407baSopenharmony_ci *reg -= (((PINCTRL_ROCKCHIP_THIRTYONE - pin_num) / RV1126_SCHMITT_PINS_PER_GRF_REG + PINCTRL_ROCKCHIP_ONE) * 18323d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOUR); 18333d0407baSopenharmony_ci *bit = pin_num % RV1126_SCHMITT_PINS_PER_GRF_REG; 18343d0407baSopenharmony_ci return 0; 18353d0407baSopenharmony_ci } 18363d0407baSopenharmony_ci *regmap = info->regmap_pmu; 18373d0407baSopenharmony_ci *reg = RV1126_SCHMITT_PMU_OFFSET; 18383d0407baSopenharmony_ci pins_per_reg = RV1126_SCHMITT_PINS_PER_PMU_REG; 18393d0407baSopenharmony_ci } else { 18403d0407baSopenharmony_ci *regmap = info->regmap_base; 18413d0407baSopenharmony_ci *reg = RV1126_SCHMITT_GRF_GPIO1A0_OFFSET; 18423d0407baSopenharmony_ci pins_per_reg = RV1126_SCHMITT_PINS_PER_GRF_REG; 18433d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RV1126_SCHMITT_BANK_STRIDE; 18443d0407baSopenharmony_ci } 18453d0407baSopenharmony_ci *reg += ((pin_num / pins_per_reg) * PINCTRL_ROCKCHIP_FOUR); 18463d0407baSopenharmony_ci *bit = pin_num % pins_per_reg; 18473d0407baSopenharmony_ci 18483d0407baSopenharmony_ci return 0; 18493d0407baSopenharmony_ci} 18503d0407baSopenharmony_ci 18513d0407baSopenharmony_ci#define RK3308_SCHMITT_PINS_PER_REG 8 18523d0407baSopenharmony_ci#define RK3308_SCHMITT_BANK_STRIDE 16 18533d0407baSopenharmony_ci#define RK3308_SCHMITT_GRF_OFFSET 0x1a0 18543d0407baSopenharmony_ci 18553d0407baSopenharmony_cistatic int rk3308_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 18563d0407baSopenharmony_ci int *reg, u8 *bit) 18573d0407baSopenharmony_ci{ 18583d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 18593d0407baSopenharmony_ci 18603d0407baSopenharmony_ci *regmap = info->regmap_base; 18613d0407baSopenharmony_ci *reg = RK3308_SCHMITT_GRF_OFFSET; 18623d0407baSopenharmony_ci 18633d0407baSopenharmony_ci *reg += bank->bank_num * RK3308_SCHMITT_BANK_STRIDE; 18643d0407baSopenharmony_ci *reg += ((pin_num / RK3308_SCHMITT_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 18653d0407baSopenharmony_ci *bit = pin_num % RK3308_SCHMITT_PINS_PER_REG; 18663d0407baSopenharmony_ci 18673d0407baSopenharmony_ci return 0; 18683d0407baSopenharmony_ci} 18693d0407baSopenharmony_ci 18703d0407baSopenharmony_ci#define RK1808_PULL_PMU_OFFSET 0x10 18713d0407baSopenharmony_ci#define RK1808_PULL_GRF_OFFSET 0x80 18723d0407baSopenharmony_ci#define RK1808_PULL_PINS_PER_REG 8 18733d0407baSopenharmony_ci#define RK1808_PULL_BITS_PER_PIN 2 18743d0407baSopenharmony_ci#define RK1808_PULL_BANK_STRIDE 16 18753d0407baSopenharmony_ci 18763d0407baSopenharmony_cistatic void rk1808_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 18773d0407baSopenharmony_ci u8 *bit) 18783d0407baSopenharmony_ci{ 18793d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 18803d0407baSopenharmony_ci 18813d0407baSopenharmony_ci if (bank->bank_num == 0) { 18823d0407baSopenharmony_ci *regmap = info->regmap_pmu; 18833d0407baSopenharmony_ci *reg = RK1808_PULL_PMU_OFFSET; 18843d0407baSopenharmony_ci } else { 18853d0407baSopenharmony_ci *reg = RK1808_PULL_GRF_OFFSET; 18863d0407baSopenharmony_ci *regmap = info->regmap_base; 18873d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK1808_PULL_BANK_STRIDE; 18883d0407baSopenharmony_ci } 18893d0407baSopenharmony_ci 18903d0407baSopenharmony_ci *reg += ((pin_num / RK1808_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 18913d0407baSopenharmony_ci *bit = (pin_num % RK1808_PULL_PINS_PER_REG); 18923d0407baSopenharmony_ci *bit *= RK1808_PULL_BITS_PER_PIN; 18933d0407baSopenharmony_ci} 18943d0407baSopenharmony_ci 18953d0407baSopenharmony_ci#define RK1808_DRV_PMU_OFFSET 0x20 18963d0407baSopenharmony_ci#define RK1808_DRV_GRF_OFFSET 0x140 18973d0407baSopenharmony_ci#define RK1808_DRV_BITS_PER_PIN 2 18983d0407baSopenharmony_ci#define RK1808_DRV_PINS_PER_REG 8 18993d0407baSopenharmony_ci#define RK1808_DRV_BANK_STRIDE 16 19003d0407baSopenharmony_ci 19013d0407baSopenharmony_cistatic void rk1808_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 19023d0407baSopenharmony_ci u8 *bit) 19033d0407baSopenharmony_ci{ 19043d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 19053d0407baSopenharmony_ci 19063d0407baSopenharmony_ci if (bank->bank_num == 0) { 19073d0407baSopenharmony_ci *regmap = info->regmap_pmu; 19083d0407baSopenharmony_ci *reg = RK1808_DRV_PMU_OFFSET; 19093d0407baSopenharmony_ci } else { 19103d0407baSopenharmony_ci *regmap = info->regmap_base; 19113d0407baSopenharmony_ci *reg = RK1808_DRV_GRF_OFFSET; 19123d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK1808_DRV_BANK_STRIDE; 19133d0407baSopenharmony_ci } 19143d0407baSopenharmony_ci 19153d0407baSopenharmony_ci *reg += ((pin_num / RK1808_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 19163d0407baSopenharmony_ci *bit = pin_num % RK1808_DRV_PINS_PER_REG; 19173d0407baSopenharmony_ci *bit *= RK1808_DRV_BITS_PER_PIN; 19183d0407baSopenharmony_ci} 19193d0407baSopenharmony_ci 19203d0407baSopenharmony_ci#define RK1808_SR_PMU_OFFSET 0x0030 19213d0407baSopenharmony_ci#define RK1808_SR_GRF_OFFSET 0x00c0 19223d0407baSopenharmony_ci#define RK1808_SR_BANK_STRIDE 16 19233d0407baSopenharmony_ci#define RK1808_SR_PINS_PER_REG 8 19243d0407baSopenharmony_ci 19253d0407baSopenharmony_cistatic int rk1808_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 19263d0407baSopenharmony_ci int *reg, u8 *bit) 19273d0407baSopenharmony_ci{ 19283d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 19293d0407baSopenharmony_ci 19303d0407baSopenharmony_ci if (bank->bank_num == 0) { 19313d0407baSopenharmony_ci *regmap = info->regmap_pmu; 19323d0407baSopenharmony_ci *reg = RK1808_SR_PMU_OFFSET; 19333d0407baSopenharmony_ci } else { 19343d0407baSopenharmony_ci *regmap = info->regmap_base; 19353d0407baSopenharmony_ci *reg = RK1808_SR_GRF_OFFSET; 19363d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK1808_SR_BANK_STRIDE; 19373d0407baSopenharmony_ci } 19383d0407baSopenharmony_ci *reg += ((pin_num / RK1808_SR_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 19393d0407baSopenharmony_ci *bit = pin_num % RK1808_SR_PINS_PER_REG; 19403d0407baSopenharmony_ci 19413d0407baSopenharmony_ci return 0; 19423d0407baSopenharmony_ci} 19433d0407baSopenharmony_ci 19443d0407baSopenharmony_ci#define RK1808_SCHMITT_PMU_OFFSET 0x0040 19453d0407baSopenharmony_ci#define RK1808_SCHMITT_GRF_OFFSET 0x0100 19463d0407baSopenharmony_ci#define RK1808_SCHMITT_BANK_STRIDE 16 19473d0407baSopenharmony_ci#define RK1808_SCHMITT_PINS_PER_REG 8 19483d0407baSopenharmony_ci 19493d0407baSopenharmony_cistatic int rk1808_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 19503d0407baSopenharmony_ci int *reg, u8 *bit) 19513d0407baSopenharmony_ci{ 19523d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 19533d0407baSopenharmony_ci 19543d0407baSopenharmony_ci if (bank->bank_num == 0) { 19553d0407baSopenharmony_ci *regmap = info->regmap_pmu; 19563d0407baSopenharmony_ci *reg = RK1808_SCHMITT_PMU_OFFSET; 19573d0407baSopenharmony_ci } else { 19583d0407baSopenharmony_ci *regmap = info->regmap_base; 19593d0407baSopenharmony_ci *reg = RK1808_SCHMITT_GRF_OFFSET; 19603d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK1808_SCHMITT_BANK_STRIDE; 19613d0407baSopenharmony_ci } 19623d0407baSopenharmony_ci *reg += ((pin_num / RK1808_SCHMITT_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 19633d0407baSopenharmony_ci *bit = pin_num % RK1808_SCHMITT_PINS_PER_REG; 19643d0407baSopenharmony_ci 19653d0407baSopenharmony_ci return 0; 19663d0407baSopenharmony_ci} 19673d0407baSopenharmony_ci 19683d0407baSopenharmony_ci#define RK2928_PULL_OFFSET 0x118 19693d0407baSopenharmony_ci#define RK2928_PULL_PINS_PER_REG 16 19703d0407baSopenharmony_ci#define RK2928_PULL_BANK_STRIDE 8 19713d0407baSopenharmony_ci 19723d0407baSopenharmony_cistatic void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 19733d0407baSopenharmony_ci u8 *bit) 19743d0407baSopenharmony_ci{ 19753d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 19763d0407baSopenharmony_ci 19773d0407baSopenharmony_ci *regmap = info->regmap_base; 19783d0407baSopenharmony_ci *reg = RK2928_PULL_OFFSET; 19793d0407baSopenharmony_ci *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 19803d0407baSopenharmony_ci *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR; 19813d0407baSopenharmony_ci 19823d0407baSopenharmony_ci *bit = pin_num % RK2928_PULL_PINS_PER_REG; 19833d0407baSopenharmony_ci}; 19843d0407baSopenharmony_ci 19853d0407baSopenharmony_ci#define RK3128_PULL_OFFSET 0x118 19863d0407baSopenharmony_ci 19873d0407baSopenharmony_cistatic void rk3128_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 19883d0407baSopenharmony_ci u8 *bit) 19893d0407baSopenharmony_ci{ 19903d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 19913d0407baSopenharmony_ci 19923d0407baSopenharmony_ci *regmap = info->regmap_base; 19933d0407baSopenharmony_ci *reg = RK3128_PULL_OFFSET; 19943d0407baSopenharmony_ci *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 19953d0407baSopenharmony_ci *reg += ((pin_num / RK2928_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 19963d0407baSopenharmony_ci 19973d0407baSopenharmony_ci *bit = pin_num % RK2928_PULL_PINS_PER_REG; 19983d0407baSopenharmony_ci} 19993d0407baSopenharmony_ci 20003d0407baSopenharmony_ci#define RK3188_PULL_OFFSET 0x164 20013d0407baSopenharmony_ci#define RK3188_PULL_BITS_PER_PIN 2 20023d0407baSopenharmony_ci#define RK3188_PULL_PINS_PER_REG 8 20033d0407baSopenharmony_ci#define RK3188_PULL_BANK_STRIDE 16 20043d0407baSopenharmony_ci#define RK3188_PULL_PMU_OFFSET 0x64 20053d0407baSopenharmony_ci 20063d0407baSopenharmony_cistatic void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 20073d0407baSopenharmony_ci u8 *bit) 20083d0407baSopenharmony_ci{ 20093d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 20103d0407baSopenharmony_ci 20113d0407baSopenharmony_ci /* The first 12 pins of the first bank are located elsewhere */ 20123d0407baSopenharmony_ci if (bank->bank_num == 0 && pin_num < PINCTRL_ROCKCHIP_TWELVE) { 20133d0407baSopenharmony_ci *regmap = info->regmap_pmu ? info->regmap_pmu : bank->regmap_pull; 20143d0407baSopenharmony_ci *reg = info->regmap_pmu ? RK3188_PULL_PMU_OFFSET : 0; 20153d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20163d0407baSopenharmony_ci *bit = pin_num % RK3188_PULL_PINS_PER_REG; 20173d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 20183d0407baSopenharmony_ci } else { 20193d0407baSopenharmony_ci *regmap = info->regmap_pull ? info->regmap_pull : info->regmap_base; 20203d0407baSopenharmony_ci *reg = info->regmap_pull ? 0 : RK3188_PULL_OFFSET; 20213d0407baSopenharmony_ci 20223d0407baSopenharmony_ci /* correct the offset, as it is the 2nd pull register */ 20233d0407baSopenharmony_ci *reg -= PINCTRL_ROCKCHIP_FOUR; 20243d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 20253d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20263d0407baSopenharmony_ci 20273d0407baSopenharmony_ci /* 20283d0407baSopenharmony_ci * The bits in these registers have an inverse ordering 20293d0407baSopenharmony_ci * with the lowest pin being in bits 15:14 and the highest 20303d0407baSopenharmony_ci * pin in bits 1:0 20313d0407baSopenharmony_ci */ 20323d0407baSopenharmony_ci *bit = PINCTRL_ROCKCHIP_SEVEN - (pin_num % RK3188_PULL_PINS_PER_REG); 20333d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 20343d0407baSopenharmony_ci } 20353d0407baSopenharmony_ci} 20363d0407baSopenharmony_ci 20373d0407baSopenharmony_ci#define RK3288_PULL_OFFSET 0x140 20383d0407baSopenharmony_cistatic void rk3288_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 20393d0407baSopenharmony_ci u8 *bit) 20403d0407baSopenharmony_ci{ 20413d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 20423d0407baSopenharmony_ci 20433d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 20443d0407baSopenharmony_ci if (bank->bank_num == 0) { 20453d0407baSopenharmony_ci *regmap = info->regmap_pmu; 20463d0407baSopenharmony_ci *reg = RK3188_PULL_PMU_OFFSET; 20473d0407baSopenharmony_ci 20483d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20493d0407baSopenharmony_ci *bit = pin_num % RK3188_PULL_PINS_PER_REG; 20503d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 20513d0407baSopenharmony_ci } else { 20523d0407baSopenharmony_ci *regmap = info->regmap_base; 20533d0407baSopenharmony_ci *reg = RK3288_PULL_OFFSET; 20543d0407baSopenharmony_ci 20553d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 20563d0407baSopenharmony_ci *reg -= 0x10; 20573d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 20583d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20593d0407baSopenharmony_ci 20603d0407baSopenharmony_ci *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 20613d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 20623d0407baSopenharmony_ci } 20633d0407baSopenharmony_ci} 20643d0407baSopenharmony_ci 20653d0407baSopenharmony_ci#define RK3288_DRV_PMU_OFFSET 0x70 20663d0407baSopenharmony_ci#define RK3288_DRV_GRF_OFFSET 0x1c0 20673d0407baSopenharmony_ci#define RK3288_DRV_BITS_PER_PIN 2 20683d0407baSopenharmony_ci#define RK3288_DRV_PINS_PER_REG 8 20693d0407baSopenharmony_ci#define RK3288_DRV_BANK_STRIDE 16 20703d0407baSopenharmony_ci 20713d0407baSopenharmony_cistatic void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 20723d0407baSopenharmony_ci u8 *bit) 20733d0407baSopenharmony_ci{ 20743d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 20753d0407baSopenharmony_ci 20763d0407baSopenharmony_ci /* The first 24 pins of the first bank are located in PMU */ 20773d0407baSopenharmony_ci if (bank->bank_num == 0) { 20783d0407baSopenharmony_ci *regmap = info->regmap_pmu; 20793d0407baSopenharmony_ci *reg = RK3288_DRV_PMU_OFFSET; 20803d0407baSopenharmony_ci 20813d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20823d0407baSopenharmony_ci *bit = pin_num % RK3288_DRV_PINS_PER_REG; 20833d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 20843d0407baSopenharmony_ci } else { 20853d0407baSopenharmony_ci *regmap = info->regmap_base; 20863d0407baSopenharmony_ci *reg = RK3288_DRV_GRF_OFFSET; 20873d0407baSopenharmony_ci 20883d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 20893d0407baSopenharmony_ci *reg -= 0x10; 20903d0407baSopenharmony_ci *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 20913d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 20923d0407baSopenharmony_ci 20933d0407baSopenharmony_ci *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 20943d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 20953d0407baSopenharmony_ci } 20963d0407baSopenharmony_ci} 20973d0407baSopenharmony_ci 20983d0407baSopenharmony_ci#define RK3228_PULL_OFFSET 0x100 20993d0407baSopenharmony_ci 21003d0407baSopenharmony_cistatic void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21013d0407baSopenharmony_ci u8 *bit) 21023d0407baSopenharmony_ci{ 21033d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21043d0407baSopenharmony_ci 21053d0407baSopenharmony_ci *regmap = info->regmap_base; 21063d0407baSopenharmony_ci *reg = RK3228_PULL_OFFSET; 21073d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 21083d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21093d0407baSopenharmony_ci 21103d0407baSopenharmony_ci *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 21113d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 21123d0407baSopenharmony_ci} 21133d0407baSopenharmony_ci 21143d0407baSopenharmony_ci#define RK3228_DRV_GRF_OFFSET 0x200 21153d0407baSopenharmony_ci 21163d0407baSopenharmony_cistatic void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21173d0407baSopenharmony_ci u8 *bit) 21183d0407baSopenharmony_ci{ 21193d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21203d0407baSopenharmony_ci 21213d0407baSopenharmony_ci *regmap = info->regmap_base; 21223d0407baSopenharmony_ci *reg = RK3228_DRV_GRF_OFFSET; 21233d0407baSopenharmony_ci *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 21243d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21253d0407baSopenharmony_ci 21263d0407baSopenharmony_ci *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 21273d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 21283d0407baSopenharmony_ci} 21293d0407baSopenharmony_ci 21303d0407baSopenharmony_ci#define RK3308_PULL_OFFSET 0xa0 21313d0407baSopenharmony_ci 21323d0407baSopenharmony_cistatic void rk3308_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21333d0407baSopenharmony_ci u8 *bit) 21343d0407baSopenharmony_ci{ 21353d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21363d0407baSopenharmony_ci 21373d0407baSopenharmony_ci *regmap = info->regmap_base; 21383d0407baSopenharmony_ci *reg = RK3308_PULL_OFFSET; 21393d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 21403d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21413d0407baSopenharmony_ci 21423d0407baSopenharmony_ci *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 21433d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 21443d0407baSopenharmony_ci} 21453d0407baSopenharmony_ci 21463d0407baSopenharmony_ci#define RK3308_DRV_GRF_OFFSET 0x100 21473d0407baSopenharmony_ci 21483d0407baSopenharmony_cistatic void rk3308_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21493d0407baSopenharmony_ci u8 *bit) 21503d0407baSopenharmony_ci{ 21513d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21523d0407baSopenharmony_ci 21533d0407baSopenharmony_ci *regmap = info->regmap_base; 21543d0407baSopenharmony_ci *reg = RK3308_DRV_GRF_OFFSET; 21553d0407baSopenharmony_ci *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 21563d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21573d0407baSopenharmony_ci 21583d0407baSopenharmony_ci *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 21593d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 21603d0407baSopenharmony_ci} 21613d0407baSopenharmony_ci 21623d0407baSopenharmony_ci#define RK3368_PULL_GRF_OFFSET 0x100 21633d0407baSopenharmony_ci#define RK3368_PULL_PMU_OFFSET 0x10 21643d0407baSopenharmony_ci 21653d0407baSopenharmony_cistatic void rk3368_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21663d0407baSopenharmony_ci u8 *bit) 21673d0407baSopenharmony_ci{ 21683d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21693d0407baSopenharmony_ci 21703d0407baSopenharmony_ci /* The first 32 pins of the first bank are located in PMU */ 21713d0407baSopenharmony_ci if (bank->bank_num == 0) { 21723d0407baSopenharmony_ci *regmap = info->regmap_pmu; 21733d0407baSopenharmony_ci *reg = RK3368_PULL_PMU_OFFSET; 21743d0407baSopenharmony_ci 21753d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21763d0407baSopenharmony_ci *bit = pin_num % RK3188_PULL_PINS_PER_REG; 21773d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 21783d0407baSopenharmony_ci } else { 21793d0407baSopenharmony_ci *regmap = info->regmap_base; 21803d0407baSopenharmony_ci *reg = RK3368_PULL_GRF_OFFSET; 21813d0407baSopenharmony_ci 21823d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 21833d0407baSopenharmony_ci *reg -= 0x10; 21843d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 21853d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 21863d0407baSopenharmony_ci 21873d0407baSopenharmony_ci *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 21883d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 21893d0407baSopenharmony_ci } 21903d0407baSopenharmony_ci} 21913d0407baSopenharmony_ci 21923d0407baSopenharmony_ci#define RK3368_DRV_PMU_OFFSET 0x20 21933d0407baSopenharmony_ci#define RK3368_DRV_GRF_OFFSET 0x200 21943d0407baSopenharmony_ci 21953d0407baSopenharmony_cistatic void rk3368_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 21963d0407baSopenharmony_ci u8 *bit) 21973d0407baSopenharmony_ci{ 21983d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 21993d0407baSopenharmony_ci 22003d0407baSopenharmony_ci /* The first 32 pins of the first bank are located in PMU */ 22013d0407baSopenharmony_ci if (bank->bank_num == 0) { 22023d0407baSopenharmony_ci *regmap = info->regmap_pmu; 22033d0407baSopenharmony_ci *reg = RK3368_DRV_PMU_OFFSET; 22043d0407baSopenharmony_ci 22053d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 22063d0407baSopenharmony_ci *bit = pin_num % RK3288_DRV_PINS_PER_REG; 22073d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 22083d0407baSopenharmony_ci } else { 22093d0407baSopenharmony_ci *regmap = info->regmap_base; 22103d0407baSopenharmony_ci *reg = RK3368_DRV_GRF_OFFSET; 22113d0407baSopenharmony_ci 22123d0407baSopenharmony_ci /* correct the offset, as we're starting with the 2nd bank */ 22133d0407baSopenharmony_ci *reg -= 0x10; 22143d0407baSopenharmony_ci *reg += bank->bank_num * RK3288_DRV_BANK_STRIDE; 22153d0407baSopenharmony_ci *reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 22163d0407baSopenharmony_ci 22173d0407baSopenharmony_ci *bit = (pin_num % RK3288_DRV_PINS_PER_REG); 22183d0407baSopenharmony_ci *bit *= RK3288_DRV_BITS_PER_PIN; 22193d0407baSopenharmony_ci } 22203d0407baSopenharmony_ci} 22213d0407baSopenharmony_ci 22223d0407baSopenharmony_ci#define RK3399_PULL_GRF_OFFSET 0xe040 22233d0407baSopenharmony_ci#define RK3399_PULL_PMU_OFFSET 0x40 22243d0407baSopenharmony_ci#define RK3399_DRV_3BITS_PER_PIN 3 22253d0407baSopenharmony_ci 22263d0407baSopenharmony_cistatic void rk3399_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 22273d0407baSopenharmony_ci u8 *bit) 22283d0407baSopenharmony_ci{ 22293d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 22303d0407baSopenharmony_ci 22313d0407baSopenharmony_ci /* The bank0:16 and bank1:32 pins are located in PMU */ 22323d0407baSopenharmony_ci if ((bank->bank_num == 0) || (bank->bank_num == PINCTRL_ROCKCHIP_ONE)) { 22333d0407baSopenharmony_ci *regmap = info->regmap_pmu; 22343d0407baSopenharmony_ci *reg = RK3399_PULL_PMU_OFFSET; 22353d0407baSopenharmony_ci 22363d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 22373d0407baSopenharmony_ci 22383d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 22393d0407baSopenharmony_ci *bit = pin_num % RK3188_PULL_PINS_PER_REG; 22403d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 22413d0407baSopenharmony_ci } else { 22423d0407baSopenharmony_ci *regmap = info->regmap_base; 22433d0407baSopenharmony_ci *reg = RK3399_PULL_GRF_OFFSET; 22443d0407baSopenharmony_ci 22453d0407baSopenharmony_ci /* correct the offset, as we're starting with the 3rd bank */ 22463d0407baSopenharmony_ci *reg -= 0x20; 22473d0407baSopenharmony_ci *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 22483d0407baSopenharmony_ci *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 22493d0407baSopenharmony_ci 22503d0407baSopenharmony_ci *bit = (pin_num % RK3188_PULL_PINS_PER_REG); 22513d0407baSopenharmony_ci *bit *= RK3188_PULL_BITS_PER_PIN; 22523d0407baSopenharmony_ci } 22533d0407baSopenharmony_ci} 22543d0407baSopenharmony_ci 22553d0407baSopenharmony_cistatic void rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 22563d0407baSopenharmony_ci u8 *bit) 22573d0407baSopenharmony_ci{ 22583d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 22593d0407baSopenharmony_ci int drv_num = (pin_num / 8); 22603d0407baSopenharmony_ci 22613d0407baSopenharmony_ci /* The bank0:16 and bank1:32 pins are located in PMU */ 22623d0407baSopenharmony_ci if ((bank->bank_num == 0) || (bank->bank_num == PINCTRL_ROCKCHIP_ONE)) { 22633d0407baSopenharmony_ci *regmap = info->regmap_pmu; 22643d0407baSopenharmony_ci } else { 22653d0407baSopenharmony_ci *regmap = info->regmap_base; 22663d0407baSopenharmony_ci } 22673d0407baSopenharmony_ci 22683d0407baSopenharmony_ci *reg = bank->drv[drv_num].offset; 22693d0407baSopenharmony_ci if ((bank->drv[drv_num].drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || 22703d0407baSopenharmony_ci (bank->drv[drv_num].drv_type == DRV_TYPE_IO_3V3_ONLY)) { 22713d0407baSopenharmony_ci *bit = (pin_num % 0x8) * PINCTRL_ROCKCHIP_THREE; 22723d0407baSopenharmony_ci } else { 22733d0407baSopenharmony_ci *bit = (pin_num % 0x8) * 0x2; 22743d0407baSopenharmony_ci } 22753d0407baSopenharmony_ci} 22763d0407baSopenharmony_ci 22773d0407baSopenharmony_ci#define RK3568_SR_PMU_OFFSET 0x60 22783d0407baSopenharmony_ci#define RK3568_SR_GRF_OFFSET 0x0180 22793d0407baSopenharmony_ci#define RK3568_SR_BANK_STRIDE 0x10 22803d0407baSopenharmony_ci#define RK3568_SR_PINS_PER_REG 16 22813d0407baSopenharmony_ci 22823d0407baSopenharmony_cistatic int rk3568_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 22833d0407baSopenharmony_ci int *reg, u8 *bit) 22843d0407baSopenharmony_ci{ 22853d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 22863d0407baSopenharmony_ci 22873d0407baSopenharmony_ci if (bank->bank_num == 0) { 22883d0407baSopenharmony_ci *regmap = info->regmap_pmu; 22893d0407baSopenharmony_ci *reg = RK3568_SR_PMU_OFFSET; 22903d0407baSopenharmony_ci } else { 22913d0407baSopenharmony_ci *regmap = info->regmap_base; 22923d0407baSopenharmony_ci *reg = RK3568_SR_GRF_OFFSET; 22933d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK3568_SR_BANK_STRIDE; 22943d0407baSopenharmony_ci } 22953d0407baSopenharmony_ci *reg += ((pin_num / RK3568_SR_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 22963d0407baSopenharmony_ci *bit = pin_num % RK3568_SR_PINS_PER_REG; 22973d0407baSopenharmony_ci 22983d0407baSopenharmony_ci return 0; 22993d0407baSopenharmony_ci} 23003d0407baSopenharmony_ci 23013d0407baSopenharmony_ci#define RK3568_PULL_PMU_OFFSET 0x20 23023d0407baSopenharmony_ci#define RK3568_PULL_GRF_OFFSET 0x80 23033d0407baSopenharmony_ci#define RK3568_PULL_BITS_PER_PIN 2 23043d0407baSopenharmony_ci#define RK3568_PULL_PINS_PER_REG 8 23053d0407baSopenharmony_ci#define RK3568_PULL_BANK_STRIDE 0x10 23063d0407baSopenharmony_ci 23073d0407baSopenharmony_cistatic void rk3568_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 23083d0407baSopenharmony_ci u8 *bit) 23093d0407baSopenharmony_ci{ 23103d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 23113d0407baSopenharmony_ci 23123d0407baSopenharmony_ci if (bank->bank_num == 0) { 23133d0407baSopenharmony_ci *regmap = info->regmap_pmu; 23143d0407baSopenharmony_ci *reg = RK3568_PULL_PMU_OFFSET; 23153d0407baSopenharmony_ci *reg += bank->bank_num * RK3568_PULL_BANK_STRIDE; 23163d0407baSopenharmony_ci *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 23173d0407baSopenharmony_ci 23183d0407baSopenharmony_ci *bit = pin_num % RK3568_PULL_PINS_PER_REG; 23193d0407baSopenharmony_ci *bit *= RK3568_PULL_BITS_PER_PIN; 23203d0407baSopenharmony_ci } else { 23213d0407baSopenharmony_ci *regmap = info->regmap_base; 23223d0407baSopenharmony_ci *reg = RK3568_PULL_GRF_OFFSET; 23233d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK3568_PULL_BANK_STRIDE; 23243d0407baSopenharmony_ci *reg += ((pin_num / RK3568_PULL_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 23253d0407baSopenharmony_ci 23263d0407baSopenharmony_ci *bit = (pin_num % RK3568_PULL_PINS_PER_REG); 23273d0407baSopenharmony_ci *bit *= RK3568_PULL_BITS_PER_PIN; 23283d0407baSopenharmony_ci } 23293d0407baSopenharmony_ci} 23303d0407baSopenharmony_ci 23313d0407baSopenharmony_ci#define RK3568_DRV_PMU_OFFSET 0x70 23323d0407baSopenharmony_ci#define RK3568_DRV_GRF_OFFSET 0x200 23333d0407baSopenharmony_ci#define RK3568_DRV_BITS_PER_PIN 8 23343d0407baSopenharmony_ci#define RK3568_DRV_PINS_PER_REG 2 23353d0407baSopenharmony_ci#define RK3568_DRV_BANK_STRIDE 0x40 23363d0407baSopenharmony_ci 23373d0407baSopenharmony_cistatic void rk3568_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, 23383d0407baSopenharmony_ci u8 *bit) 23393d0407baSopenharmony_ci{ 23403d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 23413d0407baSopenharmony_ci 23423d0407baSopenharmony_ci /* The first 32 pins of the first bank are located in PMU */ 23433d0407baSopenharmony_ci if (bank->bank_num == 0) { 23443d0407baSopenharmony_ci *regmap = info->regmap_pmu; 23453d0407baSopenharmony_ci *reg = RK3568_DRV_PMU_OFFSET; 23463d0407baSopenharmony_ci *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 23473d0407baSopenharmony_ci 23483d0407baSopenharmony_ci *bit = pin_num % RK3568_DRV_PINS_PER_REG; 23493d0407baSopenharmony_ci *bit *= RK3568_DRV_BITS_PER_PIN; 23503d0407baSopenharmony_ci } else { 23513d0407baSopenharmony_ci *regmap = info->regmap_base; 23523d0407baSopenharmony_ci *reg = RK3568_DRV_GRF_OFFSET; 23533d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK3568_DRV_BANK_STRIDE; 23543d0407baSopenharmony_ci *reg += ((pin_num / RK3568_DRV_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 23553d0407baSopenharmony_ci 23563d0407baSopenharmony_ci *bit = (pin_num % RK3568_DRV_PINS_PER_REG); 23573d0407baSopenharmony_ci *bit *= RK3568_DRV_BITS_PER_PIN; 23583d0407baSopenharmony_ci } 23593d0407baSopenharmony_ci 23603d0407baSopenharmony_ci if (rockchip_get_cpu_version() == 0) { 23613d0407baSopenharmony_ci if ((bank->bank_num == 1 && (pin_num == PINCTRL_ROCKCHIP_FIFTEEN || pin_num == PINCTRL_ROCKCHIP_TWENTYTHREE || 23623d0407baSopenharmony_ci pin_num == PINCTRL_ROCKCHIP_THIRTYONE)) || 23633d0407baSopenharmony_ci ((bank->bank_num == PINCTRL_ROCKCHIP_TWO || bank->bank_num == PINCTRL_ROCKCHIP_THREE || 23643d0407baSopenharmony_ci bank->bank_num == PINCTRL_ROCKCHIP_FOUR) && 23653d0407baSopenharmony_ci (pin_num == PINCTRL_ROCKCHIP_SEVEN || pin_num == PINCTRL_ROCKCHIP_FIFTEEN || 23663d0407baSopenharmony_ci pin_num == PINCTRL_ROCKCHIP_TWENTYTHREE || pin_num == PINCTRL_ROCKCHIP_THIRTYONE))) { 23673d0407baSopenharmony_ci *bit -= RK3568_DRV_BITS_PER_PIN; 23683d0407baSopenharmony_ci } 23693d0407baSopenharmony_ci } 23703d0407baSopenharmony_ci} 23713d0407baSopenharmony_ci 23723d0407baSopenharmony_cistatic int rockchip_perpin_drv_list[DRV_TYPE_MAX][PINCTRL_ROCKCHIP_EIGHT] = { 23733d0407baSopenharmony_ci {PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_TWELVE, -1, -1, -1, -1}, 23743d0407baSopenharmony_ci {PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_NINE, PINCTRL_ROCKCHIP_TWELVE, -1, -1, -1, -1}, 23753d0407baSopenharmony_ci {PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_FIFTEEN, PINCTRL_ROCKCHIP_TWENTY, -1, -1, -1, -1}, 23763d0407baSopenharmony_ci {PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_TWELVE, 23773d0407baSopenharmony_ci PINCTRL_ROCKCHIP_FOURTEEN, PINCTRL_ROCKCHIP_SIXTEEN, PINCTRL_ROCKCHIP_EIGHTEEN}, 23783d0407baSopenharmony_ci {PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_SEVEN, PINCTRL_ROCKCHIP_TEN, PINCTRL_ROCKCHIP_THIRTEEN, 23793d0407baSopenharmony_ci PINCTRL_ROCKCHIP_SIXTEEN, PINCTRL_ROCKCHIP_NINTEEN, PINCTRL_ROCKCHIP_TWENTYTWO, PINCTRL_ROCKCHIP_TWENTYSIX}}; 23803d0407baSopenharmony_ci 23813d0407baSopenharmony_cistatic int rockchip_get_drive_perpin(struct rockchip_pin_bank *bank, int pin_num) 23823d0407baSopenharmony_ci{ 23833d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 23843d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 23853d0407baSopenharmony_ci struct regmap *regmap; 23863d0407baSopenharmony_ci int reg, ret; 23873d0407baSopenharmony_ci u32 data, temp, rmask_bits; 23883d0407baSopenharmony_ci u8 bit; 23893d0407baSopenharmony_ci int drv_type = bank->drv[pin_num / 8].drv_type; 23903d0407baSopenharmony_ci 23913d0407baSopenharmony_ci ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 23923d0407baSopenharmony_ci 23933d0407baSopenharmony_ci switch (drv_type) { 23943d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_3V0_AUTO: 23953d0407baSopenharmony_ci case DRV_TYPE_IO_3V3_ONLY: 23963d0407baSopenharmony_ci rmask_bits = RK3399_DRV_3BITS_PER_PIN; 23973d0407baSopenharmony_ci switch (bit) { 23983d0407baSopenharmony_ci case 0 ... PINCTRL_ROCKCHIP_TWELVE: 23993d0407baSopenharmony_ci /* regular case, nothing to do */ 24003d0407baSopenharmony_ci break; 24013d0407baSopenharmony_ci case PINCTRL_ROCKCHIP_FIFTEEN: 24023d0407baSopenharmony_ci /* 24033d0407baSopenharmony_ci * drive-strength offset is special, as it is 24043d0407baSopenharmony_ci * spread over 2 registers 24053d0407baSopenharmony_ci */ 24063d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 24073d0407baSopenharmony_ci if (ret) { 24083d0407baSopenharmony_ci return ret; 24093d0407baSopenharmony_ci } 24103d0407baSopenharmony_ci 24113d0407baSopenharmony_ci ret = regmap_read(regmap, reg + 0x4, &temp); 24123d0407baSopenharmony_ci if (ret) { 24133d0407baSopenharmony_ci return ret; 24143d0407baSopenharmony_ci } 24153d0407baSopenharmony_ci 24163d0407baSopenharmony_ci /* 24173d0407baSopenharmony_ci * the bit data[15] contains bit 0 of the value 24183d0407baSopenharmony_ci * while temp[1:0] contains bits 2 and 1 24193d0407baSopenharmony_ci */ 24203d0407baSopenharmony_ci data >>= PINCTRL_ROCKCHIP_FIFTEEN; 24213d0407baSopenharmony_ci temp &= 0x3; 24223d0407baSopenharmony_ci temp <<= PINCTRL_ROCKCHIP_ONE; 24233d0407baSopenharmony_ci data |= temp; 24243d0407baSopenharmony_ci 24253d0407baSopenharmony_ci return rockchip_perpin_drv_list[drv_type][data]; 24263d0407baSopenharmony_ci case PINCTRL_ROCKCHIP_EIGHTEEN ... PINCTRL_ROCKCHIP_TWENTYONE: 24273d0407baSopenharmony_ci /* setting fully enclosed in the second register */ 24283d0407baSopenharmony_ci reg += PINCTRL_ROCKCHIP_FOUR; 24293d0407baSopenharmony_ci bit -= PINCTRL_ROCKCHIP_SIXTEEN; 24303d0407baSopenharmony_ci break; 24313d0407baSopenharmony_ci default: 24323d0407baSopenharmony_ci dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n", bit, drv_type); 24333d0407baSopenharmony_ci return -EINVAL; 24343d0407baSopenharmony_ci } 24353d0407baSopenharmony_ci 24363d0407baSopenharmony_ci break; 24373d0407baSopenharmony_ci case DRV_TYPE_IO_DEFAULT: 24383d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_OR_3V0: 24393d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_ONLY: 24403d0407baSopenharmony_ci rmask_bits = RK3288_DRV_BITS_PER_PIN; 24413d0407baSopenharmony_ci break; 24423d0407baSopenharmony_ci default: 24433d0407baSopenharmony_ci dev_err(info->dev, "unsupported pinctrl drive type: %d\n", drv_type); 24443d0407baSopenharmony_ci return -EINVAL; 24453d0407baSopenharmony_ci } 24463d0407baSopenharmony_ci 24473d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 24483d0407baSopenharmony_ci if (ret) { 24493d0407baSopenharmony_ci return ret; 24503d0407baSopenharmony_ci } 24513d0407baSopenharmony_ci 24523d0407baSopenharmony_ci data >>= bit; 24533d0407baSopenharmony_ci data &= (PINCTRL_ROCKCHIP_ONE << rmask_bits) - PINCTRL_ROCKCHIP_ONE; 24543d0407baSopenharmony_ci 24553d0407baSopenharmony_ci return rockchip_perpin_drv_list[drv_type][data]; 24563d0407baSopenharmony_ci} 24573d0407baSopenharmony_ci 24583d0407baSopenharmony_cistatic int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank, int pin_num, int strength) 24593d0407baSopenharmony_ci{ 24603d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 24613d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 24623d0407baSopenharmony_ci struct regmap *regmap; 24633d0407baSopenharmony_ci int reg, ret, i; 24643d0407baSopenharmony_ci u32 data, rmask, rmask_bits, temp; 24653d0407baSopenharmony_ci u8 bit; 24663d0407baSopenharmony_ci int drv_type = bank->drv[pin_num / 8].drv_type; 24673d0407baSopenharmony_ci 24683d0407baSopenharmony_ci dev_dbg(info->dev, "setting drive of GPIO%d-%d to %d\n", bank->bank_num, pin_num, strength); 24693d0407baSopenharmony_ci 24703d0407baSopenharmony_ci ctrl->drv_calc_reg(bank, pin_num, ®map, ®, &bit); 24713d0407baSopenharmony_ci if (ctrl->type == RV1126) { 24723d0407baSopenharmony_ci rmask_bits = RV1126_DRV_BITS_PER_PIN; 24733d0407baSopenharmony_ci ret = strength; 24743d0407baSopenharmony_ci goto config; 24753d0407baSopenharmony_ci } else if (ctrl->type == RK3568) { 24763d0407baSopenharmony_ci rmask_bits = RK3568_DRV_BITS_PER_PIN; 24773d0407baSopenharmony_ci ret = (PINCTRL_ROCKCHIP_ONE << (strength + PINCTRL_ROCKCHIP_ONE)) - PINCTRL_ROCKCHIP_ONE; 24783d0407baSopenharmony_ci goto config; 24793d0407baSopenharmony_ci } 24803d0407baSopenharmony_ci 24813d0407baSopenharmony_ci ret = -EINVAL; 24823d0407baSopenharmony_ci for (i = 0; i < ARRAY_SIZE(rockchip_perpin_drv_list[drv_type]); i++) { 24833d0407baSopenharmony_ci if (rockchip_perpin_drv_list[drv_type][i] == strength) { 24843d0407baSopenharmony_ci ret = i; 24853d0407baSopenharmony_ci break; 24863d0407baSopenharmony_ci } else if (rockchip_perpin_drv_list[drv_type][i] < 0) { 24873d0407baSopenharmony_ci ret = rockchip_perpin_drv_list[drv_type][i]; 24883d0407baSopenharmony_ci break; 24893d0407baSopenharmony_ci } 24903d0407baSopenharmony_ci } 24913d0407baSopenharmony_ci 24923d0407baSopenharmony_ci if (ret < 0) { 24933d0407baSopenharmony_ci dev_err(info->dev, "unsupported driver strength %d\n", strength); 24943d0407baSopenharmony_ci return ret; 24953d0407baSopenharmony_ci } 24963d0407baSopenharmony_ci 24973d0407baSopenharmony_ci switch (drv_type) { 24983d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_3V0_AUTO: 24993d0407baSopenharmony_ci case DRV_TYPE_IO_3V3_ONLY: 25003d0407baSopenharmony_ci rmask_bits = RK3399_DRV_3BITS_PER_PIN; 25013d0407baSopenharmony_ci switch (bit) { 25023d0407baSopenharmony_ci case 0 ... PINCTRL_ROCKCHIP_TWELVE: 25033d0407baSopenharmony_ci /* regular case, nothing to do */ 25043d0407baSopenharmony_ci break; 25053d0407baSopenharmony_ci case PINCTRL_ROCKCHIP_FIFTEEN: 25063d0407baSopenharmony_ci /* 25073d0407baSopenharmony_ci * drive-strength offset is special, as it is spread 25083d0407baSopenharmony_ci * over 2 registers, the bit data[15] contains bit 0 25093d0407baSopenharmony_ci * of the value while temp[1:0] contains bits 2 and 1 25103d0407baSopenharmony_ci */ 25113d0407baSopenharmony_ci data = (ret & 0x1) << PINCTRL_ROCKCHIP_FIFTEEN; 25123d0407baSopenharmony_ci temp = (ret >> 0x1) & 0x3; 25133d0407baSopenharmony_ci 25143d0407baSopenharmony_ci rmask = BIT(PINCTRL_ROCKCHIP_FIFTEEN) | BIT(PINCTRL_ROCKCHIP_THIRTYONE); 25153d0407baSopenharmony_ci data |= BIT(PINCTRL_ROCKCHIP_THIRTYONE); 25163d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, data); 25173d0407baSopenharmony_ci if (ret) { 25183d0407baSopenharmony_ci return ret; 25193d0407baSopenharmony_ci } 25203d0407baSopenharmony_ci 25213d0407baSopenharmony_ci rmask = 0x3 | (0x3 << PINCTRL_ROCKCHIP_SIXTEEN); 25223d0407baSopenharmony_ci temp |= (0x3 << PINCTRL_ROCKCHIP_SIXTEEN); 25233d0407baSopenharmony_ci reg += 0x4; 25243d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, temp); 25253d0407baSopenharmony_ci 25263d0407baSopenharmony_ci return ret; 25273d0407baSopenharmony_ci case PINCTRL_ROCKCHIP_EIGHTEEN ... PINCTRL_ROCKCHIP_TWENTYONE: 25283d0407baSopenharmony_ci /* setting fully enclosed in the second register */ 25293d0407baSopenharmony_ci reg += PINCTRL_ROCKCHIP_FOUR; 25303d0407baSopenharmony_ci bit -= PINCTRL_ROCKCHIP_SIXTEEN; 25313d0407baSopenharmony_ci break; 25323d0407baSopenharmony_ci default: 25333d0407baSopenharmony_ci dev_err(info->dev, "unsupported bit: %d for pinctrl drive type: %d\n", bit, drv_type); 25343d0407baSopenharmony_ci return -EINVAL; 25353d0407baSopenharmony_ci } 25363d0407baSopenharmony_ci break; 25373d0407baSopenharmony_ci case DRV_TYPE_IO_DEFAULT: 25383d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_OR_3V0: 25393d0407baSopenharmony_ci case DRV_TYPE_IO_1V8_ONLY: 25403d0407baSopenharmony_ci rmask_bits = RK3288_DRV_BITS_PER_PIN; 25413d0407baSopenharmony_ci break; 25423d0407baSopenharmony_ci default: 25433d0407baSopenharmony_ci dev_err(info->dev, "unsupported pinctrl drive type: %d\n", drv_type); 25443d0407baSopenharmony_ci return -EINVAL; 25453d0407baSopenharmony_ci } 25463d0407baSopenharmony_ci 25473d0407baSopenharmony_ciconfig: 25483d0407baSopenharmony_ci /* enable the write to the equivalent lower bits */ 25493d0407baSopenharmony_ci data = ((PINCTRL_ROCKCHIP_ONE << rmask_bits) - PINCTRL_ROCKCHIP_ONE) << (bit + PINCTRL_ROCKCHIP_SIXTEEN); 25503d0407baSopenharmony_ci rmask = data | (data >> PINCTRL_ROCKCHIP_SIXTEEN); 25513d0407baSopenharmony_ci data |= (ret << bit); 25523d0407baSopenharmony_ci 25533d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, data); 25543d0407baSopenharmony_ci if (ret) { 25553d0407baSopenharmony_ci return ret; 25563d0407baSopenharmony_ci } 25573d0407baSopenharmony_ci 25583d0407baSopenharmony_ci if (ctrl->type == RK3568 && rockchip_get_cpu_version() == 0) { 25593d0407baSopenharmony_ci if (bank->bank_num == 1 && pin_num == PINCTRL_ROCKCHIP_TWENTYONE) { 25603d0407baSopenharmony_ci reg = 0x0840; 25613d0407baSopenharmony_ci } else if (bank->bank_num == PINCTRL_ROCKCHIP_TWO && pin_num == PINCTRL_ROCKCHIP_TWO) { 25623d0407baSopenharmony_ci reg = 0x0844; 25633d0407baSopenharmony_ci } else if (bank->bank_num == PINCTRL_ROCKCHIP_TWO && pin_num == PINCTRL_ROCKCHIP_EIGHT) { 25643d0407baSopenharmony_ci reg = 0x0848; 25653d0407baSopenharmony_ci } else if (bank->bank_num == PINCTRL_ROCKCHIP_THREE && pin_num == 0) { 25663d0407baSopenharmony_ci reg = 0x084c; 25673d0407baSopenharmony_ci } else if (bank->bank_num == PINCTRL_ROCKCHIP_THREE && pin_num == PINCTRL_ROCKCHIP_SIX) { 25683d0407baSopenharmony_ci reg = 0x0850; 25693d0407baSopenharmony_ci } else if (bank->bank_num == PINCTRL_ROCKCHIP_FOUR && pin_num == 0) { 25703d0407baSopenharmony_ci reg = 0x0854; 25713d0407baSopenharmony_ci } else { 25723d0407baSopenharmony_ci return 0; 25733d0407baSopenharmony_ci } 25743d0407baSopenharmony_ci 25753d0407baSopenharmony_ci data = ((PINCTRL_ROCKCHIP_ONE << rmask_bits) - PINCTRL_ROCKCHIP_ONE) << PINCTRL_ROCKCHIP_SIXTEEN; 25763d0407baSopenharmony_ci rmask = data | (data >> PINCTRL_ROCKCHIP_SIXTEEN); 25773d0407baSopenharmony_ci data |= (PINCTRL_ROCKCHIP_ONE << (strength + PINCTRL_ROCKCHIP_ONE)) - PINCTRL_ROCKCHIP_ONE; 25783d0407baSopenharmony_ci 25793d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, data); 25803d0407baSopenharmony_ci if (ret) { 25813d0407baSopenharmony_ci return ret; 25823d0407baSopenharmony_ci } 25833d0407baSopenharmony_ci } 25843d0407baSopenharmony_ci 25853d0407baSopenharmony_ci return 0; 25863d0407baSopenharmony_ci} 25873d0407baSopenharmony_ci 25883d0407baSopenharmony_cistatic int rockchip_pull_list[PULL_TYPE_MAX][PINCTRL_ROCKCHIP_FOUR] = { 25893d0407baSopenharmony_ci {PIN_CONFIG_BIAS_DISABLE, PIN_CONFIG_BIAS_PULL_UP, PIN_CONFIG_BIAS_PULL_DOWN, PIN_CONFIG_BIAS_BUS_HOLD}, 25903d0407baSopenharmony_ci {PIN_CONFIG_BIAS_DISABLE, PIN_CONFIG_BIAS_PULL_DOWN, PIN_CONFIG_BIAS_DISABLE, PIN_CONFIG_BIAS_PULL_UP}, 25913d0407baSopenharmony_ci}; 25923d0407baSopenharmony_ci 25933d0407baSopenharmony_cistatic int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num) 25943d0407baSopenharmony_ci{ 25953d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 25963d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 25973d0407baSopenharmony_ci struct regmap *regmap; 25983d0407baSopenharmony_ci int reg, ret, pull_type; 25993d0407baSopenharmony_ci u8 bit; 26003d0407baSopenharmony_ci u32 data; 26013d0407baSopenharmony_ci 26023d0407baSopenharmony_ci /* rk3066b does support any pulls */ 26033d0407baSopenharmony_ci if (ctrl->type == RK3066B) { 26043d0407baSopenharmony_ci return PIN_CONFIG_BIAS_DISABLE; 26053d0407baSopenharmony_ci } 26063d0407baSopenharmony_ci 26073d0407baSopenharmony_ci ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 26083d0407baSopenharmony_ci 26093d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 26103d0407baSopenharmony_ci if (ret) { 26113d0407baSopenharmony_ci return ret; 26123d0407baSopenharmony_ci } 26133d0407baSopenharmony_ci 26143d0407baSopenharmony_ci switch (ctrl->type) { 26153d0407baSopenharmony_ci case RK2928: 26163d0407baSopenharmony_ci case RK3128: 26173d0407baSopenharmony_ci return !(data & BIT(bit)) ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT : PIN_CONFIG_BIAS_DISABLE; 26183d0407baSopenharmony_ci case PX30: 26193d0407baSopenharmony_ci case RV1108: 26203d0407baSopenharmony_ci case RV1126: 26213d0407baSopenharmony_ci case RK1808: 26223d0407baSopenharmony_ci case RK3188: 26233d0407baSopenharmony_ci case RK3288: 26243d0407baSopenharmony_ci case RK3308: 26253d0407baSopenharmony_ci case RK3368: 26263d0407baSopenharmony_ci case RK3399: 26273d0407baSopenharmony_ci case RK3568: 26283d0407baSopenharmony_ci pull_type = bank->pull_type[pin_num / 0x8]; 26293d0407baSopenharmony_ci data >>= bit; 26303d0407baSopenharmony_ci data &= (PINCTRL_ROCKCHIP_ONE << RK3188_PULL_BITS_PER_PIN) - PINCTRL_ROCKCHIP_ONE; 26313d0407baSopenharmony_ci 26323d0407baSopenharmony_ci return rockchip_pull_list[pull_type][data]; 26333d0407baSopenharmony_ci default: 26343d0407baSopenharmony_ci dev_err(info->dev, "unsupported pinctrl type\n"); 26353d0407baSopenharmony_ci return -EINVAL; 26363d0407baSopenharmony_ci }; 26373d0407baSopenharmony_ci} 26383d0407baSopenharmony_ci 26393d0407baSopenharmony_cistatic int rockchip_set_pull(struct rockchip_pin_bank *bank, int pin_num, int pull) 26403d0407baSopenharmony_ci{ 26413d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 26423d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 26433d0407baSopenharmony_ci struct regmap *regmap; 26443d0407baSopenharmony_ci int reg, ret, i, pull_type; 26453d0407baSopenharmony_ci u8 bit; 26463d0407baSopenharmony_ci u32 data, rmask; 26473d0407baSopenharmony_ci 26483d0407baSopenharmony_ci dev_dbg(info->dev, "setting pull of GPIO%d-%d to %d\n", bank->bank_num, pin_num, pull); 26493d0407baSopenharmony_ci 26503d0407baSopenharmony_ci /* rk3066b does support any pulls */ 26513d0407baSopenharmony_ci if (ctrl->type == RK3066B) { 26523d0407baSopenharmony_ci return pull ? -EINVAL : 0; 26533d0407baSopenharmony_ci } 26543d0407baSopenharmony_ci 26553d0407baSopenharmony_ci ctrl->pull_calc_reg(bank, pin_num, ®map, ®, &bit); 26563d0407baSopenharmony_ci 26573d0407baSopenharmony_ci switch (ctrl->type) { 26583d0407baSopenharmony_ci case RK2928: 26593d0407baSopenharmony_ci case RK3128: 26603d0407baSopenharmony_ci data = BIT(bit + PINCTRL_ROCKCHIP_SIXTEEN); 26613d0407baSopenharmony_ci if (pull == PIN_CONFIG_BIAS_DISABLE) { 26623d0407baSopenharmony_ci data |= BIT(bit); 26633d0407baSopenharmony_ci } 26643d0407baSopenharmony_ci ret = regmap_write(regmap, reg, data); 26653d0407baSopenharmony_ci break; 26663d0407baSopenharmony_ci case PX30: 26673d0407baSopenharmony_ci case RV1108: 26683d0407baSopenharmony_ci case RV1126: 26693d0407baSopenharmony_ci case RK1808: 26703d0407baSopenharmony_ci case RK3188: 26713d0407baSopenharmony_ci case RK3288: 26723d0407baSopenharmony_ci case RK3308: 26733d0407baSopenharmony_ci case RK3368: 26743d0407baSopenharmony_ci case RK3399: 26753d0407baSopenharmony_ci case RK3568: 26763d0407baSopenharmony_ci pull_type = bank->pull_type[pin_num / PINCTRL_ROCKCHIP_EIGHT]; 26773d0407baSopenharmony_ci ret = -EINVAL; 26783d0407baSopenharmony_ci for (i = 0; i < ARRAY_SIZE(rockchip_pull_list[pull_type]); i++) { 26793d0407baSopenharmony_ci if (rockchip_pull_list[pull_type][i] == pull) { 26803d0407baSopenharmony_ci ret = i; 26813d0407baSopenharmony_ci break; 26823d0407baSopenharmony_ci } 26833d0407baSopenharmony_ci } 26843d0407baSopenharmony_ci /* 26853d0407baSopenharmony_ci * In the TRM, pull-up being 1 for everything except the GPIO0_D0-D6, 26863d0407baSopenharmony_ci * where that pull up value becomes 3. 26873d0407baSopenharmony_ci */ 26883d0407baSopenharmony_ci if (ctrl->type == RK3568 && bank->bank_num == 0 && pin_num >= PINCTRL_ROCKCHIP_TWENTYSEVEN && 26893d0407baSopenharmony_ci pin_num <= PINCTRL_ROCKCHIP_THIRTY) { 26903d0407baSopenharmony_ci if (ret == PINCTRL_ROCKCHIP_ONE) { 26913d0407baSopenharmony_ci ret = PINCTRL_ROCKCHIP_THREE; 26923d0407baSopenharmony_ci } 26933d0407baSopenharmony_ci } 26943d0407baSopenharmony_ci 26953d0407baSopenharmony_ci if (ret < 0) { 26963d0407baSopenharmony_ci dev_err(info->dev, "unsupported pull setting %d\n", pull); 26973d0407baSopenharmony_ci return ret; 26983d0407baSopenharmony_ci } 26993d0407baSopenharmony_ci 27003d0407baSopenharmony_ci /* enable the write to the equivalent lower bits */ 27013d0407baSopenharmony_ci data = ((1 << RK3188_PULL_BITS_PER_PIN) - PINCTRL_ROCKCHIP_ONE) << (bit + PINCTRL_ROCKCHIP_SIXTEEN); 27023d0407baSopenharmony_ci rmask = data | (data >> PINCTRL_ROCKCHIP_SIXTEEN); 27033d0407baSopenharmony_ci data |= (ret << bit); 27043d0407baSopenharmony_ci 27053d0407baSopenharmony_ci ret = regmap_update_bits(regmap, reg, rmask, data); 27063d0407baSopenharmony_ci break; 27073d0407baSopenharmony_ci default: 27083d0407baSopenharmony_ci dev_err(info->dev, "unsupported pinctrl type\n"); 27093d0407baSopenharmony_ci return -EINVAL; 27103d0407baSopenharmony_ci } 27113d0407baSopenharmony_ci 27123d0407baSopenharmony_ci return ret; 27133d0407baSopenharmony_ci} 27143d0407baSopenharmony_ci 27153d0407baSopenharmony_ci#define RK3328_SCHMITT_BITS_PER_PIN 1 27163d0407baSopenharmony_ci#define RK3328_SCHMITT_PINS_PER_REG 16 27173d0407baSopenharmony_ci#define RK3328_SCHMITT_BANK_STRIDE 8 27183d0407baSopenharmony_ci#define RK3328_SCHMITT_GRF_OFFSET 0x380 27193d0407baSopenharmony_ci 27203d0407baSopenharmony_cistatic int rk3328_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 27213d0407baSopenharmony_ci int *reg, u8 *bit) 27223d0407baSopenharmony_ci{ 27233d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 27243d0407baSopenharmony_ci 27253d0407baSopenharmony_ci *regmap = info->regmap_base; 27263d0407baSopenharmony_ci *reg = RK3328_SCHMITT_GRF_OFFSET; 27273d0407baSopenharmony_ci 27283d0407baSopenharmony_ci *reg += bank->bank_num * RK3328_SCHMITT_BANK_STRIDE; 27293d0407baSopenharmony_ci *reg += ((pin_num / RK3328_SCHMITT_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 27303d0407baSopenharmony_ci *bit = pin_num % RK3328_SCHMITT_PINS_PER_REG; 27313d0407baSopenharmony_ci 27323d0407baSopenharmony_ci return 0; 27333d0407baSopenharmony_ci} 27343d0407baSopenharmony_ci 27353d0407baSopenharmony_ci#define RK3568_SCHMITT_BITS_PER_PIN 2 27363d0407baSopenharmony_ci#define RK3568_SCHMITT_PINS_PER_REG 8 27373d0407baSopenharmony_ci#define RK3568_SCHMITT_BANK_STRIDE 0x10 27383d0407baSopenharmony_ci#define RK3568_SCHMITT_GRF_OFFSET 0xc0 27393d0407baSopenharmony_ci#define RK3568_SCHMITT_PMUGRF_OFFSET 0x30 27403d0407baSopenharmony_ci 27413d0407baSopenharmony_cistatic int rk3568_calc_schmitt_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 27423d0407baSopenharmony_ci int *reg, u8 *bit) 27433d0407baSopenharmony_ci{ 27443d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 27453d0407baSopenharmony_ci 27463d0407baSopenharmony_ci if (bank->bank_num == 0) { 27473d0407baSopenharmony_ci *regmap = info->regmap_pmu; 27483d0407baSopenharmony_ci *reg = RK3568_SCHMITT_PMUGRF_OFFSET; 27493d0407baSopenharmony_ci } else { 27503d0407baSopenharmony_ci *regmap = info->regmap_base; 27513d0407baSopenharmony_ci *reg = RK3568_SCHMITT_GRF_OFFSET; 27523d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * RK3568_SCHMITT_BANK_STRIDE; 27533d0407baSopenharmony_ci } 27543d0407baSopenharmony_ci 27553d0407baSopenharmony_ci *reg += ((pin_num / RK3568_SCHMITT_PINS_PER_REG) * PINCTRL_ROCKCHIP_FOUR); 27563d0407baSopenharmony_ci *bit = pin_num % RK3568_SCHMITT_PINS_PER_REG; 27573d0407baSopenharmony_ci *bit *= RK3568_SCHMITT_BITS_PER_PIN; 27583d0407baSopenharmony_ci 27593d0407baSopenharmony_ci return 0; 27603d0407baSopenharmony_ci} 27613d0407baSopenharmony_ci 27623d0407baSopenharmony_cistatic int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num) 27633d0407baSopenharmony_ci{ 27643d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 27653d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 27663d0407baSopenharmony_ci struct regmap *regmap; 27673d0407baSopenharmony_ci int reg, ret; 27683d0407baSopenharmony_ci u8 bit; 27693d0407baSopenharmony_ci u32 data; 27703d0407baSopenharmony_ci 27713d0407baSopenharmony_ci ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 27723d0407baSopenharmony_ci if (ret) { 27733d0407baSopenharmony_ci return ret; 27743d0407baSopenharmony_ci } 27753d0407baSopenharmony_ci 27763d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 27773d0407baSopenharmony_ci if (ret) { 27783d0407baSopenharmony_ci return ret; 27793d0407baSopenharmony_ci } 27803d0407baSopenharmony_ci 27813d0407baSopenharmony_ci data >>= bit; 27823d0407baSopenharmony_ci switch (ctrl->type) { 27833d0407baSopenharmony_ci case RK3568: 27843d0407baSopenharmony_ci return data & ((PINCTRL_ROCKCHIP_ONE << RK3568_SCHMITT_BITS_PER_PIN) - PINCTRL_ROCKCHIP_ONE); 27853d0407baSopenharmony_ci default: 27863d0407baSopenharmony_ci break; 27873d0407baSopenharmony_ci } 27883d0407baSopenharmony_ci 27893d0407baSopenharmony_ci return data & 0x1; 27903d0407baSopenharmony_ci} 27913d0407baSopenharmony_ci 27923d0407baSopenharmony_cistatic int rockchip_set_schmitt(struct rockchip_pin_bank *bank, int pin_num, int enable) 27933d0407baSopenharmony_ci{ 27943d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 27953d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 27963d0407baSopenharmony_ci struct regmap *regmap; 27973d0407baSopenharmony_ci int reg, ret; 27983d0407baSopenharmony_ci u8 bit; 27993d0407baSopenharmony_ci u32 data, rmask; 28003d0407baSopenharmony_ci 28013d0407baSopenharmony_ci dev_dbg(info->dev, "setting input schmitt of GPIO%d-%d to %d\n", bank->bank_num, pin_num, enable); 28023d0407baSopenharmony_ci 28033d0407baSopenharmony_ci ret = ctrl->schmitt_calc_reg(bank, pin_num, ®map, ®, &bit); 28043d0407baSopenharmony_ci if (ret) { 28053d0407baSopenharmony_ci return ret; 28063d0407baSopenharmony_ci } 28073d0407baSopenharmony_ci 28083d0407baSopenharmony_ci /* enable the write to the equivalent lower bits */ 28093d0407baSopenharmony_ci switch (ctrl->type) { 28103d0407baSopenharmony_ci case RK3568: 28113d0407baSopenharmony_ci data = ((PINCTRL_ROCKCHIP_ONE << RK3568_SCHMITT_BITS_PER_PIN) - PINCTRL_ROCKCHIP_ONE) 28123d0407baSopenharmony_ci << (bit + PINCTRL_ROCKCHIP_SIXTEEN); 28133d0407baSopenharmony_ci rmask = data | (data >> PINCTRL_ROCKCHIP_SIXTEEN); 28143d0407baSopenharmony_ci data |= ((enable ? 0x2 : 0x1) << bit); 28153d0407baSopenharmony_ci break; 28163d0407baSopenharmony_ci default: 28173d0407baSopenharmony_ci data = BIT(bit + PINCTRL_ROCKCHIP_SIXTEEN) | (enable << bit); 28183d0407baSopenharmony_ci rmask = BIT(bit + PINCTRL_ROCKCHIP_SIXTEEN) | BIT(bit); 28193d0407baSopenharmony_ci break; 28203d0407baSopenharmony_ci } 28213d0407baSopenharmony_ci 28223d0407baSopenharmony_ci return regmap_update_bits(regmap, reg, rmask, data); 28233d0407baSopenharmony_ci} 28243d0407baSopenharmony_ci 28253d0407baSopenharmony_ci#define PX30_SLEW_RATE_PMU_OFFSET 0x30 28263d0407baSopenharmony_ci#define PX30_SLEW_RATE_GRF_OFFSET 0x90 28273d0407baSopenharmony_ci#define PX30_SLEW_RATE_PINS_PER_PMU_REG 16 28283d0407baSopenharmony_ci#define PX30_SLEW_RATE_BANK_STRIDE 16 28293d0407baSopenharmony_ci#define PX30_SLEW_RATE_PINS_PER_GRF_REG 8 28303d0407baSopenharmony_ci 28313d0407baSopenharmony_cistatic int px30_calc_slew_rate_reg_and_bit(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, 28323d0407baSopenharmony_ci int *reg, u8 *bit) 28333d0407baSopenharmony_ci{ 28343d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 28353d0407baSopenharmony_ci int pins_per_reg; 28363d0407baSopenharmony_ci 28373d0407baSopenharmony_ci if (bank->bank_num == 0) { 28383d0407baSopenharmony_ci *regmap = info->regmap_pmu; 28393d0407baSopenharmony_ci *reg = PX30_SLEW_RATE_PMU_OFFSET; 28403d0407baSopenharmony_ci pins_per_reg = PX30_SLEW_RATE_PINS_PER_PMU_REG; 28413d0407baSopenharmony_ci } else { 28423d0407baSopenharmony_ci *regmap = info->regmap_base; 28433d0407baSopenharmony_ci *reg = PX30_SLEW_RATE_GRF_OFFSET; 28443d0407baSopenharmony_ci pins_per_reg = PX30_SLEW_RATE_PINS_PER_GRF_REG; 28453d0407baSopenharmony_ci *reg += (bank->bank_num - PINCTRL_ROCKCHIP_ONE) * PX30_SLEW_RATE_BANK_STRIDE; 28463d0407baSopenharmony_ci } 28473d0407baSopenharmony_ci *reg += ((pin_num / pins_per_reg) * PINCTRL_ROCKCHIP_FOUR); 28483d0407baSopenharmony_ci *bit = pin_num % pins_per_reg; 28493d0407baSopenharmony_ci 28503d0407baSopenharmony_ci return 0; 28513d0407baSopenharmony_ci} 28523d0407baSopenharmony_ci 28533d0407baSopenharmony_cistatic int rockchip_get_slew_rate(struct rockchip_pin_bank *bank, int pin_num) 28543d0407baSopenharmony_ci{ 28553d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 28563d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 28573d0407baSopenharmony_ci struct regmap *regmap; 28583d0407baSopenharmony_ci int reg, ret; 28593d0407baSopenharmony_ci u8 bit; 28603d0407baSopenharmony_ci u32 data; 28613d0407baSopenharmony_ci 28623d0407baSopenharmony_ci ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 28633d0407baSopenharmony_ci if (ret) { 28643d0407baSopenharmony_ci return ret; 28653d0407baSopenharmony_ci } 28663d0407baSopenharmony_ci 28673d0407baSopenharmony_ci ret = regmap_read(regmap, reg, &data); 28683d0407baSopenharmony_ci if (ret) { 28693d0407baSopenharmony_ci return ret; 28703d0407baSopenharmony_ci } 28713d0407baSopenharmony_ci 28723d0407baSopenharmony_ci data >>= bit; 28733d0407baSopenharmony_ci return data & 0x1; 28743d0407baSopenharmony_ci} 28753d0407baSopenharmony_ci 28763d0407baSopenharmony_cistatic int rockchip_set_slew_rate(struct rockchip_pin_bank *bank, int pin_num, int speed) 28773d0407baSopenharmony_ci{ 28783d0407baSopenharmony_ci struct rockchip_pinctrl *info = bank->drvdata; 28793d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl = info->ctrl; 28803d0407baSopenharmony_ci struct regmap *regmap; 28813d0407baSopenharmony_ci int reg, ret; 28823d0407baSopenharmony_ci u8 bit; 28833d0407baSopenharmony_ci u32 data, rmask; 28843d0407baSopenharmony_ci 28853d0407baSopenharmony_ci dev_dbg(info->dev, "setting slew rate of GPIO%d-%d to %d\n", bank->bank_num, pin_num, speed); 28863d0407baSopenharmony_ci 28873d0407baSopenharmony_ci ret = ctrl->slew_rate_calc_reg(bank, pin_num, ®map, ®, &bit); 28883d0407baSopenharmony_ci if (ret) { 28893d0407baSopenharmony_ci return ret; 28903d0407baSopenharmony_ci } 28913d0407baSopenharmony_ci 28923d0407baSopenharmony_ci /* enable the write to the equivalent lower bits */ 28933d0407baSopenharmony_ci data = BIT(bit + PINCTRL_ROCKCHIP_SIXTEEN) | (speed << bit); 28943d0407baSopenharmony_ci rmask = BIT(bit + PINCTRL_ROCKCHIP_SIXTEEN) | BIT(bit); 28953d0407baSopenharmony_ci 28963d0407baSopenharmony_ci return regmap_update_bits(regmap, reg, rmask, data); 28973d0407baSopenharmony_ci} 28983d0407baSopenharmony_ci 28993d0407baSopenharmony_ci/* 29003d0407baSopenharmony_ci * Pinmux_ops handling 29013d0407baSopenharmony_ci */ 29023d0407baSopenharmony_ci 29033d0407baSopenharmony_cistatic int rockchip_pmx_get_funcs_count(struct pinctrl_dev *pctldev) 29043d0407baSopenharmony_ci{ 29053d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 29063d0407baSopenharmony_ci 29073d0407baSopenharmony_ci return info->nfunctions; 29083d0407baSopenharmony_ci} 29093d0407baSopenharmony_ci 29103d0407baSopenharmony_cistatic const char *rockchip_pmx_get_func_name(struct pinctrl_dev *pctldev, unsigned selector) 29113d0407baSopenharmony_ci{ 29123d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 29133d0407baSopenharmony_ci 29143d0407baSopenharmony_ci return info->functions[selector].name; 29153d0407baSopenharmony_ci} 29163d0407baSopenharmony_ci 29173d0407baSopenharmony_cistatic int rockchip_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, const char *const **groups, 29183d0407baSopenharmony_ci unsigned *const num_groups) 29193d0407baSopenharmony_ci{ 29203d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 29213d0407baSopenharmony_ci 29223d0407baSopenharmony_ci *groups = info->functions[selector].groups; 29233d0407baSopenharmony_ci *num_groups = info->functions[selector].ngroups; 29243d0407baSopenharmony_ci 29253d0407baSopenharmony_ci return 0; 29263d0407baSopenharmony_ci} 29273d0407baSopenharmony_ci 29283d0407baSopenharmony_cistatic int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, unsigned group) 29293d0407baSopenharmony_ci{ 29303d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 29313d0407baSopenharmony_ci const unsigned int *pins = info->groups[group].pins; 29323d0407baSopenharmony_ci const struct rockchip_pin_config *data = info->groups[group].data; 29333d0407baSopenharmony_ci struct rockchip_pin_bank *bank; 29343d0407baSopenharmony_ci int cnt, ret = 0; 29353d0407baSopenharmony_ci 29363d0407baSopenharmony_ci dev_dbg(info->dev, "enable function %s group %s\n", info->functions[selector].name, info->groups[group].name); 29373d0407baSopenharmony_ci 29383d0407baSopenharmony_ci /* 29393d0407baSopenharmony_ci * for each pin in the pin group selected, program the corresponding 29403d0407baSopenharmony_ci * pin function number in the config register. 29413d0407baSopenharmony_ci */ 29423d0407baSopenharmony_ci for (cnt = 0; cnt < info->groups[group].npins; cnt++) { 29433d0407baSopenharmony_ci bank = pin_to_bank(info, pins[cnt]); 29443d0407baSopenharmony_ci ret = rockchip_set_mux(bank, pins[cnt] - bank->pin_base, data[cnt].func); 29453d0407baSopenharmony_ci if (ret) { 29463d0407baSopenharmony_ci break; 29473d0407baSopenharmony_ci } 29483d0407baSopenharmony_ci } 29493d0407baSopenharmony_ci 29503d0407baSopenharmony_ci if (ret && cnt) { 29513d0407baSopenharmony_ci /* revert the already done pin settings */ 29523d0407baSopenharmony_ci for (cnt--; cnt >= 0 && !data[cnt].func; cnt--) { 29533d0407baSopenharmony_ci rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0); 29543d0407baSopenharmony_ci } 29553d0407baSopenharmony_ci 29563d0407baSopenharmony_ci return ret; 29573d0407baSopenharmony_ci } 29583d0407baSopenharmony_ci 29593d0407baSopenharmony_ci return 0; 29603d0407baSopenharmony_ci} 29613d0407baSopenharmony_ci 29623d0407baSopenharmony_cistatic const struct pinmux_ops rockchip_pmx_ops = { 29633d0407baSopenharmony_ci .get_functions_count = rockchip_pmx_get_funcs_count, 29643d0407baSopenharmony_ci .get_function_name = rockchip_pmx_get_func_name, 29653d0407baSopenharmony_ci .get_function_groups = rockchip_pmx_get_groups, 29663d0407baSopenharmony_ci .set_mux = rockchip_pmx_set, 29673d0407baSopenharmony_ci}; 29683d0407baSopenharmony_ci 29693d0407baSopenharmony_ci/* 29703d0407baSopenharmony_ci * Pinconf_ops handling 29713d0407baSopenharmony_ci */ 29723d0407baSopenharmony_ci 29733d0407baSopenharmony_cistatic bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, enum pin_config_param pull) 29743d0407baSopenharmony_ci{ 29753d0407baSopenharmony_ci switch (ctrl->type) { 29763d0407baSopenharmony_ci case RK2928: 29773d0407baSopenharmony_ci case RK3128: 29783d0407baSopenharmony_ci return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || pull == PIN_CONFIG_BIAS_DISABLE); 29793d0407baSopenharmony_ci case RK3066B: 29803d0407baSopenharmony_ci return pull ? false : true; 29813d0407baSopenharmony_ci case PX30: 29823d0407baSopenharmony_ci case RV1108: 29833d0407baSopenharmony_ci case RV1126: 29843d0407baSopenharmony_ci case RK1808: 29853d0407baSopenharmony_ci case RK3188: 29863d0407baSopenharmony_ci case RK3288: 29873d0407baSopenharmony_ci case RK3308: 29883d0407baSopenharmony_ci case RK3368: 29893d0407baSopenharmony_ci case RK3399: 29903d0407baSopenharmony_ci case RK3568: 29913d0407baSopenharmony_ci return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 29923d0407baSopenharmony_ci } 29933d0407baSopenharmony_ci 29943d0407baSopenharmony_ci return false; 29953d0407baSopenharmony_ci} 29963d0407baSopenharmony_ci 29973d0407baSopenharmony_ci/* set the pin config settings for a specified pin */ 29983d0407baSopenharmony_cistatic int rockchip_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin, unsigned long *configs, 29993d0407baSopenharmony_ci unsigned num_configs) 30003d0407baSopenharmony_ci{ 30013d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 30023d0407baSopenharmony_ci struct rockchip_pin_bank *bank = pin_to_bank(info, pin); 30033d0407baSopenharmony_ci struct gpio_chip *gpio = &bank->gpio_chip; 30043d0407baSopenharmony_ci enum pin_config_param param; 30053d0407baSopenharmony_ci u32 arg; 30063d0407baSopenharmony_ci int i; 30073d0407baSopenharmony_ci int rc; 30083d0407baSopenharmony_ci 30093d0407baSopenharmony_ci for (i = 0; i < num_configs; i++) { 30103d0407baSopenharmony_ci param = pinconf_to_config_param(configs[i]); 30113d0407baSopenharmony_ci arg = pinconf_to_config_argument(configs[i]); 30123d0407baSopenharmony_ci 30133d0407baSopenharmony_ci switch (param) { 30143d0407baSopenharmony_ci case PIN_CONFIG_BIAS_DISABLE: 30153d0407baSopenharmony_ci rc = rockchip_set_pull(bank, pin - bank->pin_base, param); 30163d0407baSopenharmony_ci if (rc) { 30173d0407baSopenharmony_ci return rc; 30183d0407baSopenharmony_ci } 30193d0407baSopenharmony_ci break; 30203d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_UP: 30213d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_DOWN: 30223d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 30233d0407baSopenharmony_ci case PIN_CONFIG_BIAS_BUS_HOLD: 30243d0407baSopenharmony_ci if (!rockchip_pinconf_pull_valid(info->ctrl, param)) { 30253d0407baSopenharmony_ci return -ENOTSUPP; 30263d0407baSopenharmony_ci } 30273d0407baSopenharmony_ci 30283d0407baSopenharmony_ci if (!arg) { 30293d0407baSopenharmony_ci return -EINVAL; 30303d0407baSopenharmony_ci } 30313d0407baSopenharmony_ci 30323d0407baSopenharmony_ci rc = rockchip_set_pull(bank, pin - bank->pin_base, param); 30333d0407baSopenharmony_ci if (rc) { 30343d0407baSopenharmony_ci return rc; 30353d0407baSopenharmony_ci } 30363d0407baSopenharmony_ci break; 30373d0407baSopenharmony_ci case PIN_CONFIG_OUTPUT: 30383d0407baSopenharmony_ci rc = rockchip_get_mux(bank, pin - bank->pin_base); 30393d0407baSopenharmony_ci if (rc != 0) { 30403d0407baSopenharmony_ci dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc); 30413d0407baSopenharmony_ci return -EINVAL; 30423d0407baSopenharmony_ci } 30433d0407baSopenharmony_ci 30443d0407baSopenharmony_ci rc = gpio->direction_output(gpio, pin - bank->pin_base, arg); 30453d0407baSopenharmony_ci if (rc) { 30463d0407baSopenharmony_ci return rc; 30473d0407baSopenharmony_ci } 30483d0407baSopenharmony_ci break; 30493d0407baSopenharmony_ci case PIN_CONFIG_DRIVE_STRENGTH: 30503d0407baSopenharmony_ci /* rk3288 is the first with per-pin drive-strength */ 30513d0407baSopenharmony_ci if (!info->ctrl->drv_calc_reg) { 30523d0407baSopenharmony_ci return -ENOTSUPP; 30533d0407baSopenharmony_ci } 30543d0407baSopenharmony_ci 30553d0407baSopenharmony_ci rc = rockchip_set_drive_perpin(bank, pin - bank->pin_base, arg); 30563d0407baSopenharmony_ci if (rc < 0) { 30573d0407baSopenharmony_ci return rc; 30583d0407baSopenharmony_ci } 30593d0407baSopenharmony_ci break; 30603d0407baSopenharmony_ci case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 30613d0407baSopenharmony_ci if (!info->ctrl->schmitt_calc_reg) { 30623d0407baSopenharmony_ci return -ENOTSUPP; 30633d0407baSopenharmony_ci } 30643d0407baSopenharmony_ci 30653d0407baSopenharmony_ci rc = rockchip_set_schmitt(bank, pin - bank->pin_base, arg); 30663d0407baSopenharmony_ci if (rc < 0) { 30673d0407baSopenharmony_ci return rc; 30683d0407baSopenharmony_ci } 30693d0407baSopenharmony_ci break; 30703d0407baSopenharmony_ci case PIN_CONFIG_SLEW_RATE: 30713d0407baSopenharmony_ci if (!info->ctrl->slew_rate_calc_reg) { 30723d0407baSopenharmony_ci return -ENOTSUPP; 30733d0407baSopenharmony_ci } 30743d0407baSopenharmony_ci 30753d0407baSopenharmony_ci rc = rockchip_set_slew_rate(bank, pin - bank->pin_base, arg); 30763d0407baSopenharmony_ci if (rc < 0) { 30773d0407baSopenharmony_ci return rc; 30783d0407baSopenharmony_ci } 30793d0407baSopenharmony_ci break; 30803d0407baSopenharmony_ci default: 30813d0407baSopenharmony_ci return -ENOTSUPP; 30823d0407baSopenharmony_ci } 30833d0407baSopenharmony_ci } /* for each config */ 30843d0407baSopenharmony_ci 30853d0407baSopenharmony_ci return 0; 30863d0407baSopenharmony_ci} 30873d0407baSopenharmony_ci 30883d0407baSopenharmony_ci/* get the pin config settings for a specified pin */ 30893d0407baSopenharmony_cistatic int rockchip_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin, unsigned long *config) 30903d0407baSopenharmony_ci{ 30913d0407baSopenharmony_ci struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev); 30923d0407baSopenharmony_ci struct rockchip_pin_bank *bank = pin_to_bank(info, pin); 30933d0407baSopenharmony_ci struct gpio_chip *gpio = &bank->gpio_chip; 30943d0407baSopenharmony_ci enum pin_config_param param = pinconf_to_config_param(*config); 30953d0407baSopenharmony_ci u16 arg; 30963d0407baSopenharmony_ci int rc; 30973d0407baSopenharmony_ci 30983d0407baSopenharmony_ci switch (param) { 30993d0407baSopenharmony_ci case PIN_CONFIG_BIAS_DISABLE: 31003d0407baSopenharmony_ci if (rockchip_get_pull(bank, pin - bank->pin_base) != param) { 31013d0407baSopenharmony_ci return -EINVAL; 31023d0407baSopenharmony_ci } 31033d0407baSopenharmony_ci 31043d0407baSopenharmony_ci arg = 0; 31053d0407baSopenharmony_ci break; 31063d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_UP: 31073d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_DOWN: 31083d0407baSopenharmony_ci case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 31093d0407baSopenharmony_ci case PIN_CONFIG_BIAS_BUS_HOLD: 31103d0407baSopenharmony_ci if (!rockchip_pinconf_pull_valid(info->ctrl, param)) { 31113d0407baSopenharmony_ci return -ENOTSUPP; 31123d0407baSopenharmony_ci } 31133d0407baSopenharmony_ci 31143d0407baSopenharmony_ci if (rockchip_get_pull(bank, pin - bank->pin_base) != param) { 31153d0407baSopenharmony_ci return -EINVAL; 31163d0407baSopenharmony_ci } 31173d0407baSopenharmony_ci 31183d0407baSopenharmony_ci arg = PINCTRL_ROCKCHIP_ONE; 31193d0407baSopenharmony_ci break; 31203d0407baSopenharmony_ci case PIN_CONFIG_OUTPUT: 31213d0407baSopenharmony_ci rc = rockchip_get_mux(bank, pin - bank->pin_base); 31223d0407baSopenharmony_ci if (rc != 0) { 31233d0407baSopenharmony_ci dev_err(info->dev, "pin-%d has been mux to func%d\n", pin, rc); 31243d0407baSopenharmony_ci return -EINVAL; 31253d0407baSopenharmony_ci } 31263d0407baSopenharmony_ci 31273d0407baSopenharmony_ci rc = gpio->get(gpio, pin - bank->pin_base); 31283d0407baSopenharmony_ci if (rc < 0) { 31293d0407baSopenharmony_ci return rc; 31303d0407baSopenharmony_ci } 31313d0407baSopenharmony_ci 31323d0407baSopenharmony_ci arg = rc ? 1 : 0; 31333d0407baSopenharmony_ci break; 31343d0407baSopenharmony_ci case PIN_CONFIG_DRIVE_STRENGTH: 31353d0407baSopenharmony_ci /* rk3288 is the first with per-pin drive-strength */ 31363d0407baSopenharmony_ci if (!info->ctrl->drv_calc_reg) { 31373d0407baSopenharmony_ci return -ENOTSUPP; 31383d0407baSopenharmony_ci } 31393d0407baSopenharmony_ci 31403d0407baSopenharmony_ci rc = rockchip_get_drive_perpin(bank, pin - bank->pin_base); 31413d0407baSopenharmony_ci if (rc < 0) { 31423d0407baSopenharmony_ci return rc; 31433d0407baSopenharmony_ci } 31443d0407baSopenharmony_ci 31453d0407baSopenharmony_ci arg = rc; 31463d0407baSopenharmony_ci break; 31473d0407baSopenharmony_ci case PIN_CONFIG_INPUT_SCHMITT_ENABLE: 31483d0407baSopenharmony_ci if (!info->ctrl->schmitt_calc_reg) { 31493d0407baSopenharmony_ci return -ENOTSUPP; 31503d0407baSopenharmony_ci } 31513d0407baSopenharmony_ci 31523d0407baSopenharmony_ci rc = rockchip_get_schmitt(bank, pin - bank->pin_base); 31533d0407baSopenharmony_ci if (rc < 0) { 31543d0407baSopenharmony_ci return rc; 31553d0407baSopenharmony_ci } 31563d0407baSopenharmony_ci 31573d0407baSopenharmony_ci arg = rc; 31583d0407baSopenharmony_ci break; 31593d0407baSopenharmony_ci case PIN_CONFIG_SLEW_RATE: 31603d0407baSopenharmony_ci if (!info->ctrl->slew_rate_calc_reg) { 31613d0407baSopenharmony_ci return -ENOTSUPP; 31623d0407baSopenharmony_ci } 31633d0407baSopenharmony_ci 31643d0407baSopenharmony_ci rc = rockchip_get_slew_rate(bank, pin - bank->pin_base); 31653d0407baSopenharmony_ci if (rc < 0) { 31663d0407baSopenharmony_ci return rc; 31673d0407baSopenharmony_ci } 31683d0407baSopenharmony_ci 31693d0407baSopenharmony_ci arg = rc; 31703d0407baSopenharmony_ci break; 31713d0407baSopenharmony_ci default: 31723d0407baSopenharmony_ci return -ENOTSUPP; 31733d0407baSopenharmony_ci } 31743d0407baSopenharmony_ci 31753d0407baSopenharmony_ci *config = pinconf_to_config_packed(param, arg); 31763d0407baSopenharmony_ci 31773d0407baSopenharmony_ci return 0; 31783d0407baSopenharmony_ci} 31793d0407baSopenharmony_ci 31803d0407baSopenharmony_cistatic const struct pinconf_ops rockchip_pinconf_ops = { 31813d0407baSopenharmony_ci .pin_config_get = rockchip_pinconf_get, 31823d0407baSopenharmony_ci .pin_config_set = rockchip_pinconf_set, 31833d0407baSopenharmony_ci .is_generic = true, 31843d0407baSopenharmony_ci}; 31853d0407baSopenharmony_ci 31863d0407baSopenharmony_cistatic const struct of_device_id rockchip_bank_match[] = { 31873d0407baSopenharmony_ci {.compatible = "rockchip,gpio-bank"}, 31883d0407baSopenharmony_ci {.compatible = "rockchip,rk3188-gpio-bank0"}, 31893d0407baSopenharmony_ci {}, 31903d0407baSopenharmony_ci}; 31913d0407baSopenharmony_ci 31923d0407baSopenharmony_cistatic void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info, struct device_node *np) 31933d0407baSopenharmony_ci{ 31943d0407baSopenharmony_ci struct device_node *child; 31953d0407baSopenharmony_ci 31963d0407baSopenharmony_ci for_each_child_of_node(np, child) 31973d0407baSopenharmony_ci { 31983d0407baSopenharmony_ci if (of_match_node(rockchip_bank_match, child)) { 31993d0407baSopenharmony_ci continue; 32003d0407baSopenharmony_ci } 32013d0407baSopenharmony_ci 32023d0407baSopenharmony_ci info->nfunctions++; 32033d0407baSopenharmony_ci info->ngroups += of_get_child_count(child); 32043d0407baSopenharmony_ci } 32053d0407baSopenharmony_ci} 32063d0407baSopenharmony_ci 32073d0407baSopenharmony_cistatic int rockchip_pinctrl_parse_groups(struct device_node *np, struct rockchip_pin_group *grp, 32083d0407baSopenharmony_ci struct rockchip_pinctrl *info, u32 index) 32093d0407baSopenharmony_ci{ 32103d0407baSopenharmony_ci struct rockchip_pin_bank *bank; 32113d0407baSopenharmony_ci int size; 32123d0407baSopenharmony_ci const __be32 *list; 32133d0407baSopenharmony_ci int num; 32143d0407baSopenharmony_ci int i, j; 32153d0407baSopenharmony_ci int ret; 32163d0407baSopenharmony_ci 32173d0407baSopenharmony_ci dev_dbg(info->dev, "group(%d): %pOFn\n", index, np); 32183d0407baSopenharmony_ci 32193d0407baSopenharmony_ci /* Initialise group */ 32203d0407baSopenharmony_ci grp->name = np->name; 32213d0407baSopenharmony_ci 32223d0407baSopenharmony_ci /* 32233d0407baSopenharmony_ci * the binding format is rockchip,pins = <bank pin mux CONFIG>, 32243d0407baSopenharmony_ci * do sanity check and calculate pins number 32253d0407baSopenharmony_ci */ 32263d0407baSopenharmony_ci list = of_get_property(np, "rockchip,pins", &size); 32273d0407baSopenharmony_ci /* we do not check return since it's safe node passed down */ 32283d0407baSopenharmony_ci size /= sizeof(*list); 32293d0407baSopenharmony_ci if (!size || size % PINCTRL_ROCKCHIP_FOUR) { 32303d0407baSopenharmony_ci dev_err(info->dev, "wrong pins number or pins and configs should be by 4\n"); 32313d0407baSopenharmony_ci return -EINVAL; 32323d0407baSopenharmony_ci } 32333d0407baSopenharmony_ci 32343d0407baSopenharmony_ci grp->npins = size / PINCTRL_ROCKCHIP_FOUR; 32353d0407baSopenharmony_ci 32363d0407baSopenharmony_ci grp->pins = devm_kcalloc(info->dev, grp->npins, sizeof(unsigned int), GFP_KERNEL); 32373d0407baSopenharmony_ci grp->data = devm_kcalloc(info->dev, grp->npins, sizeof(struct rockchip_pin_config), GFP_KERNEL); 32383d0407baSopenharmony_ci if (!grp->pins || !grp->data) { 32393d0407baSopenharmony_ci return -ENOMEM; 32403d0407baSopenharmony_ci } 32413d0407baSopenharmony_ci 32423d0407baSopenharmony_ci for (i = 0, j = 0; i < size; i += PINCTRL_ROCKCHIP_FOUR, j++) { 32433d0407baSopenharmony_ci const __be32 *phandle; 32443d0407baSopenharmony_ci struct device_node *np_config; 32453d0407baSopenharmony_ci 32463d0407baSopenharmony_ci num = be32_to_cpu(*list++); 32473d0407baSopenharmony_ci bank = bank_num_to_bank(info, num); 32483d0407baSopenharmony_ci if (IS_ERR(bank)) { 32493d0407baSopenharmony_ci return PTR_ERR(bank); 32503d0407baSopenharmony_ci } 32513d0407baSopenharmony_ci 32523d0407baSopenharmony_ci grp->pins[j] = bank->pin_base + be32_to_cpu(*list++); 32533d0407baSopenharmony_ci grp->data[j].func = be32_to_cpu(*list++); 32543d0407baSopenharmony_ci 32553d0407baSopenharmony_ci phandle = list++; 32563d0407baSopenharmony_ci if (!phandle) { 32573d0407baSopenharmony_ci return -EINVAL; 32583d0407baSopenharmony_ci } 32593d0407baSopenharmony_ci 32603d0407baSopenharmony_ci np_config = of_find_node_by_phandle(be32_to_cpup(phandle)); 32613d0407baSopenharmony_ci ret = pinconf_generic_parse_dt_config(np_config, NULL, &grp->data[j].configs, &grp->data[j].nconfigs); 32623d0407baSopenharmony_ci if (ret) { 32633d0407baSopenharmony_ci return ret; 32643d0407baSopenharmony_ci } 32653d0407baSopenharmony_ci } 32663d0407baSopenharmony_ci 32673d0407baSopenharmony_ci return 0; 32683d0407baSopenharmony_ci} 32693d0407baSopenharmony_ci 32703d0407baSopenharmony_cistatic int rockchip_pinctrl_parse_functions(struct device_node *np, struct rockchip_pinctrl *info, u32 index) 32713d0407baSopenharmony_ci{ 32723d0407baSopenharmony_ci struct device_node *child; 32733d0407baSopenharmony_ci struct rockchip_pmx_func *func; 32743d0407baSopenharmony_ci struct rockchip_pin_group *grp; 32753d0407baSopenharmony_ci int ret; 32763d0407baSopenharmony_ci static u32 grp_index; 32773d0407baSopenharmony_ci u32 i = 0; 32783d0407baSopenharmony_ci 32793d0407baSopenharmony_ci dev_dbg(info->dev, "parse function(%d): %pOFn\n", index, np); 32803d0407baSopenharmony_ci 32813d0407baSopenharmony_ci func = &info->functions[index]; 32823d0407baSopenharmony_ci 32833d0407baSopenharmony_ci /* Initialise function */ 32843d0407baSopenharmony_ci func->name = np->name; 32853d0407baSopenharmony_ci func->ngroups = of_get_child_count(np); 32863d0407baSopenharmony_ci if (func->ngroups <= 0) { 32873d0407baSopenharmony_ci return 0; 32883d0407baSopenharmony_ci } 32893d0407baSopenharmony_ci 32903d0407baSopenharmony_ci func->groups = devm_kcalloc(info->dev, func->ngroups, sizeof(char *), GFP_KERNEL); 32913d0407baSopenharmony_ci if (!func->groups) { 32923d0407baSopenharmony_ci return -ENOMEM; 32933d0407baSopenharmony_ci } 32943d0407baSopenharmony_ci 32953d0407baSopenharmony_ci for_each_child_of_node(np, child) 32963d0407baSopenharmony_ci { 32973d0407baSopenharmony_ci func->groups[i] = child->name; 32983d0407baSopenharmony_ci grp = &info->groups[grp_index++]; 32993d0407baSopenharmony_ci ret = rockchip_pinctrl_parse_groups(child, grp, info, i++); 33003d0407baSopenharmony_ci if (ret) { 33013d0407baSopenharmony_ci of_node_put(child); 33023d0407baSopenharmony_ci return ret; 33033d0407baSopenharmony_ci } 33043d0407baSopenharmony_ci } 33053d0407baSopenharmony_ci 33063d0407baSopenharmony_ci return 0; 33073d0407baSopenharmony_ci} 33083d0407baSopenharmony_ci 33093d0407baSopenharmony_cistatic int rockchip_pinctrl_parse_dt(struct platform_device *pdev, struct rockchip_pinctrl *info) 33103d0407baSopenharmony_ci{ 33113d0407baSopenharmony_ci struct device *dev = &pdev->dev; 33123d0407baSopenharmony_ci struct device_node *np = dev->of_node; 33133d0407baSopenharmony_ci struct device_node *child; 33143d0407baSopenharmony_ci int ret; 33153d0407baSopenharmony_ci int i; 33163d0407baSopenharmony_ci 33173d0407baSopenharmony_ci rockchip_pinctrl_child_count(info, np); 33183d0407baSopenharmony_ci 33193d0407baSopenharmony_ci dev_dbg(&pdev->dev, "nfunctions = %d\n", info->nfunctions); 33203d0407baSopenharmony_ci dev_dbg(&pdev->dev, "ngroups = %d\n", info->ngroups); 33213d0407baSopenharmony_ci 33223d0407baSopenharmony_ci info->functions = devm_kcalloc(dev, info->nfunctions, sizeof(struct rockchip_pmx_func), GFP_KERNEL); 33233d0407baSopenharmony_ci if (!info->functions) { 33243d0407baSopenharmony_ci return -ENOMEM; 33253d0407baSopenharmony_ci } 33263d0407baSopenharmony_ci 33273d0407baSopenharmony_ci info->groups = devm_kcalloc(dev, info->ngroups, sizeof(struct rockchip_pin_group), GFP_KERNEL); 33283d0407baSopenharmony_ci if (!info->groups) { 33293d0407baSopenharmony_ci return -ENOMEM; 33303d0407baSopenharmony_ci } 33313d0407baSopenharmony_ci 33323d0407baSopenharmony_ci i = 0; 33333d0407baSopenharmony_ci 33343d0407baSopenharmony_ci for_each_child_of_node(np, child) 33353d0407baSopenharmony_ci { 33363d0407baSopenharmony_ci if (of_match_node(rockchip_bank_match, child)) { 33373d0407baSopenharmony_ci continue; 33383d0407baSopenharmony_ci } 33393d0407baSopenharmony_ci 33403d0407baSopenharmony_ci ret = rockchip_pinctrl_parse_functions(child, info, i++); 33413d0407baSopenharmony_ci if (ret) { 33423d0407baSopenharmony_ci dev_err(&pdev->dev, "failed to parse function\n"); 33433d0407baSopenharmony_ci of_node_put(child); 33443d0407baSopenharmony_ci return ret; 33453d0407baSopenharmony_ci } 33463d0407baSopenharmony_ci } 33473d0407baSopenharmony_ci 33483d0407baSopenharmony_ci return 0; 33493d0407baSopenharmony_ci} 33503d0407baSopenharmony_ci 33513d0407baSopenharmony_cistatic int rockchip_pinctrl_register(struct platform_device *pdev, struct rockchip_pinctrl *info) 33523d0407baSopenharmony_ci{ 33533d0407baSopenharmony_ci struct pinctrl_desc *ctrldesc = &info->pctl; 33543d0407baSopenharmony_ci struct pinctrl_pin_desc *pindesc, *pdesc; 33553d0407baSopenharmony_ci struct rockchip_pin_bank *pin_bank; 33563d0407baSopenharmony_ci int pin, bank, ret; 33573d0407baSopenharmony_ci int k; 33583d0407baSopenharmony_ci 33593d0407baSopenharmony_ci ctrldesc->name = "rockchip-pinctrl"; 33603d0407baSopenharmony_ci ctrldesc->owner = THIS_MODULE; 33613d0407baSopenharmony_ci ctrldesc->pctlops = &rockchip_pctrl_ops; 33623d0407baSopenharmony_ci ctrldesc->pmxops = &rockchip_pmx_ops; 33633d0407baSopenharmony_ci ctrldesc->confops = &rockchip_pinconf_ops; 33643d0407baSopenharmony_ci 33653d0407baSopenharmony_ci pindesc = devm_kcalloc(&pdev->dev, info->ctrl->nr_pins, sizeof(*pindesc), GFP_KERNEL); 33663d0407baSopenharmony_ci if (!pindesc) { 33673d0407baSopenharmony_ci return -ENOMEM; 33683d0407baSopenharmony_ci } 33693d0407baSopenharmony_ci 33703d0407baSopenharmony_ci ctrldesc->pins = pindesc; 33713d0407baSopenharmony_ci ctrldesc->npins = info->ctrl->nr_pins; 33723d0407baSopenharmony_ci 33733d0407baSopenharmony_ci pdesc = pindesc; 33743d0407baSopenharmony_ci for (bank = 0, k = 0; bank < info->ctrl->nr_banks; bank++) { 33753d0407baSopenharmony_ci pin_bank = &info->ctrl->pin_banks[bank]; 33763d0407baSopenharmony_ci for (pin = 0; pin < pin_bank->nr_pins; pin++, k++) { 33773d0407baSopenharmony_ci pdesc->number = k; 33783d0407baSopenharmony_ci pdesc->name = kasprintf(GFP_KERNEL, "%s-%d", pin_bank->name, pin); 33793d0407baSopenharmony_ci pdesc++; 33803d0407baSopenharmony_ci } 33813d0407baSopenharmony_ci } 33823d0407baSopenharmony_ci 33833d0407baSopenharmony_ci ret = rockchip_pinctrl_parse_dt(pdev, info); 33843d0407baSopenharmony_ci if (ret) { 33853d0407baSopenharmony_ci return ret; 33863d0407baSopenharmony_ci } 33873d0407baSopenharmony_ci 33883d0407baSopenharmony_ci info->pctl_dev = devm_pinctrl_register(&pdev->dev, ctrldesc, info); 33893d0407baSopenharmony_ci if (IS_ERR(info->pctl_dev)) { 33903d0407baSopenharmony_ci dev_err(&pdev->dev, "could not register pinctrl driver\n"); 33913d0407baSopenharmony_ci return PTR_ERR(info->pctl_dev); 33923d0407baSopenharmony_ci } 33933d0407baSopenharmony_ci 33943d0407baSopenharmony_ci return 0; 33953d0407baSopenharmony_ci} 33963d0407baSopenharmony_ci 33973d0407baSopenharmony_cistatic const struct of_device_id rockchip_pinctrl_dt_match[]; 33983d0407baSopenharmony_ci 33993d0407baSopenharmony_ci/* retrieve the soc specific data */ 34003d0407baSopenharmony_cistatic struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data(struct rockchip_pinctrl *d, struct platform_device *pdev) 34013d0407baSopenharmony_ci{ 34023d0407baSopenharmony_ci const struct of_device_id *match; 34033d0407baSopenharmony_ci struct device_node *node = pdev->dev.of_node; 34043d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl; 34053d0407baSopenharmony_ci struct rockchip_pin_bank *bank; 34063d0407baSopenharmony_ci int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; 34073d0407baSopenharmony_ci 34083d0407baSopenharmony_ci match = of_match_node(rockchip_pinctrl_dt_match, node); 34093d0407baSopenharmony_ci ctrl = (struct rockchip_pin_ctrl *)match->data; 34103d0407baSopenharmony_ci 34113d0407baSopenharmony_ci grf_offs = ctrl->grf_mux_offset; 34123d0407baSopenharmony_ci pmu_offs = ctrl->pmu_mux_offset; 34133d0407baSopenharmony_ci drv_pmu_offs = ctrl->pmu_drv_offset; 34143d0407baSopenharmony_ci drv_grf_offs = ctrl->grf_drv_offset; 34153d0407baSopenharmony_ci bank = ctrl->pin_banks; 34163d0407baSopenharmony_ci for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { 34173d0407baSopenharmony_ci int bank_pins = 0; 34183d0407baSopenharmony_ci 34193d0407baSopenharmony_ci raw_spin_lock_init(&bank->slock); 34203d0407baSopenharmony_ci bank->drvdata = d; 34213d0407baSopenharmony_ci bank->pin_base = ctrl->nr_pins; 34223d0407baSopenharmony_ci ctrl->nr_pins += bank->nr_pins; 34233d0407baSopenharmony_ci 34243d0407baSopenharmony_ci /* calculate iomux and drv offsets */ 34253d0407baSopenharmony_ci for (j = 0; j < PINCTRL_ROCKCHIP_FOUR; j++) { 34263d0407baSopenharmony_ci struct rockchip_iomux *iom = &bank->iomux[j]; 34273d0407baSopenharmony_ci struct rockchip_drv *drv = &bank->drv[j]; 34283d0407baSopenharmony_ci int inc; 34293d0407baSopenharmony_ci 34303d0407baSopenharmony_ci if (bank_pins >= bank->nr_pins) { 34313d0407baSopenharmony_ci break; 34323d0407baSopenharmony_ci } 34333d0407baSopenharmony_ci 34343d0407baSopenharmony_ci /* preset iomux offset value, set new start value */ 34353d0407baSopenharmony_ci if (iom->offset >= 0) { 34363d0407baSopenharmony_ci if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) { 34373d0407baSopenharmony_ci pmu_offs = iom->offset; 34383d0407baSopenharmony_ci } else { 34393d0407baSopenharmony_ci grf_offs = iom->offset; 34403d0407baSopenharmony_ci } 34413d0407baSopenharmony_ci } else { /* set current iomux offset */ 34423d0407baSopenharmony_ci iom->offset = 34433d0407baSopenharmony_ci ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) ? pmu_offs : grf_offs; 34443d0407baSopenharmony_ci } 34453d0407baSopenharmony_ci 34463d0407baSopenharmony_ci /* preset drv offset value, set new start value */ 34473d0407baSopenharmony_ci if (drv->offset >= 0) { 34483d0407baSopenharmony_ci if (iom->type & IOMUX_SOURCE_PMU) { 34493d0407baSopenharmony_ci drv_pmu_offs = drv->offset; 34503d0407baSopenharmony_ci } else { 34513d0407baSopenharmony_ci drv_grf_offs = drv->offset; 34523d0407baSopenharmony_ci } 34533d0407baSopenharmony_ci } else { /* set current drv offset */ 34543d0407baSopenharmony_ci drv->offset = (iom->type & IOMUX_SOURCE_PMU) ? drv_pmu_offs : drv_grf_offs; 34553d0407baSopenharmony_ci } 34563d0407baSopenharmony_ci 34573d0407baSopenharmony_ci dev_dbg(d->dev, "bank %d, iomux %d has iom_offset 0x%x drv_offset 0x%x\n", i, j, iom->offset, drv->offset); 34583d0407baSopenharmony_ci 34593d0407baSopenharmony_ci /* 34603d0407baSopenharmony_ci * Increase offset according to iomux width. 34613d0407baSopenharmony_ci * 4bit iomux'es are spread over two registers. 34623d0407baSopenharmony_ci */ 34633d0407baSopenharmony_ci inc = (iom->type & (IOMUX_WIDTH_4BIT | IOMUX_WIDTH_3BIT | IOMUX_WIDTH_2BIT)) ? PINCTRL_ROCKCHIP_EIGHT 34643d0407baSopenharmony_ci : PINCTRL_ROCKCHIP_FOUR; 34653d0407baSopenharmony_ci if ((iom->type & IOMUX_SOURCE_PMU) || (iom->type & IOMUX_L_SOURCE_PMU)) { 34663d0407baSopenharmony_ci pmu_offs += inc; 34673d0407baSopenharmony_ci } else { 34683d0407baSopenharmony_ci grf_offs += inc; 34693d0407baSopenharmony_ci } 34703d0407baSopenharmony_ci 34713d0407baSopenharmony_ci /* 34723d0407baSopenharmony_ci * Increase offset according to drv width. 34733d0407baSopenharmony_ci * 3bit drive-strenth'es are spread over two registers. 34743d0407baSopenharmony_ci */ 34753d0407baSopenharmony_ci if ((drv->drv_type == DRV_TYPE_IO_1V8_3V0_AUTO) || (drv->drv_type == DRV_TYPE_IO_3V3_ONLY)) { 34763d0407baSopenharmony_ci inc = PINCTRL_ROCKCHIP_EIGHT; 34773d0407baSopenharmony_ci } else { 34783d0407baSopenharmony_ci inc = PINCTRL_ROCKCHIP_FOUR; 34793d0407baSopenharmony_ci } 34803d0407baSopenharmony_ci 34813d0407baSopenharmony_ci if (iom->type & IOMUX_SOURCE_PMU) { 34823d0407baSopenharmony_ci drv_pmu_offs += inc; 34833d0407baSopenharmony_ci } else { 34843d0407baSopenharmony_ci drv_grf_offs += inc; 34853d0407baSopenharmony_ci } 34863d0407baSopenharmony_ci 34873d0407baSopenharmony_ci bank_pins += PINCTRL_ROCKCHIP_EIGHT; 34883d0407baSopenharmony_ci } 34893d0407baSopenharmony_ci 34903d0407baSopenharmony_ci /* calculate the per-bank recalced_mask */ 34913d0407baSopenharmony_ci for (j = 0; j < ctrl->niomux_recalced; j++) { 34923d0407baSopenharmony_ci int pin = 0; 34933d0407baSopenharmony_ci 34943d0407baSopenharmony_ci if (ctrl->iomux_recalced[j].num == bank->bank_num) { 34953d0407baSopenharmony_ci pin = ctrl->iomux_recalced[j].pin; 34963d0407baSopenharmony_ci bank->recalced_mask |= BIT(pin); 34973d0407baSopenharmony_ci } 34983d0407baSopenharmony_ci } 34993d0407baSopenharmony_ci 35003d0407baSopenharmony_ci /* calculate the per-bank route_mask */ 35013d0407baSopenharmony_ci for (j = 0; j < ctrl->niomux_routes; j++) { 35023d0407baSopenharmony_ci int pin = 0; 35033d0407baSopenharmony_ci 35043d0407baSopenharmony_ci if (ctrl->iomux_routes[j].bank_num == bank->bank_num) { 35053d0407baSopenharmony_ci pin = ctrl->iomux_routes[j].pin; 35063d0407baSopenharmony_ci bank->route_mask |= BIT(pin); 35073d0407baSopenharmony_ci } 35083d0407baSopenharmony_ci } 35093d0407baSopenharmony_ci } 35103d0407baSopenharmony_ci 35113d0407baSopenharmony_ci return ctrl; 35123d0407baSopenharmony_ci} 35133d0407baSopenharmony_ci 35143d0407baSopenharmony_ci#define RK3288_GRF_GPIO6C_IOMUX 0x64 35153d0407baSopenharmony_ci#define GPIO6C6_SEL_WRITE_ENABLE BIT(28) 35163d0407baSopenharmony_ci 35173d0407baSopenharmony_cistatic u32 rk3288_grf_gpio6c_iomux; 35183d0407baSopenharmony_ci 35193d0407baSopenharmony_cistatic int __maybe_unused rockchip_pinctrl_suspend(struct device *dev) 35203d0407baSopenharmony_ci{ 35213d0407baSopenharmony_ci struct rockchip_pinctrl *info = dev_get_drvdata(dev); 35223d0407baSopenharmony_ci int ret = pinctrl_force_sleep(info->pctl_dev); 35233d0407baSopenharmony_ci 35243d0407baSopenharmony_ci if (ret) { 35253d0407baSopenharmony_ci return ret; 35263d0407baSopenharmony_ci } 35273d0407baSopenharmony_ci 35283d0407baSopenharmony_ci /* 35293d0407baSopenharmony_ci * RK3288 GPIO6_C6 mux would be modified by Maskrom when resume, so save 35303d0407baSopenharmony_ci * the setting here, and restore it at resume. 35313d0407baSopenharmony_ci */ 35323d0407baSopenharmony_ci if (info->ctrl->type == RK3288) { 35333d0407baSopenharmony_ci ret = regmap_read(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, &rk3288_grf_gpio6c_iomux); 35343d0407baSopenharmony_ci if (ret) { 35353d0407baSopenharmony_ci pinctrl_force_default(info->pctl_dev); 35363d0407baSopenharmony_ci return ret; 35373d0407baSopenharmony_ci } 35383d0407baSopenharmony_ci } 35393d0407baSopenharmony_ci 35403d0407baSopenharmony_ci return 0; 35413d0407baSopenharmony_ci} 35423d0407baSopenharmony_ci 35433d0407baSopenharmony_cistatic int __maybe_unused rockchip_pinctrl_resume(struct device *dev) 35443d0407baSopenharmony_ci{ 35453d0407baSopenharmony_ci struct rockchip_pinctrl *info = dev_get_drvdata(dev); 35463d0407baSopenharmony_ci int ret; 35473d0407baSopenharmony_ci 35483d0407baSopenharmony_ci if (info->ctrl->type == RK3288) { 35493d0407baSopenharmony_ci ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, 35503d0407baSopenharmony_ci rk3288_grf_gpio6c_iomux | GPIO6C6_SEL_WRITE_ENABLE); 35513d0407baSopenharmony_ci if (ret) { 35523d0407baSopenharmony_ci return ret; 35533d0407baSopenharmony_ci } 35543d0407baSopenharmony_ci } 35553d0407baSopenharmony_ci 35563d0407baSopenharmony_ci return pinctrl_force_default(info->pctl_dev); 35573d0407baSopenharmony_ci} 35583d0407baSopenharmony_ci 35593d0407baSopenharmony_cistatic SIMPLE_DEV_PM_OPS(rockchip_pinctrl_dev_pm_ops, rockchip_pinctrl_suspend, rockchip_pinctrl_resume); 35603d0407baSopenharmony_ci 35613d0407baSopenharmony_ci/* SoC data specially handle */ 35623d0407baSopenharmony_ci 35633d0407baSopenharmony_ci/* rk3308 SoC data initialize */ 35643d0407baSopenharmony_ci#define RK3308_GRF_SOC_CON13 0x608 35653d0407baSopenharmony_ci#define RK3308_GRF_SOC_CON15 0x610 35663d0407baSopenharmony_ci 35673d0407baSopenharmony_ci/* RK3308_GRF_SOC_CON13 */ 35683d0407baSopenharmony_ci#define RK3308_GRF_I2C3_IOFUNC_SRC_CTRL \ 35693d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_TEN) | BIT(PINCTRL_ROCKCHIP_TEN)) 35703d0407baSopenharmony_ci#define RK3308_GRF_GPIO2A3_SEL_SRC_CTRL \ 35713d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN) | BIT(PINCTRL_ROCKCHIP_SEVEN)) 35723d0407baSopenharmony_ci#define RK3308_GRF_GPIO2A2_SEL_SRC_CTRL \ 35733d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | BIT(PINCTRL_ROCKCHIP_THREE)) 35743d0407baSopenharmony_ci 35753d0407baSopenharmony_ci/* RK3308_GRF_SOC_CON15 */ 35763d0407baSopenharmony_ci#define RK3308_GRF_GPIO2C0_SEL_SRC_CTRL \ 35773d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_ELEVEN) | BIT(PINCTRL_ROCKCHIP_ELEVEN)) 35783d0407baSopenharmony_ci#define RK3308_GRF_GPIO3B3_SEL_SRC_CTRL \ 35793d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_SEVEN) | BIT(PINCTRL_ROCKCHIP_SEVEN)) 35803d0407baSopenharmony_ci#define RK3308_GRF_GPIO3B2_SEL_SRC_CTRL \ 35813d0407baSopenharmony_ci (BIT(PINCTRL_ROCKCHIP_SIXTEEN + PINCTRL_ROCKCHIP_THREE) | BIT(PINCTRL_ROCKCHIP_THREE)) 35823d0407baSopenharmony_ci 35833d0407baSopenharmony_cistatic int rk3308_soc_data_init(struct rockchip_pinctrl *info) 35843d0407baSopenharmony_ci{ 35853d0407baSopenharmony_ci int ret; 35863d0407baSopenharmony_ci 35873d0407baSopenharmony_ci /* 35883d0407baSopenharmony_ci * Enable the special ctrl of selected sources. 35893d0407baSopenharmony_ci */ 35903d0407baSopenharmony_ci 35913d0407baSopenharmony_ci ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON13, 35923d0407baSopenharmony_ci RK3308_GRF_I2C3_IOFUNC_SRC_CTRL | RK3308_GRF_GPIO2A3_SEL_SRC_CTRL | 35933d0407baSopenharmony_ci RK3308_GRF_GPIO2A2_SEL_SRC_CTRL); 35943d0407baSopenharmony_ci if (ret) { 35953d0407baSopenharmony_ci return ret; 35963d0407baSopenharmony_ci } 35973d0407baSopenharmony_ci 35983d0407baSopenharmony_ci ret = regmap_write(info->regmap_base, RK3308_GRF_SOC_CON15, 35993d0407baSopenharmony_ci RK3308_GRF_GPIO2C0_SEL_SRC_CTRL | RK3308_GRF_GPIO3B3_SEL_SRC_CTRL | 36003d0407baSopenharmony_ci RK3308_GRF_GPIO3B2_SEL_SRC_CTRL); 36013d0407baSopenharmony_ci 36023d0407baSopenharmony_ci return ret; 36033d0407baSopenharmony_ci} 36043d0407baSopenharmony_ci 36053d0407baSopenharmony_cistatic int rockchip_pinctrl_probe(struct platform_device *pdev) 36063d0407baSopenharmony_ci{ 36073d0407baSopenharmony_ci struct rockchip_pinctrl *info; 36083d0407baSopenharmony_ci struct device *dev = &pdev->dev; 36093d0407baSopenharmony_ci struct rockchip_pin_ctrl *ctrl; 36103d0407baSopenharmony_ci struct device_node *np = pdev->dev.of_node, *node; 36113d0407baSopenharmony_ci struct resource *res; 36123d0407baSopenharmony_ci void __iomem *base; 36133d0407baSopenharmony_ci int ret; 36143d0407baSopenharmony_ci 36153d0407baSopenharmony_ci if (!dev->of_node) { 36163d0407baSopenharmony_ci dev_err(dev, "device tree node not found\n"); 36173d0407baSopenharmony_ci return -ENODEV; 36183d0407baSopenharmony_ci } 36193d0407baSopenharmony_ci 36203d0407baSopenharmony_ci info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); 36213d0407baSopenharmony_ci if (!info) { 36223d0407baSopenharmony_ci return -ENOMEM; 36233d0407baSopenharmony_ci } 36243d0407baSopenharmony_ci 36253d0407baSopenharmony_ci info->dev = dev; 36263d0407baSopenharmony_ci 36273d0407baSopenharmony_ci ctrl = rockchip_pinctrl_get_soc_data(info, pdev); 36283d0407baSopenharmony_ci if (!ctrl) { 36293d0407baSopenharmony_ci dev_err(dev, "driver data not available\n"); 36303d0407baSopenharmony_ci return -EINVAL; 36313d0407baSopenharmony_ci } 36323d0407baSopenharmony_ci info->ctrl = ctrl; 36333d0407baSopenharmony_ci 36343d0407baSopenharmony_ci node = of_parse_phandle(np, "rockchip,grf", 0); 36353d0407baSopenharmony_ci if (node) { 36363d0407baSopenharmony_ci info->regmap_base = syscon_node_to_regmap(node); 36373d0407baSopenharmony_ci of_node_put(node); 36383d0407baSopenharmony_ci if (IS_ERR(info->regmap_base)) { 36393d0407baSopenharmony_ci return PTR_ERR(info->regmap_base); 36403d0407baSopenharmony_ci } 36413d0407baSopenharmony_ci } else { 36423d0407baSopenharmony_ci res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 36433d0407baSopenharmony_ci base = devm_ioremap_resource(&pdev->dev, res); 36443d0407baSopenharmony_ci if (IS_ERR(base)) { 36453d0407baSopenharmony_ci return PTR_ERR(base); 36463d0407baSopenharmony_ci } 36473d0407baSopenharmony_ci 36483d0407baSopenharmony_ci rockchip_regmap_config.max_register = resource_size(res) - PINCTRL_ROCKCHIP_FOUR; 36493d0407baSopenharmony_ci rockchip_regmap_config.name = "rockchip,pinctrl"; 36503d0407baSopenharmony_ci info->regmap_base = devm_regmap_init_mmio(&pdev->dev, base, &rockchip_regmap_config); 36513d0407baSopenharmony_ci 36523d0407baSopenharmony_ci /* to check for the old dt-bindings */ 36533d0407baSopenharmony_ci info->reg_size = resource_size(res); 36543d0407baSopenharmony_ci 36553d0407baSopenharmony_ci /* Honor the old binding, with pull registers as 2nd resource */ 36563d0407baSopenharmony_ci if (ctrl->type == RK3188 && info->reg_size < 0x200) { 36573d0407baSopenharmony_ci res = platform_get_resource(pdev, IORESOURCE_MEM, PINCTRL_ROCKCHIP_ONE); 36583d0407baSopenharmony_ci base = devm_ioremap_resource(&pdev->dev, res); 36593d0407baSopenharmony_ci if (IS_ERR(base)) { 36603d0407baSopenharmony_ci return PTR_ERR(base); 36613d0407baSopenharmony_ci } 36623d0407baSopenharmony_ci 36633d0407baSopenharmony_ci rockchip_regmap_config.max_register = resource_size(res) - PINCTRL_ROCKCHIP_FOUR; 36643d0407baSopenharmony_ci rockchip_regmap_config.name = "rockchip,pinctrl-pull"; 36653d0407baSopenharmony_ci info->regmap_pull = devm_regmap_init_mmio(&pdev->dev, base, &rockchip_regmap_config); 36663d0407baSopenharmony_ci } 36673d0407baSopenharmony_ci } 36683d0407baSopenharmony_ci 36693d0407baSopenharmony_ci /* try to find the optional reference to the pmu syscon */ 36703d0407baSopenharmony_ci node = of_parse_phandle(np, "rockchip,pmu", 0); 36713d0407baSopenharmony_ci if (node) { 36723d0407baSopenharmony_ci info->regmap_pmu = syscon_node_to_regmap(node); 36733d0407baSopenharmony_ci of_node_put(node); 36743d0407baSopenharmony_ci if (IS_ERR(info->regmap_pmu)) { 36753d0407baSopenharmony_ci return PTR_ERR(info->regmap_pmu); 36763d0407baSopenharmony_ci } 36773d0407baSopenharmony_ci } 36783d0407baSopenharmony_ci 36793d0407baSopenharmony_ci /* Special handle for some Socs */ 36803d0407baSopenharmony_ci if (ctrl->soc_data_init) { 36813d0407baSopenharmony_ci ret = ctrl->soc_data_init(info); 36823d0407baSopenharmony_ci if (ret) { 36833d0407baSopenharmony_ci return ret; 36843d0407baSopenharmony_ci } 36853d0407baSopenharmony_ci } 36863d0407baSopenharmony_ci 36873d0407baSopenharmony_ci ret = rockchip_pinctrl_register(pdev, info); 36883d0407baSopenharmony_ci if (ret) { 36893d0407baSopenharmony_ci return ret; 36903d0407baSopenharmony_ci } 36913d0407baSopenharmony_ci 36923d0407baSopenharmony_ci platform_set_drvdata(pdev, info); 36933d0407baSopenharmony_ci 36943d0407baSopenharmony_ci ret = of_platform_populate(np, rockchip_bank_match, NULL, NULL); 36953d0407baSopenharmony_ci if (ret) { 36963d0407baSopenharmony_ci dev_err(&pdev->dev, "failed to register gpio device\n"); 36973d0407baSopenharmony_ci return ret; 36983d0407baSopenharmony_ci } 36993d0407baSopenharmony_ci dev_info(dev, "probed %s\n", dev_name(dev)); 37003d0407baSopenharmony_ci 37013d0407baSopenharmony_ci return 0; 37023d0407baSopenharmony_ci} 37033d0407baSopenharmony_ci 37043d0407baSopenharmony_cistatic struct rockchip_pin_bank px30_pin_banks[] = { 37053d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, 37063d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU), 37073d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37083d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37093d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37103d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37113d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_4BIT, 37123d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37133d0407baSopenharmony_ci}; 37143d0407baSopenharmony_ci 37153d0407baSopenharmony_cistatic struct rockchip_pin_ctrl px30_pin_ctrl = { 37163d0407baSopenharmony_ci .pin_banks = px30_pin_banks, 37173d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(px30_pin_banks), 37183d0407baSopenharmony_ci .label = "PX30-GPIO", 37193d0407baSopenharmony_ci .type = PX30, 37203d0407baSopenharmony_ci .grf_mux_offset = 0x0, 37213d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 37223d0407baSopenharmony_ci .iomux_routes = px30_mux_route_data, 37233d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(px30_mux_route_data), 37243d0407baSopenharmony_ci .pull_calc_reg = px30_calc_pull_reg_and_bit, 37253d0407baSopenharmony_ci .drv_calc_reg = px30_calc_drv_reg_and_bit, 37263d0407baSopenharmony_ci .schmitt_calc_reg = px30_calc_schmitt_reg_and_bit, 37273d0407baSopenharmony_ci .slew_rate_calc_reg = px30_calc_slew_rate_reg_and_bit, 37283d0407baSopenharmony_ci}; 37293d0407baSopenharmony_ci 37303d0407baSopenharmony_cistatic struct rockchip_pin_bank rv1108_pin_banks[] = { 37313d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, 37323d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU), 37333d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", 0, 0, 0, 0), 37343d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", 0, 0, 0, 0), 37353d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", 0, 0, 0, 0), 37363d0407baSopenharmony_ci}; 37373d0407baSopenharmony_ci 37383d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rv1108_pin_ctrl = { 37393d0407baSopenharmony_ci .pin_banks = rv1108_pin_banks, 37403d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rv1108_pin_banks), 37413d0407baSopenharmony_ci .label = "RV1108-GPIO", 37423d0407baSopenharmony_ci .type = RV1108, 37433d0407baSopenharmony_ci .grf_mux_offset = 0x10, 37443d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 37453d0407baSopenharmony_ci .iomux_recalced = rv1108_mux_recalced_data, 37463d0407baSopenharmony_ci .niomux_recalced = ARRAY_SIZE(rv1108_mux_recalced_data), 37473d0407baSopenharmony_ci .pull_calc_reg = rv1108_calc_pull_reg_and_bit, 37483d0407baSopenharmony_ci .drv_calc_reg = rv1108_calc_drv_reg_and_bit, 37493d0407baSopenharmony_ci .schmitt_calc_reg = rv1108_calc_schmitt_reg_and_bit, 37503d0407baSopenharmony_ci}; 37513d0407baSopenharmony_ci 37523d0407baSopenharmony_cistatic struct rockchip_pin_bank rv1126_pin_banks[] = { 37533d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", 37543d0407baSopenharmony_ci IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, IOMUX_WIDTH_4BIT | IOMUX_SOURCE_PMU, 37553d0407baSopenharmony_ci IOMUX_WIDTH_4BIT | IOMUX_L_SOURCE_PMU, IOMUX_WIDTH_4BIT), 37563d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS_OFFSET(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_WIDTH_4BIT, 37573d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 0x10010, 0x10018, 0x10020, 37583d0407baSopenharmony_ci 0x10028), 37593d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37603d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37613d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_4BIT, 37623d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37633d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_TWO, "gpio4", IOMUX_WIDTH_4BIT, 0, 0, 0), 37643d0407baSopenharmony_ci}; 37653d0407baSopenharmony_ci 37663d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rv1126_pin_ctrl = { 37673d0407baSopenharmony_ci .pin_banks = rv1126_pin_banks, 37683d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rv1126_pin_banks), 37693d0407baSopenharmony_ci .label = "RV1126-GPIO", 37703d0407baSopenharmony_ci .type = RV1126, 37713d0407baSopenharmony_ci .grf_mux_offset = 0x10004, /* mux offset from GPIO0_D0 */ 37723d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 37733d0407baSopenharmony_ci .iomux_routes = rv1126_mux_route_data, 37743d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rv1126_mux_route_data), 37753d0407baSopenharmony_ci .iomux_recalced = rv1126_mux_recalced_data, 37763d0407baSopenharmony_ci .niomux_recalced = ARRAY_SIZE(rv1126_mux_recalced_data), 37773d0407baSopenharmony_ci .pull_calc_reg = rv1126_calc_pull_reg_and_bit, 37783d0407baSopenharmony_ci .drv_calc_reg = rv1126_calc_drv_reg_and_bit, 37793d0407baSopenharmony_ci .schmitt_calc_reg = rv1126_calc_schmitt_reg_and_bit, 37803d0407baSopenharmony_ci}; 37813d0407baSopenharmony_ci 37823d0407baSopenharmony_cistatic struct rockchip_pin_bank rk1808_pin_banks[] = { 37833d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, 37843d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU), 37853d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37863d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37873d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37883d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37893d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_4BIT, 37903d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37913d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 37923d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 37933d0407baSopenharmony_ci}; 37943d0407baSopenharmony_ci 37953d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk1808_pin_ctrl = { 37963d0407baSopenharmony_ci .pin_banks = rk1808_pin_banks, 37973d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk1808_pin_banks), 37983d0407baSopenharmony_ci .label = "RK1808-GPIO", 37993d0407baSopenharmony_ci .type = RK1808, 38003d0407baSopenharmony_ci .iomux_routes = rk1808_mux_route_data, 38013d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk1808_mux_route_data), 38023d0407baSopenharmony_ci .grf_mux_offset = 0x0, 38033d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 38043d0407baSopenharmony_ci .pull_calc_reg = rk1808_calc_pull_reg_and_bit, 38053d0407baSopenharmony_ci .drv_calc_reg = rk1808_calc_drv_reg_and_bit, 38063d0407baSopenharmony_ci .schmitt_calc_reg = rk1808_calc_schmitt_reg_and_bit, 38073d0407baSopenharmony_ci .slew_rate_calc_reg = rk1808_calc_slew_rate_reg_and_bit, 38083d0407baSopenharmony_ci}; 38093d0407baSopenharmony_ci 38103d0407baSopenharmony_cistatic struct rockchip_pin_bank rk2928_pin_banks[] = { 38113d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 38123d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38133d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38143d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 38153d0407baSopenharmony_ci}; 38163d0407baSopenharmony_ci 38173d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk2928_pin_ctrl = { 38183d0407baSopenharmony_ci .pin_banks = rk2928_pin_banks, 38193d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 38203d0407baSopenharmony_ci .label = "RK2928-GPIO", 38213d0407baSopenharmony_ci .type = RK2928, 38223d0407baSopenharmony_ci .grf_mux_offset = 0xa8, 38233d0407baSopenharmony_ci .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 38243d0407baSopenharmony_ci}; 38253d0407baSopenharmony_ci 38263d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3036_pin_banks[] = { 38273d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 38283d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38293d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38303d0407baSopenharmony_ci}; 38313d0407baSopenharmony_ci 38323d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3036_pin_ctrl = { 38333d0407baSopenharmony_ci .pin_banks = rk3036_pin_banks, 38343d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3036_pin_banks), 38353d0407baSopenharmony_ci .label = "RK3036-GPIO", 38363d0407baSopenharmony_ci .type = RK2928, 38373d0407baSopenharmony_ci .grf_mux_offset = 0xa8, 38383d0407baSopenharmony_ci .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 38393d0407baSopenharmony_ci}; 38403d0407baSopenharmony_ci 38413d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3066a_pin_banks[] = { 38423d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 38433d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38443d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38453d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 38463d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4"), 38473d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_SIXTEEN, "gpio6"), 38483d0407baSopenharmony_ci}; 38493d0407baSopenharmony_ci 38503d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3066a_pin_ctrl = { 38513d0407baSopenharmony_ci .pin_banks = rk3066a_pin_banks, 38523d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 38533d0407baSopenharmony_ci .label = "RK3066a-GPIO", 38543d0407baSopenharmony_ci .type = RK2928, 38553d0407baSopenharmony_ci .grf_mux_offset = 0xa8, 38563d0407baSopenharmony_ci .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 38573d0407baSopenharmony_ci}; 38583d0407baSopenharmony_ci 38593d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3066b_pin_banks[] = { 38603d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 38613d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38623d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38633d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 38643d0407baSopenharmony_ci}; 38653d0407baSopenharmony_ci 38663d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3066b_pin_ctrl = { 38673d0407baSopenharmony_ci .pin_banks = rk3066b_pin_banks, 38683d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 38693d0407baSopenharmony_ci .label = "RK3066b-GPIO", 38703d0407baSopenharmony_ci .type = RK3066B, 38713d0407baSopenharmony_ci .grf_mux_offset = 0x60, 38723d0407baSopenharmony_ci}; 38733d0407baSopenharmony_ci 38743d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3128_pin_banks[] = { 38753d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 38763d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38773d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38783d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 38793d0407baSopenharmony_ci}; 38803d0407baSopenharmony_ci 38813d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3128_pin_ctrl = { 38823d0407baSopenharmony_ci .pin_banks = rk3128_pin_banks, 38833d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3128_pin_banks), 38843d0407baSopenharmony_ci .label = "RK3128-GPIO", 38853d0407baSopenharmony_ci .type = RK3128, 38863d0407baSopenharmony_ci .grf_mux_offset = 0xa8, 38873d0407baSopenharmony_ci .iomux_recalced = rk3128_mux_recalced_data, 38883d0407baSopenharmony_ci .niomux_recalced = ARRAY_SIZE(rk3128_mux_recalced_data), 38893d0407baSopenharmony_ci .iomux_routes = rk3128_mux_route_data, 38903d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3128_mux_route_data), 38913d0407baSopenharmony_ci .pull_calc_reg = rk3128_calc_pull_reg_and_bit, 38923d0407baSopenharmony_ci}; 38933d0407baSopenharmony_ci 38943d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3188_pin_banks[] = { 38953d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_GPIO_ONLY, 0, 0, 0), 38963d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 38973d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 38983d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 38993d0407baSopenharmony_ci}; 39003d0407baSopenharmony_ci 39013d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3188_pin_ctrl = { 39023d0407baSopenharmony_ci .pin_banks = rk3188_pin_banks, 39033d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 39043d0407baSopenharmony_ci .label = "RK3188-GPIO", 39053d0407baSopenharmony_ci .type = RK3188, 39063d0407baSopenharmony_ci .grf_mux_offset = 0x60, 39073d0407baSopenharmony_ci .iomux_routes = rk3188_mux_route_data, 39083d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3188_mux_route_data), 39093d0407baSopenharmony_ci .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 39103d0407baSopenharmony_ci}; 39113d0407baSopenharmony_ci 39123d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3228_pin_banks[] = { 39133d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0"), 39143d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 39153d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 39163d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 39173d0407baSopenharmony_ci}; 39183d0407baSopenharmony_ci 39193d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3228_pin_ctrl = { 39203d0407baSopenharmony_ci .pin_banks = rk3228_pin_banks, 39213d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3228_pin_banks), 39223d0407baSopenharmony_ci .label = "RK3228-GPIO", 39233d0407baSopenharmony_ci .type = RK3288, 39243d0407baSopenharmony_ci .grf_mux_offset = 0x0, 39253d0407baSopenharmony_ci .iomux_routes = rk3228_mux_route_data, 39263d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3228_mux_route_data), 39273d0407baSopenharmony_ci .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 39283d0407baSopenharmony_ci .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 39293d0407baSopenharmony_ci}; 39303d0407baSopenharmony_ci 39313d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3288_pin_banks[] = { 39323d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_TWENTYFOUR, "gpio0", 39333d0407baSopenharmony_ci IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, 39343d0407baSopenharmony_ci IOMUX_SOURCE_PMU | IOMUX_WRITABLE_32BIT, IOMUX_UNROUTED), 39353d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_UNROUTED, IOMUX_UNROUTED, 39363d0407baSopenharmony_ci IOMUX_UNROUTED, 0), 39373d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", 0, 0, 0, IOMUX_UNROUTED), 39383d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", 0, 0, 0, IOMUX_WIDTH_4BIT), 39393d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 39403d0407baSopenharmony_ci 0, 0), 39413d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FIVE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio5", IOMUX_UNROUTED, 0, 0, 39423d0407baSopenharmony_ci IOMUX_UNROUTED), 39433d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_SIX, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio6", 0, 0, 0, IOMUX_UNROUTED), 39443d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(7, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio7", 0, 0, IOMUX_WIDTH_4BIT, IOMUX_UNROUTED), 39453d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_EIGHT, PINCTRL_ROCKCHIP_SIXTEEN, "gpio8"), 39463d0407baSopenharmony_ci}; 39473d0407baSopenharmony_ci 39483d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3288_pin_ctrl = { 39493d0407baSopenharmony_ci .pin_banks = rk3288_pin_banks, 39503d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3288_pin_banks), 39513d0407baSopenharmony_ci .label = "RK3288-GPIO", 39523d0407baSopenharmony_ci .type = RK3288, 39533d0407baSopenharmony_ci .grf_mux_offset = 0x0, 39543d0407baSopenharmony_ci .pmu_mux_offset = 0x84, 39553d0407baSopenharmony_ci .iomux_routes = rk3288_mux_route_data, 39563d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3288_mux_route_data), 39573d0407baSopenharmony_ci .pull_calc_reg = rk3288_calc_pull_reg_and_bit, 39583d0407baSopenharmony_ci .drv_calc_reg = rk3288_calc_drv_reg_and_bit, 39593d0407baSopenharmony_ci}; 39603d0407baSopenharmony_ci 39613d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3308_pin_banks[] = { 39623d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, 39633d0407baSopenharmony_ci IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT), 39643d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, 39653d0407baSopenharmony_ci IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT), 39663d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, 39673d0407baSopenharmony_ci IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT), 39683d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_2BIT, 39693d0407baSopenharmony_ci IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT), 39703d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4", IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT, 39713d0407baSopenharmony_ci IOMUX_WIDTH_2BIT, IOMUX_WIDTH_2BIT), 39723d0407baSopenharmony_ci}; 39733d0407baSopenharmony_ci 39743d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3308_pin_ctrl = { 39753d0407baSopenharmony_ci .pin_banks = rk3308_pin_banks, 39763d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3308_pin_banks), 39773d0407baSopenharmony_ci .label = "RK3308-GPIO", 39783d0407baSopenharmony_ci .type = RK3308, 39793d0407baSopenharmony_ci .grf_mux_offset = 0x0, 39803d0407baSopenharmony_ci .iomux_recalced = rk3308_mux_recalced_data, 39813d0407baSopenharmony_ci .niomux_recalced = ARRAY_SIZE(rk3308_mux_recalced_data), 39823d0407baSopenharmony_ci .iomux_routes = rk3308_mux_route_data, 39833d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3308_mux_route_data), 39843d0407baSopenharmony_ci .soc_data_init = rk3308_soc_data_init, 39853d0407baSopenharmony_ci .pull_calc_reg = rk3308_calc_pull_reg_and_bit, 39863d0407baSopenharmony_ci .drv_calc_reg = rk3308_calc_drv_reg_and_bit, 39873d0407baSopenharmony_ci .schmitt_calc_reg = rk3308_calc_schmitt_reg_and_bit, 39883d0407baSopenharmony_ci}; 39893d0407baSopenharmony_ci 39903d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3328_pin_banks[] = { 39913d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", 0, 0, 0, 0), 39923d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", 0, 0, 0, 0), 39933d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", 0, IOMUX_WIDTH_3BIT, 39943d0407baSopenharmony_ci IOMUX_WIDTH_3BIT, 0), 39953d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_3BIT, 39963d0407baSopenharmony_ci IOMUX_WIDTH_3BIT, 0, 0), 39973d0407baSopenharmony_ci}; 39983d0407baSopenharmony_ci 39993d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3328_pin_ctrl = { 40003d0407baSopenharmony_ci .pin_banks = rk3328_pin_banks, 40013d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3328_pin_banks), 40023d0407baSopenharmony_ci .label = "RK3328-GPIO", 40033d0407baSopenharmony_ci .type = RK3288, 40043d0407baSopenharmony_ci .grf_mux_offset = 0x0, 40053d0407baSopenharmony_ci .iomux_recalced = rk3328_mux_recalced_data, 40063d0407baSopenharmony_ci .niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data), 40073d0407baSopenharmony_ci .iomux_routes = rk3328_mux_route_data, 40083d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3328_mux_route_data), 40093d0407baSopenharmony_ci .pull_calc_reg = rk3228_calc_pull_reg_and_bit, 40103d0407baSopenharmony_ci .drv_calc_reg = rk3228_calc_drv_reg_and_bit, 40113d0407baSopenharmony_ci .schmitt_calc_reg = rk3328_calc_schmitt_reg_and_bit, 40123d0407baSopenharmony_ci}; 40133d0407baSopenharmony_ci 40143d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3368_pin_banks[] = { 40153d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, 40163d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU), 40173d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1"), 40183d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2"), 40193d0407baSopenharmony_ci PIN_BANK(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3"), 40203d0407baSopenharmony_ci}; 40213d0407baSopenharmony_ci 40223d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3368_pin_ctrl = { 40233d0407baSopenharmony_ci .pin_banks = rk3368_pin_banks, 40243d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3368_pin_banks), 40253d0407baSopenharmony_ci .label = "RK3368-GPIO", 40263d0407baSopenharmony_ci .type = RK3368, 40273d0407baSopenharmony_ci .grf_mux_offset = 0x0, 40283d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 40293d0407baSopenharmony_ci .pull_calc_reg = rk3368_calc_pull_reg_and_bit, 40303d0407baSopenharmony_ci .drv_calc_reg = rk3368_calc_drv_reg_and_bit, 40313d0407baSopenharmony_ci}; 40323d0407baSopenharmony_ci 40333d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3399_pin_banks[] = { 40343d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS_DRV_FLAGS_OFFSET_PULL_FLAGS( 40353d0407baSopenharmony_ci PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, 40363d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, DRV_TYPE_IO_1V8_ONLY, DRV_TYPE_IO_1V8_ONLY, DRV_TYPE_IO_DEFAULT, 40373d0407baSopenharmony_ci DRV_TYPE_IO_DEFAULT, 0x80, 0x88, -1, -1, PULL_TYPE_IO_1V8_ONLY, PULL_TYPE_IO_1V8_ONLY, PULL_TYPE_IO_DEFAULT, 40383d0407baSopenharmony_ci PULL_TYPE_IO_DEFAULT), 40393d0407baSopenharmony_ci PIN_BANK_IOMUX_DRV_FLAGS_OFFSET(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_SOURCE_PMU, 40403d0407baSopenharmony_ci IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU, DRV_TYPE_IO_1V8_OR_3V0, 40413d0407baSopenharmony_ci DRV_TYPE_IO_1V8_OR_3V0, DRV_TYPE_IO_1V8_OR_3V0, DRV_TYPE_IO_1V8_OR_3V0, 0xa0, 0xa8, 40423d0407baSopenharmony_ci 0xb0, 0xb8), 40433d0407baSopenharmony_ci PIN_BANK_DRV_FLAGS_PULL_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", DRV_TYPE_IO_1V8_OR_3V0, 40443d0407baSopenharmony_ci DRV_TYPE_IO_1V8_OR_3V0, DRV_TYPE_IO_1V8_ONLY, DRV_TYPE_IO_1V8_ONLY, 40453d0407baSopenharmony_ci PULL_TYPE_IO_DEFAULT, PULL_TYPE_IO_DEFAULT, PULL_TYPE_IO_1V8_ONLY, 40463d0407baSopenharmony_ci PULL_TYPE_IO_1V8_ONLY), 40473d0407baSopenharmony_ci PIN_BANK_DRV_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", DRV_TYPE_IO_3V3_ONLY, 40483d0407baSopenharmony_ci DRV_TYPE_IO_3V3_ONLY, DRV_TYPE_IO_3V3_ONLY, DRV_TYPE_IO_1V8_OR_3V0), 40493d0407baSopenharmony_ci PIN_BANK_DRV_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4", DRV_TYPE_IO_1V8_OR_3V0, 40503d0407baSopenharmony_ci DRV_TYPE_IO_1V8_3V0_AUTO, DRV_TYPE_IO_1V8_OR_3V0, DRV_TYPE_IO_1V8_OR_3V0), 40513d0407baSopenharmony_ci}; 40523d0407baSopenharmony_ci 40533d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3399_pin_ctrl = { 40543d0407baSopenharmony_ci .pin_banks = rk3399_pin_banks, 40553d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3399_pin_banks), 40563d0407baSopenharmony_ci .label = "RK3399-GPIO", 40573d0407baSopenharmony_ci .type = RK3399, 40583d0407baSopenharmony_ci .grf_mux_offset = 0xe000, 40593d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 40603d0407baSopenharmony_ci .grf_drv_offset = 0xe100, 40613d0407baSopenharmony_ci .pmu_drv_offset = 0x80, 40623d0407baSopenharmony_ci .iomux_routes = rk3399_mux_route_data, 40633d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3399_mux_route_data), 40643d0407baSopenharmony_ci .pull_calc_reg = rk3399_calc_pull_reg_and_bit, 40653d0407baSopenharmony_ci .drv_calc_reg = rk3399_calc_drv_reg_and_bit, 40663d0407baSopenharmony_ci}; 40673d0407baSopenharmony_ci 40683d0407baSopenharmony_cistatic struct rockchip_pin_bank rk3568_pin_banks[] = { 40693d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ZERO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio0", 40703d0407baSopenharmony_ci IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, 40713d0407baSopenharmony_ci IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT), 40723d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_ONE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio1", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 40733d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 40743d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_TWO, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio2", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 40753d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 40763d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_THREE, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio3", IOMUX_WIDTH_4BIT, 40773d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 40783d0407baSopenharmony_ci PIN_BANK_IOMUX_FLAGS(PINCTRL_ROCKCHIP_FOUR, PINCTRL_ROCKCHIP_THIRTYTWO, "gpio4", IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT, 40793d0407baSopenharmony_ci IOMUX_WIDTH_4BIT, IOMUX_WIDTH_4BIT), 40803d0407baSopenharmony_ci}; 40813d0407baSopenharmony_ci 40823d0407baSopenharmony_cistatic struct rockchip_pin_ctrl rk3568_pin_ctrl = { 40833d0407baSopenharmony_ci .pin_banks = rk3568_pin_banks, 40843d0407baSopenharmony_ci .nr_banks = ARRAY_SIZE(rk3568_pin_banks), 40853d0407baSopenharmony_ci .label = "RK3568-GPIO", 40863d0407baSopenharmony_ci .type = RK3568, 40873d0407baSopenharmony_ci .grf_mux_offset = 0x0, 40883d0407baSopenharmony_ci .pmu_mux_offset = 0x0, 40893d0407baSopenharmony_ci .grf_drv_offset = 0x0200, 40903d0407baSopenharmony_ci .pmu_drv_offset = 0x0070, 40913d0407baSopenharmony_ci .iomux_routes = rk3568_mux_route_data, 40923d0407baSopenharmony_ci .niomux_routes = ARRAY_SIZE(rk3568_mux_route_data), 40933d0407baSopenharmony_ci .pull_calc_reg = rk3568_calc_pull_reg_and_bit, 40943d0407baSopenharmony_ci .drv_calc_reg = rk3568_calc_drv_reg_and_bit, 40953d0407baSopenharmony_ci .slew_rate_calc_reg = rk3568_calc_slew_rate_reg_and_bit, 40963d0407baSopenharmony_ci .schmitt_calc_reg = rk3568_calc_schmitt_reg_and_bit, 40973d0407baSopenharmony_ci}; 40983d0407baSopenharmony_ci 40993d0407baSopenharmony_cistatic const struct of_device_id rockchip_pinctrl_dt_match[] = { 41003d0407baSopenharmony_ci {.compatible = "rockchip,px30-pinctrl", .data = &px30_pin_ctrl}, 41013d0407baSopenharmony_ci {.compatible = "rockchip,rv1108-pinctrl", .data = &rv1108_pin_ctrl}, 41023d0407baSopenharmony_ci {.compatible = "rockchip,rv1126-pinctrl", .data = &rv1126_pin_ctrl}, 41033d0407baSopenharmony_ci {.compatible = "rockchip,rk1808-pinctrl", .data = &rk1808_pin_ctrl}, 41043d0407baSopenharmony_ci {.compatible = "rockchip,rk2928-pinctrl", .data = &rk2928_pin_ctrl}, 41053d0407baSopenharmony_ci {.compatible = "rockchip,rk3036-pinctrl", .data = &rk3036_pin_ctrl}, 41063d0407baSopenharmony_ci {.compatible = "rockchip,rk3066a-pinctrl", .data = &rk3066a_pin_ctrl}, 41073d0407baSopenharmony_ci {.compatible = "rockchip,rk3066b-pinctrl", .data = &rk3066b_pin_ctrl}, 41083d0407baSopenharmony_ci {.compatible = "rockchip,rk3128-pinctrl", .data = (void *)&rk3128_pin_ctrl}, 41093d0407baSopenharmony_ci {.compatible = "rockchip,rk3188-pinctrl", .data = &rk3188_pin_ctrl}, 41103d0407baSopenharmony_ci {.compatible = "rockchip,rk3228-pinctrl", .data = &rk3228_pin_ctrl}, 41113d0407baSopenharmony_ci {.compatible = "rockchip,rk3288-pinctrl", .data = &rk3288_pin_ctrl}, 41123d0407baSopenharmony_ci {.compatible = "rockchip,rk3308-pinctrl", .data = &rk3308_pin_ctrl}, 41133d0407baSopenharmony_ci {.compatible = "rockchip,rk3328-pinctrl", .data = &rk3328_pin_ctrl}, 41143d0407baSopenharmony_ci {.compatible = "rockchip,rk3368-pinctrl", .data = &rk3368_pin_ctrl}, 41153d0407baSopenharmony_ci {.compatible = "rockchip,rk3399-pinctrl", .data = &rk3399_pin_ctrl}, 41163d0407baSopenharmony_ci {.compatible = "rockchip,rk3568-pinctrl", .data = &rk3568_pin_ctrl}, 41173d0407baSopenharmony_ci {}, 41183d0407baSopenharmony_ci}; 41193d0407baSopenharmony_ci 41203d0407baSopenharmony_cistatic struct platform_driver rockchip_pinctrl_driver = { 41213d0407baSopenharmony_ci .probe = rockchip_pinctrl_probe, 41223d0407baSopenharmony_ci .driver = 41233d0407baSopenharmony_ci { 41243d0407baSopenharmony_ci .name = "rockchip-pinctrl", 41253d0407baSopenharmony_ci .pm = &rockchip_pinctrl_dev_pm_ops, 41263d0407baSopenharmony_ci .of_match_table = rockchip_pinctrl_dt_match, 41273d0407baSopenharmony_ci }, 41283d0407baSopenharmony_ci}; 41293d0407baSopenharmony_ci 41303d0407baSopenharmony_cistatic int __init rockchip_pinctrl_drv_register(void) 41313d0407baSopenharmony_ci{ 41323d0407baSopenharmony_ci return platform_driver_register(&rockchip_pinctrl_driver); 41333d0407baSopenharmony_ci} 41343d0407baSopenharmony_cipostcore_initcall(rockchip_pinctrl_drv_register); 41353d0407baSopenharmony_ci 41363d0407baSopenharmony_cistatic void __exit rockchip_pinctrl_drv_unregister(void) 41373d0407baSopenharmony_ci{ 41383d0407baSopenharmony_ci platform_driver_unregister(&rockchip_pinctrl_driver); 41393d0407baSopenharmony_ci} 41403d0407baSopenharmony_cimodule_exit(rockchip_pinctrl_drv_unregister); 41413d0407baSopenharmony_ci 41423d0407baSopenharmony_ciMODULE_DESCRIPTION("ROCKCHIP Pin Controller Driver"); 41433d0407baSopenharmony_ciMODULE_LICENSE("GPL"); 41443d0407baSopenharmony_ciMODULE_ALIAS("platform:pinctrl-rockchip"); 41453d0407baSopenharmony_ciMODULE_DEVICE_TABLE(of, rockchip_pinctrl_dt_match); 4146