Skip to contentSkip to conversation

regmap: regmap-irq: Remove default irq type setting from core

PATCH In review Matti Vaittinen 2 participants 3 messages Dec 18, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index 603b1554f81c..8b216b2e2c19 100644
@@ -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 ~~~
Tested-by on v1 1/1
#1 lore raw

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.

---
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
index 603b1554f81c..8b216b2e2c19 100644
@@ -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.

#2 lore raw
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

---
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_mask flag.

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 ~~~