Commit ae5ae354 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski

Merge tag 'regmap-no-status' of...

Merge tag 'regmap-no-status' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap into gpio/for-next

regmap: Add no_status support

This patch adds support for devices which don't support readback of
individual interrupt statuses, we report all interrupts as firing and
hope the consumers do the right thing.
parents a7400a48 4d60cac9
...@@ -433,7 +433,10 @@ static irqreturn_t regmap_irq_thread(int irq, void *d) ...@@ -433,7 +433,10 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
* possible in order to reduce the I/O overheads. * possible in order to reduce the I/O overheads.
*/ */
if (chip->num_main_regs) { if (chip->no_status) {
/* no status register so default to all active */
memset32(data->status_buf, GENMASK(31, 0), chip->num_regs);
} else if (chip->num_main_regs) {
unsigned int max_main_bits; unsigned int max_main_bits;
unsigned long size; unsigned long size;
...@@ -949,6 +952,10 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, ...@@ -949,6 +952,10 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
continue; continue;
/* Ack masked but set interrupts */ /* Ack masked but set interrupts */
if (d->chip->no_status) {
/* no status register so default to all active */
d->status_buf[i] = GENMASK(31, 0);
} else {
reg = d->get_irq_reg(d, d->chip->status_base, i); reg = d->get_irq_reg(d, d->chip->status_base, i);
ret = regmap_read(map, reg, &d->status_buf[i]); ret = regmap_read(map, reg, &d->status_buf[i]);
if (ret != 0) { if (ret != 0) {
...@@ -956,6 +963,7 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode, ...@@ -956,6 +963,7 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
ret); ret);
goto err_alloc; goto err_alloc;
} }
}
if (chip->status_invert) if (chip->status_invert)
d->status_buf[i] = ~d->status_buf[i]; d->status_buf[i] = ~d->status_buf[i];
......
...@@ -1567,6 +1567,7 @@ struct regmap_irq_chip_data; ...@@ -1567,6 +1567,7 @@ struct regmap_irq_chip_data;
* the need for a @sub_reg_offsets table. * the need for a @sub_reg_offsets table.
* @status_invert: Inverted status register: cleared bits are active interrupts. * @status_invert: Inverted status register: cleared bits are active interrupts.
* @runtime_pm: Hold a runtime PM lock on the device when accessing it. * @runtime_pm: Hold a runtime PM lock on the device when accessing it.
* @no_status: No status register: all interrupts assumed generated by device.
* *
* @num_regs: Number of registers in each control bank. * @num_regs: Number of registers in each control bank.
* @irqs: Descriptors for individual IRQs. Interrupt numbers are * @irqs: Descriptors for individual IRQs. Interrupt numbers are
...@@ -1631,6 +1632,7 @@ struct regmap_irq_chip { ...@@ -1631,6 +1632,7 @@ struct regmap_irq_chip {
unsigned int clear_on_unmask:1; unsigned int clear_on_unmask:1;
unsigned int not_fixed_stride:1; unsigned int not_fixed_stride:1;
unsigned int status_invert:1; unsigned int status_invert:1;
unsigned int no_status:1;
int num_regs; int num_regs;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment