Hi Linus,
I am sorry to report that your patch
(1) c1c04cea13dc gpio: of: Fix logic inversion
together with the basic patch
(2) 6953c57ab172 gpio: of: Handle SPI chipselect legacy bindings
leads to a severe regression for our GTA04 board. The symptom was easy to see but really difficult
to understand: the LCD panel stopped working (did only show white pixels) after upgrading from
v5.0 to v5.1-rc1.
In a long bisect session, I was able to identify patch (1) as the first bad commit and started
to analyse what the code is supposed to do and then found the older patch (2).
I learned that it tries to handle a legacy "spi-cs-high" property of SPI slaves, but was stopped
from doing so by a bug (1). So only with both patches, the legacy handler becomes active which
explains why it was not noticed earlier.
Now, our GTA04 device tree from 2014 (v3.16-rc1) was already written without any legacy spi properties
in mind
(3) c2e138bc8ed80 ARM: dts: omap3-gta04: Add display support
So it has no spi-cs-high property and just defines constant 0 for the flags (GPIO_ACTIVE_HIGH after
some fix from 2015) assuming that this is sufficient. And it was until before v5.1-rc1.
This is now wrongly turned into an GPIO_ACTIVE_LOW by your legacy fix which makes the panel
stop feeling responsible to receive any initialization data over SPI.
Yes, there is a new message in the boot log for this case, but to be honest, nobody did see it
before I found the code that does print it. A non-working LCD panel was a too distracting indicator
and could have been everything (most likely drm or the panel driver or clock or regulator or
dma setup or whatever)...
So your assumption that this case is the exception as stated in commit message of (2) seems not
to be true. IMHO it should be standard (at least since 2015) that there is GPIO_ACTIVE_HIGH and
no spi-cs-high. So your patch (2) gives a legacy property a new priority over modern style.
BTW: the spi-cs-high is described as optional and indicative in the bindings document. But it
now appears to be required to get a cs-high.
By the way, the detection of spi-cs-high still seems to be wrong as of v5.1-rc1. Shouldn't it
look at the child node for "spi-cs-high" and not the controller node pointer? As far as I understand
the current code, all such legacy flags are therefore ignored and should break all boards that
use spi-cs-high and GPIO_ACTIVE_HIGH.
Of course, adding spi-cs-high; (at the controller node!) of our device tree can make it work,
but I do not like to be forced to introduce a legacy property to our DTS file, just because
gpio-lib tries to fix a legacy problem in the SPI subsystem (quite mind-twisting cross-subsystem
dependencies, aren't they?).
The real problem seems to be that the legacy spi-cs-high property itself still exists although
it should not be needed for ca. 5 years. From all this I conclude that nobody really needs this
legacy support or does test it. And if he/she does, they should better fix the cs-gpios entries
in the DTS and remove spi-cs-high completely.
Therefore I would suggest:
* revert both patches as soon as possible (v5.1-rc series) to remove the unexpected spi legacy
code handler from the gpio subsystem.
* replace all uses of spi-cs-high by correct cs-gpios flags - unless they already are there.
fgrep spi-cs-high arch/*/boot/dts/*.dts* shows only a handful of DTS candidates.
* fix spi-bus.txt documentation to describe this potential pitfall.
Then we can leave our GTA04 display and device tree untouched as from v3.16-rc1 up to v5.0.x.
BR and thanks,
Nikolaus
On Sat, Mar 23, 2019 at 3:40 PM H. Nikolaus Schaller <[email protected]> wrote:
> (1) c1c04cea13dc gpio: of: Fix logic inversion
>
> together with the basic patch
>
> (2) 6953c57ab172 gpio: of: Handle SPI chipselect legacy bindings
>
> leads to a severe regression for our GTA04 board.
Sorry! :(
I found the same problem on my Nomadik board.
But I fixed it in that case by introducing a spi-cs-high into the DTS file:
https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
> I learned that it tries to handle a legacy "spi-cs-high" property of SPI slaves, but was stopped
> from doing so by a bug (1). So only with both patches, the legacy handler becomes active which
> explains why it was not noticed earlier.
>
> Now, our GTA04 device tree from 2014 (v3.16-rc1) was already written without any legacy spi properties
> in mind
I'm sorry about that, however if you look at the DT binding document:
Documentation/devicetree/bindings/spi/spi-bus.txt
You will see that spi-cs-high is mandatory. So these DTS files are
incorrect.
> Therefore I would suggest:
> * revert both patches as soon as possible (v5.1-rc series) to remove the unexpected spi legacy
> code handler from the gpio subsystem.
> * replace all uses of spi-cs-high by correct cs-gpios flags - unless they already are there.
> fgrep spi-cs-high arch/*/boot/dts/*.dts* shows only a handful of DTS candidates.
> * fix spi-bus.txt documentation to describe this potential pitfall.
This does not work because there are devices that requires spi-cs-high to be
respected and the DTS second cell GPIO flag to be ignored.
Jan Kotas reported this problem.
They might have deployed DTB binaries that need to keep working, so we
cannot change it to ignore spi-cs-high like this. (I might give in if it can be
proven that all of them just recompile the DTS all the time and no
DTBs are in flash.)
I think in this case the oldest binding wins. The spi-cs-high was there before
we came up with the scheme to use the flags cell with GPIO phandles.
I think you simply have to patch these GTA04 DTS files to use
spi-cs-high.
But I'm open to other ideas, let's discuss this.
Yours,
Linus Walleij
Hi Linus,
> Am 24.03.2019 um 05:15 schrieb Linus Walleij <[email protected]>:
>
> On Sat, Mar 23, 2019 at 3:40 PM H. Nikolaus Schaller <[email protected]> wrote:
>
>> (1) c1c04cea13dc gpio: of: Fix logic inversion
>>
>> together with the basic patch
>>
>> (2) 6953c57ab172 gpio: of: Handle SPI chipselect legacy bindings
>>
>> leads to a severe regression for our GTA04 board.
>
> Sorry! :(
>
> I found the same problem on my Nomadik board.
>
> But I fixed it in that case by introducing a spi-cs-high into the DTS file:
> https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
Yes, that of course works and is our temporary solution.
And I see that you also have it on the controller node and not the slave node.
>
>> I learned that it tries to handle a legacy "spi-cs-high" property of SPI slaves, but was stopped
>> from doing so by a bug (1). So only with both patches, the legacy handler becomes active which
>> explains why it was not noticed earlier.
>>
>> Now, our GTA04 device tree from 2014 (v3.16-rc1) was already written without any legacy spi properties
>> in mind
>
> I'm sorry about that, however if you look at the DT binding document:
> Documentation/devicetree/bindings/spi/spi-bus.txt
Shouldn't it be a property of the slave node and not the controller node?
>
> You will see that spi-cs-high is mandatory. So these DTS files are
> incorrect.
How do you read that it is mandatory from
"All slave nodes can contain the following optional properties:
- spi-cs-high - Empty property indicating device requires chip select
active high."
I read it as optional and indicative. Equal priority to cs-gpios.
>
>> Therefore I would suggest:
>> * revert both patches as soon as possible (v5.1-rc series) to remove the unexpected spi legacy
>> code handler from the gpio subsystem.
>> * replace all uses of spi-cs-high by correct cs-gpios flags - unless they already are there.
>> fgrep spi-cs-high arch/*/boot/dts/*.dts* shows only a handful of DTS candidates.
>> * fix spi-bus.txt documentation to describe this potential pitfall.
>
> This does not work because there are devices that requires spi-cs-high to be
> respected and the DTS second cell GPIO flag to be ignored.
Then, those should be fixed...
>
> Jan Kotas reported this problem.
Thanks for adding him to the discussion.
>
> They might have deployed DTB binaries that need to keep working,
Well, that is a weak argument. What if the GTA04 would have the DTB in FLASH
and would need it working (fortunately we always reflash kernel + dtbs)?
> so we
> cannot change it to ignore spi-cs-high like this. (I might give in if it can be
> proven that all of them just recompile the DTS all the time and no
> DTBs are in flash.)
BTW, on which node do these invariable DTBs have the spi-cs-high flag?
In the controller node (IMHO wrong) or the slave node (according to bindings doc)?
I have checked with randomly picked imx51-babbage.dts and it has it in the
slave node (pmic: mc13892@0). It also seems to be an example where different
CS lines want different settings.
If the all these DTBs have spi-cs-high in the slave node, none of them will
be fixed by the current code.
>
> I think in this case the oldest binding wins.
Ok, it is the question when such deprecated things are really removed.
There is no clear answer...
> The spi-cs-high was there before
> we came up with the scheme to use the flags cell with GPIO phandles.
>
> I think you simply have to patch these GTA04 DTS files to use
> spi-cs-high.
Ugly... Well, if DTS maintainers accept that?
>
> But I'm open to other ideas, let's discuss this.
What about a CONFIG to explicitly enable/disable this legacy support?
IMHO it will need to be enabled for les than 1% of the kernel builds and
therefore also keeps the zImage smaller for all others. And avoids DTB
changes where the gpio flags are already correct.
BR and thanks,
Nikolaus
On Sun, 24 Mar 2019 07:56:17 +0100
"H. Nikolaus Schaller" <[email protected]> wrote:
> Hi Linus,
>
> > Am 24.03.2019 um 05:15 schrieb Linus Walleij <[email protected]>:
> >
> > On Sat, Mar 23, 2019 at 3:40 PM H. Nikolaus Schaller <[email protected]> wrote:
> >
> >> (1) c1c04cea13dc gpio: of: Fix logic inversion
> >>
> >> together with the basic patch
> >>
> >> (2) 6953c57ab172 gpio: of: Handle SPI chipselect legacy bindings
> >>
> >> leads to a severe regression for our GTA04 board.
> >
> > Sorry! :(
> >
> > I found the same problem on my Nomadik board.
> >
> > But I fixed it in that case by introducing a spi-cs-high into the DTS file:
> > https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
>
> Yes, that of course works and is our temporary solution.
>
> And I see that you also have it on the controller node and not the slave node.
>
So if I get it right is a check added for undocumented properties
(nothing about spi-cs-high in controller node in the bindings
documentation, only in the slave node) in the two patches mentioned.
And then you add that undocumented property to a dts file in your "fix".
That all sounds strange to me.
> >
> >> I learned that it tries to handle a legacy "spi-cs-high" property of SPI slaves, but was stopped
> >> from doing so by a bug (1). So only with both patches, the legacy handler becomes active which
> >> explains why it was not noticed earlier.
> >>
> >> Now, our GTA04 device tree from 2014 (v3.16-rc1) was already written without any legacy spi properties
> >> in mind
> >
> > I'm sorry about that, however if you look at the DT binding document:
> > Documentation/devicetree/bindings/spi/spi-bus.txt
>
> Shouldn't it be a property of the slave node and not the controller node?
>
> >
> > You will see that spi-cs-high is mandatory. So these DTS files are
> > incorrect.
>
> How do you read that it is mandatory from
>
> "All slave nodes can contain the following optional properties:
> - spi-cs-high - Empty property indicating device requires chip select
> active high."
>
> I read it as optional and indicative. Equal priority to cs-gpios.
>
Well, it is in the list of optional properties. So the question is how
that "optional" is interpreted. Is it optional because you only use it
if cs is active high or is it optional because you can either indicate
that fact here or via gpio definition.
But again that flags makes no sense in the controller node.
Regards,
Andreas
Hi Andreas,
> Am 30.03.2019 um 19:33 schrieb Andreas Kemnade <[email protected]>:
>
> On Sun, 24 Mar 2019 07:56:17 +0100
> "H. Nikolaus Schaller" <[email protected]> wrote:
>
>> Hi Linus,
>>
>>> Am 24.03.2019 um 05:15 schrieb Linus Walleij <[email protected]>:
>>>
>>> On Sat, Mar 23, 2019 at 3:40 PM H. Nikolaus Schaller <[email protected]> wrote:
>>>
>>>> (1) c1c04cea13dc gpio: of: Fix logic inversion
>>>>
>>>> together with the basic patch
>>>>
>>>> (2) 6953c57ab172 gpio: of: Handle SPI chipselect legacy bindings
>>>>
>>>> leads to a severe regression for our GTA04 board.
>>>
>>> Sorry! :(
>>>
>>> I found the same problem on my Nomadik board.
>>>
>>> But I fixed it in that case by introducing a spi-cs-high into the DTS file:
>>> https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
>>
>> Yes, that of course works and is our temporary solution.
>>
>> And I see that you also have it on the controller node and not the slave node.
>>
> So if I get it right is a check added for undocumented properties
> (nothing about spi-cs-high in controller node in the bindings
> documentation, only in the slave node) in the two patches mentioned.
>
> And then you add that undocumented property to a dts file in your "fix".
>
> That all sounds strange to me.
>
>>>
>>>> I learned that it tries to handle a legacy "spi-cs-high" property of SPI slaves, but was stopped
>>>> from doing so by a bug (1). So only with both patches, the legacy handler becomes active which
>>>> explains why it was not noticed earlier.
>>>>
>>>> Now, our GTA04 device tree from 2014 (v3.16-rc1) was already written without any legacy spi properties
>>>> in mind
>>>
>>> I'm sorry about that, however if you look at the DT binding document:
>>> Documentation/devicetree/bindings/spi/spi-bus.txt
>>
>> Shouldn't it be a property of the slave node and not the controller node?
>>
>>>
>>> You will see that spi-cs-high is mandatory. So these DTS files are
>>> incorrect.
>>
>> How do you read that it is mandatory from
>>
>> "All slave nodes can contain the following optional properties:
>> - spi-cs-high - Empty property indicating device requires chip select
>> active high."
>>
>> I read it as optional and indicative. Equal priority to cs-gpios.
>>
> Well, it is in the list of optional properties. So the question is how
> that "optional" is interpreted. Is it optional because you only use it
> if cs is active high or is it optional because you can either indicate
> that fact here or via gpio definition.
>
> But again that flags makes no sense in the controller node.
I have already prepared some fix for this controller/slave node issue and
a new CONFIG option to enable the legacy "spi-cs-high" only if needed.
Seems to be common practice that legacy API support (and legacy DTB
compatibility is also "API") is only enabled by CONFIGs on demand.
This can then replace our current GTA04 hack. Will post ASAP to LKML.
BR,
Nikolaus
(CC Kumar and Wolfgang who came up with spi-active-low, I think.)
On Sun, Mar 24, 2019 at 1:56 PM H. Nikolaus Schaller <[email protected]> wrote:
> > Am 24.03.2019 um 05:15 schrieb Linus Walleij <[email protected]>:
> > But I fixed it in that case by introducing a spi-cs-high into the DTS file:
> > https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
>
> Yes, that of course works and is our temporary solution.
>
> And I see that you also have it on the controller node and not the slave node.
Yes I git it wrong, the slave should have it and another bug of mine
made it look at the controller not (some days I should not write
code in paths that do not get executed).
> > I'm sorry about that, however if you look at the DT binding document:
> > Documentation/devicetree/bindings/spi/spi-bus.txt
>
> Shouldn't it be a property of the slave node and not the controller node?
Indeed.
> > You will see that spi-cs-high is mandatory. So these DTS files are
> > incorrect.
>
> How do you read that it is mandatory from
>
> "All slave nodes can contain the following optional properties:
> - spi-cs-high - Empty property indicating device requires chip select
> active high."
>
> I read it as optional and indicative. Equal priority to cs-gpios.
The basic problem is that spi-cs-high is defined negatively,
so by default a CS GPIO is active low. This clashes with the
default GPIO flag, as GPIO_ACTIVE_HIGH is zero, no flag,
and thus the default if nothing is specified, so if the GPIO flag is
zero it should be active high, but if "spi-active-high" is not on the
slave node it should be active low, so one of them have
to win, they can't both win.
I'd say that spi-cs-high existed before we standardized the GPIO
flags in the DT bindings. So people were relying on it for years before
we came up with the ACTIVE_HIGH/LOW flags.
commit f618ebfcbf9616a0fa9a78f5ecb69762f0fa3c59
Author: Wolfgang Ocker <[email protected]>
Date: Wed Oct 15 15:00:47 2008 +0200
of/spi: Support specifying chip select as active high via device tree
The patch allows to specify that an SPI device needs an active high chip
select.
Signed-off-by: Wolfgang Ocker <[email protected]>
Signed-off-by: Kumar Gala <[email protected]>
While the GPIO binding turns up 5 years later:
commit 71fab21fee07fd6d5f1a984db387cc5e4596f3fa
Author: Stephen Warren <[email protected]>
Date: Tue Feb 12 17:22:36 2013 -0700
ARM: dt: add header to define GPIO flags
Many GPIO device tree bindings use the same flags. Create a header to
define those.
Signed-off-by: Stephen Warren <[email protected]>
Acked-by: Rob Herring <[email protected]>
And then this guy think it is a good idea to standardize this for
all GPIO phandles two years later:
commit 69d301fdd19635a39cb2b78e53fdd625b7a27924
Author: Linus Walleij <[email protected]>
Date: Thu Sep 24 15:05:45 2015 -0700
gpio: add DT bindings for existing consumer flags
It is customary for GPIO controllers to support open drain/collector
and open source/emitter configurations. Add standard GPIO line flags
to account for this and augment the documentation to say that these
are the most generic bindings.
Several people approached me to add new flags to the lines, and this
makes sense, but let's first bind up the most common cases before we
start to add exotic stuff.
Thanks to H. Nikolaus Schaller for ideas on how to encode single-ended
wiring such as open drain/source and open collector/emitter.
Cc: Tony Lindgren <[email protected]>
Cc: Grygorii Strashko <[email protected]>
Cc: H. Nikolaus Schaller <[email protected]>
Signed-off-by: Linus Walleij <[email protected]>
> > This does not work because there are devices that requires spi-cs-high to be
> > respected and the DTS second cell GPIO flag to be ignored.
>
> Then, those should be fixed...
This can't be done because some old systems (mostly powerpc)
added between 2008-2013 do not know about GPIO flags and
have DTBs deployed in firmware that need to keep working.
They cannot be fixed.
> > They might have deployed DTB binaries that need to keep working,
>
> Well, that is a weak argument. What if the GTA04 would have the DTB in FLASH
> and would need it working (fortunately we always reflash kernel + dtbs)?
Usually the definition I use for "deployed DTB" is not
"deployed on my desk" but "deployed by a factory" i.e. someone
producing millions of TV sets or something. For example my monitor
is using a PowerPC CPU and has one of these DTBs in flash,
and expect it to keep working if I upgrade the kernel separately.
> BTW, on which node do these invariable DTBs have the spi-cs-high flag?
> In the controller node (IMHO wrong) or the slave node (according to bindings doc)?
Slave node I hope, the controller thing was just one of my stupid
mistakes.
> I have checked with randomly picked imx51-babbage.dts and it has it in the
> slave node (pmic: mc13892@0). It also seems to be an example where different
> CS lines want different settings.
I'm afraid the consumers of the old powerpc DTS files are not even
maintained inside the Linux kernel, as we sometimes assume. Those
were created and dispersed by vendors at a time when it was assumed
it was OK to maintain your DTS files somewhere out there on the
side (some people still hold this opinion, I don't).
> > I think in this case the oldest binding wins.
>
> Ok, it is the question when such deprecated things are really removed.
> There is no clear answer...
I think the DT bindings people would say never. They are deprecated
but they can never stop working. I guess in theory you could try to
figure out when the last piece of equipment using the old binding and
ever wanting a FW update stops working. That seems hard, but I don't
know much about these powerpc systems.
That is the reason why I try to contain these weirdness things inside
gpiolib-of.c rather than out amongst the different subsystems, so I can
have it under control.
> > I think you simply have to patch these GTA04 DTS files to use
> > spi-cs-high.
>
> Ugly... Well, if DTS maintainers accept that?
I suppose.
> What about a CONFIG to explicitly enable/disable this legacy support?
>
> IMHO it will need to be enabled for les than 1% of the kernel builds and
> therefore also keeps the zImage smaller for all others. And avoids DTB
> changes where the gpio flags are already correct.
Dunno about this, it looks fragile, I would prefer to keep all working.
But I will listen to reason.
I have thought about using of_machine_is_compatible("vendor,foo")
in gpiolib-of.h to whitelist some systems that will just use the
new way, or reversely blacklist some old systems that have to use the
old syntax. What do you think about this?
Yours,
Linus Walleij
On Sun, Mar 31, 2019 at 1:33 AM Andreas Kemnade <[email protected]> wrote:
> > > But I fixed it in that case by introducing a spi-cs-high into the DTS file:
> > > https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
> >
> > Yes, that of course works and is our temporary solution.
> >
> > And I see that you also have it on the controller node and not the slave node.
> >
> So if I get it right is a check added for undocumented properties
> (nothing about spi-cs-high in controller node in the bindings
> documentation, only in the slave node) in the two patches mentioned.
>
> And then you add that undocumented property to a dts file in your "fix".
>
> That all sounds strange to me.
Yeah it sounds strange because it is strange :)
I was simply confused and wrong. Sometimes we all do very uniformed
things, today it was me.
The flag should of course be on the slave node.
So now I have to fix my fix.
Yours,
Linus Walleij
Hi Linus,
> Am 02.04.2019 um 06:02 schrieb Linus Walleij <[email protected]>:
>
> (CC Kumar and Wolfgang who came up with spi-active-low, I think.)
>
> On Sun, Mar 24, 2019 at 1:56 PM H. Nikolaus Schaller <[email protected]> wrote:
>>> Am 24.03.2019 um 05:15 schrieb Linus Walleij <[email protected]>:
>
>>> But I fixed it in that case by introducing a spi-cs-high into the DTS file:
>>> https://marc.info/?l=linux-arm-kernel&m=155292310015309&w=2
>>
>> Yes, that of course works and is our temporary solution.
>>
>> And I see that you also have it on the controller node and not the slave node.
>
> Yes I git it wrong, the slave should have it and another bug of mine
> made it look at the controller not (some days I should not write
> code in paths that do not get executed).
>
>>> I'm sorry about that, however if you look at the DT binding document:
>>> Documentation/devicetree/bindings/spi/spi-bus.txt
>>
>> Shouldn't it be a property of the slave node and not the controller node?
>
> Indeed.
>
>>> You will see that spi-cs-high is mandatory. So these DTS files are
>>> incorrect.
>>
>> How do you read that it is mandatory from
>>
>> "All slave nodes can contain the following optional properties:
>> - spi-cs-high - Empty property indicating device requires chip select
>> active high."
>>
>> I read it as optional and indicative. Equal priority to cs-gpios.
>
> The basic problem is that spi-cs-high is defined negatively,
> so by default a CS GPIO is active low. This clashes with the
> default GPIO flag, as GPIO_ACTIVE_HIGH is zero, no flag,
> and thus the default if nothing is specified, so if the GPIO flag is
> zero it should be active high, but if "spi-active-high" is not on the
> slave node it should be active low, so one of them have
> to win, they can't both win.
>
> I'd say that spi-cs-high existed before we standardized the GPIO
> flags in the DT bindings. So people were relying on it for years before
> we came up with the ACTIVE_HIGH/LOW flags.
>
> commit f618ebfcbf9616a0fa9a78f5ecb69762f0fa3c59
> Author: Wolfgang Ocker <[email protected]>
> Date: Wed Oct 15 15:00:47 2008 +0200
>
> of/spi: Support specifying chip select as active high via device tree
>
> The patch allows to specify that an SPI device needs an active high chip
> select.
>
> Signed-off-by: Wolfgang Ocker <[email protected]>
> Signed-off-by: Kumar Gala <[email protected]>
>
> While the GPIO binding turns up 5 years later:
>
> commit 71fab21fee07fd6d5f1a984db387cc5e4596f3fa
> Author: Stephen Warren <[email protected]>
> Date: Tue Feb 12 17:22:36 2013 -0700
>
> ARM: dt: add header to define GPIO flags
>
> Many GPIO device tree bindings use the same flags. Create a header to
> define those.
>
> Signed-off-by: Stephen Warren <[email protected]>
> Acked-by: Rob Herring <[email protected]>
>
> And then this guy think it is a good idea to standardize this for
> all GPIO phandles two years later:
>
> commit 69d301fdd19635a39cb2b78e53fdd625b7a27924
> Author: Linus Walleij <[email protected]>
> Date: Thu Sep 24 15:05:45 2015 -0700
>
> gpio: add DT bindings for existing consumer flags
>
> It is customary for GPIO controllers to support open drain/collector
> and open source/emitter configurations. Add standard GPIO line flags
> to account for this and augment the documentation to say that these
> are the most generic bindings.
>
> Several people approached me to add new flags to the lines, and this
> makes sense, but let's first bind up the most common cases before we
> start to add exotic stuff.
>
> Thanks to H. Nikolaus Schaller for ideas on how to encode single-ended
> wiring such as open drain/source and open collector/emitter.
>
> Cc: Tony Lindgren <[email protected]>
> Cc: Grygorii Strashko <[email protected]>
> Cc: H. Nikolaus Schaller <[email protected]>
Yes, I remember to help with the open drain/collector definition :)
> Signed-off-by: Linus Walleij <[email protected]>
>
>>> This does not work because there are devices that requires spi-cs-high to be
>>> respected and the DTS second cell GPIO flag to be ignored.
>>
>> Then, those should be fixed...
>
> This can't be done because some old systems (mostly powerpc)
> added between 2008-2013 do not know about GPIO flags and
> have DTBs deployed in firmware that need to keep working.
> They cannot be fixed.
The question is if it is even possible to deploy a new kernel
for such devices and if anyone wants to do...
This also gives another idea: make it depend on "powerpc".
>
>>> They might have deployed DTB binaries that need to keep working,
>>
>> Well, that is a weak argument. What if the GTA04 would have the DTB in FLASH
>> and would need it working (fortunately we always reflash kernel + dtbs)?
>
> Usually the definition I use for "deployed DTB" is not
> "deployed on my desk" but "deployed by a factory" i.e. someone
> producing millions of TV sets or something. For example my monitor
> is using a PowerPC CPU and has one of these DTBs in flash,
> and expect it to keep working if I upgrade the kernel separately.
Ok, I see.
We basically have the same (devices deployed to unknown users), but
we can and do flash kernel + dtb in parallel so it is easier in our
case.
>
>> BTW, on which node do these invariable DTBs have the spi-cs-high flag?
>> In the controller node (IMHO wrong) or the slave node (according to bindings doc)?
>
> Slave node I hope, the controller thing was just one of my stupid
> mistakes.
>
>> I have checked with randomly picked imx51-babbage.dts and it has it in the
>> slave node (pmic: mc13892@0). It also seems to be an example where different
>> CS lines want different settings.
>
> I'm afraid the consumers of the old powerpc DTS files are not even
> maintained inside the Linux kernel, as we sometimes assume. Those
> were created and dispersed by vendors at a time when it was assumed
> it was OK to maintain your DTS files somewhere out there on the
> side (some people still hold this opinion, I don't).
>
>>> I think in this case the oldest binding wins.
>>
>> Ok, it is the question when such deprecated things are really removed.
>> There is no clear answer...
>
> I think the DT bindings people would say never. They are deprecated
> but they can never stop working. I guess in theory you could try to
> figure out when the last piece of equipment using the old binding and
> ever wanting a FW update stops working. That seems hard, but I don't
> know much about these powerpc systems.
>
> That is the reason why I try to contain these weirdness things inside
> gpiolib-of.c rather than out amongst the different subsystems, so I can
> have it under control.
>
>>> I think you simply have to patch these GTA04 DTS files to use
>>> spi-cs-high.
>>
>> Ugly... Well, if DTS maintainers accept that?
>
> I suppose.
>
>> What about a CONFIG to explicitly enable/disable this legacy support?
>>
>> IMHO it will need to be enabled for les than 1% of the kernel builds and
>> therefore also keeps the zImage smaller for all others. And avoids DTB
>> changes where the gpio flags are already correct.
First of all, the new patch checking for presence of cs-gpios works for us!
So we are fine with upstream v5.1-rc3 on our devices and do not need to
"fix" the DTS.
>
> Dunno about this, it looks fragile, I would prefer to keep all working.
> But I will listen to reason.
Reason why I propose a CONFIG option is:
if someone is able to compile and deploy a v5.1 kernel for some device which
has (old) and problematic DTB in ROM he/she must have access to the .config.
So it is easy to modify it to enable legacy handling of spi-cs-high. And keep
it disabled for all others.
That is the idea I have casted into my
"[BUG/PATCH 3/4] gpiolib: make legacy handling for spi-cs-high optional"
sent separately. Maybe there is a better solution (e.g. replace SPI_MASTER
by SPI_LEGACY_MASTER or similar).
>
> I have thought about using of_machine_is_compatible("vendor,foo")
> in gpiolib-of.h to whitelist some systems that will just use the
> new way, or reversely blacklist some old systems that have to use the
> old syntax. What do you think about this?
This would just automate modifying .config for a specific board. By adding
runtime code for everybody.
And it gives you the burden to collect all new "vendor,foo" strings every
now and then, instead of having "vendor" change some .config when building
a kernel image for "foo", especially for out-of-tree devices.
Since it requires help from vendors anyways (those would have to supply the
"vendor,foo" to you, you can maybe easier ask them to change their CONFIG.
For DTS of In-tree devices you could IMHO simply replace spi-cs-high by the
correct gpio flags so that there is no use of it in kernel.org any more
and nobody is tempted to use it as an example...
BR and thanks,
Nikolaus
On Tue, Apr 02, 2019 at 07:05:35AM +0200, H. Nikolaus Schaller wrote:
> > Am 02.04.2019 um 06:02 schrieb Linus Walleij <[email protected]>:
Please delete unneeded context from mails when replying. Doing this
makes it much easier to find your reply in the message, helping ensure
it won't be missed by people scrolling through the irrelevant quoted
material.
> >>> This does not work because there are devices that requires spi-cs-high to be
> >>> respected and the DTS second cell GPIO flag to be ignored.
> >> Then, those should be fixed...
> > This can't be done because some old systems (mostly powerpc)
> > added between 2008-2013 do not know about GPIO flags and
> > have DTBs deployed in firmware that need to keep working.
> > They cannot be fixed.
> The question is if it is even possible to deploy a new kernel
> for such devices and if anyone wants to do...
It's relatively common, especially with older devices, for people to be
perfectly happy to update the kernel and do so frequently but unwilling
to update the bootloader as the procedure for recovering a broken
bootloader is difficult or perhaps not even possible.
> This also gives another idea: make it depend on "powerpc".
That won't fly, the code has always been architecture neutral.
> > Dunno about this, it looks fragile, I would prefer to keep all working.
> > But I will listen to reason.
> Reason why I propose a CONFIG option is:
> if someone is able to compile and deploy a v5.1 kernel for some device which
> has (old) and problematic DTB in ROM he/she must have access to the .config.
> So it is easy to modify it to enable legacy handling of spi-cs-high. And keep
> it disabled for all others.
This assumes people aren't able to run a distro kernel...
> Am 02.04.2019 um 07:31 schrieb Mark Brown <[email protected]>:
>
> It's relatively common, especially with older devices, for people to be
> perfectly happy to update the kernel and do so frequently but unwilling
> to update the bootloader as the procedure for recovering a broken
> bootloader is difficult or perhaps not even possible.
Yes, that is the case Linus tries to solve, where it is not even possible
to modify the DTB. No idea how it could be solved if it would not be
possible to change our 6 years old DTB.
Fortunately we do not need to change it at all with the latest check for
cs-gpios.
>
>> This also gives another idea: make it depend on "powerpc".
>
> That won't fly, the code has always been architecture neutral.
Ok. Just an idea.
>
>>> Dunno about this, it looks fragile, I would prefer to keep all working.
>>> But I will listen to reason.
>
>> Reason why I propose a CONFIG option is:
>
>> if someone is able to compile and deploy a v5.1 kernel for some device which
>> has (old) and problematic DTB in ROM he/she must have access to the .config.
>> So it is easy to modify it to enable legacy handling of spi-cs-high. And keep
>> it disabled for all others.
>
> This assumes people aren't able to run a distro kernel...
Yes, indeed.
I have learned from Linus that the problem with legacy spi-cs-high are mostly embedded
powerpc systems deployed between 2008 and 2013 where the boot-loader can't be
changed. And where the dts is not maintained on kernel.org.
IMHO it is very unlikely that they are running distro kernels. Or is there an example
of such a system?
BR and thanks,
Nikolaus
On Tue, Apr 02, 2019 at 08:37:23AM +0200, H. Nikolaus Schaller wrote:
> I have learned from Linus that the problem with legacy spi-cs-high are mostly embedded
> powerpc systems deployed between 2008 and 2013 where the boot-loader can't be
> changed. And where the dts is not maintained on kernel.org.
> IMHO it is very unlikely that they are running distro kernels. Or is there an example
> of such a system?
I used to work on embedded systems which were built by essentially
bolting expansion cards onto standard reference systems, for some of
them we shipped distro kernels with the extra hardware supported by
adding modules. No idea if there's practical examples for specific
PowerPC systems though.
The burden when you're breaking things is more on showing that there
isn't a problem anyway...