driverlinux-device-driveri2cacpi

How to identify device at i2c address?


I have a laptop running Ubuntu, kernel v5.8. It has two cameras which lack of functional drivers, and I want to try to get them to work.

I'm hitting an immediate hurdle in that the devices don't seem to be present in the way I (or indeed the ACPI tables) expect. For example for the front camera, the ACPI tables have this to say:

            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Name (SBUF, ResourceTemplate ()
                {
                    I2cSerialBusV2 (0x0010, ControllerInitiated, 0x00061A80,
                        AddressingMode7Bit, "\\_SB.PCI0.I2C2",
                        0x00, ResourceConsumer, , Exclusive,
                        )
                })
                Return (SBUF) /* \_SB_.PCI0.CAM1._CRS.SBUF */
            }

and the datasheet somewhat contradictory addresses:

The 8-bit address of the OV2680 is 0x20 when SID pin is set to 1 or 0x6C when SID pin is set to 0.

But none of that's helpful, because there's no chip at 0x10, 0x6C or 0x20. There is a chip at 0x0c, but only one chip on the I2C bus for two cameras. This makes me suspect that perhaps the cameras are behind a multiplexer or something, but I can't find any documentation on that. How can I identify what device is running on a particular I2C port, so that I can figure out what the thing at 0x0c is?

Further Info:

Laptop Specs: Lenovo Miix 510. Original installed OS by OEM was Windows 10. The camera sensors are an OVTI2680 and an OVTI5648.

Full DSDT tables in this gist


Solution

  • Do you have camera PMIC drivers loaded? Your camera sensors likely are powered off. The camera PMIC is TPS68470 chip which is represented by three drivers:

    1. PMIC as Multi-Functional Device (MFD) driver with ACPI ID INT3472
    2. GPIO driver for it, and
    3. OpRegion driver to support access from ACPI code

    All three must be enabled and loaded in order to get power gating work.

    Side note regarding to I²C addresses: In datasheet the addresses most probably are in 8-bit format, means the real ones (7-bit) are 0x10 or 0x36.