Messages in this thread | | | From | Bartosz Golaszewski <> | Date | Tue, 18 Dec 2018 14:08:41 +0100 | Subject | Re: [PATCH] regmap: regmap-irq: Remove default irq type setting from core |
| |
wt., 18 gru 2018 o 11:58 Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> napisał(a): > > The common code should not set IRQ type. Read HW defaults to the > cache at startup instead of forcing type to EDGE_BOTH. If > default setting is needed this should be done via normal > mechanisms or by chip specific code if normal mechanisms are not > suitable for some reason. Common regmap-irq code should not have > defaults hard-coded but keep the HW/boot defaults untouched. > > Signed-off-by: Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com> > --- > So let's try removing the hard-coded default setting from generic > regmap-irq code as discussed with Mark here: > https://lore.kernel.org/lkml/20181217180722.GG27909@sirena.org.uk/ > > Core code should not care about the default trigger level - such > settings should be done by code which knows the target > platform/board. > > I was not able to test this change as I have no max77620 which seems to > be the only user of regmap-irq type-setting in tree as of now. > > The patch was created on top of the regulator-next tree, with > "regmap: irq: handle HW using separate rising/falling edge interrupts" > from Bartosz Golaszewski cherry-picked. This should still cleanly apply > on regmap-tree. > > drivers/base/regmap/regmap-irq.c | 22 ++++++++-------------- > 1 file changed, 8 insertions(+), 14 deletions(-) > > diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c > index 603b1554f81c..8b216b2e2c19 100644 > --- a/drivers/base/regmap/regmap-irq.c > +++ b/drivers/base/regmap/regmap-irq.c > @@ -625,26 +625,20 @@ int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags, > } > > if (chip->num_type_reg && !chip->type_in_mask) { > - for (i = 0; i < chip->num_irqs; i++) { > - reg = chip->irqs[i].type_reg_offset / map->reg_stride; > - d->type_buf_def[reg] |= chip->irqs[i].type_rising_mask | > - chip->irqs[i].type_falling_mask; > - } > for (i = 0; i < chip->num_type_reg; ++i) { > if (!d->type_buf_def[i]) > continue; > > reg = chip->type_base + > (i * map->reg_stride * d->type_reg_stride); > - if (chip->type_invert) > - ret = regmap_irq_update_bits(d, reg, > - d->type_buf_def[i], 0xFF); > - else > - ret = regmap_irq_update_bits(d, reg, > - d->type_buf_def[i], 0x0); > - if (ret != 0) { > - dev_err(map->dev, > - "Failed to set type in 0x%x: %x\n", > + > + ret = regmap_read(map, reg, &d->type_buf_def[i]); > + > + if (d->chip->type_invert) > + d->type_buf_def[i] = ~d->type_buf_def[i]; > + > + if (ret) { > + dev_err(map->dev, "Failed to get type defaults at 0x%x: %d\n", > reg, ret); > goto err_alloc; > } > -- > 2.14.3 > > > -- > Matti Vaittinen > ROHM Semiconductors > > ~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~
Works with my work-in-progress max77650 driver that uses the new type_in_mask flag.
Tested-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
| |