static int cpcap_init_irq_chip(struct cpcap_ddata *cpcap, int irq_chip, int irq_start, int nr_irqs) { struct regmap_irq_chip *chip = &cpcap_irq_chip[irq_chip]; int i, ret; for (i = irq_start; i < irq_start + nr_irqs; i++) { struct regmap_irq *rirq = &cpcap->irqs[i]; cpcap_init_one_regmap_irq(cpcap, rirq, irq_start, i); } chip->irqs = &cpcap->irqs[irq_start]; chip->num_irqs = nr_irqs; chip->irq_drv_data = cpcap; ret = devm_regmap_add_irq_chip(&cpcap->spi->dev, cpcap->regmap, cpcap->spi->irq, irq_get_trigger_type(cpcap->spi->irq) | IRQF_SHARED, -1, chip, &cpcap->irqdata[irq_chip]); if (ret) { dev_err(&cpcap->spi->dev, "could not add irq chip %i: %i\n", irq_chip, ret); return ret; } return 0; }
static int chtdc_ti_probe(struct i2c_client *i2c) { struct device *dev = &i2c->dev; struct intel_soc_pmic *pmic; int ret; pmic = devm_kzalloc(dev, sizeof(*pmic), GFP_KERNEL); if (!pmic) return -ENOMEM; i2c_set_clientdata(i2c, pmic); pmic->regmap = devm_regmap_init_i2c(i2c, &chtdc_ti_regmap_config); if (IS_ERR(pmic->regmap)) return PTR_ERR(pmic->regmap); pmic->irq = i2c->irq; ret = devm_regmap_add_irq_chip(dev, pmic->regmap, pmic->irq, IRQF_ONESHOT, 0, &chtdc_ti_irq_chip, &pmic->irq_chip_data); if (ret) return ret; return devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, chtdc_ti_dev, ARRAY_SIZE(chtdc_ti_dev), NULL, 0, regmap_irq_get_domain(pmic->irq_chip_data)); }
int da9063_irq_init(struct da9063 *da9063) { const struct regmap_irq_chip *irq_chip; int ret; if (!da9063->chip_irq) { dev_err(da9063->dev, "No IRQ configured\n"); return -EINVAL; } if (da9063->type == PMIC_TYPE_DA9063) irq_chip = &da9063_irq_chip; else irq_chip = &da9063l_irq_chip; ret = devm_regmap_add_irq_chip(da9063->dev, da9063->regmap, da9063->chip_irq, IRQF_TRIGGER_LOW | IRQF_ONESHOT | IRQF_SHARED, da9063->irq_base, irq_chip, &da9063->regmap_irq); if (ret) { dev_err(da9063->dev, "Failed to reguest IRQ %d: %d\n", da9063->chip_irq, ret); return ret; } return 0; }
int sec_irq_init(struct sec_pmic_dev *sec_pmic) { int ret = 0; int type = sec_pmic->device_type; const struct regmap_irq_chip *sec_irq_chip; if (!sec_pmic->irq) { dev_warn(sec_pmic->dev, "No interrupt specified, no interrupts\n"); sec_pmic->irq_base = 0; return 0; } switch (type) { case S5M8763X: sec_irq_chip = &s5m8763_irq_chip; break; case S5M8767X: sec_irq_chip = &s5m8767_irq_chip; break; case S2MPS11X: sec_irq_chip = &s2mps11_irq_chip; break; case S2MPS13X: sec_irq_chip = &s2mps13_irq_chip; break; case S2MPS14X: sec_irq_chip = &s2mps14_irq_chip; break; case S2MPS15X: sec_irq_chip = &s2mps15_irq_chip; break; case S2MPU02: sec_irq_chip = &s2mpu02_irq_chip; break; default: dev_err(sec_pmic->dev, "Unknown device type %lu\n", sec_pmic->device_type); return -EINVAL; } ret = devm_regmap_add_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic, sec_pmic->irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, sec_pmic->irq_base, sec_irq_chip, &sec_pmic->irq_data); if (ret != 0) { dev_err(sec_pmic->dev, "Failed to register IRQ chip: %d\n", ret); return ret; } /* * The rtc-s5m driver requests S2MPS14_IRQ_RTCA0 also for S2MPS11 * so the interrupt number must be consistent. */ BUILD_BUG_ON(((enum s2mps14_irq)S2MPS11_IRQ_RTCA0) != S2MPS14_IRQ_RTCA0); return 0; }
static int tps65910_irq_init(struct tps65910 *tps65910, int irq, struct tps65910_platform_data *pdata) { int ret = 0; static struct regmap_irq_chip *tps6591x_irqs_chip; if (!irq) { dev_warn(tps65910->dev, "No interrupt support, no core IRQ\n"); return -EINVAL; } if (!pdata) { dev_warn(tps65910->dev, "No interrupt support, no pdata\n"); return -EINVAL; } switch (tps65910_chip_id(tps65910)) { case TPS65910: tps6591x_irqs_chip = &tps65910_irq_chip; break; case TPS65911: tps6591x_irqs_chip = &tps65911_irq_chip; break; } tps65910->chip_irq = irq; ret = devm_regmap_add_irq_chip(tps65910->dev, tps65910->regmap, tps65910->chip_irq, IRQF_ONESHOT, pdata->irq_base, tps6591x_irqs_chip, &tps65910->irq_data); if (ret < 0) { dev_warn(tps65910->dev, "Failed to add irq_chip %d\n", ret); tps65910->chip_irq = 0; } return ret; }
static int max77686_i2c_probe(struct i2c_client *i2c) { struct max77686_dev *max77686 = NULL; unsigned int data; int ret = 0; const struct regmap_config *config; const struct regmap_irq_chip *irq_chip; const struct mfd_cell *cells; int n_devs; max77686 = devm_kzalloc(&i2c->dev, sizeof(struct max77686_dev), GFP_KERNEL); if (!max77686) return -ENOMEM; i2c_set_clientdata(i2c, max77686); max77686->type = (unsigned long)of_device_get_match_data(&i2c->dev); max77686->dev = &i2c->dev; max77686->i2c = i2c; max77686->irq = i2c->irq; if (max77686->type == TYPE_MAX77686) { config = &max77686_regmap_config; irq_chip = &max77686_irq_chip; cells = max77686_devs; n_devs = ARRAY_SIZE(max77686_devs); } else { config = &max77802_regmap_config; irq_chip = &max77802_irq_chip; cells = max77802_devs; n_devs = ARRAY_SIZE(max77802_devs); } max77686->regmap = devm_regmap_init_i2c(i2c, config); if (IS_ERR(max77686->regmap)) { ret = PTR_ERR(max77686->regmap); dev_err(max77686->dev, "Failed to allocate register map: %d\n", ret); return ret; } ret = regmap_read(max77686->regmap, MAX77686_REG_DEVICE_ID, &data); if (ret < 0) { dev_err(max77686->dev, "device not found on this channel (this is not an error)\n"); return -ENODEV; } ret = devm_regmap_add_irq_chip(&i2c->dev, max77686->regmap, max77686->irq, IRQF_TRIGGER_FALLING | IRQF_ONESHOT | IRQF_SHARED, 0, irq_chip, &max77686->irq_data); if (ret < 0) { dev_err(&i2c->dev, "failed to add PMIC irq chip: %d\n", ret); return ret; } ret = devm_mfd_add_devices(max77686->dev, -1, cells, n_devs, NULL, 0, NULL); if (ret < 0) { dev_err(&i2c->dev, "failed to add MFD devices: %d\n", ret); return ret; } return 0; }