Skip to content

Commit 1222390

Browse files
committed
Merge tag 'gpio-fixes-for-v6.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio fixes from Bartosz Golaszewski: - protect gpio-aggregator against module unload - use raw spinlock in gpio-rcar to fix a lockdep splat - fix OF node leak in gpio-rcar * tag 'gpio-fixes-for-v6.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpio: rcar: Fix missing of_node_put() call gpio: rcar: Use raw_spinlock to protect register access gpio: aggregator: protect driver attr handlers against module unload
2 parents 8aed61b + 391b41f commit 1222390

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

drivers/gpio/gpio-aggregator.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,15 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf,
119119
struct platform_device *pdev;
120120
int res, id;
121121

122+
if (!try_module_get(THIS_MODULE))
123+
return -ENOENT;
124+
122125
/* kernfs guarantees string termination, so count + 1 is safe */
123126
aggr = kzalloc(sizeof(*aggr) + count + 1, GFP_KERNEL);
124-
if (!aggr)
125-
return -ENOMEM;
127+
if (!aggr) {
128+
res = -ENOMEM;
129+
goto put_module;
130+
}
126131

127132
memcpy(aggr->args, buf, count + 1);
128133

@@ -161,6 +166,7 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf,
161166
}
162167

163168
aggr->pdev = pdev;
169+
module_put(THIS_MODULE);
164170
return count;
165171

166172
remove_table:
@@ -175,6 +181,8 @@ static ssize_t new_device_store(struct device_driver *driver, const char *buf,
175181
kfree(aggr->lookups);
176182
free_ga:
177183
kfree(aggr);
184+
put_module:
185+
module_put(THIS_MODULE);
178186
return res;
179187
}
180188

@@ -203,13 +211,19 @@ static ssize_t delete_device_store(struct device_driver *driver,
203211
if (error)
204212
return error;
205213

214+
if (!try_module_get(THIS_MODULE))
215+
return -ENOENT;
216+
206217
mutex_lock(&gpio_aggregator_lock);
207218
aggr = idr_remove(&gpio_aggregator_idr, id);
208219
mutex_unlock(&gpio_aggregator_lock);
209-
if (!aggr)
220+
if (!aggr) {
221+
module_put(THIS_MODULE);
210222
return -ENOENT;
223+
}
211224

212225
gpio_aggregator_free(aggr);
226+
module_put(THIS_MODULE);
213227
return count;
214228
}
215229
static DRIVER_ATTR_WO(delete_device);

drivers/gpio/gpio-rcar.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct gpio_rcar_info {
4040

4141
struct gpio_rcar_priv {
4242
void __iomem *base;
43-
spinlock_t lock;
43+
raw_spinlock_t lock;
4444
struct device *dev;
4545
struct gpio_chip gpio_chip;
4646
unsigned int irq_parent;
@@ -123,7 +123,7 @@ static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
123123
* "Setting Level-Sensitive Interrupt Input Mode"
124124
*/
125125

126-
spin_lock_irqsave(&p->lock, flags);
126+
raw_spin_lock_irqsave(&p->lock, flags);
127127

128128
/* Configure positive or negative logic in POSNEG */
129129
gpio_rcar_modify_bit(p, POSNEG, hwirq, !active_high_rising_edge);
@@ -142,7 +142,7 @@ static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
142142
if (!level_trigger)
143143
gpio_rcar_write(p, INTCLR, BIT(hwirq));
144144

145-
spin_unlock_irqrestore(&p->lock, flags);
145+
raw_spin_unlock_irqrestore(&p->lock, flags);
146146
}
147147

148148
static int gpio_rcar_irq_set_type(struct irq_data *d, unsigned int type)
@@ -246,7 +246,7 @@ static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
246246
* "Setting General Input Mode"
247247
*/
248248

249-
spin_lock_irqsave(&p->lock, flags);
249+
raw_spin_lock_irqsave(&p->lock, flags);
250250

251251
/* Configure positive logic in POSNEG */
252252
gpio_rcar_modify_bit(p, POSNEG, gpio, false);
@@ -261,7 +261,7 @@ static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
261261
if (p->info.has_outdtsel && output)
262262
gpio_rcar_modify_bit(p, OUTDTSEL, gpio, false);
263263

264-
spin_unlock_irqrestore(&p->lock, flags);
264+
raw_spin_unlock_irqrestore(&p->lock, flags);
265265
}
266266

