1677b5358SBeniamino Galvani /* 2677b5358SBeniamino Galvani * (C) Copyright 2016 - Beniamino Galvani <b.galvani@gmail.com> 3677b5358SBeniamino Galvani * 4677b5358SBeniamino Galvani * SPDX-License-Identifier: GPL-2.0+ 5677b5358SBeniamino Galvani */ 6677b5358SBeniamino Galvani 7677b5358SBeniamino Galvani #ifndef __PINCTRL_MESON_H__ 8677b5358SBeniamino Galvani #define __PINCTRL_MESON_H__ 9677b5358SBeniamino Galvani 10677b5358SBeniamino Galvani #include <linux/types.h> 11677b5358SBeniamino Galvani 12677b5358SBeniamino Galvani struct meson_pmx_group { 13677b5358SBeniamino Galvani const char *name; 14677b5358SBeniamino Galvani const unsigned int *pins; 15677b5358SBeniamino Galvani unsigned int num_pins; 16677b5358SBeniamino Galvani bool is_gpio; 17677b5358SBeniamino Galvani unsigned int reg; 18677b5358SBeniamino Galvani unsigned int bit; 19677b5358SBeniamino Galvani }; 20677b5358SBeniamino Galvani 21677b5358SBeniamino Galvani struct meson_pmx_func { 22677b5358SBeniamino Galvani const char *name; 23677b5358SBeniamino Galvani const char * const *groups; 24677b5358SBeniamino Galvani unsigned int num_groups; 25677b5358SBeniamino Galvani }; 26677b5358SBeniamino Galvani 27677b5358SBeniamino Galvani struct meson_pinctrl_data { 28677b5358SBeniamino Galvani const char *name; 29677b5358SBeniamino Galvani struct meson_pmx_group *groups; 30677b5358SBeniamino Galvani struct meson_pmx_func *funcs; 31*2009a8d0SBeniamino Galvani struct meson_bank *banks; 32677b5358SBeniamino Galvani unsigned int pin_base; 33677b5358SBeniamino Galvani unsigned int num_pins; 34677b5358SBeniamino Galvani unsigned int num_groups; 35677b5358SBeniamino Galvani unsigned int num_funcs; 36*2009a8d0SBeniamino Galvani unsigned int num_banks; 37677b5358SBeniamino Galvani }; 38677b5358SBeniamino Galvani 39677b5358SBeniamino Galvani struct meson_pinctrl { 40677b5358SBeniamino Galvani struct meson_pinctrl_data *data; 41677b5358SBeniamino Galvani void __iomem *reg_mux; 42*2009a8d0SBeniamino Galvani void __iomem *reg_gpio; 43*2009a8d0SBeniamino Galvani }; 44*2009a8d0SBeniamino Galvani 45*2009a8d0SBeniamino Galvani /** 46*2009a8d0SBeniamino Galvani * struct meson_reg_desc - a register descriptor 47*2009a8d0SBeniamino Galvani * 48*2009a8d0SBeniamino Galvani * @reg: register offset in the regmap 49*2009a8d0SBeniamino Galvani * @bit: bit index in register 50*2009a8d0SBeniamino Galvani * 51*2009a8d0SBeniamino Galvani * The structure describes the information needed to control pull, 52*2009a8d0SBeniamino Galvani * pull-enable, direction, etc. for a single pin 53*2009a8d0SBeniamino Galvani */ 54*2009a8d0SBeniamino Galvani struct meson_reg_desc { 55*2009a8d0SBeniamino Galvani unsigned int reg; 56*2009a8d0SBeniamino Galvani unsigned int bit; 57*2009a8d0SBeniamino Galvani }; 58*2009a8d0SBeniamino Galvani 59*2009a8d0SBeniamino Galvani /** 60*2009a8d0SBeniamino Galvani * enum meson_reg_type - type of registers encoded in @meson_reg_desc 61*2009a8d0SBeniamino Galvani */ 62*2009a8d0SBeniamino Galvani enum meson_reg_type { 63*2009a8d0SBeniamino Galvani REG_PULLEN, 64*2009a8d0SBeniamino Galvani REG_PULL, 65*2009a8d0SBeniamino Galvani REG_DIR, 66*2009a8d0SBeniamino Galvani REG_OUT, 67*2009a8d0SBeniamino Galvani REG_IN, 68*2009a8d0SBeniamino Galvani NUM_REG, 69*2009a8d0SBeniamino Galvani }; 70*2009a8d0SBeniamino Galvani 71*2009a8d0SBeniamino Galvani /** 72*2009a8d0SBeniamino Galvani * struct meson bank 73*2009a8d0SBeniamino Galvani * 74*2009a8d0SBeniamino Galvani * @name: bank name 75*2009a8d0SBeniamino Galvani * @first: first pin of the bank 76*2009a8d0SBeniamino Galvani * @last: last pin of the bank 77*2009a8d0SBeniamino Galvani * @regs: array of register descriptors 78*2009a8d0SBeniamino Galvani * 79*2009a8d0SBeniamino Galvani * A bank represents a set of pins controlled by a contiguous set of 80*2009a8d0SBeniamino Galvani * bits in the domain registers. The structure specifies which bits in 81*2009a8d0SBeniamino Galvani * the regmap control the different functionalities. Each member of 82*2009a8d0SBeniamino Galvani * the @regs array refers to the first pin of the bank. 83*2009a8d0SBeniamino Galvani */ 84*2009a8d0SBeniamino Galvani struct meson_bank { 85*2009a8d0SBeniamino Galvani const char *name; 86*2009a8d0SBeniamino Galvani unsigned int first; 87*2009a8d0SBeniamino Galvani unsigned int last; 88*2009a8d0SBeniamino Galvani struct meson_reg_desc regs[NUM_REG]; 89677b5358SBeniamino Galvani }; 90677b5358SBeniamino Galvani 91677b5358SBeniamino Galvani #define PIN(x, b) (b + x) 92677b5358SBeniamino Galvani 93677b5358SBeniamino Galvani #define GROUP(grp, r, b) \ 94677b5358SBeniamino Galvani { \ 95677b5358SBeniamino Galvani .name = #grp, \ 96677b5358SBeniamino Galvani .pins = grp ## _pins, \ 97677b5358SBeniamino Galvani .num_pins = ARRAY_SIZE(grp ## _pins), \ 98677b5358SBeniamino Galvani .reg = r, \ 99677b5358SBeniamino Galvani .bit = b, \ 100677b5358SBeniamino Galvani } 101677b5358SBeniamino Galvani 102677b5358SBeniamino Galvani #define GPIO_GROUP(gpio, b) \ 103677b5358SBeniamino Galvani { \ 104677b5358SBeniamino Galvani .name = #gpio, \ 105677b5358SBeniamino Galvani .pins = (const unsigned int[]){ PIN(gpio, b) }, \ 106677b5358SBeniamino Galvani .num_pins = 1, \ 107677b5358SBeniamino Galvani .is_gpio = true, \ 108677b5358SBeniamino Galvani } 109677b5358SBeniamino Galvani 110677b5358SBeniamino Galvani #define FUNCTION(fn) \ 111677b5358SBeniamino Galvani { \ 112677b5358SBeniamino Galvani .name = #fn, \ 113677b5358SBeniamino Galvani .groups = fn ## _groups, \ 114677b5358SBeniamino Galvani .num_groups = ARRAY_SIZE(fn ## _groups), \ 115677b5358SBeniamino Galvani } 116677b5358SBeniamino Galvani 117*2009a8d0SBeniamino Galvani #define BANK(n, f, l, per, peb, pr, pb, dr, db, or, ob, ir, ib) \ 118*2009a8d0SBeniamino Galvani { \ 119*2009a8d0SBeniamino Galvani .name = n, \ 120*2009a8d0SBeniamino Galvani .first = f, \ 121*2009a8d0SBeniamino Galvani .last = l, \ 122*2009a8d0SBeniamino Galvani .regs = { \ 123*2009a8d0SBeniamino Galvani [REG_PULLEN] = { per, peb }, \ 124*2009a8d0SBeniamino Galvani [REG_PULL] = { pr, pb }, \ 125*2009a8d0SBeniamino Galvani [REG_DIR] = { dr, db }, \ 126*2009a8d0SBeniamino Galvani [REG_OUT] = { or, ob }, \ 127*2009a8d0SBeniamino Galvani [REG_IN] = { ir, ib }, \ 128*2009a8d0SBeniamino Galvani }, \ 129*2009a8d0SBeniamino Galvani } 130*2009a8d0SBeniamino Galvani 131677b5358SBeniamino Galvani #define MESON_PIN(x, b) PINCTRL_PIN(PIN(x, b), #x) 132677b5358SBeniamino Galvani 133677b5358SBeniamino Galvani extern const struct pinctrl_ops meson_pinctrl_ops; 134677b5358SBeniamino Galvani 135677b5358SBeniamino Galvani int meson_pinctrl_probe(struct udevice *dev); 136677b5358SBeniamino Galvani 137677b5358SBeniamino Galvani #endif /* __PINCTRL_MESON_H__ */ 138