Lines Matching full:d

57 	struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);  in regmap_irq_lock()  local
59 mutex_lock(&d->lock); in regmap_irq_lock()
62 static int regmap_irq_update_bits(struct regmap_irq_chip_data *d, in regmap_irq_update_bits() argument
66 if (d->chip->mask_writeonly) in regmap_irq_update_bits()
67 return regmap_write_bits(d->map, reg, mask, val); in regmap_irq_update_bits()
69 return regmap_update_bits(d->map, reg, mask, val); in regmap_irq_update_bits()
74 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_sync_unlock() local
75 struct regmap *map = d->map; in regmap_irq_sync_unlock()
81 if (d->chip->runtime_pm) { in regmap_irq_sync_unlock()
84 dev_err(map->dev, "IRQ sync failed to resume: %d\n", in regmap_irq_sync_unlock()
88 if (d->clear_status) { in regmap_irq_sync_unlock()
89 for (i = 0; i < d->chip->num_regs; i++) { in regmap_irq_sync_unlock()
90 reg = d->chip->status_base + in regmap_irq_sync_unlock()
91 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
95 dev_err(d->map->dev, in regmap_irq_sync_unlock()
99 d->clear_status = false; in regmap_irq_sync_unlock()
107 for (i = 0; i < d->chip->num_regs; i++) { in regmap_irq_sync_unlock()
108 if (!d->chip->mask_base) in regmap_irq_sync_unlock()
111 reg = d->chip->mask_base + in regmap_irq_sync_unlock()
112 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
113 if (d->chip->mask_invert) { in regmap_irq_sync_unlock()
114 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
115 d->mask_buf_def[i], ~d->mask_buf[i]); in regmap_irq_sync_unlock()
116 } else if (d->chip->unmask_base) { in regmap_irq_sync_unlock()
118 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
119 d->mask_buf_def[i], ~d->mask_buf[i]); in regmap_irq_sync_unlock()
121 dev_err(d->map->dev, in regmap_irq_sync_unlock()
124 unmask_offset = d->chip->unmask_base - in regmap_irq_sync_unlock()
125 d->chip->mask_base; in regmap_irq_sync_unlock()
127 ret = regmap_irq_update_bits(d, in regmap_irq_sync_unlock()
129 d->mask_buf_def[i], in regmap_irq_sync_unlock()
130 d->mask_buf[i]); in regmap_irq_sync_unlock()
132 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
133 d->mask_buf_def[i], d->mask_buf[i]); in regmap_irq_sync_unlock()
136 dev_err(d->map->dev, "Failed to sync masks in %x\n", in regmap_irq_sync_unlock()
139 reg = d->chip->wake_base + in regmap_irq_sync_unlock()
140 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
141 if (d->wake_buf) { in regmap_irq_sync_unlock()
142 if (d->chip->wake_invert) in regmap_irq_sync_unlock()
143 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
144 d->mask_buf_def[i], in regmap_irq_sync_unlock()
145 ~d->wake_buf[i]); in regmap_irq_sync_unlock()
147 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
148 d->mask_buf_def[i], in regmap_irq_sync_unlock()
149 d->wake_buf[i]); in regmap_irq_sync_unlock()
151 dev_err(d->map->dev, in regmap_irq_sync_unlock()
152 "Failed to sync wakes in %x: %d\n", in regmap_irq_sync_unlock()
156 if (!d->chip->init_ack_masked) in regmap_irq_sync_unlock()
163 if (d->mask_buf[i] && (d->chip->ack_base || d->chip->use_ack)) { in regmap_irq_sync_unlock()
164 reg = d->chip->ack_base + in regmap_irq_sync_unlock()
165 (i * map->reg_stride * d->irq_reg_stride); in regmap_irq_sync_unlock()
167 if (d->chip->ack_invert) in regmap_irq_sync_unlock()
168 ret = regmap_write(map, reg, ~d->mask_buf[i]); in regmap_irq_sync_unlock()
170 ret = regmap_write(map, reg, d->mask_buf[i]); in regmap_irq_sync_unlock()
171 if (d->chip->clear_ack) { in regmap_irq_sync_unlock()
172 if (d->chip->ack_invert && !ret) in regmap_irq_sync_unlock()
174 d->mask_buf[i]); in regmap_irq_sync_unlock()
177 ~d->mask_buf[i]); in regmap_irq_sync_unlock()
180 dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", in regmap_irq_sync_unlock()
186 if (!d->chip->type_in_mask) { in regmap_irq_sync_unlock()
187 for (i = 0; i < d->chip->num_type_reg; i++) { in regmap_irq_sync_unlock()
188 if (!d->type_buf_def[i]) in regmap_irq_sync_unlock()
190 reg = d->chip->type_base + in regmap_irq_sync_unlock()
191 (i * map->reg_stride * d->type_reg_stride); in regmap_irq_sync_unlock()
192 if (d->chip->type_invert) in regmap_irq_sync_unlock()
193 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
194 d->type_buf_def[i], ~d->type_buf[i]); in regmap_irq_sync_unlock()
196 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
197 d->type_buf_def[i], d->type_buf[i]); in regmap_irq_sync_unlock()
199 dev_err(d->map->dev, "Failed to sync type in %x\n", in regmap_irq_sync_unlock()
204 if (d->chip->runtime_pm) in regmap_irq_sync_unlock()
208 if (d->wake_count < 0) in regmap_irq_sync_unlock()
209 for (i = d->wake_count; i < 0; i++) in regmap_irq_sync_unlock()
210 irq_set_irq_wake(d->irq, 0); in regmap_irq_sync_unlock()
211 else if (d->wake_count > 0) in regmap_irq_sync_unlock()
212 for (i = 0; i < d->wake_count; i++) in regmap_irq_sync_unlock()
213 irq_set_irq_wake(d->irq, 1); in regmap_irq_sync_unlock()
215 d->wake_count = 0; in regmap_irq_sync_unlock()
217 mutex_unlock(&d->lock); in regmap_irq_sync_unlock()
222 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_enable() local
223 struct regmap *map = d->map; in regmap_irq_enable()
224 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_enable()
240 if (d->chip->type_in_mask && type) in regmap_irq_enable()
241 mask = d->type_buf[irq_data->reg_offset / map->reg_stride]; in regmap_irq_enable()
245 if (d->chip->clear_on_unmask) in regmap_irq_enable()
246 d->clear_status = true; in regmap_irq_enable()
248 d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask; in regmap_irq_enable()
253 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_disable() local
254 struct regmap *map = d->map; in regmap_irq_disable()
255 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_disable()
257 d->mask_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask; in regmap_irq_disable()
262 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_type() local
263 struct regmap *map = d->map; in regmap_irq_set_type()
264 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_type()
274 d->type_buf[reg] &= ~t->type_reg_mask; in regmap_irq_set_type()
276 d->type_buf[reg] &= ~(t->type_falling_val | in regmap_irq_set_type()
282 d->type_buf[reg] |= t->type_falling_val; in regmap_irq_set_type()
286 d->type_buf[reg] |= t->type_rising_val; in regmap_irq_set_type()
290 d->type_buf[reg] |= (t->type_falling_val | in regmap_irq_set_type()
295 d->type_buf[reg] |= t->type_level_high_val; in regmap_irq_set_type()
299 d->type_buf[reg] |= t->type_level_low_val; in regmap_irq_set_type()
309 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_wake() local
310 struct regmap *map = d->map; in regmap_irq_set_wake()
311 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_wake()
314 if (d->wake_buf) in regmap_irq_set_wake()
315 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
317 d->wake_count++; in regmap_irq_set_wake()
319 if (d->wake_buf) in regmap_irq_set_wake()
320 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
322 d->wake_count--; in regmap_irq_set_wake()
364 static irqreturn_t regmap_irq_thread(int irq, void *d) in regmap_irq_thread() argument
366 struct regmap_irq_chip_data *data = d; in regmap_irq_thread()
379 dev_err(map->dev, "IRQ thread failed to resume: %d\n", in regmap_irq_thread()
414 "Failed to read IRQ status %d\n", in regmap_irq_thread()
433 "Failed to read IRQ status %d\n", in regmap_irq_thread()
453 dev_err(map->dev, "Failed to read IRQ status: %d\n", in regmap_irq_thread()
484 "Failed to read IRQ status: %d\n", in regmap_irq_thread()
519 dev_err(map->dev, "Failed to ack 0x%x: %d\n", in regmap_irq_thread()
587 struct regmap_irq_chip_data *d; in regmap_add_irq_chip_fwnode() local
611 dev_warn(map->dev, "Failed to allocate IRQs: %d\n", in regmap_add_irq_chip_fwnode()
617 d = kzalloc(sizeof(*d), GFP_KERNEL); in regmap_add_irq_chip_fwnode()
618 if (!d) in regmap_add_irq_chip_fwnode()
622 d->main_status_buf = kcalloc(chip->num_main_regs, in regmap_add_irq_chip_fwnode()
626 if (!d->main_status_buf) in regmap_add_irq_chip_fwnode()
630 d->status_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip_fwnode()
632 if (!d->status_buf) in regmap_add_irq_chip_fwnode()
635 d->mask_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip_fwnode()
637 if (!d->mask_buf) in regmap_add_irq_chip_fwnode()
640 d->mask_buf_def = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip_fwnode()
642 if (!d->mask_buf_def) in regmap_add_irq_chip_fwnode()
646 d->wake_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip_fwnode()
648 if (!d->wake_buf) in regmap_add_irq_chip_fwnode()
654 d->type_buf_def = kcalloc(num_type_reg, in regmap_add_irq_chip_fwnode()
656 if (!d->type_buf_def) in regmap_add_irq_chip_fwnode()
659 d->type_buf = kcalloc(num_type_reg, sizeof(unsigned int), in regmap_add_irq_chip_fwnode()
661 if (!d->type_buf) in regmap_add_irq_chip_fwnode()
665 d->irq_chip = regmap_irq_chip; in regmap_add_irq_chip_fwnode()
666 d->irq_chip.name = chip->name; in regmap_add_irq_chip_fwnode()
667 d->irq = irq; in regmap_add_irq_chip_fwnode()
668 d->map = map; in regmap_add_irq_chip_fwnode()
669 d->chip = chip; in regmap_add_irq_chip_fwnode()
670 d->irq_base = irq_base; in regmap_add_irq_chip_fwnode()
673 d->irq_reg_stride = chip->irq_reg_stride; in regmap_add_irq_chip_fwnode()
675 d->irq_reg_stride = 1; in regmap_add_irq_chip_fwnode()
678 d->type_reg_stride = chip->type_reg_stride; in regmap_add_irq_chip_fwnode()
680 d->type_reg_stride = 1; in regmap_add_irq_chip_fwnode()
683 d->irq_reg_stride == 1) { in regmap_add_irq_chip_fwnode()
684 d->status_reg_buf = kmalloc_array(chip->num_regs, in regmap_add_irq_chip_fwnode()
687 if (!d->status_reg_buf) in regmap_add_irq_chip_fwnode()
691 mutex_init(&d->lock); in regmap_add_irq_chip_fwnode()
694 d->mask_buf_def[chip->irqs[i].reg_offset / map->reg_stride] in regmap_add_irq_chip_fwnode()
699 d->mask_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip_fwnode()
704 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip_fwnode()
706 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip_fwnode()
707 d->mask_buf[i], ~d->mask_buf[i]); in regmap_add_irq_chip_fwnode()
708 else if (d->chip->unmask_base) { in regmap_add_irq_chip_fwnode()
709 unmask_offset = d->chip->unmask_base - in regmap_add_irq_chip_fwnode()
710 d->chip->mask_base; in regmap_add_irq_chip_fwnode()
711 ret = regmap_irq_update_bits(d, in regmap_add_irq_chip_fwnode()
713 d->mask_buf[i], in regmap_add_irq_chip_fwnode()
714 d->mask_buf[i]); in regmap_add_irq_chip_fwnode()
716 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip_fwnode()
717 d->mask_buf[i], d->mask_buf[i]); in regmap_add_irq_chip_fwnode()
719 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n", in regmap_add_irq_chip_fwnode()
729 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip_fwnode()
730 ret = regmap_read(map, reg, &d->status_buf[i]); in regmap_add_irq_chip_fwnode()
732 dev_err(map->dev, "Failed to read IRQ status: %d\n", in regmap_add_irq_chip_fwnode()
737 if (d->status_buf[i] && (chip->ack_base || chip->use_ack)) { in regmap_add_irq_chip_fwnode()
739 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip_fwnode()
742 ~(d->status_buf[i] & d->mask_buf[i])); in regmap_add_irq_chip_fwnode()
745 d->status_buf[i] & d->mask_buf[i]); in regmap_add_irq_chip_fwnode()
749 (d->status_buf[i] & in regmap_add_irq_chip_fwnode()
750 d->mask_buf[i])); in regmap_add_irq_chip_fwnode()
753 ~(d->status_buf[i] & in regmap_add_irq_chip_fwnode()
754 d->mask_buf[i])); in regmap_add_irq_chip_fwnode()
757 dev_err(map->dev, "Failed to ack 0x%x: %d\n", in regmap_add_irq_chip_fwnode()
765 if (d->wake_buf) { in regmap_add_irq_chip_fwnode()
767 d->wake_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip_fwnode()
769 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip_fwnode()
772 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip_fwnode()
773 d->mask_buf_def[i], in regmap_add_irq_chip_fwnode()
776 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip_fwnode()
777 d->mask_buf_def[i], in regmap_add_irq_chip_fwnode()
778 d->wake_buf[i]); in regmap_add_irq_chip_fwnode()
780 dev_err(map->dev, "Failed to set masks in 0x%x: %d\n", in regmap_add_irq_chip_fwnode()
790 (i * map->reg_stride * d->type_reg_stride); in regmap_add_irq_chip_fwnode()
792 ret = regmap_read(map, reg, &d->type_buf_def[i]); in regmap_add_irq_chip_fwnode()
794 if (d->chip->type_invert) in regmap_add_irq_chip_fwnode()
795 d->type_buf_def[i] = ~d->type_buf_def[i]; in regmap_add_irq_chip_fwnode()
798 dev_err(map->dev, "Failed to get type defaults at 0x%x: %d\n", in regmap_add_irq_chip_fwnode()
806 d->domain = irq_domain_add_legacy(to_of_node(fwnode), in regmap_add_irq_chip_fwnode()
808 0, &regmap_domain_ops, d); in regmap_add_irq_chip_fwnode()
810 d->domain = irq_domain_add_linear(to_of_node(fwnode), in regmap_add_irq_chip_fwnode()
812 &regmap_domain_ops, d); in regmap_add_irq_chip_fwnode()
813 if (!d->domain) { in regmap_add_irq_chip_fwnode()
821 chip->name, d); in regmap_add_irq_chip_fwnode()
823 dev_err(map->dev, "Failed to request IRQ %d for %s: %d\n", in regmap_add_irq_chip_fwnode()
828 *data = d; in regmap_add_irq_chip_fwnode()
835 kfree(d->type_buf); in regmap_add_irq_chip_fwnode()
836 kfree(d->type_buf_def); in regmap_add_irq_chip_fwnode()
837 kfree(d->wake_buf); in regmap_add_irq_chip_fwnode()
838 kfree(d->mask_buf_def); in regmap_add_irq_chip_fwnode()
839 kfree(d->mask_buf); in regmap_add_irq_chip_fwnode()
840 kfree(d->status_buf); in regmap_add_irq_chip_fwnode()
841 kfree(d->status_reg_buf); in regmap_add_irq_chip_fwnode()
842 kfree(d); in regmap_add_irq_chip_fwnode()
875 * @d: &regmap_irq_chip_data allocated by regmap_add_irq_chip()
879 void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d) in regmap_del_irq_chip() argument
884 if (!d) in regmap_del_irq_chip()
887 free_irq(irq, d); in regmap_del_irq_chip()
890 for (hwirq = 0; hwirq < d->chip->num_irqs; hwirq++) { in regmap_del_irq_chip()
892 if (!d->chip->irqs[hwirq].mask) in regmap_del_irq_chip()
899 virq = irq_find_mapping(d->domain, hwirq); in regmap_del_irq_chip()
904 irq_domain_remove(d->domain); in regmap_del_irq_chip()
905 kfree(d->type_buf); in regmap_del_irq_chip()
906 kfree(d->type_buf_def); in regmap_del_irq_chip()
907 kfree(d->wake_buf); in regmap_del_irq_chip()
908 kfree(d->mask_buf_def); in regmap_del_irq_chip()
909 kfree(d->mask_buf); in regmap_del_irq_chip()
910 kfree(d->status_reg_buf); in regmap_del_irq_chip()
911 kfree(d->status_buf); in regmap_del_irq_chip()
912 kfree(d); in regmap_del_irq_chip()
918 struct regmap_irq_chip_data *d = *(struct regmap_irq_chip_data **)res; in devm_regmap_irq_chip_release() local
920 regmap_del_irq_chip(d->irq, d); in devm_regmap_irq_chip_release()
959 struct regmap_irq_chip_data **ptr, *d; in devm_regmap_add_irq_chip_fwnode() local
968 chip, &d); in devm_regmap_add_irq_chip_fwnode()
974 *ptr = d; in devm_regmap_add_irq_chip_fwnode()
976 *data = d; in devm_regmap_add_irq_chip_fwnode()