tc3589x
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
ret = tc3589x_set_bits(tc3589x, odmreg, BIT(pos), 0);
return tc3589x_set_bits(tc3589x, odereg, BIT(pos), BIT(pos));
ret = tc3589x_set_bits(tc3589x, odmreg, BIT(pos), BIT(pos));
return tc3589x_set_bits(tc3589x, odereg, BIT(pos), BIT(pos));
return tc3589x_set_bits(tc3589x, odereg, BIT(pos), 0);
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
tc3589x_reg_write(tc3589x, regmap[i] + j, new);
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
ret = tc3589x_block_read(tc3589x, TC3589x_GPIOMIS0,
struct tc3589x *tc3589x;
tc3589x_reg_write(tc3589x, TC3589x_GPIOIC0 + i, status[i]);
struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
tc3589x_gpio->tc3589x = tc3589x;
tc3589x_gpio->chip.ngpio = tc3589x->num_gpio;
ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL,
ret = tc3589x_reg_write(tc3589x, TC3589x_DKBDMSK,
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
ret = tc3589x_reg_read(tc3589x, reg);
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
return tc3589x_block_write(tc3589x, reg, ARRAY_SIZE(data), data);
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
return tc3589x_set_bits(tc3589x, reg, BIT(pos), BIT(pos));
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
return tc3589x_set_bits(tc3589x, reg, BIT(pos), 0);
struct tc3589x *tc3589x = tc3589x_gpio->tc3589x;
ret = tc3589x_reg_read(tc3589x, reg);
struct tc3589x *tc3589x;
struct tc3589x *tc3589x = keypad->tc3589x;
ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSIZE,
ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_LSB, DEDICATED_KEY_VAL);
ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_MSB, DEDICATED_KEY_VAL);
ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSETTLE_REG,
ret = tc3589x_reg_write(tc3589x, TC3589x_KBDBOUNCE,
ret = tc3589x_set_bits(tc3589x, TC3589x_IOCFG, 0x0, IOCFG_IG);
ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_LSB,
ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_MSB,
ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_LSB,
ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_MSB,
ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG2_LSB,
struct tc3589x *tc3589x = keypad->tc3589x;
kbd_code = tc3589x_reg_read(tc3589x, TC3589x_EVTCODE_FIFO);
tc3589x_set_bits(tc3589x, TC3589x_KBDIC,
tc3589x_set_bits(tc3589x, TC3589x_KBDMSK,
struct tc3589x *tc3589x = keypad->tc3589x;
ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x0);
ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMFS, 0x0, TC3589x_KBDMFS_EN);
ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x0, KPD_CLK_EN);
ret = tc3589x_set_bits(tc3589x, TC3589x_RSTINTCLR, 0x0, 0x1);
ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, 0x0,
struct tc3589x *tc3589x = keypad->tc3589x;
ret = tc3589x_set_bits(tc3589x, TC3589x_KBDIC,
ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK,
ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x1, 0x0);
ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x1);
struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent);
keypad->tc3589x = tc3589x;
int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
ret = i2c_smbus_write_i2c_block_data(tc3589x->i2c, reg, length,
dev_err(tc3589x->dev, "failed to write regs %#x: %d\n",
int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val)
mutex_lock(&tc3589x->lock);
ret = tc3589x_reg_read(tc3589x, reg);
ret = tc3589x_reg_write(tc3589x, reg, ret);
mutex_unlock(&tc3589x->lock);
struct tc3589x *tc3589x = data;
status = tc3589x_reg_read(tc3589x, TC3589x_IRQST);
int virq = irq_find_mapping(tc3589x->domain, bit);
status = tc3589x_reg_read(tc3589x, TC3589x_IRQST);
struct tc3589x *tc3589x = d->host_data;
irq_set_chip_data(virq, tc3589x);
static int tc3589x_irq_init(struct tc3589x *tc3589x, struct device_node *np)
tc3589x->domain = irq_domain_create_simple(of_fwnode_handle(np),
&tc3589x_irq_ops, tc3589x);
if (!tc3589x->domain) {
dev_err(tc3589x->dev, "Failed to create irqdomain\n");
static int tc3589x_chip_init(struct tc3589x *tc3589x)
manf = tc3589x_reg_read(tc3589x, TC3589x_MANFCODE);
ver = tc3589x_reg_read(tc3589x, TC3589x_VERSION);
dev_err(tc3589x->dev, "unknown manufacturer: %#x\n", manf);
dev_info(tc3589x->dev, "manufacturer: %#x, version: %#x\n", manf, ver);
ret = tc3589x_reg_write(tc3589x, TC3589x_RSTCTRL,
return tc3589x_reg_write(tc3589x, TC3589x_RSTINTCLR, 0x1);
static int tc3589x_device_init(struct tc3589x *tc3589x)
unsigned int blocks = tc3589x->pdata->block;
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
0, tc3589x->domain);
dev_err(tc3589x->dev, "failed to add gpio child\n");
dev_info(tc3589x->dev, "added gpio block\n");
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
0, tc3589x->domain);
dev_err(tc3589x->dev, "failed to keypad child\n");
dev_info(tc3589x->dev, "added keypad block\n");
struct tc3589x *tc3589x;
tc3589x = devm_kzalloc(&i2c->dev, sizeof(struct tc3589x),
if (!tc3589x)
mutex_init(&tc3589x->lock);
tc3589x->dev = &i2c->dev;
tc3589x->i2c = i2c;
tc3589x->pdata = pdata;
tc3589x->num_gpio = 20;
tc3589x->num_gpio = 24;
i2c_set_clientdata(i2c, tc3589x);
ret = tc3589x_chip_init(tc3589x);
ret = tc3589x_irq_init(tc3589x, np);
ret = request_threaded_irq(tc3589x->i2c->irq, NULL, tc3589x_irq,
"tc3589x", tc3589x);
dev_err(tc3589x->dev, "failed to request IRQ: %d\n", ret);
int tc3589x_reg_read(struct tc3589x *tc3589x, u8 reg)
ret = tc3589x_device_init(tc3589x);
dev_err(tc3589x->dev, "failed to add child devices\n");
struct tc3589x *tc3589x = i2c_get_clientdata(client);
mfd_remove_devices(tc3589x->dev);
struct tc3589x *tc3589x = dev_get_drvdata(dev);
struct i2c_client *client = tc3589x->i2c;
ret = tc3589x_reg_write(tc3589x, TC3589x_CLKMODE,
struct tc3589x *tc3589x = dev_get_drvdata(dev);
struct i2c_client *client = tc3589x->i2c;
ret = tc3589x_reg_write(tc3589x, TC3589x_CLKMODE,
ret = i2c_smbus_read_byte_data(tc3589x->i2c, reg);
dev_err(tc3589x->dev, "failed to read reg %#x: %d\n",
int tc3589x_reg_write(struct tc3589x *tc3589x, u8 reg, u8 data)
ret = i2c_smbus_write_byte_data(tc3589x->i2c, reg, data);
dev_err(tc3589x->dev, "failed to write reg %#x: %d\n",
int tc3589x_block_read(struct tc3589x *tc3589x, u8 reg, u8 length, u8 *values)
ret = i2c_smbus_read_i2c_block_data(tc3589x->i2c, reg, length, values);
dev_err(tc3589x->dev, "failed to read regs %#x: %d\n",
extern int tc3589x_reg_write(struct tc3589x *tc3589x, u8 reg, u8 data);
extern int tc3589x_reg_read(struct tc3589x *tc3589x, u8 reg);
extern int tc3589x_block_read(struct tc3589x *tc3589x, u8 reg, u8 length,
extern int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
extern int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val);