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, &reg, &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, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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, &regmap, &reg, &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