Hi, On Fri, Apr 29, 2022 at 4:31 PM Stephen Boyd <swboyd@xxxxxxxxxxxx> wrote: > > If the device is a detachable, this device won't have a matrix keyboard > but it may have some button switches, e.g. volume buttons and power > buttons. Let's add a more specific compatible for this type of device > that indicates to the OS that there are only switches and no matrix > keyboard present. If only the switches compatible is present, then the > matrix keyboard properties are denied. This lets us gracefully migrate > devices that only have switches over to the new compatible string. I know the history here so I know the reasons for the 3 choices, but I'm not sure I'd fully understand it just from the description above. Maybe a summary in the CL desc would help? Summary: 1. If you have a matrix keyboard and maybe also some buttons/switches then use the compatible: google,cros-ec-keyb 2. If you only have buttons/switches but you want to be compatible with the old driver in Linux that looked for the compatible "google,cros-ec-keyb" and required the matrix properties, use the compatible: "google,cros-ec-keyb-switches", "google,cros-ec-keyb" 3. If you have only buttons/switches and don't need compatibility with old Linux drivers, use the compatible: "google,cros-ec-keyb-switches" > Similarly, start enforcing that the keypad rows/cols and keymap > properties exist if the google,cros-ec-keyb compatible is present. This > more clearly describes what the driver is expecting, i.e. that the > kernel driver will fail to probe if the row or column or keymap > properties are missing and only the google,cros-ec-keyb compatible is > present. > > Cc: Krzysztof Kozlowski <krzk@xxxxxxxxxx> > Cc: Rob Herring <robh+dt@xxxxxxxxxx> > Cc: <devicetree@xxxxxxxxxxxxxxx> > Cc: Benson Leung <bleung@xxxxxxxxxxxx> > Cc: Guenter Roeck <groeck@xxxxxxxxxxxx> > Cc: Douglas Anderson <dianders@xxxxxxxxxxxx> > Cc: Hsin-Yi Wang <hsinyi@xxxxxxxxxxxx> > Cc: "Joseph S. Barrera III" <joebar@xxxxxxxxxxxx> > Signed-off-by: Stephen Boyd <swboyd@xxxxxxxxxxxx> > --- > .../bindings/input/google,cros-ec-keyb.yaml | 95 +++++++++++++++++-- > 1 file changed, 89 insertions(+), 6 deletions(-) > > diff --git a/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml b/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml > index e8f137abb03c..c1b079449cf3 100644 > --- a/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml > +++ b/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml > @@ -15,14 +15,19 @@ description: | > Google's ChromeOS EC Keyboard is a simple matrix keyboard > implemented on a separate EC (Embedded Controller) device. It provides > a message for reading key scans from the EC. These are then converted > - into keycodes for processing by the kernel. > - > -allOf: > - - $ref: "/schemas/input/matrix-keymap.yaml#" > + into keycodes for processing by the kernel. This device also supports > + switches/buttons like power and volume buttons. > > properties: > compatible: > - const: google,cros-ec-keyb > + oneOf: > + - items: > + - const: google,cros-ec-keyb-switches > + - items: > + - const: google,cros-ec-keyb-switches > + - const: google,cros-ec-keyb > + - items: > + - const: google,cros-ec-keyb > > google,needs-ghost-filter: > description: > @@ -41,15 +46,40 @@ properties: > where the lower 16 bits are reserved. This property is specified only > when the keyboard has a custom design for the top row keys. > > +dependencies: > + function-row-phsymap: [ 'linux,keymap' ] > + google,needs-ghost-filter: [ 'linux,keymap' ] > + > required: > - compatible > > +allOf: > + - if: > + properties: > + compatible: > + contains: > + const: google,cros-ec-keyb > + then: > + allOf: > + - $ref: "/schemas/input/matrix-keymap.yaml#" > + - if: > + not: > + properties: > + compatible: > + contains: > + const: google,cros-ec-keyb-switches > + then: > + required: > + - keypad,num-rows > + - keypad,num-columns > + - linux,keymap I think that: 1. If you only have buttons/switches and care about backward compatibility, you use the "two compatibles" version. 2. If you care about backward compatibility then you _must_ include the matrix properties. Thus I would be tempted to say that we should just have one "if" test that says that if matrix properties are allowed then they're also required. That goes against the recently landed commit 4352e23a7ff2 ("Input: cros-ec-keyb - only register keyboard if rows/columns exist") but perhaps we should just _undo_ that that since it landed pretty recently and say that the truly supported way to specify that you only have keyboards/switches is with the compatible. What do you think? -Doug