101aa9d1dSRyder Lee /* SPDX-License-Identifier: GPL-2.0 */ 201aa9d1dSRyder Lee /* 301aa9d1dSRyder Lee * Copyright (C) 2018 MediaTek Inc. 401aa9d1dSRyder Lee * Author: Ryder Lee <ryder.lee@mediatek.com> 501aa9d1dSRyder Lee */ 601aa9d1dSRyder Lee 701aa9d1dSRyder Lee #ifndef __PINCTRL_MEDIATEK_H__ 801aa9d1dSRyder Lee #define __PINCTRL_MEDIATEK_H__ 901aa9d1dSRyder Lee 1001aa9d1dSRyder Lee #define MTK_RANGE(_a) { .range = (_a), .nranges = ARRAY_SIZE(_a), } 1101aa9d1dSRyder Lee #define MTK_PIN(_number, _name, _drv_n) { \ 1201aa9d1dSRyder Lee .number = _number, \ 1301aa9d1dSRyder Lee .name = _name, \ 1401aa9d1dSRyder Lee .drv_n = _drv_n, \ 1501aa9d1dSRyder Lee } 1601aa9d1dSRyder Lee 1701aa9d1dSRyder Lee #define PINCTRL_PIN_GROUP(name, id) \ 1801aa9d1dSRyder Lee { \ 1901aa9d1dSRyder Lee name, \ 2001aa9d1dSRyder Lee id##_pins, \ 2101aa9d1dSRyder Lee ARRAY_SIZE(id##_pins), \ 2201aa9d1dSRyder Lee id##_funcs, \ 2301aa9d1dSRyder Lee } 2401aa9d1dSRyder Lee 2501aa9d1dSRyder Lee #define PIN_FIELD_CALC(_s_pin, _e_pin, _s_addr, _x_addrs, _s_bit, \ 2601aa9d1dSRyder Lee _x_bits, _sz_reg, _fixed) { \ 2701aa9d1dSRyder Lee .s_pin = _s_pin, \ 2801aa9d1dSRyder Lee .e_pin = _e_pin, \ 2901aa9d1dSRyder Lee .s_addr = _s_addr, \ 3001aa9d1dSRyder Lee .x_addrs = _x_addrs, \ 3101aa9d1dSRyder Lee .s_bit = _s_bit, \ 3201aa9d1dSRyder Lee .x_bits = _x_bits, \ 3301aa9d1dSRyder Lee .sz_reg = _sz_reg, \ 3401aa9d1dSRyder Lee .fixed = _fixed, \ 3501aa9d1dSRyder Lee } 3601aa9d1dSRyder Lee 3701aa9d1dSRyder Lee /* List these attributes which could be modified for the pin */ 3801aa9d1dSRyder Lee enum { 3901aa9d1dSRyder Lee PINCTRL_PIN_REG_MODE, 4001aa9d1dSRyder Lee PINCTRL_PIN_REG_DIR, 4101aa9d1dSRyder Lee PINCTRL_PIN_REG_DI, 4201aa9d1dSRyder Lee PINCTRL_PIN_REG_DO, 4301aa9d1dSRyder Lee PINCTRL_PIN_REG_IES, 4401aa9d1dSRyder Lee PINCTRL_PIN_REG_SMT, 4501aa9d1dSRyder Lee PINCTRL_PIN_REG_PULLEN, 4601aa9d1dSRyder Lee PINCTRL_PIN_REG_PULLSEL, 4701aa9d1dSRyder Lee PINCTRL_PIN_REG_DRV, 4801aa9d1dSRyder Lee PINCTRL_PIN_REG_MAX, 4901aa9d1dSRyder Lee }; 5001aa9d1dSRyder Lee 5101aa9d1dSRyder Lee /* Group the pins by the driving current */ 5201aa9d1dSRyder Lee enum { 5301aa9d1dSRyder Lee DRV_FIXED, 5401aa9d1dSRyder Lee DRV_GRP0, 5501aa9d1dSRyder Lee DRV_GRP1, 5601aa9d1dSRyder Lee DRV_GRP2, 5701aa9d1dSRyder Lee DRV_GRP3, 5801aa9d1dSRyder Lee DRV_GRP4, 5901aa9d1dSRyder Lee }; 6001aa9d1dSRyder Lee 6101aa9d1dSRyder Lee /** 6201aa9d1dSRyder Lee * struct mtk_pin_field - the structure that holds the information of the field 6301aa9d1dSRyder Lee * used to describe the attribute for the pin 6401aa9d1dSRyder Lee * @offset: the register offset relative to the base address 6501aa9d1dSRyder Lee * @mask: the mask used to filter out the field from the register 6601aa9d1dSRyder Lee * @bitpos: the start bit relative to the register 6701aa9d1dSRyder Lee * @next: the indication that the field would be extended to the 6801aa9d1dSRyder Lee next register 6901aa9d1dSRyder Lee */ 7001aa9d1dSRyder Lee struct mtk_pin_field { 7101aa9d1dSRyder Lee u32 offset; 7201aa9d1dSRyder Lee u32 mask; 7301aa9d1dSRyder Lee u8 bitpos; 7401aa9d1dSRyder Lee u8 next; 7501aa9d1dSRyder Lee }; 7601aa9d1dSRyder Lee 7701aa9d1dSRyder Lee /** 7801aa9d1dSRyder Lee * struct mtk_pin_field_calc - the structure that holds the range providing 7901aa9d1dSRyder Lee * the guide used to look up the relevant field 8001aa9d1dSRyder Lee * @s_pin: the start pin within the range 8101aa9d1dSRyder Lee * @e_pin: the end pin within the range 8201aa9d1dSRyder Lee * @s_addr: the start address for the range 8301aa9d1dSRyder Lee * @x_addrs: the address distance between two consecutive registers 8401aa9d1dSRyder Lee * within the range 8501aa9d1dSRyder Lee * @s_bit: the start bit for the first register within the range 8601aa9d1dSRyder Lee * @x_bits: the bit distance between two consecutive pins within 8701aa9d1dSRyder Lee * the range 8801aa9d1dSRyder Lee * @sz_reg: the size of bits in a register 8901aa9d1dSRyder Lee * @fixed: the consecutive pins share the same bits with the 1st 9001aa9d1dSRyder Lee * pin 9101aa9d1dSRyder Lee */ 9201aa9d1dSRyder Lee struct mtk_pin_field_calc { 9301aa9d1dSRyder Lee u16 s_pin; 9401aa9d1dSRyder Lee u16 e_pin; 9501aa9d1dSRyder Lee u32 s_addr; 9601aa9d1dSRyder Lee u8 x_addrs; 9701aa9d1dSRyder Lee u8 s_bit; 9801aa9d1dSRyder Lee u8 x_bits; 9901aa9d1dSRyder Lee u8 sz_reg; 10001aa9d1dSRyder Lee u8 fixed; 10101aa9d1dSRyder Lee }; 10201aa9d1dSRyder Lee 10301aa9d1dSRyder Lee /** 10401aa9d1dSRyder Lee * struct mtk_pin_reg_calc - the structure that holds all ranges used to 10501aa9d1dSRyder Lee * determine which register the pin would make use of 10601aa9d1dSRyder Lee * for certain pin attribute. 10701aa9d1dSRyder Lee * @range: the start address for the range 10801aa9d1dSRyder Lee * @nranges: the number of items in the range 10901aa9d1dSRyder Lee */ 11001aa9d1dSRyder Lee struct mtk_pin_reg_calc { 11101aa9d1dSRyder Lee const struct mtk_pin_field_calc *range; 11201aa9d1dSRyder Lee unsigned int nranges; 11301aa9d1dSRyder Lee }; 11401aa9d1dSRyder Lee 11501aa9d1dSRyder Lee /** 11601aa9d1dSRyder Lee * struct mtk_pin_desc - the structure that providing information 11701aa9d1dSRyder Lee * for each pin of chips 11801aa9d1dSRyder Lee * @number: unique pin number from the global pin number space 11901aa9d1dSRyder Lee * @name: name for this pin 12001aa9d1dSRyder Lee * @drv_n: the index with the driving group 12101aa9d1dSRyder Lee */ 12201aa9d1dSRyder Lee struct mtk_pin_desc { 12301aa9d1dSRyder Lee unsigned int number; 12401aa9d1dSRyder Lee const char *name; 12501aa9d1dSRyder Lee u8 drv_n; 12601aa9d1dSRyder Lee }; 12701aa9d1dSRyder Lee 12801aa9d1dSRyder Lee /** 12901aa9d1dSRyder Lee * struct mtk_group_desc - generic pin group descriptor 13001aa9d1dSRyder Lee * @name: name of the pin group 13101aa9d1dSRyder Lee * @pins: array of pins that belong to the group 13201aa9d1dSRyder Lee * @num_pins: number of pins in the group 13301aa9d1dSRyder Lee * @data: pin controller driver specific data 13401aa9d1dSRyder Lee */ 13501aa9d1dSRyder Lee struct mtk_group_desc { 13601aa9d1dSRyder Lee const char *name; 13701aa9d1dSRyder Lee int *pins; 13801aa9d1dSRyder Lee int num_pins; 13901aa9d1dSRyder Lee void *data; 14001aa9d1dSRyder Lee }; 14101aa9d1dSRyder Lee 14201aa9d1dSRyder Lee /** 14301aa9d1dSRyder Lee * struct mtk_function_desc - generic function descriptor 14401aa9d1dSRyder Lee * @name: name of the function 14501aa9d1dSRyder Lee * @group_names: array of pin group names 14601aa9d1dSRyder Lee * @num_group_names: number of pin group names 14701aa9d1dSRyder Lee */ 14801aa9d1dSRyder Lee struct mtk_function_desc { 14901aa9d1dSRyder Lee const char *name; 15001aa9d1dSRyder Lee const char * const *group_names; 15101aa9d1dSRyder Lee int num_group_names; 15201aa9d1dSRyder Lee }; 15301aa9d1dSRyder Lee 15401aa9d1dSRyder Lee /* struct mtk_pin_soc - the structure that holds SoC-specific data */ 15501aa9d1dSRyder Lee struct mtk_pinctrl_soc { 15601aa9d1dSRyder Lee const char *name; 15701aa9d1dSRyder Lee const struct mtk_pin_reg_calc *reg_cal; 15801aa9d1dSRyder Lee const struct mtk_pin_desc *pins; 15901aa9d1dSRyder Lee int npins; 16001aa9d1dSRyder Lee const struct mtk_group_desc *grps; 16101aa9d1dSRyder Lee int ngrps; 16201aa9d1dSRyder Lee const struct mtk_function_desc *funcs; 16301aa9d1dSRyder Lee int nfuncs; 16401aa9d1dSRyder Lee }; 16501aa9d1dSRyder Lee 16601aa9d1dSRyder Lee /** 16701aa9d1dSRyder Lee * struct mtk_pinctrl_priv - private data for MTK pinctrl driver 16801aa9d1dSRyder Lee * 16901aa9d1dSRyder Lee * @base: base address of the pinctrl device 17001aa9d1dSRyder Lee * @soc: SoC specific data 17101aa9d1dSRyder Lee */ 17201aa9d1dSRyder Lee struct mtk_pinctrl_priv { 17301aa9d1dSRyder Lee void __iomem *base; 17401aa9d1dSRyder Lee struct mtk_pinctrl_soc *soc; 17501aa9d1dSRyder Lee }; 17601aa9d1dSRyder Lee 17701aa9d1dSRyder Lee extern const struct pinctrl_ops mtk_pinctrl_ops; 17801aa9d1dSRyder Lee 179*59a8fef3SRyder Lee /* A common read-modify-write helper for MediaTek chips */ 180*59a8fef3SRyder Lee void mtk_rmw(struct udevice *dev, u32 reg, u32 mask, u32 set); 18101aa9d1dSRyder Lee int mtk_pinctrl_common_probe(struct udevice *dev, 18201aa9d1dSRyder Lee struct mtk_pinctrl_soc *soc); 18301aa9d1dSRyder Lee 18401aa9d1dSRyder Lee #endif /* __PINCTRL_MEDIATEK_H__ */ 185