Lines Matching refs: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()
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()
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()
172 dev_err(d->map->dev, "Failed to ack 0x%x: %d\n", in regmap_irq_sync_unlock()
178 if (!d->chip->type_in_mask) { in regmap_irq_sync_unlock()
179 for (i = 0; i < d->chip->num_type_reg; i++) { in regmap_irq_sync_unlock()
180 if (!d->type_buf_def[i]) in regmap_irq_sync_unlock()
182 reg = d->chip->type_base + in regmap_irq_sync_unlock()
183 (i * map->reg_stride * d->type_reg_stride); in regmap_irq_sync_unlock()
184 if (d->chip->type_invert) in regmap_irq_sync_unlock()
185 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
186 d->type_buf_def[i], ~d->type_buf[i]); in regmap_irq_sync_unlock()
188 ret = regmap_irq_update_bits(d, reg, in regmap_irq_sync_unlock()
189 d->type_buf_def[i], d->type_buf[i]); in regmap_irq_sync_unlock()
191 dev_err(d->map->dev, "Failed to sync type in %x\n", in regmap_irq_sync_unlock()
196 if (d->chip->runtime_pm) in regmap_irq_sync_unlock()
200 if (d->wake_count < 0) in regmap_irq_sync_unlock()
201 for (i = d->wake_count; i < 0; i++) in regmap_irq_sync_unlock()
202 irq_set_irq_wake(d->irq, 0); in regmap_irq_sync_unlock()
203 else if (d->wake_count > 0) in regmap_irq_sync_unlock()
204 for (i = 0; i < d->wake_count; i++) in regmap_irq_sync_unlock()
205 irq_set_irq_wake(d->irq, 1); in regmap_irq_sync_unlock()
207 d->wake_count = 0; in regmap_irq_sync_unlock()
209 mutex_unlock(&d->lock); in regmap_irq_sync_unlock()
214 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_enable() local
215 struct regmap *map = d->map; in regmap_irq_enable()
216 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_enable()
232 if (d->chip->type_in_mask && type) in regmap_irq_enable()
233 mask = d->type_buf[irq_data->reg_offset / map->reg_stride]; in regmap_irq_enable()
237 if (d->chip->clear_on_unmask) in regmap_irq_enable()
238 d->clear_status = true; in regmap_irq_enable()
240 d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask; in regmap_irq_enable()
245 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_disable() local
246 struct regmap *map = d->map; in regmap_irq_disable()
247 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_disable()
249 d->mask_buf[irq_data->reg_offset / map->reg_stride] |= irq_data->mask; in regmap_irq_disable()
254 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_type() local
255 struct regmap *map = d->map; in regmap_irq_set_type()
256 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_type()
266 d->type_buf[reg] &= ~t->type_reg_mask; in regmap_irq_set_type()
268 d->type_buf[reg] &= ~(t->type_falling_val | in regmap_irq_set_type()
274 d->type_buf[reg] |= t->type_falling_val; in regmap_irq_set_type()
278 d->type_buf[reg] |= t->type_rising_val; in regmap_irq_set_type()
282 d->type_buf[reg] |= (t->type_falling_val | in regmap_irq_set_type()
287 d->type_buf[reg] |= t->type_level_high_val; in regmap_irq_set_type()
291 d->type_buf[reg] |= t->type_level_low_val; in regmap_irq_set_type()
301 struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data); in regmap_irq_set_wake() local
302 struct regmap *map = d->map; in regmap_irq_set_wake()
303 const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq); in regmap_irq_set_wake()
306 if (d->wake_buf) in regmap_irq_set_wake()
307 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
309 d->wake_count++; in regmap_irq_set_wake()
311 if (d->wake_buf) in regmap_irq_set_wake()
312 d->wake_buf[irq_data->reg_offset / map->reg_stride] in regmap_irq_set_wake()
314 d->wake_count--; in regmap_irq_set_wake()
356 static irqreturn_t regmap_irq_thread(int irq, void *d) in regmap_irq_thread() argument
358 struct regmap_irq_chip_data *data = d; in regmap_irq_thread()
563 struct regmap_irq_chip_data *d; in regmap_add_irq_chip() local
593 d = kzalloc(sizeof(*d), GFP_KERNEL); in regmap_add_irq_chip()
594 if (!d) in regmap_add_irq_chip()
598 d->main_status_buf = kcalloc(chip->num_main_regs, in regmap_add_irq_chip()
602 if (!d->main_status_buf) in regmap_add_irq_chip()
606 d->status_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
608 if (!d->status_buf) in regmap_add_irq_chip()
611 d->mask_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
613 if (!d->mask_buf) in regmap_add_irq_chip()
616 d->mask_buf_def = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
618 if (!d->mask_buf_def) in regmap_add_irq_chip()
622 d->wake_buf = kcalloc(chip->num_regs, sizeof(unsigned int), in regmap_add_irq_chip()
624 if (!d->wake_buf) in regmap_add_irq_chip()
630 d->type_buf_def = kcalloc(num_type_reg, in regmap_add_irq_chip()
632 if (!d->type_buf_def) in regmap_add_irq_chip()
635 d->type_buf = kcalloc(num_type_reg, sizeof(unsigned int), in regmap_add_irq_chip()
637 if (!d->type_buf) in regmap_add_irq_chip()
641 d->irq_chip = regmap_irq_chip; in regmap_add_irq_chip()
642 d->irq_chip.name = chip->name; in regmap_add_irq_chip()
643 d->irq = irq; in regmap_add_irq_chip()
644 d->map = map; in regmap_add_irq_chip()
645 d->chip = chip; in regmap_add_irq_chip()
646 d->irq_base = irq_base; in regmap_add_irq_chip()
649 d->irq_reg_stride = chip->irq_reg_stride; in regmap_add_irq_chip()
651 d->irq_reg_stride = 1; in regmap_add_irq_chip()
654 d->type_reg_stride = chip->type_reg_stride; in regmap_add_irq_chip()
656 d->type_reg_stride = 1; in regmap_add_irq_chip()
659 d->irq_reg_stride == 1) { in regmap_add_irq_chip()
660 d->status_reg_buf = kmalloc_array(chip->num_regs, in regmap_add_irq_chip()
663 if (!d->status_reg_buf) in regmap_add_irq_chip()
667 mutex_init(&d->lock); in regmap_add_irq_chip()
670 d->mask_buf_def[chip->irqs[i].reg_offset / map->reg_stride] in regmap_add_irq_chip()
675 d->mask_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip()
680 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
682 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
683 d->mask_buf[i], ~d->mask_buf[i]); in regmap_add_irq_chip()
684 else if (d->chip->unmask_base) { in regmap_add_irq_chip()
685 unmask_offset = d->chip->unmask_base - in regmap_add_irq_chip()
686 d->chip->mask_base; in regmap_add_irq_chip()
687 ret = regmap_irq_update_bits(d, in regmap_add_irq_chip()
689 d->mask_buf[i], in regmap_add_irq_chip()
690 d->mask_buf[i]); in regmap_add_irq_chip()
692 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
693 d->mask_buf[i], d->mask_buf[i]); in regmap_add_irq_chip()
705 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
706 ret = regmap_read(map, reg, &d->status_buf[i]); in regmap_add_irq_chip()
713 if (d->status_buf[i] && (chip->ack_base || chip->use_ack)) { in regmap_add_irq_chip()
715 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
718 ~(d->status_buf[i] & d->mask_buf[i])); in regmap_add_irq_chip()
721 d->status_buf[i] & d->mask_buf[i]); in regmap_add_irq_chip()
731 if (d->wake_buf) { in regmap_add_irq_chip()
733 d->wake_buf[i] = d->mask_buf_def[i]; in regmap_add_irq_chip()
735 (i * map->reg_stride * d->irq_reg_stride); in regmap_add_irq_chip()
738 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
739 d->mask_buf_def[i], in regmap_add_irq_chip()
742 ret = regmap_irq_update_bits(d, reg, in regmap_add_irq_chip()
743 d->mask_buf_def[i], in regmap_add_irq_chip()
744 d->wake_buf[i]); in regmap_add_irq_chip()
756 (i * map->reg_stride * d->type_reg_stride); in regmap_add_irq_chip()
758 ret = regmap_read(map, reg, &d->type_buf_def[i]); in regmap_add_irq_chip()
760 if (d->chip->type_invert) in regmap_add_irq_chip()
761 d->type_buf_def[i] = ~d->type_buf_def[i]; in regmap_add_irq_chip()
772 d->domain = irq_domain_add_legacy(map->dev->of_node, in regmap_add_irq_chip()
774 &regmap_domain_ops, d); in regmap_add_irq_chip()
776 d->domain = irq_domain_add_linear(map->dev->of_node, in regmap_add_irq_chip()
778 &regmap_domain_ops, d); in regmap_add_irq_chip()
779 if (!d->domain) { in regmap_add_irq_chip()
787 chip->name, d); in regmap_add_irq_chip()
794 *data = d; in regmap_add_irq_chip()
801 kfree(d->type_buf); in regmap_add_irq_chip()
802 kfree(d->type_buf_def); in regmap_add_irq_chip()
803 kfree(d->wake_buf); in regmap_add_irq_chip()
804 kfree(d->mask_buf_def); in regmap_add_irq_chip()
805 kfree(d->mask_buf); in regmap_add_irq_chip()
806 kfree(d->status_buf); in regmap_add_irq_chip()
807 kfree(d->status_reg_buf); in regmap_add_irq_chip()
808 kfree(d); in regmap_add_irq_chip()
821 void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *d) in regmap_del_irq_chip() argument
826 if (!d) in regmap_del_irq_chip()
829 free_irq(irq, d); in regmap_del_irq_chip()
832 for (hwirq = 0; hwirq < d->chip->num_irqs; hwirq++) { in regmap_del_irq_chip()
834 if (!d->chip->irqs[hwirq].mask) in regmap_del_irq_chip()
841 virq = irq_find_mapping(d->domain, hwirq); in regmap_del_irq_chip()
846 irq_domain_remove(d->domain); in regmap_del_irq_chip()
847 kfree(d->type_buf); in regmap_del_irq_chip()
848 kfree(d->type_buf_def); in regmap_del_irq_chip()
849 kfree(d->wake_buf); in regmap_del_irq_chip()
850 kfree(d->mask_buf_def); in regmap_del_irq_chip()
851 kfree(d->mask_buf); in regmap_del_irq_chip()
852 kfree(d->status_reg_buf); in regmap_del_irq_chip()
853 kfree(d->status_buf); in regmap_del_irq_chip()
854 kfree(d); in regmap_del_irq_chip()
860 struct regmap_irq_chip_data *d = *(struct regmap_irq_chip_data **)res; in devm_regmap_irq_chip_release() local
862 regmap_del_irq_chip(d->irq, d); in devm_regmap_irq_chip_release()
898 struct regmap_irq_chip_data **ptr, *d; in devm_regmap_add_irq_chip() local
907 chip, &d); in devm_regmap_add_irq_chip()
913 *ptr = d; in devm_regmap_add_irq_chip()
915 *data = d; in devm_regmap_add_irq_chip()