^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2020 TOSHIBA CORPORATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2020 Toshiba Electronic Devices & Storage Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2020 Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #ifndef __VISCONTI_PINCTRL_COMMON_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #define __VISCONTI_PINCTRL_COMMON_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct pinctrl_pin_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* PIN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define VISCONTI_PINS(pins_name, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) static const unsigned int pins_name ## _pins[] = { __VA_ARGS__ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) struct visconti_desc_pin {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct pinctrl_pin_desc pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) unsigned int dsel_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) unsigned int dsel_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unsigned int pude_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) unsigned int pudsel_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) unsigned int pud_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define VISCONTI_PIN(_pin, dsel, d_sh, pude, pudsel, p_sh) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .pin = _pin, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .dsel_offset = dsel, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .dsel_shift = d_sh, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .pude_offset = pude, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .pudsel_offset = pudsel, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .pud_shift = p_sh, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* Group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define VISCONTI_GROUPS(groups_name, ...) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static const char * const groups_name ## _grps[] = { __VA_ARGS__ }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct visconti_mux {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) unsigned int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) unsigned int val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) struct visconti_pin_group {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) const unsigned int *pins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) unsigned int nr_pins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct visconti_mux mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define VISCONTI_PIN_GROUP(group_name, off, msk, v) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .name = __stringify(group_name) "_grp", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .pins = group_name ## _pins, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .nr_pins = ARRAY_SIZE(group_name ## _pins), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .mux = { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .offset = off, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .mask = msk, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .val = v, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* MUX */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct visconti_pin_function {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) const char * const *groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unsigned int nr_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define VISCONTI_PIN_FUNCTION(func) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) .name = #func, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .groups = func ## _grps, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) .nr_groups = ARRAY_SIZE(func ## _grps), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* chip dependent data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) struct visconti_pinctrl_devdata {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) const struct visconti_desc_pin *pins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned int nr_pins;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) const struct visconti_pin_group *groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) unsigned int nr_groups;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) const struct visconti_pin_function *functions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) unsigned int nr_functions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) const struct visconti_mux *gpio_mux;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) void (*unlock)(void __iomem *base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) int visconti_pinctrl_probe(struct platform_device *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) const struct visconti_pinctrl_devdata *devdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #endif /* __VISCONTI_PINCTRL_COMMON_H__ */