/* * i2c_set_bus_num(): * ------------------ * * Change the active I2C bus. Subsequent read/write calls will * go to this one. Sets all of the muxes in a proper condition * if that bus is behind muxes. * If previously selected bus is behind the muxes turns off all the * muxes along the path to that bus. * * bus - bus index, zero based * * Returns: 0 on success, not 0 on failure */ int i2c_set_bus_num(unsigned int bus) { int max; if ((bus == I2C_BUS) && (I2C_ADAP->init_done > 0)) return 0; #ifndef CONFIG_SYS_I2C_DIRECT_BUS if (bus >= CONFIG_SYS_NUM_I2C_BUSES) return -1; #endif max = ll_entry_count(struct i2c_adapter, i2c); if (I2C_ADAPTER(bus) >= max) { printf("Error, wrong i2c adapter %d max %d possible\n", I2C_ADAPTER(bus), max); return -2; } #ifndef CONFIG_SYS_I2C_DIRECT_BUS i2c_mux_disconnet_all(); #endif gd->cur_i2c_bus = bus; if (I2C_ADAP->init_done == 0) i2c_init_bus(bus, I2C_ADAP->speed, I2C_ADAP->slaveaddr); #ifndef CONFIG_SYS_I2C_DIRECT_BUS i2c_mux_set_all(); #endif return 0; }
int shw_i2c_io_init(void) { if (i2c_init_bus(&i2c_io_bus) < 0) { pr_error("I2C I/O init failed for bus %s\n", i2c_io_bus.name); return -1; } pr_debug("I2C I/O init success for bus %s\n", i2c_io_bus.name); return 0; }
static void imx_i2c_realize(DeviceState *dev, Error **errp) { IMXI2CState *s = IMX_I2C(dev); memory_region_init_io(&s->iomem, OBJECT(s), &imx_i2c_ops, s, TYPE_IMX_I2C, IMX_I2C_MEM_SIZE); sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem); sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq); s->bus = i2c_init_bus(DEVICE(dev), "i2c"); }
static int realview_i2c_init(SysBusDevice *dev) { RealViewI2CState *s = FROM_SYSBUS(RealViewI2CState, dev); i2c_bus *bus; bus = i2c_init_bus(&dev->qdev, "i2c"); s->bitbang = bitbang_i2c_init(bus); memory_region_init_io(&s->iomem, &realview_i2c_ops, s, "realview-i2c", 0x1000); sysbus_init_mmio_region(dev, &s->iomem); return 0; }
static int realview_i2c_init(SysBusDevice *dev) { RealViewI2CState *s = FROM_SYSBUS(RealViewI2CState, dev); i2c_bus *bus; int iomemtype; bus = i2c_init_bus(&dev->qdev, "i2c"); s->bitbang = bitbang_i2c_init(bus); iomemtype = cpu_register_io_memory(realview_i2c_readfn, realview_i2c_writefn, s); sysbus_init_mmio(dev, 0x1000, iomemtype); return 0; }
static void pca954x_init(Object *obj) { PCA954XState *s = PCA954X(obj); PCA954XClass *sc = PCA954X_GET_CLASS(obj); int i; if (sc->device) { s->mux = sc->device->mux; s->lanes = sc->device->lanes; } else { /* Emulate pca9548 device as default */ s->mux = false; s->lanes = 8; } for (i = 0; i < s->lanes; ++i) { char bus_name[16]; snprintf(bus_name, sizeof(bus_name), "i2c@%d", i); s->busses[i] = i2c_init_bus(DEVICE(s), bus_name); } }
/* * Address Definitions * * 0x000 ... 0x03F: Global Register * 0x040 ... 0x07F: Device 1 * 0x080 ... 0x0BF: Device 2 * 0x0C0 ... 0x0FF: Device 3 * 0x100 ... 0x13F: Device 4 * 0x140 ... 0x17F: Device 5 * 0x180 ... 0x1BF: Device 6 * 0x1C0 ... 0x1FF: Device 7 * 0x200 ... 0x2FF: Buffer Pool (unused in linux driver) * 0x300 ... 0x33F: Device 8 * 0x340 ... 0x37F: Device 9 * 0x380 ... 0x3BF: Device 10 * 0x3C0 ... 0x3FF: Device 11 * 0x400 ... 0x43F: Device 12 * 0x440 ... 0x47F: Device 13 * 0x480 ... 0x4BF: Device 14 * 0x800 ... 0xFFF: Buffer Pool (unused in linux driver) */ static void aspeed_i2c_realize(DeviceState *dev, Error **errp) { int i; SysBusDevice *sbd = SYS_BUS_DEVICE(dev); AspeedI2CState *s = ASPEED_I2C(dev); sysbus_init_irq(sbd, &s->irq); memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_i2c_ctrl_ops, s, "aspeed.i2c", 0x1000); sysbus_init_mmio(sbd, &s->iomem); for (i = 0; i < ASPEED_I2C_NR_BUSSES; i++) { char name[16]; int offset = i < 7 ? 1 : 5; snprintf(name, sizeof(name), "aspeed.i2c.%d", i); s->busses[i].controller = s; s->busses[i].id = i; s->busses[i].bus = i2c_init_bus(dev, name); memory_region_init_io(&s->busses[i].mr, OBJECT(dev), &aspeed_i2c_bus_ops, &s->busses[i], name, 0x40); memory_region_add_subregion(&s->iomem, 0x40 * (i + offset), &s->busses[i].mr); } }
static void aux_bridge_init(Object *obj) { AUXTOI2CState *s = AUXTOI2C(obj); s->i2c_bus = i2c_init_bus(DEVICE(obj), "aux-i2c"); }
void __i2c_init(int speed, int slaveaddr) { i2c_init_bus(i2c_get_bus_num(), speed, slaveaddr); }