diff options
author | Lan Tianyu <tianyu.lan@intel.com> | 2014-05-20 08:59:23 -0400 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2014-06-27 08:50:40 -0400 |
commit | 5d98e61d337c181f199a6cb864569cc4e116ef4c (patch) | |
tree | 8768f805e13e68c0f9662cf288d2c7179fe01002 /include/linux/acpi.h | |
parent | a497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee (diff) |
I2C/ACPI: Add i2c ACPI operation region support
ACPI 5.0 spec(5.5.2.4.5) defines GenericSerialBus(i2c, spi, uart) operation region.
It allows ACPI aml code able to access such kind of devices to implement
some ACPI standard method.
ACPI Spec defines some access attribute to associate with i2c protocol.
AttribQuick Read/Write Quick Protocol
AttribSendReceive Send/Receive Byte Protocol
AttribByte Read/Write Byte Protocol
AttribWord Read/Write Word Protocol
AttribBlock Read/Write Block Protocol
AttribBytes Read/Write N-Bytes Protocol
AttribProcessCall Process Call Protocol
AttribBlockProcessCall Write Block-Read Block Process Call Protocol
AttribRawBytes Raw Read/Write N-BytesProtocol
AttribRawProcessBytes Raw Process Call Protocol
On the Asus T100TA, Bios use GenericSerialBus operation region to access
i2c device to get battery info.
Sample code From Asus T100TA
Scope (_SB.I2C1)
{
Name (UMPC, ResourceTemplate ()
{
I2cSerialBus (0x0066, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2C1",
0x00, ResourceConsumer, ,
)
})
...
OperationRegion (DVUM, GenericSerialBus, Zero, 0x0100)
Field (DVUM, BufferAcc, NoLock, Preserve)
{
Connection (UMPC),
Offset (0x81),
AccessAs (BufferAcc, AttribBytes (0x3E)),
FGC0, 8
}
...
}
Device (BATC)
{
Name (_HID, EisaId ("PNP0C0A")) // _HID: Hardware ID
Name (_UID, One) // _UID: Unique ID
...
Method (_BST, 0, NotSerialized) // _BST: Battery Status
{
If (LEqual (AVBL, One))
{
Store (FGC0, BFFG)
If (LNotEqual (STAT, One))
{
ShiftRight (CHST, 0x04, Local0)
And (Local0, 0x03, Local0)
If (LOr (LEqual (Local0, One), LEqual (Local0, 0x02)))
{
Store (0x02, Local1)
}
...
}
The i2c operation region is defined under I2C1 scope. _BST method under
battery device BATC read battery status from the field "FCG0". The request
would be sent to i2c operation region handler.
This patch is to add i2c ACPI operation region support. Due to there are
only "Byte" and "Bytes" protocol access on the Asus T100TA, other protocols
have not been tested.
About RawBytes and RawProcessBytes protocol, they needs specific drivers to interpret
reference data from AML code according ACPI 5.0 SPEC(5.5.2.4.5.3.9 and 5.5.2.4.5.3.10).
So far, not found such case and will add when find real case.
Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'include/linux/acpi.h')
-rw-r--r-- | include/linux/acpi.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 358c01b971db..40718e91e171 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
@@ -364,6 +364,17 @@ extern bool osc_sb_apei_support_acked; | |||
364 | #define OSC_PCI_EXPRESS_CAPABILITY_CONTROL 0x00000010 | 364 | #define OSC_PCI_EXPRESS_CAPABILITY_CONTROL 0x00000010 |
365 | #define OSC_PCI_CONTROL_MASKS 0x0000001f | 365 | #define OSC_PCI_CONTROL_MASKS 0x0000001f |
366 | 366 | ||
367 | #define ACPI_GSB_ACCESS_ATTRIB_QUICK 0x00000002 | ||
368 | #define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV 0x00000004 | ||
369 | #define ACPI_GSB_ACCESS_ATTRIB_BYTE 0x00000006 | ||
370 | #define ACPI_GSB_ACCESS_ATTRIB_WORD 0x00000008 | ||
371 | #define ACPI_GSB_ACCESS_ATTRIB_BLOCK 0x0000000A | ||
372 | #define ACPI_GSB_ACCESS_ATTRIB_MULTIBYTE 0x0000000B | ||
373 | #define ACPI_GSB_ACCESS_ATTRIB_WORD_CALL 0x0000000C | ||
374 | #define ACPI_GSB_ACCESS_ATTRIB_BLOCK_CALL 0x0000000D | ||
375 | #define ACPI_GSB_ACCESS_ATTRIB_RAW_BYTES 0x0000000E | ||
376 | #define ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS 0x0000000F | ||
377 | |||
367 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, | 378 | extern acpi_status acpi_pci_osc_control_set(acpi_handle handle, |
368 | u32 *mask, u32 req); | 379 | u32 *mask, u32 req); |
369 | 380 | ||