[U-Boot] [PATCH v2] Add single register pin controller driver
Felix Brack
fb at ltec.ch
Wed Feb 8 14:26:29 UTC 2017
Hello Masahiro,
This is my understanding of the parameters 'dev' and 'perihp' passed to
the function implementing set_state_simple().
On 08.02.2017 04:02, Masahiro Yamada wrote:
> Hi.
>
>
>
> 2017-02-07 22:30 GMT+09:00 Felix Brack <fb at ltec.ch>:
>
>> +
>> +static int single_set_state_simple(struct udevice *dev,
>> + struct udevice *periph)
>> +{
>> + const void *fdt = gd->fdt_blob;
>> + const struct single_fdt_pin_cfg *prop;
>> + int len;
>> +
>> + prop = fdt_getprop(fdt, periph->of_offset, "pinctrl-single,pins", &len);
>
>
> This seems wrong to me.
>
>
> The "periph" is a peripheral device (like UART, eMMC, USB, etc.).
>
In the case above 'dev' represents the pin controller node of the DT and
'periph' represents the DT node holding the pin configuration
information for a specific peripheral like i2c0, not the peripheral
itself. I know that neither 'dev' nor 'periph' _are_ device tree nodes
objects. This is why I use the word 'represent'.
> So, you are parsing the "pinctrl-single,pins" property
> in the peripheral device, like
>
> uart: uart {
>
> pinctrl-single,pins = <
> .....
> >;
>
> };
>
>
I don't think so (see below).
>
>
> In pinctrl, peripheral nodes should have a phandle to a child of the
> pinctrl device.
> As you see Linux, the DT should look like this:
>
>
> uart: uart {
>
> pinctrl-0 = <&uart_pins>;
>
> };
>
>
> pinctrl {
>
> uart_pins: uart_pins {
> pinctrl-single,pins = <
> ....
> >;
> };
>
> };
>
>
This is how it works. single_set_state_simple() would be called with
'dev' representing 'pinctrl' node and 'periph' representing 'uart_pins'
node. I would have to parse 'periph' for 'pinctrl-single,pins'.
>
>
I use this pin controller on a AM335x based board. Here are the relevant
parts from the device tree.
>From 'am33xx.dtsi', representing the pin controller itself:
am33xx_pinmux: pinmux at 800 {
compatible = "pinctrl-single";
reg = <0x800 0x238>;
...
}
>From a a device tree source file, representing the configuration of the
pins for the peripheral i2c0:
&am33xx_pinmux {
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
i2c0_pins: pinmux_i2c0_pins {
pinctrl-single,pins = <
AM33XX_IOPAD(0x988, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
AM33XX_IOPAD(0x98c, PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
>;
};
};
With this, single_set_state_simple() gets called with 'dev' representing
'pinmux at 800' and 'periph' representing 'pinmux_i2c0_pins' which makes
perfect sense to me.
Again I would have to parse 'periph' for 'pinctrl-single,pins'.
regards Felix
More information about the U-Boot
mailing list