1 /* 2 * (C) Copyright 2016 - Beniamino Galvani <b.galvani@gmail.com> 3 * 4 * SPDX-License-Identifier: GPL-2.0+ 5 */ 6 7 #ifndef __PINCTRL_MESON_H__ 8 #define __PINCTRL_MESON_H__ 9 10 #include <linux/types.h> 11 12 struct meson_pmx_group { 13 const char *name; 14 const unsigned int *pins; 15 unsigned int num_pins; 16 bool is_gpio; 17 unsigned int reg; 18 unsigned int bit; 19 }; 20 21 struct meson_pmx_func { 22 const char *name; 23 const char * const *groups; 24 unsigned int num_groups; 25 }; 26 27 struct meson_pinctrl_data { 28 const char *name; 29 struct meson_pmx_group *groups; 30 struct meson_pmx_func *funcs; 31 unsigned int pin_base; 32 unsigned int num_pins; 33 unsigned int num_groups; 34 unsigned int num_funcs; 35 }; 36 37 struct meson_pinctrl { 38 struct meson_pinctrl_data *data; 39 void __iomem *reg_mux; 40 }; 41 42 #define PIN(x, b) (b + x) 43 44 #define GROUP(grp, r, b) \ 45 { \ 46 .name = #grp, \ 47 .pins = grp ## _pins, \ 48 .num_pins = ARRAY_SIZE(grp ## _pins), \ 49 .reg = r, \ 50 .bit = b, \ 51 } 52 53 #define GPIO_GROUP(gpio, b) \ 54 { \ 55 .name = #gpio, \ 56 .pins = (const unsigned int[]){ PIN(gpio, b) }, \ 57 .num_pins = 1, \ 58 .is_gpio = true, \ 59 } 60 61 #define FUNCTION(fn) \ 62 { \ 63 .name = #fn, \ 64 .groups = fn ## _groups, \ 65 .num_groups = ARRAY_SIZE(fn ## _groups), \ 66 } 67 68 #define MESON_PIN(x, b) PINCTRL_PIN(PIN(x, b), #x) 69 70 extern const struct pinctrl_ops meson_pinctrl_ops; 71 72 int meson_pinctrl_probe(struct udevice *dev); 73 74 #endif /* __PINCTRL_MESON_H__ */ 75