^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: (GPL-2.0+ or MIT) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2017 Baylibre SAS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Author: Jerome Brunet <jbrunet@baylibre.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2017 Amlogic, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Author: Xingyu Chen <xingyu.chen@amlogic.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct meson_pmx_bank {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) unsigned int first;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) unsigned int last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) unsigned int reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) unsigned int offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct meson_axg_pmx_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct meson_pmx_bank *pmx_banks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) unsigned int num_pmx_banks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define BANK_PMX(n, f, l, r, o) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) .name = n, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .first = f, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .last = l, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .reg = r, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .offset = o, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct meson_pmx_axg_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) unsigned int func;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define PMX_DATA(f) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .func = f, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define GROUP(grp, f) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) .name = #grp, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .pins = grp ## _pins, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) .num_pins = ARRAY_SIZE(grp ## _pins), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) .data = (const struct meson_pmx_axg_data[]){ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) PMX_DATA(f), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define GPIO_GROUP(gpio) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .name = #gpio, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) .pins = (const unsigned int[]){ gpio }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .num_pins = 1, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) .data = (const struct meson_pmx_axg_data[]){ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) PMX_DATA(0), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) extern const struct pinmux_ops meson_axg_pmx_ops;