@@ -168,6 +168,14 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
168168 ret = regmap_write (map , reg , ~d -> mask_buf [i ]);
169169 else
170170 ret = regmap_write (map , reg , d -> mask_buf [i ]);
171+ if (d -> chip -> clear_ack ) {
172+ if (d -> chip -> ack_invert && !ret )
173+ ret = regmap_write (map , reg ,
174+ d -> mask_buf [i ]);
175+ else if (!ret )
176+ ret = regmap_write (map , reg ,
177+ ~d -> mask_buf [i ]);
178+ }
171179 if (ret != 0 )
172180 dev_err (d -> map -> dev , "Failed to ack 0x%x: %d\n" ,
173181 reg , ret );
@@ -493,7 +501,20 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
493501 if (data -> status_buf [i ] && (chip -> ack_base || chip -> use_ack )) {
494502 reg = chip -> ack_base +
495503 (i * map -> reg_stride * data -> irq_reg_stride );
496- ret = regmap_write (map , reg , data -> status_buf [i ]);
504+ if (chip -> ack_invert )
505+ ret = regmap_write (map , reg ,
506+ ~data -> status_buf [i ]);
507+ else
508+ ret = regmap_write (map , reg ,
509+ data -> status_buf [i ]);
510+ if (chip -> clear_ack ) {
511+ if (chip -> ack_invert && !ret )
512+ ret = regmap_write (map , reg ,
513+ data -> status_buf [i ]);
514+ else if (!ret )
515+ ret = regmap_write (map , reg ,
516+ ~data -> status_buf [i ]);
517+ }
497518 if (ret != 0 )
498519 dev_err (map -> dev , "Failed to ack 0x%x: %d\n" ,
499520 reg , ret );
@@ -722,6 +743,16 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
722743 else
723744 ret = regmap_write (map , reg ,
724745 d -> status_buf [i ] & d -> mask_buf [i ]);
746+ if (chip -> clear_ack ) {
747+ if (chip -> ack_invert && !ret )
748+ ret = regmap_write (map , reg ,
749+ (d -> status_buf [i ] &
750+ d -> mask_buf [i ]));
751+ else if (!ret )
752+ ret = regmap_write (map , reg ,
753+ ~(d -> status_buf [i ] &
754+ d -> mask_buf [i ]));
755+ }
725756 if (ret != 0 ) {
726757 dev_err (map -> dev , "Failed to ack 0x%x: %d\n" ,
727758 reg , ret );
0 commit comments