13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci * Copyright (c) 2020 Rockchip Electronics Co. Ltd.
43d0407baSopenharmony_ci */
53d0407baSopenharmony_ci
63d0407baSopenharmony_ci#ifndef _PINCTRL_ROCKCHIP_H
73d0407baSopenharmony_ci#define _PINCTRL_ROCKCHIP_H
83d0407baSopenharmony_ci
93d0407baSopenharmony_cienum rockchip_pinctrl_type {
103d0407baSopenharmony_ci    PX30,
113d0407baSopenharmony_ci    RV1108,
123d0407baSopenharmony_ci    RV1126,
133d0407baSopenharmony_ci    RK1808,
143d0407baSopenharmony_ci    RK2928,
153d0407baSopenharmony_ci    RK3066B,
163d0407baSopenharmony_ci    RK3128,
173d0407baSopenharmony_ci    RK3188,
183d0407baSopenharmony_ci    RK3288,
193d0407baSopenharmony_ci    RK3308,
203d0407baSopenharmony_ci    RK3368,
213d0407baSopenharmony_ci    RK3399,
223d0407baSopenharmony_ci    RK3568,
233d0407baSopenharmony_ci};
243d0407baSopenharmony_ci
253d0407baSopenharmony_cistruct rockchip_gpio_regs {
263d0407baSopenharmony_ci    u32 port_dr;
273d0407baSopenharmony_ci    u32 port_ddr;
283d0407baSopenharmony_ci    u32 int_en;
293d0407baSopenharmony_ci    u32 int_mask;
303d0407baSopenharmony_ci    u32 int_type;
313d0407baSopenharmony_ci    u32 int_polarity;
323d0407baSopenharmony_ci    u32 int_bothedge;
333d0407baSopenharmony_ci    u32 int_status;
343d0407baSopenharmony_ci    u32 int_rawstatus;
353d0407baSopenharmony_ci    u32 debounce;
363d0407baSopenharmony_ci    u32 dbclk_div_en;
373d0407baSopenharmony_ci    u32 dbclk_div_con;
383d0407baSopenharmony_ci    u32 port_eoi;
393d0407baSopenharmony_ci    u32 ext_port;
403d0407baSopenharmony_ci    u32 version_id;
413d0407baSopenharmony_ci};
423d0407baSopenharmony_ci
433d0407baSopenharmony_ci/**
443d0407baSopenharmony_ci * @type: iomux variant using IOMUX_* constants
453d0407baSopenharmony_ci * @offset: if initialized to -1 it will be autocalculated, by specifying
463d0407baSopenharmony_ci *        an initial offset value the relevant source offset can be reset
473d0407baSopenharmony_ci *        to a new value for autocalculating the following iomux registers.
483d0407baSopenharmony_ci */
493d0407baSopenharmony_cistruct rockchip_iomux {
503d0407baSopenharmony_ci    int type;
513d0407baSopenharmony_ci    int offset;
523d0407baSopenharmony_ci};
533d0407baSopenharmony_ci
543d0407baSopenharmony_ci/**
553d0407baSopenharmony_ci * enum type index corresponding to rockchip_perpin_drv_list arrays index.
563d0407baSopenharmony_ci */
573d0407baSopenharmony_cienum rockchip_pin_drv_type {
583d0407baSopenharmony_ci    DRV_TYPE_IO_DEFAULT = 0,
593d0407baSopenharmony_ci    DRV_TYPE_IO_1V8_OR_3V0,
603d0407baSopenharmony_ci    DRV_TYPE_IO_1V8_ONLY,
613d0407baSopenharmony_ci    DRV_TYPE_IO_1V8_3V0_AUTO,
623d0407baSopenharmony_ci    DRV_TYPE_IO_3V3_ONLY,
633d0407baSopenharmony_ci    DRV_TYPE_MAX
643d0407baSopenharmony_ci};
653d0407baSopenharmony_ci
663d0407baSopenharmony_ci/**
673d0407baSopenharmony_ci * enum type index corresponding to rockchip_pull_list arrays index.
683d0407baSopenharmony_ci */
693d0407baSopenharmony_cienum rockchip_pin_pull_type { PULL_TYPE_IO_DEFAULT = 0, PULL_TYPE_IO_1V8_ONLY, PULL_TYPE_MAX };
703d0407baSopenharmony_ci
713d0407baSopenharmony_ci/**
723d0407baSopenharmony_ci * enum mux route register type, should be invalid/default/topgrf/pmugrf.
733d0407baSopenharmony_ci * INVALID: means do not need to set mux route
743d0407baSopenharmony_ci * DEFAULT: means same regmap as pin iomux
753d0407baSopenharmony_ci * TOPGRF: means mux route setting in topgrf
763d0407baSopenharmony_ci * PMUGRF: means mux route setting in pmugrf
773d0407baSopenharmony_ci */
783d0407baSopenharmony_cienum rockchip_pin_route_type {
793d0407baSopenharmony_ci    ROUTE_TYPE_DEFAULT = 0,
803d0407baSopenharmony_ci    ROUTE_TYPE_TOPGRF = 1,
813d0407baSopenharmony_ci    ROUTE_TYPE_PMUGRF = 2,
823d0407baSopenharmony_ci
833d0407baSopenharmony_ci    ROUTE_TYPE_INVALID = -1,
843d0407baSopenharmony_ci};
853d0407baSopenharmony_ci
863d0407baSopenharmony_cienum rockchip_mux_route_location {
873d0407baSopenharmony_ci    ROCKCHIP_ROUTE_SAME = 0,
883d0407baSopenharmony_ci    ROCKCHIP_ROUTE_PMU,
893d0407baSopenharmony_ci    ROCKCHIP_ROUTE_GRF,
903d0407baSopenharmony_ci};
913d0407baSopenharmony_ci
923d0407baSopenharmony_ci/**
933d0407baSopenharmony_ci * @drv_type: drive strength variant using rockchip_perpin_drv_type
943d0407baSopenharmony_ci * @offset: if initialized to -1 it will be autocalculated, by specifying
953d0407baSopenharmony_ci *        an initial offset value the relevant source offset can be reset
963d0407baSopenharmony_ci *        to a new value for autocalculating the following drive strength
973d0407baSopenharmony_ci *        registers. if used chips own cal_drv func instead to calculate
983d0407baSopenharmony_ci *        registers offset, the variant could be ignored.
993d0407baSopenharmony_ci */
1003d0407baSopenharmony_cistruct rockchip_drv {
1013d0407baSopenharmony_ci    enum rockchip_pin_drv_type drv_type;
1023d0407baSopenharmony_ci    int offset;
1033d0407baSopenharmony_ci};
1043d0407baSopenharmony_ci
1053d0407baSopenharmony_ci/**
1063d0407baSopenharmony_ci * @dev: device of the gpio bank
1073d0407baSopenharmony_ci * @reg_base: register base of the gpio bank
1083d0407baSopenharmony_ci * @reg_pull: optional separate register for additional pull settings
1093d0407baSopenharmony_ci * @clk: clock of the gpio bank
1103d0407baSopenharmony_ci * @db_clk: clock of the gpio debounce
1113d0407baSopenharmony_ci * @irq: interrupt of the gpio bank
1123d0407baSopenharmony_ci * @saved_masks: Saved content of GPIO_INTEN at suspend time.
1133d0407baSopenharmony_ci * @pin_base: first pin number
1143d0407baSopenharmony_ci * @nr_pins: number of pins in this bank
1153d0407baSopenharmony_ci * @name: name of the bank
1163d0407baSopenharmony_ci * @bank_num: number of the bank, to account for holes
1173d0407baSopenharmony_ci * @iomux: array describing the 4 iomux sources of the bank
1183d0407baSopenharmony_ci * @drv: array describing the 4 drive strength sources of the bank
1193d0407baSopenharmony_ci * @pull_type: array describing the 4 pull type sources of the bank
1203d0407baSopenharmony_ci * @of_node: dt node of this bank
1213d0407baSopenharmony_ci * @drvdata: common pinctrl basedata
1223d0407baSopenharmony_ci * @domain: irqdomain of the gpio bank
1233d0407baSopenharmony_ci * @gpio_chip: gpiolib chip
1243d0407baSopenharmony_ci * @grange: gpio range
1253d0407baSopenharmony_ci * @slock: spinlock for the gpio bank
1263d0407baSopenharmony_ci * @route_mask: bits describing the routing pins of per bank
1273d0407baSopenharmony_ci */
1283d0407baSopenharmony_cistruct rockchip_pin_bank {
1293d0407baSopenharmony_ci    struct device *dev;
1303d0407baSopenharmony_ci
1313d0407baSopenharmony_ci    void __iomem *reg_base;
1323d0407baSopenharmony_ci    struct regmap *regmap_pull;
1333d0407baSopenharmony_ci    struct clk *clk;
1343d0407baSopenharmony_ci    struct clk *db_clk;
1353d0407baSopenharmony_ci    int irq;
1363d0407baSopenharmony_ci    u32 saved_masks;
1373d0407baSopenharmony_ci    u32 pin_base;
1383d0407baSopenharmony_ci    u8 nr_pins;
1393d0407baSopenharmony_ci    char *name;
1403d0407baSopenharmony_ci    u8 bank_num;
1413d0407baSopenharmony_ci    struct rockchip_iomux iomux[4];
1423d0407baSopenharmony_ci    struct rockchip_drv drv[4];
1433d0407baSopenharmony_ci    enum rockchip_pin_pull_type pull_type[4];
1443d0407baSopenharmony_ci    struct device_node *of_node;
1453d0407baSopenharmony_ci    struct rockchip_pinctrl *drvdata;
1463d0407baSopenharmony_ci    struct irq_domain *domain;
1473d0407baSopenharmony_ci    struct gpio_chip gpio_chip;
1483d0407baSopenharmony_ci    struct pinctrl_gpio_range grange;
1493d0407baSopenharmony_ci    raw_spinlock_t slock;
1503d0407baSopenharmony_ci    const struct rockchip_gpio_regs *gpio_regs;
1513d0407baSopenharmony_ci    u32 gpio_type;
1523d0407baSopenharmony_ci    u32 toggle_edge_mode;
1533d0407baSopenharmony_ci    u32 recalced_mask;
1543d0407baSopenharmony_ci    u32 route_mask;
1553d0407baSopenharmony_ci};
1563d0407baSopenharmony_ci
1573d0407baSopenharmony_ci/**
1583d0407baSopenharmony_ci * struct rockchip_mux_recalced_data: represent a pin iomux data.
1593d0407baSopenharmony_ci * @num: bank number.
1603d0407baSopenharmony_ci * @pin: pin number.
1613d0407baSopenharmony_ci * @bit: index at register.
1623d0407baSopenharmony_ci * @reg: register offset.
1633d0407baSopenharmony_ci * @mask: mask bit
1643d0407baSopenharmony_ci */
1653d0407baSopenharmony_cistruct rockchip_mux_recalced_data {
1663d0407baSopenharmony_ci    u8 num;
1673d0407baSopenharmony_ci    u8 pin;
1683d0407baSopenharmony_ci    u32 reg;
1693d0407baSopenharmony_ci    u8 bit;
1703d0407baSopenharmony_ci    u8 mask;
1713d0407baSopenharmony_ci};
1723d0407baSopenharmony_ci
1733d0407baSopenharmony_ci/**
1743d0407baSopenharmony_ci * struct rockchip_mux_recalced_data: represent a pin iomux data.
1753d0407baSopenharmony_ci * @bank_num: bank number.
1763d0407baSopenharmony_ci * @pin: index at register or used to calc index.
1773d0407baSopenharmony_ci * @func: the min pin.
1783d0407baSopenharmony_ci * @route_location: the mux route location (same, pmu, grf).
1793d0407baSopenharmony_ci * @route_offset: the max pin.
1803d0407baSopenharmony_ci * @route_val: the register offset.
1813d0407baSopenharmony_ci */
1823d0407baSopenharmony_cistruct rockchip_mux_route_data {
1833d0407baSopenharmony_ci    u8 bank_num;
1843d0407baSopenharmony_ci    u8 pin;
1853d0407baSopenharmony_ci    u8 func;
1863d0407baSopenharmony_ci    enum rockchip_mux_route_location route_location;
1873d0407baSopenharmony_ci    u32 route_offset;
1883d0407baSopenharmony_ci    u32 route_val;
1893d0407baSopenharmony_ci};
1903d0407baSopenharmony_ci
1913d0407baSopenharmony_cistruct rockchip_pin_ctrl {
1923d0407baSopenharmony_ci    struct rockchip_pin_bank *pin_banks;
1933d0407baSopenharmony_ci    u32 nr_banks;
1943d0407baSopenharmony_ci    u32 nr_pins;
1953d0407baSopenharmony_ci    char *label;
1963d0407baSopenharmony_ci    enum rockchip_pinctrl_type type;
1973d0407baSopenharmony_ci    int grf_mux_offset;
1983d0407baSopenharmony_ci    int pmu_mux_offset;
1993d0407baSopenharmony_ci    int grf_drv_offset;
2003d0407baSopenharmony_ci    int pmu_drv_offset;
2013d0407baSopenharmony_ci    struct rockchip_mux_recalced_data *iomux_recalced;
2023d0407baSopenharmony_ci    u32 niomux_recalced;
2033d0407baSopenharmony_ci    struct rockchip_mux_route_data *iomux_routes;
2043d0407baSopenharmony_ci    u32 niomux_routes;
2053d0407baSopenharmony_ci
2063d0407baSopenharmony_ci    int (*ctrl_data_re_init)(struct rockchip_pin_ctrl *ctrl);
2073d0407baSopenharmony_ci
2083d0407baSopenharmony_ci    int (*soc_data_init)(struct rockchip_pinctrl *info);
2093d0407baSopenharmony_ci
2103d0407baSopenharmony_ci    void (*pull_calc_reg)(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, u8 *bit);
2113d0407baSopenharmony_ci    void (*drv_calc_reg)(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, u8 *bit);
2123d0407baSopenharmony_ci    int (*schmitt_calc_reg)(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, u8 *bit);
2133d0407baSopenharmony_ci    int (*slew_rate_calc_reg)(struct rockchip_pin_bank *bank, int pin_num, struct regmap **regmap, int *reg, u8 *bit);
2143d0407baSopenharmony_ci};
2153d0407baSopenharmony_ci
2163d0407baSopenharmony_cistruct rockchip_pin_config {
2173d0407baSopenharmony_ci    unsigned int func;
2183d0407baSopenharmony_ci    unsigned long *configs;
2193d0407baSopenharmony_ci    unsigned int nconfigs;
2203d0407baSopenharmony_ci};
2213d0407baSopenharmony_ci
2223d0407baSopenharmony_ci/**
2233d0407baSopenharmony_ci * struct rockchip_pin_group: represent group of pins of a pinmux function.
2243d0407baSopenharmony_ci * @name: name of the pin group, used to lookup the group.
2253d0407baSopenharmony_ci * @pins: the pins included in this group.
2263d0407baSopenharmony_ci * @npins: number of pins included in this group.
2273d0407baSopenharmony_ci * @func: the mux function number to be programmed when selected.
2283d0407baSopenharmony_ci * @configs: the config values to be set for each pin
2293d0407baSopenharmony_ci * @nconfigs: number of configs for each pin
2303d0407baSopenharmony_ci */
2313d0407baSopenharmony_cistruct rockchip_pin_group {
2323d0407baSopenharmony_ci    const char *name;
2333d0407baSopenharmony_ci    unsigned int npins;
2343d0407baSopenharmony_ci    unsigned int *pins;
2353d0407baSopenharmony_ci    struct rockchip_pin_config *data;
2363d0407baSopenharmony_ci};
2373d0407baSopenharmony_ci
2383d0407baSopenharmony_ci/**
2393d0407baSopenharmony_ci * struct rockchip_pmx_func: represent a pin function.
2403d0407baSopenharmony_ci * @name: name of the pin function, used to lookup the function.
2413d0407baSopenharmony_ci * @groups: one or more names of pin groups that provide this function.
2423d0407baSopenharmony_ci * @num_groups: number of groups included in @groups.
2433d0407baSopenharmony_ci */
2443d0407baSopenharmony_cistruct rockchip_pmx_func {
2453d0407baSopenharmony_ci    const char *name;
2463d0407baSopenharmony_ci    const char **groups;
2473d0407baSopenharmony_ci    u8 ngroups;
2483d0407baSopenharmony_ci};
2493d0407baSopenharmony_ci
2503d0407baSopenharmony_cistruct rockchip_pinctrl {
2513d0407baSopenharmony_ci    struct regmap *regmap_base;
2523d0407baSopenharmony_ci    int reg_size;
2533d0407baSopenharmony_ci    struct regmap *regmap_pull;
2543d0407baSopenharmony_ci    struct regmap *regmap_pmu;
2553d0407baSopenharmony_ci    struct device *dev;
2563d0407baSopenharmony_ci    struct rockchip_pin_ctrl *ctrl;
2573d0407baSopenharmony_ci    struct pinctrl_desc pctl;
2583d0407baSopenharmony_ci    struct pinctrl_dev *pctl_dev;
2593d0407baSopenharmony_ci    struct rockchip_pin_group *groups;
2603d0407baSopenharmony_ci    unsigned int ngroups;
2613d0407baSopenharmony_ci    struct rockchip_pmx_func *functions;
2623d0407baSopenharmony_ci    unsigned int nfunctions;
2633d0407baSopenharmony_ci};
2643d0407baSopenharmony_ci
2653d0407baSopenharmony_ci#endif
266