Lines Matching refs:d
58 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_lock() local
60 mutex_lock(&d->lock); in regmap_irq_lock()
63 static int regmap_irq_update_bits(struct regmap_irq_chip_data *d, in regmap_irq_update_bits() argument
67 if (d->chip->mask_writeonly) in regmap_irq_update_bits()
68 return regmap_write_bits(d->map, reg, mask, val); in regmap_irq_update_bits()
70 return regmap_update_bits(d->map, reg, mask, val); in regmap_irq_update_bits()
75 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_sync_unlock() local
76 struct regmap *map = d->map; in regmap_irq_sync_unlock()
81 if (d->chip->runtime_pm) { in regmap_irq_sync_unlock()
93 for (i = 0; i < d->chip->num_regs; i++) { in regmap_irq_sync_unlock()
94 reg = d->chip->mask_base + in regmap_irq_sync_unlock()
95 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
96 if (d->chip->mask_invert) { in regmap_irq_sync_unlock()
97 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
98 d->mask_buf_def[i], ~d->mask_buf[i]); in regmap_irq_sync_unlock()
99 } else if (d->chip->unmask_base) { in regmap_irq_sync_unlock()
101 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
102 d->mask_buf_def[i], ~d->mask_buf[i]); in regmap_irq_sync_unlock()
104 dev_err(d->map->dev, in regmap_irq_sync_unlock()
107 unmask_offset = d->chip->unmask_base - in regmap_irq_sync_unlock()
108 d->chip->mask_base; in regmap_irq_sync_unlock()
110 ret = regmap_irq_update_bits(d, in regmap_irq_sync_unlock()
112 d->mask_buf_def[i], in regmap_irq_sync_unlock()
113 d->mask_buf[i]); in regmap_irq_sync_unlock()
115 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
116 d->mask_buf_def[i], d->mask_buf[i]); in regmap_irq_sync_unlock()
119 dev_err(d->map->dev, "Failed to sync masks in %x\n", in regmap_irq_sync_unlock()
122 reg = d->chip->wake_base + in regmap_irq_sync_unlock()
123 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
124 if (d->wake_buf) { in regmap_irq_sync_unlock()
125 if (d->chip->wake_invert) in regmap_irq_sync_unlock()
126 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
127 d->mask_buf_def[i], in regmap_irq_sync_unlock()
128 ~d->wake_buf[i]); in regmap_irq_sync_unlock()
130 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
131 d->mask_buf_def[i], in regmap_irq_sync_unlock()
132 d->wake_buf[i]); in regmap_irq_sync_unlock()
134 dev_err(d->map->dev, in regmap_irq_sync_unlock()
139 if (!d->chip->init_ack_masked) in regmap_irq_sync_unlock()
146 if (d->mask_buf[i] && (d->chip->ack_base || d->chip->use_ack)) { in regmap_irq_sync_unlock()
147 reg = d->chip->ack_base + in regmap_irq_sync_unlock()
148 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
150 if (d->chip->ack_invert) in regmap_irq_sync_unlock()
151 ret = regmap_write(map, reg, ~d->mask_buf[i]); in regmap_irq_sync_unlock()
153 ret = regmap_write(map, reg, d->mask_buf[i]); in regmap_irq_sync_unlock()
155 dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", in regmap_irq_sync_unlock()
160 for (i = 0; i < d->chip->num_type_reg; i++) { in regmap_irq_sync_unlock()
161 if (!d->type_buf_def[i]) in regmap_irq_sync_unlock()
163 reg = d->chip->type_base + in regmap_irq_sync_unlock()
164 (i * map->reg_stride * d->type_reg_stride); in regmap_irq_sync_unlock()
165 if (d->chip->type_invert) in regmap_irq_sync_unlock()
166 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
167 d->type_buf_def[i], ~d->type_buf[i]); in regmap_irq_sync_unlock()
169 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
170 d->type_buf_def[i], d->type_buf[i]); in regmap_irq_sync_unlock()
172 dev_err(d->map->dev, "Failed to sync type in %x\n", in regmap_irq_sync_unlock()
176 if (d->chip->runtime_pm) in regmap_irq_sync_unlock()
180 if (d->wake_count < 0) in regmap_irq_sync_unlock()
181 for (i = d->wake_count; i < 0; i++) in regmap_irq_sync_unlock()
182 irq_set_irq_wake(d->irq, 0); in regmap_irq_sync_unlock()
183 else if (d->wake_count > 0) in regmap_irq_sync_unlock()
184 for (i = 0; i < d->wake_count; i++) in regmap_irq_sync_unlock()
185 irq_set_irq_wake(d->irq, 1); in regmap_irq_sync_unlock()
187 d->wake_count = 0; in regmap_irq_sync_unlock()
189 mutex_unlock(&d->lock); in regmap_irq_sync_unlock()
194 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_enable() local
195 struct regmap *map = d->map; in regmap_irq_enable()
196 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_enable()
198 d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~irq_data->mask; in regmap_irq_enable()
203 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_disable() local
204 struct regmap *map = d->map; in regmap_irq_disable()
205 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_disable()
207 d->mask_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask; in regmap_irq_disable()
212 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_type() local
213 struct regmap *map = d->map; in regmap_irq_set_type()
214 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_type()
220 d->type_buf[reg] &= ~(irq_data->type_falling_mask | in regmap_irq_set_type()
224 d->type_buf[reg] |= irq_data->type_falling_mask; in regmap_irq_set_type()
228 d->type_buf[reg] |= irq_data->type_rising_mask; in regmap_irq_set_type()
232 d->type_buf[reg] |= (irq_data->type_falling_mask | in regmap_irq_set_type()
244 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_wake() local
245 struct regmap *map = d->map; in regmap_irq_set_wake()
246 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_wake()
249 if (d->wake_buf) in regmap_irq_set_wake()
250 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
252 d->wake_count++; in regmap_irq_set_wake()
254 if (d->wake_buf) in regmap_irq_set_wake()
255 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
257 d->wake_count--; in regmap_irq_set_wake()
272 static irqreturn_t regmap_irq_thread(int irq, void *d) in regmap_irq_thread() argument
274 struct regmap_irq_chip_data *data = d; in regmap_irq_thread()
430 struct regmap_irq_chip_data *d; in regmap_add_irq_chip() local
456 d = kzalloc(sizeof(*d), GFP_KERNEL); in regmap_add_irq_chip()
457 if (!d) in regmap_add_irq_chip()
460 d->status_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
462 if (!d->status_buf) in regmap_add_irq_chip()
465 d->mask_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
467 if (!d->mask_buf) in regmap_add_irq_chip()
470 d->mask_buf_def = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
472 if (!d->mask_buf_def) in regmap_add_irq_chip()
476 d->wake_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
478 if (!d->wake_buf) in regmap_add_irq_chip()
483 d->type_buf_def = kcalloc(chip->num_type_reg, in regmap_add_irq_chip()
485 if (!d->type_buf_def) in regmap_add_irq_chip()
488 d->type_buf = kcalloc(chip->num_type_reg, sizeof(unsigned int), in regmap_add_irq_chip()
490 if (!d->type_buf) in regmap_add_irq_chip()
494 d->irq_chip = regmap_irq_chip; in regmap_add_irq_chip()
495 d->irq_chip.name = chip->name; in regmap_add_irq_chip()
496 d->irq = irq; in regmap_add_irq_chip()
497 d->map = map; in regmap_add_irq_chip()
498 d->chip = chip; in regmap_add_irq_chip()
499 d->irq_base = irq_base; in regmap_add_irq_chip()
502 d->irq_reg_stride = chip->irq_reg_stride; in regmap_add_irq_chip()
504 d->irq_reg_stride = 1; in regmap_add_irq_chip()
507 d->type_reg_stride = chip->type_reg_stride; in regmap_add_irq_chip()
509 d->type_reg_stride = 1; in regmap_add_irq_chip()
512 d->irq_reg_stride == 1) { in regmap_add_irq_chip()
513 d->status_reg_buf = kmalloc_array(chip->num_regs, in regmap_add_irq_chip()
516 if (!d->status_reg_buf) in regmap_add_irq_chip()
520 mutex_init(&d->lock); in regmap_add_irq_chip()
523 d->mask_buf_def[chip->irqs[i].reg_offset / map->reg_stride] in regmap_add_irq_chip()
528 d->mask_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip()
530 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
532 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
533 d->mask_buf[i], ~d->mask_buf[i]); in regmap_add_irq_chip()
534 else if (d->chip->unmask_base) { in regmap_add_irq_chip()
535 unmask_offset = d->chip->unmask_base - in regmap_add_irq_chip()
536 d->chip->mask_base; in regmap_add_irq_chip()
537 ret = regmap_irq_update_bits(d, in regmap_add_irq_chip()
539 d->mask_buf[i], in regmap_add_irq_chip()
540 d->mask_buf[i]); in regmap_add_irq_chip()
542 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
543 d->mask_buf[i], d->mask_buf[i]); in regmap_add_irq_chip()
555 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
556 ret = regmap_read(map, reg, &d->status_buf[i]); in regmap_add_irq_chip()
563 if (d->status_buf[i] && (chip->ack_base || chip->use_ack)) { in regmap_add_irq_chip()
565 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
568 ~(d->status_buf[i] & d->mask_buf[i])); in regmap_add_irq_chip()
571 d->status_buf[i] & d->mask_buf[i]); in regmap_add_irq_chip()
581 if (d->wake_buf) { in regmap_add_irq_chip()
583 d->wake_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip()
585 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
588 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
589 d->mask_buf_def[i], in regmap_add_irq_chip()
592 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
593 d->mask_buf_def[i], in regmap_add_irq_chip()
594 d->wake_buf[i]); in regmap_add_irq_chip()
606 d->type_buf_def[reg] |= chip->irqs[i].type_rising_mask | in regmap_add_irq_chip()
610 if (!d->type_buf_def[i]) in regmap_add_irq_chip()
614 (i * map->reg_stride * d->type_reg_stride); in regmap_add_irq_chip()
616 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
617 d->type_buf_def[i], 0xFF); in regmap_add_irq_chip()
619 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
620 d->type_buf_def[i], 0x0); in regmap_add_irq_chip()
631 d->domain = irq_domain_add_legacy(map->dev->of_node, in regmap_add_irq_chip()
633 ®map_domain_ops, d); in regmap_add_irq_chip()
635 d->domain = irq_domain_add_linear(map->dev->of_node, in regmap_add_irq_chip()
637 ®map_domain_ops, d); in regmap_add_irq_chip()
638 if (!d->domain) { in regmap_add_irq_chip()
646 chip->name, d); in regmap_add_irq_chip()
653 *data = d; in regmap_add_irq_chip()
660 kfree(d->type_buf); in regmap_add_irq_chip()
661 kfree(d->type_buf_def); in regmap_add_irq_chip()
662 kfree(d->wake_buf); in regmap_add_irq_chip()
663 kfree(d->mask_buf_def); in regmap_add_irq_chip()
664 kfree(d->mask_buf); in regmap_add_irq_chip()
665 kfree(d->status_buf); in regmap_add_irq_chip()
666 kfree(d->status_reg_buf); in regmap_add_irq_chip()
667 kfree(d); in regmap_add_irq_chip()
680 void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d) in regmap_del_irq_chip() argument
685 if (!d) in regmap_del_irq_chip()
688 free_irq(irq, d); in regmap_del_irq_chip()
691 for (hwirq = 0; hwirq < d->chip->num_irqs; hwirq++) { in regmap_del_irq_chip()
693 if (!d->chip->irqs[hwirq].mask) in regmap_del_irq_chip()
700 virq = irq_find_mapping(d->domain, hwirq); in regmap_del_irq_chip()
705 irq_domain_remove(d->domain); in regmap_del_irq_chip()
706 kfree(d->type_buf); in regmap_del_irq_chip()
707 kfree(d->type_buf_def); in regmap_del_irq_chip()
708 kfree(d->wake_buf); in regmap_del_irq_chip()
709 kfree(d->mask_buf_def); in regmap_del_irq_chip()
710 kfree(d->mask_buf); in regmap_del_irq_chip()
711 kfree(d->status_reg_buf); in regmap_del_irq_chip()
712 kfree(d->status_buf); in regmap_del_irq_chip()
713 kfree(d); in regmap_del_irq_chip()
719 struct regmap_irq_chip_data *d = *(struct regmap_irq_chip_data **)res; in devm_regmap_irq_chip_release() local
721 regmap_del_irq_chip(d->irq, d); in devm_regmap_irq_chip_release()
757 struct regmap_irq_chip_data **ptr, *d; in devm_regmap_add_irq_chip() local
766 chip, &d); in devm_regmap_add_irq_chip()
772 *ptr = d; in devm_regmap_add_irq_chip()
774 *data = d; in devm_regmap_add_irq_chip()