Hi,

> Am 20.09.2016 um 23:45 schrieb Tony Lindgren <t...@atomide.com>:
> 
> * H. Nikolaus Schaller <h...@goldelico.com> [160920 01:44]:
>> Hi Tony,
>> (I had forgotten to cc LKML so I have added it).
>> 
>>> Am 19.09.2016 um 20:07 schrieb Tony Lindgren <t...@atomide.com>:
>>> 
>>> * H. Nikolaus Schaller <h...@goldelico.com> [160918 06:53]:
>>>> Hi,
>>>> I am trying to set up a special McBSP1 CLKR on OMAP3, but I don't 
>>>> understand
>>>> the logic of the offsets and masks behind pinctrl-single,bits.
>>>> 
>>>> I have modified the example given in the bindings document
>>>> 
>>>>    
>>>> http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/pinctrl/pinctrl-single.txt?v=3.8#L110
>>>> 
>>>> to:
>>>> 
>>>> / {
>>>>    /* pinmux for devconf0 */
>>>>    control_devconf0: pinmux@48002274 {
>>>>            compatible = "pinctrl-single";
>>>>            reg = <0x48002274 4>;   /* Single register */
>>>>            #address-cells = <1>;
>>>>            #size-cells = <0>;
>>>>            pinctrl-single,bit-per-mux;
>>>>            pinctrl-single,register-width = <32>;
>>>>            pinctrl-single,function-mask = <0x5F>;
>>>>    };
>>>> };
>>>> 
>>>> &control_devconf0 {
>>>>    pinctrl-names = "default";
>>>>    pinctrl-0 = <&mcbsp1_defconf0>;
>>>> 
>>>>    mcbsp1_defconf0: pinmux_mcbsp1_defconf0 {
>>>>            /*                   offset bits mask */
>>>>            pinctrl-single,bits = <0x00 0x08 0x08>; /* set MCBSP1_CLKR_MASK 
>>>> */
>>>>    };
>>>> };
>>>> 
>>>> This looks reasonable to me to set bit 0x08 of the DEVCONF0 register which 
>>>> is within the set of the bits "enabled" for modification by the mask 0x5F.
>>> 
>>> Yes as long as devconf0 is purely a mux register with no extra features
>>> like regulators or clocks.
>>> 
>>>> All I get from this is a reject:
>>>> 
>>>> [    1.808258] pinctrl-single 48002274.pinmux: Invalid submask 0x8 for 
>>>> pinmux_mcbsp1_defconf0 at 0x0
>>>> 
>>>> So what is wrong?
>>>> 
>>>> I have added some printk to drivers/pinctrl/pinctrl-single.c to understand 
>>>> what
>>>> the bits, offsets and masks are thought to do.
>>>> 
>>>> [    1.807220] pinctrl-single: fmask=0000005f fshift=0 fmax=0000005f
>>>> [    1.807464] pinctrl-single: pcs->fmask = 0000005f
>>>> [    1.807495] pinctrl-single: mask = 00000008 bit_pos = 3 
>>>> pin_num_from_lsb = 0 mask_pos = 000002f8 val_pos = 00000008 submask = 
>>>> 00000008
>>>> [    1.807495] pinctrl-single:  -> mask = 00000000
>>>> [    1.807525] pinctrl-single 48002274.pinmux: Invalid submask 0x8 for 
>>>> pinmux_mcbsp1_defconf0 at 0x0
>>>> 
>>>> What I don't understand at all is why the mask 0x5f gives a mask_pos = 
>>>> 000002f8.
>>>> Of course then the mask can never be the same as the submask.
>>>> 
>>>> Or is the example in the bindings document wrong?
>>> 
>>> Hmm can't say what might be wrong, it is pretty widely used for da850 and
>>> keystone. Maybe check those dtsi files and see if there's some difference
>>> compared to the docs?
>> 
>> Yes, that was a good hint.
>> 
>> I found how it is used in da850.dtsi and it looks as if the documentation is
>> too sparse and the example is wrong.
>> 
>> The reason seems to be that pinctrl-single,function-mask has changed its
>> role some time ago. At least
>> 
>> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=055cb2a9e065c3a606f57fbcf8de1689f7c1fedf
>> 
>> seems to indicate that.
>> 
>> My current working hypothesis is that function-mask no longer specifies
>> which bits *can* be changed in total (depending on the individual mask)
>> but which bits *must* be changed by a single mask.
>> 
>> So the old one was to reject setting bits that are not to be changed while
>> the new one enforces several bits to be changed as a group.
>> 
>> 0x5f did mean: you can change any of these 5 bits but with the modified
>> scheme it seems to mean: you must set/reset all these bits in parallel.
>> 
>> Hence setting just one bit (my example) or two bits (bindings document
>> example) is rejected.
>> 
>> This did not at all become clear to me from the bindings description...
>> 
>> I have tried both:
>> 
>>>> pinctrl-single,function-mask = <0x01>;
>>>> pinctrl-single,bits = <0x00 0x08 0x08>;
>> 
>>>> pinctrl-single,function-mask = <0x5F>;
>>>> pinctrl-single,bits = <0x00 0x08 0x5f>;
>> 
>> and both are not rejected and set the expected value.
> 
> OK, care to update the doc while at it so we can avoid running
> into this again?

Yes, I'd like to.

The problem is that I need some confirmation that my understanding is
really correct... I just did guess and succeed.

So someone who understands the driver code should comment first.
Then I can prepare a patch for the documentation.

BR,
Nikolaus

Reply via email to