Skip to content

Commit d8aef84

Browse files
committed
Merge tag 'counter-fixes-for-6.19' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wbg/counter into char-misc-linus
William writes: Counter fixes for 6.19 A fix for interrupt-cnt dropping the IRQF_NO_THREAD configuration to allow the IRQ handler to correctly acquire a spinlock_t lock. A fix for 104-quad-8 correcting quad8_irq_handler() to return irqreturn_t enum values rather than negative errno codes on error. * tag 'counter-fixes-for-6.19' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/wbg/counter: counter: 104-quad-8: Fix incorrect return value in IRQ handler counter: interrupt-cnt: Drop IRQF_NO_THREAD flag
2 parents 9448598 + 9517d76 commit d8aef84

2 files changed

Lines changed: 15 additions & 8 deletions

File tree

drivers/counter/104-quad-8.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,7 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
11921192
{
11931193
struct counter_device *counter = private;
11941194
struct quad8 *const priv = counter_priv(counter);
1195+
struct device *dev = counter->parent;
11951196
unsigned int status;
11961197
unsigned long irq_status;
11971198
unsigned long channel;
@@ -1200,8 +1201,11 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
12001201
int ret;
12011202

12021203
ret = regmap_read(priv->map, QUAD8_INTERRUPT_STATUS, &status);
1203-
if (ret)
1204-
return ret;
1204+
if (ret) {
1205+
dev_WARN_ONCE(dev, true,
1206+
"Attempt to read Interrupt Status Register failed: %d\n", ret);
1207+
return IRQ_NONE;
1208+
}
12051209
if (!status)
12061210
return IRQ_NONE;
12071211

@@ -1223,17 +1227,21 @@ static irqreturn_t quad8_irq_handler(int irq, void *private)
12231227
break;
12241228
default:
12251229
/* should never reach this path */
1226-
WARN_ONCE(true, "invalid interrupt trigger function %u configured for channel %lu\n",
1227-
flg_pins, channel);
1230+
dev_WARN_ONCE(dev, true,
1231+
"invalid interrupt trigger function %u configured for channel %lu\n",
1232+
flg_pins, channel);
12281233
continue;
12291234
}
12301235

12311236
counter_push_event(counter, event, channel);
12321237
}
12331238

12341239
ret = regmap_write(priv->map, QUAD8_CHANNEL_OPERATION, CLEAR_PENDING_INTERRUPTS);
1235-
if (ret)
1236-
return ret;
1240+
if (ret) {
1241+
dev_WARN_ONCE(dev, true,
1242+
"Attempt to clear pending interrupts by writing to Channel Operation Register failed: %d\n", ret);
1243+
return IRQ_HANDLED;
1244+
}
12371245

12381246
return IRQ_HANDLED;
12391247
}

drivers/counter/interrupt-cnt.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,7 @@ static int interrupt_cnt_probe(struct platform_device *pdev)
229229

230230
irq_set_status_flags(priv->irq, IRQ_NOAUTOEN);
231231
ret = devm_request_irq(dev, priv->irq, interrupt_cnt_isr,
232-
IRQF_TRIGGER_RISING | IRQF_NO_THREAD,
233-
dev_name(dev), counter);
232+
IRQF_TRIGGER_RISING, dev_name(dev), counter);
234233
if (ret)
235234
return ret;
236235

0 commit comments

Comments
 (0)