Re: ACPI vs Device Tree - moving forward

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 20, 2013 at 11:11 PM, Rafael J. Wysocki <rjw@xxxxxxx> wrote:

> There's one more problematic case which is that some systems ship with ACPI
> tables that don't contain all of the information necessary to enumerate
> hardware appropriately and it's difficult, if not impossible, to convince
> the vendors of those systems to fix their ACPI firmware after the fact.
> However, at least in some cases there are well defined DT bindings for the
> hardware in question.

I think this works as far as the hardware can be described in a simple
way.

When the hardware is complex, the problem of interoperating with ACPI
becomes complex, because when it comes to interrupts and other
resources, it seems to me that both ACPI and DT wants to be in
the driver seat and there is only place for one.

Let me copy this example again for this wider discusson
(OK Rafael has seen it before, so you can skip the rest):

Here is an example:
drivers/gpio/gpio-stmpe.c

This is a generic multi-purpose-expander, it can be used on any
system, be it ARM, blackfin or x86 embedded. You connect this
to an I2C port and then there is an IRQ line that you will need to
connect to a dedicated IRQ in pin or a GPIO line configured to take
an IRQ in. Since it contains a GPIO expander and a keypad driver
those two aspects get configured.

It looks like this in an I2C controller node
(condensed from arch/arm/boot/dts/href.dtsi and more)

i2c@80004000 {
        stmpe1601: stmpe1601@40 {
                compatible = "st,stmpe1601";
                reg = <0x40>;
                interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
                interrupt-parent = <&gpio6>;
                interrupt-controller;

                wakeup-source;
                st,autosleep-timeout = <1024>;

                stmpe_keypad {
                        compatible = "st,stmpe-keypad";

                        debounce-interval = <64>;
                        st,scan-count = <8>;
                        st,no-autorepeat;

                        linux,keymap = <0x205006b
                                        0x4010074
                                        0x3050072
                                        0x1030004
                                        0x502006a
                                        0x500000a
                                        0x5008b
                                        0x706001c
                                        0x405000b
                                        0x6070003
                                        0x3040067
                                        0x303006c
                                        0x60400e7
                                        0x602009e
                                        0x4020073
                                        0x5050002
                                        0x4030069
                                        0x3020008>;
                };
         };
};

As you can some stuff is nice to get for free: the keymap
parser, scan settings, debounce, and so on. But then we run
into these problems:

- The I2C address is specified in "reg" - maybe ACPI have
  some other way to assign I2C addresses to I2C devices?
  In any case, it *must* reference the parent I2C controller,
  here that is done implicitly by placing this DT node inside
  the I2C controllers DT node.

- Then it is using a GPIO line as interrupt, and specify that
  this shall be configured as a falling edge IRQ.

- It then tells the interrupt controller parent. So it needs
  to have a reference to whatever interrupt chip device
  will handle that IRQ.

- Further it *is* an interrupt controller, so devices connected
  to the GPIO lines may generate IRQs and then this
  device should service them. Is it possible that the devices
  connected to this expander in turn use ACPI to describe
  themselves? Then we need a reference in the other
  direction.

- Further it is a wakeup source, so each IRQ it provides
  on its GPIO lines can be set as a wakeup. I wonder how
  this plays with D-states and ACPI.

-------

I did present the above as an extreme example, but if we
start to combine DT and ACPI we have to have that kind of
hardware in mind. GPIO expanders with IRQs and all are
maybe rare on desktops and laptops but very common on
embedded systems.

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux