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