regmap: regmap-irq: Remove default irq type setting from core
Subsystems (2)
PATCH 1/1 regmap: regmap-irq: Remove default irq type setting from core
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.
---
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/[email protected]/
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(-)
drivers/base/regmap/regmap-irq.c +8 -14
@@ -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; }
Signature · 8 lines
2.14.3 -- Matti Vaittinen ROHM Semiconductors ~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~
wt., 18 gru 2018 o 11:58 Matti Vaittinen
<[email protected]> napisał(a):
Quoted 72 lines
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 <[email protected]>---
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/[email protected]/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(-)drivers/base/regmap/regmap-irq.c +8
-15@@ -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
Quoted 5 lines
--
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.
Quoted 16 lines · Bartosz Golaszewski
wt., 18 gru 2018 o 11:58 Matti Vaittinen
<[email protected]> napisał(a):Quoted 8 lines
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.Quoted 5 lines
Signed-off-by Matti Vaittinen <[email protected]>---
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.
Quoted 4 lines
Works with my work-in-progress max77650 driver that uses the new
type_in_maskflag.Tested-by Bartosz Golaszewski <[email protected]>
Thanks a bunch for testing Bartosz :) Highly appreciated!
Signature · 4 lines
Matti Vaittinen ROHM Semiconductors ~~~ "I don't think so," said Rene Descartes. Just then, he vanished ~~~