Skip to content
  • Stephen Boyd's avatar
    of: Support parsing phandle argument lists through a nexus node · bd6f2fd5
    Stephen Boyd authored
    
    
    Platforms like 96boards have a standardized connector/expansion
    slot that exposes signals like GPIOs to expansion boards in an
    SoC agnostic way. We'd like the DT overlays for the expansion
    boards to be written once without knowledge of the SoC on the
    other side of the connector. This avoids the unscalable
    combinatorial explosion of a different DT overlay for each
    expansion board and SoC pair.
    
    We need a way to describe the GPIOs routed through the connector
    in an SoC agnostic way. Let's introduce nexus property parsing
    into the OF core to do this. This is largely based on the
    interrupt nexus support we already have. This allows us to remap
    a phandle list in a consumer node (e.g. reset-gpios) through a
    connector in a generic way (e.g. via gpio-map). Do this in a
    generic routine so that we can remap any sort of variable length
    phandle list.
    
    Taking GPIOs as an example, the connector would be a GPIO nexus,
    supporting the remapping of a GPIO specifier space to multiple
    GPIO providers on the SoC. DT would look as shown below, where
    'soc_gpio1' and 'soc_gpio2' are inside the SoC, 'connector' is an
    expansion port where boards can be plugged in, and
    'expansion_device' is a device on the expansion board.
    
    	soc {
    		soc_gpio1: gpio-controller1 {
    			#gpio-cells = <2>;
    		};
    
    		soc_gpio2: gpio-controller2 {
    			#gpio-cells = <2>;
    		};
    	};
    
    	connector: connector {
    		#gpio-cells = <2>;
    		gpio-map = <0 0 &soc_gpio1 1 0>,
    			   <1 0 &soc_gpio2 4 0>,
    			   <2 0 &soc_gpio1 3 0>,
    			   <3 0 &soc_gpio2 2 0>;
    		gpio-map-mask = <0xf 0x0>;
    		gpio-map-pass-thru = <0x0 0x1>
    	};
    
    	expansion_device {
    		reset-gpios = <&connector 2 GPIO_ACTIVE_LOW>;
    	};
    
    The GPIO core would use of_parse_phandle_with_args_map() instead
    of of_parse_phandle_with_args() and arrive at the same type of
    result, a phandle and argument list. The difference is that the
    phandle and arguments will be remapped through the nexus node to
    the underlying SoC GPIO controller node. In the example above,
    we would remap 'reset-gpios' from <&connector 2 GPIO_ACTIVE_LOW>
    to <&soc_gpio1 3 GPIO_ACTIVE_LOW>.
    
    Cc: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Mark Brown <broonie@kernel.org>
    Signed-off-by: default avatarStephen Boyd <stephen.boyd@linaro.org>
    Signed-off-by: default avatarRob Herring <robh@kernel.org>
    bd6f2fd5