[coreboot-gerrit] Patch merged into coreboot/master: device: i2c: Add support for I2C bus operations

gerrit at coreboot.org gerrit at coreboot.org
Thu Jun 9 17:06:01 CEST 2016


the following patch was just integrated into master:
commit ec00968f08e69f40ec978d2b6128764f4e4e12ea
Author: Duncan Laurie <dlaurie at chromium.org>
Date:   Tue Jun 7 15:38:14 2016 -0700

    device: i2c: Add support for I2C bus operations
    
    In order to support doing bus operations on an I2C device that is
    described in the devicetree there needs to be some linkage of the
    device and the existing opaque I2C controller bus number.
    
    This is provided in a similar fashion to the existing SMBUS operations
    but modified to fit within the existing I2C infrastructure.
    
    Variants of the existing I2C helper functions are provided that will
    obtain the bus number that corresponds to this device by looking for
    the SOC-provided I2C bus operation structure to provide a function
    that will make that translation.
    
    For example an SOC using a PCI I2C controller at 0:15.0 could use:
    
    soc/intel/.../i2c.c:
      static int i2c_dev_to_bus(struct device *dev)
      {
        if (dev->path.pci.devfn == PCI_DEVFN(0x15, 0))
          return 0;
        return -1;
      }
      static struct i2c_bus_operation i2c_bus_ops = {
        .dev_to_bus = &i2c_dev_to_bus
      }
      static struct device_operations i2c_dev_ops = {
        .ops_i2c_bus = &i2c_bus_ops
        ...
      }
    
    With an I2C device on that bus at address 0x1a described in the tree:
    
    devicetree.cb:
      device pci 15.0 on # I2C0
        chip drivers/i2c/sample
          device i2c 1a.0 on end
        end
      end
    
    That driver can then do I2C transactions with the device object
    without needing to know that the SOC-specific bus number that this
    I2C device lives on is "0".
    
    For example it could read a version value from register address 0
    with a byte transaction:
    
    drivers/i2c/sample/sample.c:
      static void i2c_sample_enable(struct device *dev)
      {
        uint8_t ver;
        if (!i2c_dev_readb(dev, 0x00, &ver))
          printk(BIOS_INFO, "I2C %s version 0x02x\n", dev_path(dev), ver);
      }
    
    Change-Id: I6c41c8e0d10caabe01cc41da96382074de40e91e
    Signed-off-by: Duncan Laurie <dlaurie at chromium.org>
    Reviewed-on: https://review.coreboot.org/15100
    Tested-by: build bot (Jenkins)
    Reviewed-by: Aaron Durbin <adurbin at chromium.org>


See https://review.coreboot.org/15100 for details.

-gerrit



More information about the coreboot-gerrit mailing list