• Home
  • Raw
  • Download

Lines Matching +full:pin +full:- +full:group

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
12 * functions. The SoC function enabled on a pin is determined on a priority
13 * basis where a given pin can provide a number of different signal types.
15 * The signal active on a pin is described by both a priority level and
17 * bits. Some difficulty arises as the pin's function bit masks for each
22 * read-only).
24 * SoC Multi-function Pin Expression Examples
25 * ------------------------------------------
31 * D6 is a pin with a single function (beside GPIO); a high priority signal
35 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
37 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
39 * C5 is a multi-signal pin (high and low priority signals). Here we touch
42 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
44 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
46 * E19 is a single-signal pin with two functions that influence the active
47 * signal. In this case both bits have the same meaning - enable a dedicated
48 * LPC reset pin. However it's not always the case that the bits in the
49 * OR-relationship have the same meaning.
51 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
53 * -----+---------+-----------+-----------------------------+-----------+---------------+----------
55 * For example, pin B19 has a low-priority signal that's enabled by two
62 …* -----+---------+-----------+-----------------------------------------+-----------+--------------…
64 …* -----+---------+-----------+-----------------------------------------+-----------+--------------…
66 * For pin E18, the SoC ANDs the expected state of three bits to determine the
67 * pin's active signal:
70 * * SCU80[15]: Enable SPICS1# or EXTRST# function pin
73 …* -----+---------+-----------+-----------------------------------------+-----------+--------------…
75 …* -----+---------+-----------+-----------------------------------------+-----------+--------------…
78 * selecting the signals on pin E18)
80 * Pin T5 is a multi-signal pin with a more complex configuration:
83 * -----+---------+-----------+------------------------------+-----------+---------------+----------
85 * -----+---------+-----------+------------------------------+-----------+---------------+----------
95 * Re-writing:
97 * -----+---------+-----------+------------------------------+-----------+---------------+----------
101 * -----+---------+-----------+------------------------------+-----------+---------------+----------
104 * function pin", where the signal itself is determined by whether SCU94[5:4]
107 * Other video-input-related pins require an explicit state in SCU90[5:4], e.g.
110 * -----+---------+-----------+------------------------------+-----------+---------------+----------
113 * -----+---------+-----------+------------------------------+-----------+---------------+----------
120 * signals are required. However, this isn't done consistently - UART1 is
121 * enabled on a per-pin basis, and by contrast, all signals for UART6 are
130 * fails in this instance where applying the configuration for the UART pin of
132 * VPI functions on the current pin.
135 …* -----+------------+-----------+---------------------------+-----------+---------------+---------…
138 …* -----+------------+-----------+---------------------------+-----------+---------------+---------…
140 * A12 demonstrates that the "Other" signal isn't always GPIO - in this case
141 * GPIOT0 is a high-priority signal and RGMII1TXCK is Other. Thus, GPIO
145 * pins in the function's group to disable the higher-priority signals such
160 * * For priorities levels defined on a pin, each priority provides one signal
175 * comparisons must evaluate 'true' for a signal to be enabled on a pin.
177 * * A signal participating in a function is active on a pin if evaluating all
178 * signal descriptors in the pin's signal expression for the function yields
181 * * A signal at a given priority on a given pin is active if any of the
183 * priority signal on the pin is active
185 * * GPIO is configured per-pin
192 * * Each pin must know the signal expressions of functions in which it
195 * pin.
215 * --------------
217 * If pinctrl allows us to allocate a pin we can configure a function without
218 * concern for the function of already allocated pins, if pin groups are
220 * intuitive, but it did not feel obvious from the bit/pin relationships.
222 * Conversely, failing to allocate all pins in a group indicates some bits (as
223 * well as pins) required for the group's configuration will already be in use,
225 * group.
228 * --------------
239 * 1. Use a data-driven solution rather than embedding state into code
244 * properties associated with a given mux configuration: The pin, the signal,
245 * the group and the function. In this way copy/paste errors cause duplicate
249 * no override errors in the pin, group and function arrays.
255 * Here's a complete, concrete "pre-processed" example of the table structures
454 * @signal: The signal name for the priority level on the pin. If the signal
458 * associated expression. For pin-specific GPIO, the function
473 * for a given pin. The signal configuration for a priority level is evaluated
477 * @name: A name for the pin
492 * Short-hand macro for describing an SCU descriptor enabled by the state of
505 * A further short-hand macro expanding to an SCU descriptor enabled by a set
514 #define SIG_DESC_LIST_SYM(sig, group) sig_descs_ ## sig ## _ ## group argument
515 #define SIG_DESC_LIST_DECL(sig, group, ...) \ argument
516 static const struct aspeed_sig_desc SIG_DESC_LIST_SYM(sig, group)[] = \
519 #define SIG_EXPR_SYM(sig, group) sig_expr_ ## sig ## _ ## group argument
520 #define SIG_EXPR_DECL_(sig, group, func) \ argument
521 static const struct aspeed_sig_expr SIG_EXPR_SYM(sig, group) = \
525 .ndescs = ARRAY_SIZE(SIG_DESC_LIST_SYM(sig, group)), \
526 .descs = &(SIG_DESC_LIST_SYM(sig, group))[0], \
546 #define SIG_EXPR_DECL(sig, group, func, ...) \ argument
547 SIG_DESC_LIST_DECL(sig, group, __VA_ARGS__); \
548 SIG_EXPR_DECL_(sig, group, func)
556 #define SIG_EXPR_PTR(sig, group) (&SIG_EXPR_SYM(sig, group)) argument
558 #define SIG_EXPR_LIST_SYM(sig, group) sig_exprs_ ## sig ## _ ## group argument
566 * For example, the 16-bit ROM bus can be enabled by one of two possible signal
575 #define SIG_EXPR_LIST_DECL(sig, group, ...) \ argument
576 static const struct aspeed_sig_expr *SIG_EXPR_LIST_SYM(sig, group)[] =\
583 * Create an expression symbol alias from (signal, group) to (pin, signal).
585 * @pin: The pin number
587 * @group: The name of the group of which the pin is a member that is
591 * the signal for a group multiple times) whilst enabling multiple pin groups
592 * to exist for a signal without intrusive side-effects on defining the list of
593 * signals available on a pin.
595 #define SIG_EXPR_LIST_ALIAS(pin, sig, group) \ argument
597 SIG_EXPR_LIST_SYM(pin, sig)[ARRAY_SIZE(SIG_EXPR_LIST_SYM(sig, group))] \
598 __attribute__((alias(istringify(SIG_EXPR_LIST_SYM(sig, group)))))
601 * A short-hand macro for declaring a function expression and an expression
602 * list with a single expression (SE) and a single group (SG) of pins.
604 * @pin: The pin the signal will be routed to
605 * @sig: The signal that will be routed to the pin for the function
609 * For example, signal NCTS6 participates in its own function with one group:
613 #define SIG_EXPR_LIST_DECL_SESG(pin, sig, func, ...) \ argument
617 SIG_EXPR_LIST_ALIAS(pin, sig, func)
623 * @pin: The pin the signal will be routed to
624 * @sig: The signal that will be routed to the pin for the function
625 * @group: The name of the function's pin group in which the pin participates
629 #define SIG_EXPR_LIST_DECL_SEMG(pin, sig, group, func, ...) \ argument
630 SIG_DESC_LIST_DECL(sig, group, __VA_ARGS__); \
631 SIG_EXPR_DECL_(sig, group, func); \
632 SIG_EXPR_LIST_DECL(sig, group, SIG_EXPR_PTR(sig, group)); \
633 SIG_EXPR_LIST_ALIAS(pin, sig, group)
637 * and a single group (SG) of pins.
639 * @pin: The pin the signal will be routed to
640 * @sig: The signal that will be routed to the pin for the function
641 * @group: The name of the function's pin group in which the pin participates
645 #define SIG_EXPR_LIST_DECL_DESG(pin, sig, f0, f1) \ argument
649 SIG_EXPR_LIST_ALIAS(pin, sig, f0)
651 #define SIG_EXPR_LIST_PTR(sig, group) SIG_EXPR_LIST_SYM(sig, group) argument
653 #define PIN_EXPRS_SYM(pin) pin_exprs_ ## pin argument
654 #define PIN_EXPRS_PTR(pin) (&PIN_EXPRS_SYM(pin)[0]) argument
655 #define PIN_SYM(pin) pin_ ## pin argument
657 #define PIN_DECL_(pin, ...) \ argument
658 static const struct aspeed_sig_expr **PIN_EXPRS_SYM(pin)[] = \
660 static const struct aspeed_pin_desc PIN_SYM(pin) = \
661 { #pin, PIN_EXPRS_PTR(pin) }
664 * Declare a single signal pin
666 * @pin: The pin number
676 #define PIN_DECL_1(pin, other, sig) \ argument
677 SIG_EXPR_LIST_DECL_SESG(pin, other, other); \
678 PIN_DECL_(pin, SIG_EXPR_LIST_PTR(pin, sig), \
679 SIG_EXPR_LIST_PTR(pin, other))
682 * Single signal, single function pin declaration
684 * @pin: The pin number
693 #define SSSF_PIN_DECL(pin, other, sig, ...) \ argument
694 SIG_EXPR_LIST_DECL_SESG(pin, sig, sig, __VA_ARGS__); \
695 SIG_EXPR_LIST_DECL_SESG(pin, other, other); \
696 PIN_DECL_(pin, SIG_EXPR_LIST_PTR(pin, sig), \
697 SIG_EXPR_LIST_PTR(pin, other)); \
698 FUNC_GROUP_DECL(sig, pin)
700 * Declare a two-signal pin
702 * @pin: The pin number
718 #define PIN_DECL_2(pin, other, high, low) \ argument
719 SIG_EXPR_LIST_DECL_SESG(pin, other, other); \
720 PIN_DECL_(pin, \
721 SIG_EXPR_LIST_PTR(pin, high), \
722 SIG_EXPR_LIST_PTR(pin, low), \
723 SIG_EXPR_LIST_PTR(pin, other))
725 #define PIN_DECL_3(pin, other, high, medium, low) \ argument
726 SIG_EXPR_LIST_DECL_SESG(pin, other, other); \
727 PIN_DECL_(pin, \
728 SIG_EXPR_LIST_PTR(pin, high), \
729 SIG_EXPR_LIST_PTR(pin, medium), \
730 SIG_EXPR_LIST_PTR(pin, low), \
731 SIG_EXPR_LIST_PTR(pin, other))
733 #define GROUP_SYM(group) group_pins_ ## group argument
734 #define GROUP_DECL(group, ...) \ argument
735 static const int GROUP_SYM(group)[] = { __VA_ARGS__ }
741 #define FUNC_DECL_1(func, group) FUNC_DECL_(func, #group) argument
750 #define GPIO_PIN_DECL(pin, gpio) \ argument
751 SIG_EXPR_LIST_DECL_SESG(pin, gpio, gpio); \
752 PIN_DECL_(pin, SIG_EXPR_LIST_PTR(pin, gpio))
810 return ctx->ops->set(ctx, expr, enabled); in aspeed_sig_expr_set()