ki2c
static int ki2c_wait_for_mcf(struct ki2c *ki2c)
return ki2c_wait_for_bit(ki2c->base + KI2C_STATUS_REG, KI2C_STATUS_MCF,
ki2c->adapter.timeout);
static int ki2c_wait_for_data(struct ki2c *ki2c)
ret = ki2c_wait_for_mcf(ki2c);
return ki2c_wait_for_bit(ki2c->base + KI2C_STATUS_REG,
ki2c->adapter.timeout);
static int ki2c_wait_for_data_ack(struct ki2c *ki2c)
ret = ki2c_wait_for_data(ki2c);
reg = ioread8(ki2c->base + KI2C_STATUS_REG);
static int ki2c_has_capability(struct ki2c *ki2c, unsigned int cap)
unsigned int reg = ioread8(ki2c->base + KI2C_CAPABILITY_REG);
static int ki2c_get_scl(struct ki2c *ki2c)
unsigned int reg = ioread8(ki2c->base + KI2C_STATUS_DC_REG);
static int ki2c_get_sda(struct ki2c *ki2c)
unsigned int reg = ioread8(ki2c->base + KI2C_STATUS_DC_REG);
static void ki2c_set_scl(struct ki2c *ki2c, int val)
control_dc = ioread8(ki2c->base + KI2C_CONTROL_DC_REG);
iowrite8(control_dc, ki2c->base + KI2C_CONTROL_DC_REG);
static int ki2c_reset_bus_bitwise(struct ki2c *ki2c)
iowrite8(0, ki2c->base + KI2C_CONTROL_REG);
ki2c_set_scl(ki2c, val);
if (!ki2c_get_scl(ki2c)) {
dev_err(&ki2c->auxdev->auxdev.dev,
if (ki2c_get_sda(ki2c))
ki2c_set_scl(ki2c, val);
if (!ki2c_get_sda(ki2c)) {
dev_err(&ki2c->auxdev->auxdev.dev, "SDA is still low!\n");
iowrite8(KI2C_CONTROL_MEN, ki2c->base + KI2C_CONTROL_REG);
static int ki2c_reset_bus_bytewise(struct ki2c *ki2c)
iowrite8(0xFF, ki2c->base + KI2C_DATA_REG);
ki2c->base + KI2C_CONTROL_REG);
ret = ki2c_wait_for_mcf(ki2c);
dev_err(&ki2c->auxdev->auxdev.dev, "Start condition failed\n");
ki2c->base + KI2C_CONTROL_REG);
ret = ki2c_wait_for_mcf(ki2c);
dev_err(&ki2c->auxdev->auxdev.dev, "Stop condition failed\n");
static int ki2c_reset_bus(struct ki2c *ki2c)
ret = ki2c_inuse_lock(ki2c);
if (ki2c_has_capability(ki2c, KI2C_CAPABILITY_DC))
ret = ki2c_reset_bus_bitwise(ki2c);
ret = ki2c_reset_bus_bytewise(ki2c);
ki2c_inuse_unlock(ki2c);
static void ki2c_write_target_addr(struct ki2c *ki2c, struct i2c_msg *m)
iowrite8(addr, ki2c->base + KI2C_DATA_REG);
static int ki2c_start_addr(struct ki2c *ki2c, struct i2c_msg *m)
ki2c_write_target_addr(ki2c, m);
ki2c->base + KI2C_CONTROL_REG);
ki2c->base + KI2C_CONTROL_REG);
ret = ki2c_wait_for_data_ack(ki2c);
dev_dbg(&ki2c->auxdev->auxdev.dev,
static int ki2c_repstart_addr(struct ki2c *ki2c, struct i2c_msg *m)
dev_err(&ki2c->auxdev->auxdev.dev,
ki2c->base + KI2C_CONTROL_REG);
ret = ki2c_wait_for_mcf(ki2c);
dev_err(&ki2c->auxdev->auxdev.dev,
ki2c_write_target_addr(ki2c, m);
ret = ki2c_wait_for_data_ack(ki2c);
dev_err(&ki2c->auxdev->auxdev.dev,
static void ki2c_stop(struct ki2c *ki2c)
iowrite8(KI2C_CONTROL_MEN, ki2c->base + KI2C_CONTROL_REG);
ki2c_wait_for_mcf(ki2c);
static int ki2c_write(struct ki2c *ki2c, const u8 *data, int len)
iowrite8(data[i], ki2c->base + KI2C_DATA_REG);
ret = ki2c_wait_for_data_ack(ki2c);
static int ki2c_read(struct ki2c *ki2c, u8 *data, int len)
iowrite8(control, ki2c->base + KI2C_CONTROL_REG);
ioread8(ki2c->base + KI2C_DATA_REG);
ret = ki2c_wait_for_data(ki2c);
ki2c->base + KI2C_CONTROL_REG);
ki2c->base + KI2C_CONTROL_REG);
data[i] = ioread8(ki2c->base + KI2C_DATA_REG);
struct ki2c *ki2c = i2c_get_adapdata(adap);
ret = ki2c_inuse_lock(ki2c);
ret = ki2c_start_addr(ki2c, m);
ret = ki2c_repstart_addr(ki2c, m);
ret = ki2c_read(ki2c, m->buf, m->len);
ret = ki2c_write(ki2c, m->buf, m->len);
ki2c_stop(ki2c);
ki2c_inuse_unlock(ki2c);
static void ki2c_unregister_devices(struct ki2c *ki2c)
for (i = 0; i < ki2c->client_size; i++)
i2c_unregister_device(ki2c->client[i]);
static int ki2c_register_devices(struct ki2c *ki2c)
struct i2c_board_info *info = ki2c->auxdev->info;
for (i = 0; i < ki2c->client_size; i++) {
client = i2c_new_scanned_device(&ki2c->adapter, &info[i],
ki2c->client[i] = client;
ki2c->client_size = i;
ki2c_unregister_devices(ki2c);
struct ki2c *ki2c;
ki2c = devm_kzalloc(dev, sizeof(*ki2c), GFP_KERNEL);
if (!ki2c)
ki2c->auxdev = container_of(auxdev, struct keba_i2c_auxdev, auxdev);
ki2c->client = devm_kcalloc(dev, ki2c->auxdev->info_size,
sizeof(*ki2c->client), GFP_KERNEL);
if (!ki2c->client)
ki2c->client_size = ki2c->auxdev->info_size;
auxiliary_set_drvdata(auxdev, ki2c);
ki2c->base = devm_ioremap_resource(dev, &ki2c->auxdev->io);
if (IS_ERR(ki2c->base))
return PTR_ERR(ki2c->base);
adap = &ki2c->adapter;
i2c_set_adapdata(adap, ki2c);
iowrite8(KI2C_CONTROL_MEN, ki2c->base + KI2C_CONTROL_REG);
ret = ki2c_reset_bus(ki2c);
ret = ki2c_register_devices(ki2c);
iowrite8(KI2C_CONTROL_DISABLE, ki2c->base + KI2C_CONTROL_REG);
struct ki2c *ki2c = auxiliary_get_drvdata(auxdev);
ki2c_unregister_devices(ki2c);
iowrite8(KI2C_CONTROL_DISABLE, ki2c->base + KI2C_CONTROL_REG);
static int ki2c_inuse_lock(struct ki2c *ki2c)
ret = readb_poll_timeout(ki2c->base + KI2C_STATUS_REG,
dev_err(&ki2c->auxdev->auxdev.dev, "%s err!\n", __func__);
static void ki2c_inuse_unlock(struct ki2c *ki2c)
iowrite8(KI2C_STATUS_IN_USE, ki2c->base + KI2C_STATUS_REG);