267267
static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
@@ -347,7 +347,7 @@ static int gpio_rcar_get_multiple(struct gpio_chip *chip, unsigned long *mask,
347347
return 0;
348348
}
349349

350-
spin_lock_irqsave(&p->lock, flags);
350+
raw_spin_lock_irqsave(&p->lock, flags);
351351
outputs = gpio_rcar_read(p, INOUTSEL);
352352
m = outputs & bankmask;
353353
if (m)
@@ -356,7 +356,7 @@ static int gpio_rcar_get_multiple(struct gpio_chip *chip, unsigned long *mask,
356356
m = ~outputs & bankmask;
357357
if (m)
358358
val |= gpio_rcar_read(p, INDT) & m;
359-
spin_unlock_irqrestore(&p->lock, flags);
359+
raw_spin_unlock_irqrestore(&p->lock, flags);
360360

361361
bits[0] = val;
362362
return 0;
@@ -367,9 +367,9 @@ static void gpio_rcar_set(struct gpio_chip *chip, unsigned offset, int value)
367367
struct gpio_rcar_priv *p = gpiochip_get_data(chip);
368368
unsigned long flags;
369369

370-
spin_lock_irqsave(&p->lock, flags);
370+
raw_spin_lock_irqsave(&p->lock, flags);
371371
gpio_rcar_modify_bit(p, OUTDT, offset, value);
372-
spin_unlock_irqrestore(&p->lock, flags);
372+
raw_spin_unlock_irqrestore(&p->lock, flags);
373373
}
374374

375375
static void gpio_rcar_set_multiple(struct gpio_chip *chip, unsigned long *mask,
@@ -386,12 +386,12 @@ static void gpio_rcar_set_multiple(struct gpio_chip *chip, unsigned long *mask,
386386
if (!bankmask)
387387
return;
388388

389-
spin_lock_irqsave(&p->lock, flags);
389+
raw_spin_lock_irqsave(&p->lock, flags);
390390
val = gpio_rcar_read(p, OUTDT);
391391
val &= ~bankmask;
392392
val |= (bankmask & bits[0]);
393393
gpio_rcar_write(p, OUTDT, val);
394-
spin_unlock_irqrestore(&p->lock, flags);
394+
raw_spin_unlock_irqrestore(&p->lock, flags);
395395
}
396396

397397
static int gpio_rcar_direction_output(struct gpio_chip *chip, unsigned offset,
@@ -468,7 +468,12 @@ static int gpio_rcar_parse_dt(struct gpio_rcar_priv *p, unsigned int *npins)
468468
p->info = *info;
469469

470470
ret = of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, 0, &args);
471-
*npins = ret == 0 ? args.args[2] : RCAR_MAX_GPIO_PER_BANK;
471+
if (ret) {
472+
*npins = RCAR_MAX_GPIO_PER_BANK;
473+
} else {
474+
*npins = args.args[2];
475+
of_node_put(args.np);
476+
}
472477

473478
if (*npins == 0 || *npins > RCAR_MAX_GPIO_PER_BANK) {
474479
dev_warn(p->dev, "Invalid number of gpio lines %u, using %u\n",
@@ -505,7 +510,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
505510
return -ENOMEM;
506511

507512
p->dev = dev;
508-
spin_lock_init(&p->lock);
513+
raw_spin_lock_init(&p->lock);
509514

510515
/* Get device configuration from DT node */
511516
ret = gpio_rcar_parse_dt(p, &npins);

0 commit comments

Comments
 (0)