specifying two conflicting configs

Olof Johansson olof at lixom.net
Fri Jul 27 13:05:43 EST 2012


On Tue, Jul 24, 2012 at 8:48 PM, David Gibson
<david at gibson.dropbear.id.au> wrote:
> On Tue, Jul 24, 2012 at 11:34:50AM +0200, Attila Kinali wrote:
>> Hi,
>>
>> I have here an embedded system where i use a serial port as SD Card
>> interface as well as SPI interface. I select what i want to use
>> by setting a GPIO pin high or low.
>>
>> Currently i'm using two different dts files, one that specifies the
>> serial port as SD Card interface and one that specifies the serial
>> port as SPI interface.
>>
>> Now i would like to merge them into one file so that i can select
>> which mode to use at runtime. The documentation gave me the impression
>> that this should be possible, but i was not able to figure out how
>> to do it.
>>
>> Would someone be so kind and point me to the documentation/example
>> i've missed?
>>
>> The current configuration i use is either:
>>
>> ssp0: ssp at 80010000 {
>>         compatible = "fsl,imx23-mmc";
>>         pinctrl-names = "default";
>>         pinctrl-0 = <&mmc0_8bit_pins_a &mmc1_pins_fixup>;
>>         bus-width = <8>;
>>         status = "okay";
>> };
>>
>> or:
>>
>> ssp0: ssp at 80010000 {
>>         #address-cells = <1>;
>>         #size-cells = <0>;
>>         compatible = "fsl,imx23-spi";
>>         fsl,ssp-dma-channel = <1>;
>>         pinctrl-names = "default";
>>         pinctrl-0 = <&spi_pins_a>;
>>         status = "okay";
>>
>> };
>
> So, Mitch may have better insights here, but my inclination would be
> to do something like this:
>
> ssp-mux at 80010000 {
>         #address-cells = <1>;
>         #size-cells = <0>;
>         compatible = "yourvendor,ssp-mux";
>         control-line = <&gpio 17>;
>         ranges = <0x0 0x80010000>;
>
>         ssp-mmc at 0 {
>                   compatible = "fsl,imx23-mmc";
>                   /* ... */
>                   status = "okay";
>         };
>
>         ssp-spi at 1 {
>                   compatible = "fsl,imx23-spi";
>                   /* ... */
>                   status = "disabled";
>         };
> };
>
> ranges would need tweaking depending on #size-cells of the parent and
> the existing node reg properties, which you don't show.
>
> A hackier, but possibly simpler alternative would be to simply include
> both nodes, but have the one that's active by default marked status =
> "okay" and the other marked status = "disabled".  Platform specific
> knowledge would then me needed to know that with the right gpio magic
> the original one can be disabled and the other enabled.

I think the missing piece for a bystander looking at this proposal
(besides Mitch' comment about ranges) is that the probing by the
kernel would stop at the mux level, and the driver binding on the mux
device would have the option of restarting tree walk on its children.

That means that the standard unmodified drivers can be used since the
selection is done outside of them.


-Olof


More information about the devicetree-discuss mailing list