···44444545 unsigned int irq_reg_stride;4646 unsigned int type_reg_stride;4747+4848+ bool clear_status:1;4749};48504951static inline const···7977 int i, ret;8078 u32 reg;8179 u32 unmask_offset;8080+ u32 val;82818382 if (d->chip->runtime_pm) {8483 ret = pm_runtime_get_sync(map->dev);8584 if (ret < 0)8685 dev_err(map->dev, "IRQ sync failed to resume: %d\n",8786 ret);8787+ }8888+8989+ if (d->clear_status) {9090+ for (i = 0; i < d->chip->num_regs; i++) {9191+ reg = d->chip->status_base +9292+ (i * map->reg_stride * d->irq_reg_stride);9393+9494+ ret = regmap_read(map, reg, &val);9595+ if (ret)9696+ dev_err(d->map->dev,9797+ "Failed to clear the interrupt status bits\n");9898+ }9999+100100+ d->clear_status = false;88101 }8910290103 /*···174157 }175158 }176159177177- for (i = 0; i < d->chip->num_type_reg; i++) {178178- if (!d->type_buf_def[i])179179- continue;180180- reg = d->chip->type_base +181181- (i * map->reg_stride * d->type_reg_stride);182182- if (d->chip->type_invert)183183- ret = regmap_irq_update_bits(d, reg,184184- d->type_buf_def[i], ~d->type_buf[i]);185185- else186186- ret = regmap_irq_update_bits(d, reg,187187- d->type_buf_def[i], d->type_buf[i]);188188- if (ret != 0)189189- dev_err(d->map->dev, "Failed to sync type in %x\n",190190- reg);160160+ /* Don't update the type bits if we're using mask bits for irq type. */161161+ if (!d->chip->type_in_mask) {162162+ for (i = 0; i < d->chip->num_type_reg; i++) {163163+ if (!d->type_buf_def[i])164164+ continue;165165+ reg = d->chip->type_base +166166+ (i * map->reg_stride * d->type_reg_stride);167167+ if (d->chip->type_invert)168168+ ret = regmap_irq_update_bits(d, reg,169169+ d->type_buf_def[i], ~d->type_buf[i]);170170+ else171171+ ret = regmap_irq_update_bits(d, reg,172172+ d->type_buf_def[i], d->type_buf[i]);173173+ if (ret != 0)174174+ dev_err(d->map->dev, "Failed to sync type in %x\n",175175+ reg);176176+ }191177 }192178193179 if (d->chip->runtime_pm)···214194 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);215195 struct regmap *map = d->map;216196 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);197197+ unsigned int mask, type;217198218218- d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~irq_data->mask;199199+ type = irq_data->type.type_falling_val | irq_data->type.type_rising_val;200200+201201+ /*202202+ * The type_in_mask flag means that the underlying hardware uses203203+ * separate mask bits for rising and falling edge interrupts, but204204+ * we want to make them into a single virtual interrupt with205205+ * configurable edge.206206+ *207207+ * If the interrupt we're enabling defines the falling or rising208208+ * masks then instead of using the regular mask bits for this209209+ * interrupt, use the value previously written to the type buffer210210+ * at the corresponding offset in regmap_irq_set_type().211211+ */212212+ if (d->chip->type_in_mask && type)213213+ mask = d->type_buf[irq_data->reg_offset / map->reg_stride];214214+ else215215+ mask = irq_data->mask;216216+217217+ if (d->chip->clear_on_unmask)218218+ d->clear_status = true;219219+220220+ d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask;219221}220222221223static void regmap_irq_disable(struct irq_data *data)···254212 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);255213 struct regmap *map = d->map;256214 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);257257- int reg = irq_data->type_reg_offset / map->reg_stride;215215+ int reg;216216+ const struct regmap_irq_type *t = &irq_data->type;258217259259- if (!(irq_data->type_rising_mask | irq_data->type_falling_mask))260260- return 0;218218+ if ((t->types_supported & type) != type)219219+ return -ENOTSUPP;261220262262- d->type_buf[reg] &= ~(irq_data->type_falling_mask |263263- irq_data->type_rising_mask);221221+ reg = t->type_reg_offset / map->reg_stride;222222+223223+ if (t->type_reg_mask)224224+ d->type_buf[reg] &= ~t->type_reg_mask;225225+ else226226+ d->type_buf[reg] &= ~(t->type_falling_val |227227+ t->type_rising_val |228228+ t->type_level_low_val |229229+ t->type_level_high_val);264230 switch (type) {265231 case IRQ_TYPE_EDGE_FALLING:266266- d->type_buf[reg] |= irq_data->type_falling_mask;232232+ d->type_buf[reg] |= t->type_falling_val;267233 break;268234269235 case IRQ_TYPE_EDGE_RISING:270270- d->type_buf[reg] |= irq_data->type_rising_mask;236236+ d->type_buf[reg] |= t->type_rising_val;271237 break;272238273239 case IRQ_TYPE_EDGE_BOTH:274274- d->type_buf[reg] |= (irq_data->type_falling_mask |275275- irq_data->type_rising_mask);240240+ d->type_buf[reg] |= (t->type_falling_val |241241+ t->type_rising_val);276242 break;277243244244+ case IRQ_TYPE_LEVEL_HIGH:245245+ d->type_buf[reg] |= t->type_level_high_val;246246+ break;247247+248248+ case IRQ_TYPE_LEVEL_LOW:249249+ d->type_buf[reg] |= t->type_level_low_val;250250+ break;278251 default:279252 return -EINVAL;280253 }···487430 struct regmap_irq_chip_data *d;488431 int i;489432 int ret = -ENOMEM;433433+ int num_type_reg;490434 u32 reg;491435 u32 unmask_offset;492436493437 if (chip->num_regs <= 0)438438+ return -EINVAL;439439+440440+ if (chip->clear_on_unmask && (chip->ack_base || chip->use_ack))494441 return -EINVAL;495442496443 for (i = 0; i < chip->num_irqs; i++) {···540479 goto err_alloc;541480 }542481543543- if (chip->num_type_reg) {544544- d->type_buf_def = kcalloc(chip->num_type_reg,545545- sizeof(unsigned int), GFP_KERNEL);482482+ num_type_reg = chip->type_in_mask ? chip->num_regs : chip->num_type_reg;483483+ if (num_type_reg) {484484+ d->type_buf_def = kcalloc(num_type_reg,485485+ sizeof(unsigned int), GFP_KERNEL);546486 if (!d->type_buf_def)547487 goto err_alloc;548488549549- d->type_buf = kcalloc(chip->num_type_reg, sizeof(unsigned int),489489+ d->type_buf = kcalloc(num_type_reg, sizeof(unsigned int),550490 GFP_KERNEL);551491 if (!d->type_buf)552492 goto err_alloc;···662600 }663601 }664602665665- if (chip->num_type_reg) {666666- for (i = 0; i < chip->num_irqs; i++) {667667- reg = chip->irqs[i].type_reg_offset / map->reg_stride;668668- d->type_buf_def[reg] |= chip->irqs[i].type_rising_mask |669669- chip->irqs[i].type_falling_mask;670670- }603603+ if (chip->num_type_reg && !chip->type_in_mask) {671604 for (i = 0; i < chip->num_type_reg; ++i) {672605 if (!d->type_buf_def[i])673606 continue;674607675608 reg = chip->type_base +676609 (i * map->reg_stride * d->type_reg_stride);677677- if (chip->type_invert)678678- ret = regmap_irq_update_bits(d, reg,679679- d->type_buf_def[i], 0xFF);680680- else681681- ret = regmap_irq_update_bits(d, reg,682682- d->type_buf_def[i], 0x0);683683- if (ret != 0) {684684- dev_err(map->dev,685685- "Failed to set type in 0x%x: %x\n",610610+611611+ ret = regmap_read(map, reg, &d->type_buf_def[i]);612612+613613+ if (d->chip->type_invert)614614+ d->type_buf_def[i] = ~d->type_buf_def[i];615615+616616+ if (ret) {617617+ dev_err(map->dev, "Failed to get type defaults at 0x%x: %d\n",686618 reg, ret);687619 goto err_alloc;688620 }
···10891089int regmap_fields_update_bits_base(struct regmap_field *field, unsigned int id,10901090 unsigned int mask, unsigned int val,10911091 bool *change, bool async, bool force);10921092+/**10931093+ * struct regmap_irq_type - IRQ type definitions.10941094+ *10951095+ * @type_reg_offset: Offset register for the irq type setting.10961096+ * @type_rising_val: Register value to configure RISING type irq.10971097+ * @type_falling_val: Register value to configure FALLING type irq.10981098+ * @type_level_low_val: Register value to configure LEVEL_LOW type irq.10991099+ * @type_level_high_val: Register value to configure LEVEL_HIGH type irq.11001100+ * @types_supported: logical OR of IRQ_TYPE_* flags indicating supported types.11011101+ */11021102+struct regmap_irq_type {11031103+ unsigned int type_reg_offset;11041104+ unsigned int type_reg_mask;11051105+ unsigned int type_rising_val;11061106+ unsigned int type_falling_val;11071107+ unsigned int type_level_low_val;11081108+ unsigned int type_level_high_val;11091109+ unsigned int types_supported;11101110+};1092111110931112/**10941113 * struct regmap_irq - Description of an IRQ for the generic regmap irq_chip.10951114 *10961115 * @reg_offset: Offset of the status/mask register within the bank10971116 * @mask: Mask used to flag/control the register.10981098- * @type_reg_offset: Offset register for the irq type setting.10991099- * @type_rising_mask: Mask bit to configure RISING type irq.11001100- * @type_falling_mask: Mask bit to configure FALLING type irq.11171117+ * @type: IRQ trigger type setting details if supported.11011118 */11021119struct regmap_irq {11031120 unsigned int reg_offset;11041121 unsigned int mask;11051105- unsigned int type_reg_offset;11061106- unsigned int type_rising_mask;11071107- unsigned int type_falling_mask;11221122+ struct regmap_irq_type type;11081123};1109112411101125#define REGMAP_IRQ_REG(_irq, _off, _mask) \11111126 [_irq] = { .reg_offset = (_off), .mask = (_mask) }11271127+11281128+#define REGMAP_IRQ_REG_LINE(_id, _reg_bits) \11291129+ [_id] = { \11301130+ .mask = BIT((_id) % (_reg_bits)), \11311131+ .reg_offset = (_id) / (_reg_bits), \11321132+ }1112113311131134/**11141135 * struct regmap_irq_chip - Description of a generic regmap irq_chip.···11521131 * @ack_invert: Inverted ack register: cleared bits for ack.11531132 * @wake_invert: Inverted wake register: cleared bits are wake enabled.11541133 * @type_invert: Invert the type flags.11341134+ * @type_in_mask: Use the mask registers for controlling irq type. For11351135+ * interrupts defining type_rising/falling_mask use mask_base11361136+ * for edge configuration and never update bits in type_base.11371137+ * @clear_on_unmask: For chips with interrupts cleared on read: read the status11381138+ * registers before unmasking interrupts to clear any bits11391139+ * set when they were masked.11551140 * @runtime_pm: Hold a runtime PM lock on the device when accessing it.11561141 *11571142 * @num_regs: Number of registers in each control bank.···11961169 bool wake_invert:1;11971170 bool runtime_pm:1;11981171 bool type_invert:1;11721172+ bool type_in_mask:1;11731173+ bool clear_on_unmask:1;1199117412001175 int num_regs;12011176