• Hans de Goede's avatar
    i2c: core: Add new i2c_acpi_new_device helper function · 605f8fc2
    Hans de Goede authored
    By default the i2c subsys creates an i2c-client for the first I2cSerialBus
    resource of an acpi_device, but some acpi_devices have multiple
    I2cSerialBus resources and we may want to instantiate i2c-clients for
    the others.
    
    This commit adds a new i2c_acpi_new_device function which can be used to
    create an i2c-client for any I2cSerialBus resource of an acpi_device.
    
    Note that the other resources may even be on a different i2c bus, so just
    retrieving the client address is not enough.
    
    Here is an example DSDT excerpt from such a device:
    
    Device (WIDR)
    {
        Name (_HID, "INT33FE" /* XPOWER Battery Device */)
        Name (_CID, "INT33FE" /* XPOWER Battery Device */)
        Name (_DDN, "WC PMIC Battery Device")
    <snip>
        Name (RBUF, ResourceTemplate ()
        {
            I2cSerialBusV2 (0x005E, ControllerInitiated, 0x000186A0,
                AddressingMode7Bit, "\\_SB.PCI0.I2C7",
                0x00, ResourceConsumer, , Exclusive,
                )
            I2cSerialBusV2 (0x0036, ControllerInitiated, 0x000186A0,
                AddressingMode7Bit, "\\_SB.PCI0.I2C1",
                0x00, ResourceConsumer, , Exclusive,
                )
            I2cSerialBusV2 (0x0022, ControllerInitiated, 0x00061A80,
                AddressingMode7Bit, "\\_SB.PCI0.I2C1",
                0x00, ResourceConsumer, , Exclusive,
                )
            I2cSerialBusV2 (0x0054, ControllerInitiated, 0x00061A80,
                AddressingMode7Bit, "\\_SB.PCI0.I2C1",
                0x00, ResourceConsumer, , Exclusive,
                )
            GpioInt (Level, ActiveLow, Exclusive, PullNone, 0x0000,
                "\\_SB.PCI0.I2C7.PMI5", 0x00, ResourceConsumer, ,
                )
                {   // Pin list
            0x0012
                }
            GpioInt (Edge, ActiveLow, ExclusiveAndWake, PullNone, 0x0000,
                "\\_SB.GPO1", 0x00, ResourceConsumer, ,
                )
                {   // Pin list
            0x0005
                }
            GpioInt (Level, ActiveLow, Exclusive, PullNone, 0x0000,
                "\\_SB.PCI0.I2C7.PMI5", 0x00, ResourceConsumer, ,
                )
                {   // Pin list
            0x0013
                }
        })
        Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
        {
            Return (RBUF) /* \_SB_.PCI0.I2C7.WIDR.RBUF */
        }
    <snip>
    }
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
    605f8fc2
i2c-core.c 101 KB