Skip to content

Commit c1a1c0d

Browse files
committed
Merge tag 'gpio-fixes-for-v6.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio fixes from Bartosz Golaszewski: - fix regressions in regmap cache initialization in gpio-104-idio-16 and gpio-pci-idio-16 - configure first 16 GPIO lines of the IDIO-16 as fixed outputs - fix duplicated IRQ mapping that can lead to an RCU stall in gpio-ljca - fix printf formatters passed to dev_err() and make failure to set debounce period non fatal * tag 'gpio-fixes-for-v6.18-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: gpio: ljca: Fix duplicated IRQ mapping gpiolib: acpi: Use %pe when passing an error pointer to dev_err() gpiolib: acpi: Make set debounce errors non fatal gpio: idio-16: Define fixed direction of the GPIO lines gpio: regmap: add the .fixed_direction_output configuration parameter gpio: pci-idio-16: Define maximum valid register address offset gpio: 104-idio-16: Define maximum valid register address offset
2 parents 6fab32b + 4c4e6ea commit c1a1c0d

7 files changed

Lines changed: 56 additions & 27 deletions

File tree

drivers/gpio/gpio-104-idio-16.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ static const struct regmap_config idio_16_regmap_config = {
5959
.reg_stride = 1,
6060
.val_bits = 8,
6161
.io_port = true,
62+
.max_register = 0x5,
6263
.wr_table = &idio_16_wr_table,
6364
.rd_table = &idio_16_rd_table,
6465
.volatile_table = &idio_16_rd_table,

drivers/gpio/gpio-idio-16.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#define DEFAULT_SYMBOL_NAMESPACE "GPIO_IDIO_16"
88

9+
#include <linux/bitmap.h>
910
#include <linux/bits.h>
1011
#include <linux/device.h>
1112
#include <linux/err.h>
@@ -107,6 +108,7 @@ int devm_idio_16_regmap_register(struct device *const dev,
107108
struct idio_16_data *data;
108109
struct regmap_irq_chip *chip;
109110
struct regmap_irq_chip_data *chip_data;
111+
DECLARE_BITMAP(fixed_direction_output, IDIO_16_NGPIO);
110112

111113
if (!config->parent)
112114
return -EINVAL;
@@ -164,6 +166,9 @@ int devm_idio_16_regmap_register(struct device *const dev,
164166
gpio_config.irq_domain = regmap_irq_get_domain(chip_data);
165167
gpio_config.reg_mask_xlate = idio_16_reg_mask_xlate;
166168

169+
bitmap_from_u64(fixed_direction_output, GENMASK_U64(15, 0));
170+
gpio_config.fixed_direction_output = fixed_direction_output;
171+
167172
return PTR_ERR_OR_ZERO(devm_gpio_regmap_register(dev, &gpio_config));
168173
}
169174
EXPORT_SYMBOL_GPL(devm_idio_16_regmap_register);

drivers/gpio/gpio-ljca.c

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -286,22 +286,14 @@ static void ljca_gpio_event_cb(void *context, u8 cmd, const void *evt_data,
286286
{
287287
const struct ljca_gpio_packet *packet = evt_data;
288288
struct ljca_gpio_dev *ljca_gpio = context;
289-
int i, irq;
289+
int i;
290290

291291
if (cmd != LJCA_GPIO_INT_EVENT)
292292
return;
293293

294294
for (i = 0; i < packet->num; i++) {
295-
irq = irq_find_mapping(ljca_gpio->gc.irq.domain,
296-
packet->item[i].index);
297-
if (!irq) {
298-
dev_err(ljca_gpio->gc.parent,
299-
"gpio_id %u does not mapped to IRQ yet\n",
300-
packet->item[i].index);
301-
return;
302-
}
303-
304-
generic_handle_domain_irq(ljca_gpio->gc.irq.domain, irq);
295+
generic_handle_domain_irq(ljca_gpio->gc.irq.domain,
296+
packet->item[i].index);
305297
set_bit(packet->item[i].index, ljca_gpio->reenable_irqs);
306298
}
307299

drivers/gpio/gpio-pci-idio-16.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ static const struct regmap_config idio_16_regmap_config = {
4141
.reg_stride = 1,
4242
.val_bits = 8,
4343
.io_port = true,
44+
.max_register = 0x7,
4445
.wr_table = &idio_16_wr_table,
4546
.rd_table = &idio_16_rd_table,
4647
.volatile_table = &idio_16_rd_table,

drivers/gpio/gpio-regmap.c

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ struct gpio_regmap {
3131
unsigned int reg_clr_base;
3232
unsigned int reg_dir_in_base;
3333
unsigned int reg_dir_out_base;
34+
unsigned long *fixed_direction_output;
3435

3536
#ifdef CONFIG_REGMAP_IRQ
3637
int regmap_irq_line;
@@ -134,6 +135,13 @@ static int gpio_regmap_get_direction(struct gpio_chip *chip,
134135
unsigned int base, val, reg, mask;
135136
int invert, ret;
136137

138+
if (gpio->fixed_direction_output) {
139+
if (test_bit(offset, gpio->fixed_direction_output))
140+
return GPIO_LINE_DIRECTION_OUT;
141+
else
142+
return GPIO_LINE_DIRECTION_IN;
143+
}
144+
137145
if (gpio->reg_dat_base && !gpio->reg_set_base)
138146
return GPIO_LINE_DIRECTION_IN;
139147
if (gpio->reg_set_base && !gpio->reg_dat_base)
@@ -284,6 +292,17 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
284292
goto err_free_gpio;
285293
}
286294

295+
if (config->fixed_direction_output) {
296+
gpio->fixed_direction_output = bitmap_alloc(chip->ngpio,
297+
GFP_KERNEL);
298+
if (!gpio->fixed_direction_output) {
299+
ret = -ENOMEM;
300+
goto err_free_gpio;
301+
}
302+
bitmap_copy(gpio->fixed_direction_output,
303+
config->fixed_direction_output, chip->ngpio);
304+
}
305+
287306
/* if not set, assume there is only one register */
288307
gpio->ngpio_per_reg = config->ngpio_per_reg;
289308
if (!gpio->ngpio_per_reg)
@@ -300,7 +319,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
300319

301320
ret = gpiochip_add_data(chip, gpio);
302321
if (ret < 0)
303-
goto err_free_gpio;
322+
goto err_free_bitmap;
304323

305324
#ifdef CONFIG_REGMAP_IRQ
306325
if (config->regmap_irq_chip) {
@@ -309,7 +328,7 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
309328
config->regmap_irq_line, config->regmap_irq_flags,
310329
0, config->regmap_irq_chip, &gpio->irq_chip_data);
311330
if (ret)
312-
goto err_free_gpio;
331+
goto err_free_bitmap;
313332

314333
irq_domain = regmap_irq_get_domain(gpio->irq_chip_data);
315334
} else
@@ -326,6 +345,8 @@ struct gpio_regmap *gpio_regmap_register(const struct gpio_regmap_config *config
326345

327346
err_remove_gpiochip:
328347
gpiochip_remove(chip);
348+
err_free_bitmap:
349+
bitmap_free(gpio->fixed_direction_output);
329350
err_free_gpio:
330351
kfree(gpio);
331352
return ERR_PTR(ret);
@@ -344,6 +365,7 @@ void gpio_regmap_unregister(struct gpio_regmap *gpio)
344365
#endif
345366

346367
gpiochip_remove(&gpio->gpio_chip);
368+
bitmap_free(gpio->fixed_direction_output);
347369
kfree(gpio);
348370
}
349371
EXPORT_SYMBOL_GPL(gpio_regmap_unregister);

drivers/gpio/gpiolib-acpi-core.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,19 @@ acpi_gpio_to_gpiod_flags(const struct acpi_resource_gpio *agpio, int polarity)
291291
return GPIOD_ASIS;
292292
}
293293

294+
static void acpi_gpio_set_debounce_timeout(struct gpio_desc *desc,
295+
unsigned int acpi_debounce)
296+
{
297+
int ret;
298+
299+
/* ACPI uses hundredths of milliseconds units */
300+
acpi_debounce *= 10;
301+
ret = gpio_set_debounce_timeout(desc, acpi_debounce);
302+
if (ret)
303+
gpiod_warn(desc, "Failed to set debounce-timeout %u: %d\n",
304+
acpi_debounce, ret);
305+
}
306+
294307
static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip,
295308
struct acpi_resource_gpio *agpio,
296309
unsigned int index,
@@ -300,18 +313,12 @@ static struct gpio_desc *acpi_request_own_gpiod(struct gpio_chip *chip,
300313
enum gpiod_flags flags = acpi_gpio_to_gpiod_flags(agpio, polarity);
301314
unsigned int pin = agpio->pin_table[index];
302315
struct gpio_desc *desc;
303-
int ret;
304316

305317
desc = gpiochip_request_own_desc(chip, pin, label, polarity, flags);
306318
if (IS_ERR(desc))
307319
return desc;
308320

309-
/* ACPI uses hundredths of milliseconds units */
310-
ret = gpio_set_debounce_timeout(desc, agpio->debounce_timeout * 10);
311-
if (ret)
312-
dev_warn(chip->parent,
313-
"Failed to set debounce-timeout for pin 0x%04X, err %d\n",
314-
pin, ret);
321+
acpi_gpio_set_debounce_timeout(desc, agpio->debounce_timeout);
315322

316323
return desc;
317324
}
@@ -375,8 +382,8 @@ static acpi_status acpi_gpiochip_alloc_event(struct acpi_resource *ares,
375382
desc = acpi_request_own_gpiod(chip, agpio, 0, "ACPI:Event");
376383
if (IS_ERR(desc)) {
377384
dev_err(chip->parent,
378-
"Failed to request GPIO for pin 0x%04X, err %ld\n",
379-
pin, PTR_ERR(desc));
385+
"Failed to request GPIO for pin 0x%04X, err %pe\n",
386+
pin, desc);
380387
return AE_OK;
381388
}
382389

@@ -944,7 +951,6 @@ struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode,
944951
bool can_fallback = acpi_can_fallback_to_crs(adev, con_id);
945952
struct acpi_gpio_info info = {};
946953
struct gpio_desc *desc;
947-
int ret;
948954

949955
desc = __acpi_find_gpio(fwnode, con_id, idx, can_fallback, &info);
950956
if (IS_ERR(desc))
@@ -959,10 +965,7 @@ struct gpio_desc *acpi_find_gpio(struct fwnode_handle *fwnode,
959965
acpi_gpio_update_gpiod_flags(dflags, &info);
960966
acpi_gpio_update_gpiod_lookup_flags(lookupflags, &info);
961967

962-
/* ACPI uses hundredths of milliseconds units */
963-
ret = gpio_set_debounce_timeout(desc, info.debounce * 10);
964-
if (ret)
965-
return ERR_PTR(ret);
968+
acpi_gpio_set_debounce_timeout(desc, info.debounce);
966969

967970
return desc;
968971
}

include/linux/gpio/regmap.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ struct regmap;
3838
* offset to a register/bitmask pair. If not
3939
* given the default gpio_regmap_simple_xlate()
4040
* is used.
41+
* @fixed_direction_output:
42+
* (Optional) Bitmap representing the fixed direction of
43+
* the GPIO lines. Useful when there are GPIO lines with a
44+
* fixed direction mixed together in the same register.
4145
* @drvdata: (Optional) Pointer to driver specific data which is
4246
* not used by gpio-remap but is provided "as is" to the
4347
* driver callback(s).
@@ -85,6 +89,7 @@ struct gpio_regmap_config {
8589
int reg_stride;
8690
int ngpio_per_reg;
8791
struct irq_domain *irq_domain;
92+
unsigned long *fixed_direction_output;
8893

8994
#ifdef CONFIG_REGMAP_IRQ
9095
struct regmap_irq_chip *regmap_irq_chip;

0 commit comments

Comments
 (0)