@@ -115,12 +115,20 @@ static void regmap_irq_sync_unlock(struct irq_data *data)
115
115
*/
116
116
for (i = 0 ; i < d -> chip -> num_regs ; i ++ ) {
117
117
if (d -> mask_base ) {
118
- reg = d -> get_irq_reg (d , d -> mask_base , i );
119
- ret = regmap_update_bits (d -> map , reg ,
120
- d -> mask_buf_def [i ], d -> mask_buf [i ]);
121
- if (ret )
122
- dev_err (d -> map -> dev , "Failed to sync masks in %x\n" ,
123
- reg );
118
+ if (d -> chip -> handle_mask_sync )
119
+ d -> chip -> handle_mask_sync (d -> map , i ,
120
+ d -> mask_buf_def [i ],
121
+ d -> mask_buf [i ],
122
+ d -> chip -> irq_drv_data );
123
+ else {
124
+ reg = d -> get_irq_reg (d , d -> mask_base , i );
125
+ ret = regmap_update_bits (d -> map , reg ,
126
+ d -> mask_buf_def [i ],
127
+ d -> mask_buf [i ]);
128
+ if (ret )
129
+ dev_err (d -> map -> dev , "Failed to sync masks in %x\n" ,
130
+ reg );
131
+ }
124
132
}
125
133
126
134
if (d -> unmask_base ) {
@@ -917,13 +925,23 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
917
925
d -> mask_buf [i ] = d -> mask_buf_def [i ];
918
926
919
927
if (d -> mask_base ) {
920
- reg = d -> get_irq_reg (d , d -> mask_base , i );
921
- ret = regmap_update_bits (d -> map , reg ,
922
- d -> mask_buf_def [i ], d -> mask_buf [i ]);
923
- if (ret ) {
924
- dev_err (map -> dev , "Failed to set masks in 0x%x: %d\n" ,
925
- reg , ret );
926
- goto err_alloc ;
928
+ if (chip -> handle_mask_sync ) {
929
+ ret = chip -> handle_mask_sync (d -> map , i ,
930
+ d -> mask_buf_def [i ],
931
+ d -> mask_buf [i ],
932
+ chip -> irq_drv_data );
933
+ if (ret )
934
+ goto err_alloc ;
935
+ } else {
936
+ reg = d -> get_irq_reg (d , d -> mask_base , i );
937
+ ret = regmap_update_bits (d -> map , reg ,
938
+ d -> mask_buf_def [i ],
939
+ d -> mask_buf [i ]);
940
+ if (ret ) {
941
+ dev_err (map -> dev , "Failed to set masks in 0x%x: %d\n" ,
942
+ reg , ret );
943
+ goto err_alloc ;
944
+ }
927
945
}
928
946
}
929
947
0 commit comments