as3722
static int as3722_check_device_id(struct as3722 *as3722)
ret = as3722_read(as3722, AS3722_ASIC_ID1_REG, &val);
dev_err(as3722->dev, "ASIC_ID1 read failed: %d\n", ret);
dev_err(as3722->dev, "Device is not AS3722, ID is 0x%x\n", val);
ret = as3722_read(as3722, AS3722_ASIC_ID2_REG, &val);
dev_err(as3722->dev, "ASIC_ID2 read failed: %d\n", ret);
dev_info(as3722->dev, "AS3722 with revision 0x%x found\n", val);
static int as3722_configure_pullups(struct as3722 *as3722)
if (as3722->en_intern_int_pullup)
if (as3722->en_intern_i2c_pullup)
ret = as3722_update_bits(as3722, AS3722_IOVOLTAGE_REG,
dev_err(as3722->dev, "IOVOLTAGE_REG update failed: %d\n", ret);
struct as3722 *as3722)
as3722->en_intern_int_pullup = of_property_read_bool(np,
as3722->en_intern_i2c_pullup = of_property_read_bool(np,
as3722->en_ac_ok_pwr_on = of_property_read_bool(np,
as3722->irq_flags = irqd_get_trigger_type(irq_data);
dev_dbg(&i2c->dev, "IRQ flags are 0x%08lx\n", as3722->irq_flags);
struct as3722 *as3722;
as3722 = devm_kzalloc(&i2c->dev, sizeof(struct as3722), GFP_KERNEL);
if (!as3722)
as3722->dev = &i2c->dev;
as3722->chip_irq = i2c->irq;
i2c_set_clientdata(i2c, as3722);
ret = as3722_i2c_of_probe(i2c, as3722);
as3722->regmap = devm_regmap_init_i2c(i2c, &as3722_regmap_config);
if (IS_ERR(as3722->regmap)) {
ret = PTR_ERR(as3722->regmap);
ret = as3722_check_device_id(as3722);
irq_flags = as3722->irq_flags | IRQF_ONESHOT;
ret = devm_regmap_add_irq_chip(as3722->dev, as3722->regmap,
as3722->chip_irq,
&as3722->irq_data);
dev_err(as3722->dev, "Failed to add regmap irq: %d\n", ret);
ret = as3722_configure_pullups(as3722);
if (as3722->en_ac_ok_pwr_on)
ret = as3722_update_bits(as3722, AS3722_CTRL_SEQU1_REG,
dev_err(as3722->dev, "CTRLsequ1 update failed: %d\n", ret);
regmap_irq_get_domain(as3722->irq_data));
dev_err(as3722->dev, "Failed to add MFD devices: %d\n", ret);
ret = devm_device_init_wakeup(as3722->dev);
return dev_err_probe(as3722->dev, ret, "Failed to init wakeup\n");
dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n");
struct as3722 *as3722 = dev_get_drvdata(dev);
enable_irq_wake(as3722->chip_irq);
disable_irq(as3722->chip_irq);
struct as3722 *as3722 = dev_get_drvdata(dev);
enable_irq(as3722->chip_irq);
disable_irq_wake(as3722->chip_irq);
ret = as3722_update_bits(as_pci->as3722, gpio_cntr_reg,
ret = as3722_update_bits(as_pci->as3722, gpio_cntr_reg,
struct as3722 *as3722 = as_pci->as3722;
return as3722_update_bits(as3722, AS3722_GPIOn_CONTROL_REG(offset),
struct as3722 *as3722 = as_pci->as3722;
ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &control);
ret = as3722_read(as3722, reg, &val);
struct as3722 *as3722 = as_pci->as3722;
ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &val);
ret = as3722_update_bits(as3722, AS3722_GPIO_SIGNAL_OUT_REG,
return as3722_irq_get_virq(as_pci->as3722, offset);
as_pci->as3722 = dev_get_drvdata(pdev->dev.parent);
struct as3722 *as3722;
struct as3722 *as3722;
ret = as3722_update_bits(as3722_pm_poweroff->as3722,
as3722_poweroff->as3722 = dev_get_drvdata(pdev->dev.parent);
struct as3722 *as3722 = as3722_reg->as3722;
return as3722_update_bits(as3722,
struct as3722 *as3722 = as3722_regs->as3722;
ret = as3722_read(as3722, as3722_reg_lookup[id].control_reg, &val);
struct as3722 *as3722 = as3722_regs->as3722;
ret = as3722_update_bits(as3722, as3722_reg_lookup[id].control_reg,
err = as3722_read(as3722_regs->as3722, AS3722_FUSE7_REG, &val);
ret = as3722_update_bits(as3722_regs->as3722,
struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent);
as3722_regs->as3722 = as3722;
config.regmap = as3722->regmap;
struct as3722 *as3722;
struct as3722 *as3722 = as3722_rtc->as3722;
ret = as3722_block_read(as3722, AS3722_RTC_ALARM_SECOND_REG, 6,
struct as3722 *as3722 = as3722_rtc->as3722;
ret = as3722_block_write(as3722, AS3722_RTC_ALARM_SECOND_REG, 6,
struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent);
as3722_rtc->as3722 = as3722;
ret = as3722_update_bits(as3722, AS3722_RTC_CONTROL_REG,
struct as3722 *as3722;
struct as3722 *as3722 = as3722_rtc->as3722;
ret = as3722_block_read(as3722, AS3722_RTC_SECOND_REG,
struct as3722 *as3722 = as3722_rtc->as3722;
ret = as3722_block_write(as3722, AS3722_RTC_SECOND_REG, 6,
static inline int as3722_read(struct as3722 *as3722, u32 reg, u32 *dest)
return regmap_read(as3722->regmap, reg, dest);
static inline int as3722_write(struct as3722 *as3722, u32 reg, u32 value)
return regmap_write(as3722->regmap, reg, value);
static inline int as3722_block_read(struct as3722 *as3722, u32 reg,
return regmap_bulk_read(as3722->regmap, reg, buf, count);
static inline int as3722_block_write(struct as3722 *as3722, u32 reg,
return regmap_bulk_write(as3722->regmap, reg, data, count);
static inline int as3722_update_bits(struct as3722 *as3722, u32 reg,
return regmap_update_bits(as3722->regmap, reg, mask, val);
static inline int as3722_irq_get_virq(struct as3722 *as3722, int irq)
return regmap_irq_get_virq(as3722->irq_data, irq);