summaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-mcp23s08.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-mcp23s08.c')
-rw-r--r--drivers/gpio/gpio-mcp23s08.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c
index 4a41694919da..c767879e4dd9 100644
--- a/drivers/gpio/gpio-mcp23s08.c
+++ b/drivers/gpio/gpio-mcp23s08.c
@@ -269,7 +269,7 @@ static const struct mcp23s08_ops mcp23s17_ops = {
269 269
270static int mcp23s08_direction_input(struct gpio_chip *chip, unsigned offset) 270static int mcp23s08_direction_input(struct gpio_chip *chip, unsigned offset)
271{ 271{
272 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 272 struct mcp23s08 *mcp = gpiochip_get_data(chip);
273 int status; 273 int status;
274 274
275 mutex_lock(&mcp->lock); 275 mutex_lock(&mcp->lock);
@@ -281,7 +281,7 @@ static int mcp23s08_direction_input(struct gpio_chip *chip, unsigned offset)
281 281
282static int mcp23s08_get(struct gpio_chip *chip, unsigned offset) 282static int mcp23s08_get(struct gpio_chip *chip, unsigned offset)
283{ 283{
284 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 284 struct mcp23s08 *mcp = gpiochip_get_data(chip);
285 int status; 285 int status;
286 286
287 mutex_lock(&mcp->lock); 287 mutex_lock(&mcp->lock);
@@ -312,7 +312,7 @@ static int __mcp23s08_set(struct mcp23s08 *mcp, unsigned mask, int value)
312 312
313static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value) 313static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value)
314{ 314{
315 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 315 struct mcp23s08 *mcp = gpiochip_get_data(chip);
316 unsigned mask = 1 << offset; 316 unsigned mask = 1 << offset;
317 317
318 mutex_lock(&mcp->lock); 318 mutex_lock(&mcp->lock);
@@ -323,7 +323,7 @@ static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value)
323static int 323static int
324mcp23s08_direction_output(struct gpio_chip *chip, unsigned offset, int value) 324mcp23s08_direction_output(struct gpio_chip *chip, unsigned offset, int value)
325{ 325{
326 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 326 struct mcp23s08 *mcp = gpiochip_get_data(chip);
327 unsigned mask = 1 << offset; 327 unsigned mask = 1 << offset;
328 int status; 328 int status;
329 329
@@ -377,7 +377,7 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
377 377
378static int mcp23s08_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 378static int mcp23s08_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
379{ 379{
380 struct mcp23s08 *mcp = container_of(chip, struct mcp23s08, chip); 380 struct mcp23s08 *mcp = gpiochip_get_data(chip);
381 381
382 return irq_find_mapping(mcp->irq_domain, offset); 382 return irq_find_mapping(mcp->irq_domain, offset);
383} 383}
@@ -446,7 +446,7 @@ static int mcp23s08_irq_reqres(struct irq_data *data)
446 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data); 446 struct mcp23s08 *mcp = irq_data_get_irq_chip_data(data);
447 447
448 if (gpiochip_lock_as_irq(&mcp->chip, data->hwirq)) { 448 if (gpiochip_lock_as_irq(&mcp->chip, data->hwirq)) {
449 dev_err(mcp->chip.dev, 449 dev_err(mcp->chip.parent,
450 "unable to lock HW IRQ %lu for IRQ usage\n", 450 "unable to lock HW IRQ %lu for IRQ usage\n",
451 data->hwirq); 451 data->hwirq);
452 return -EINVAL; 452 return -EINVAL;
@@ -481,7 +481,8 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
481 481
482 mutex_init(&mcp->irq_lock); 482 mutex_init(&mcp->irq_lock);
483 483
484 mcp->irq_domain = irq_domain_add_linear(chip->dev->of_node, chip->ngpio, 484 mcp->irq_domain = irq_domain_add_linear(chip->parent->of_node,
485 chip->ngpio,
485 &irq_domain_simple_ops, mcp); 486 &irq_domain_simple_ops, mcp);
486 if (!mcp->irq_domain) 487 if (!mcp->irq_domain)
487 return -ENODEV; 488 return -ENODEV;
@@ -491,10 +492,11 @@ static int mcp23s08_irq_setup(struct mcp23s08 *mcp)
491 else 492 else
492 irqflags |= IRQF_TRIGGER_LOW; 493 irqflags |= IRQF_TRIGGER_LOW;
493 494
494 err = devm_request_threaded_irq(chip->dev, mcp->irq, NULL, mcp23s08_irq, 495 err = devm_request_threaded_irq(chip->parent, mcp->irq, NULL,
495 irqflags, dev_name(chip->dev), mcp); 496 mcp23s08_irq,
497 irqflags, dev_name(chip->parent), mcp);
496 if (err != 0) { 498 if (err != 0) {
497 dev_err(chip->dev, "unable to request IRQ#%d: %d\n", 499 dev_err(chip->parent, "unable to request IRQ#%d: %d\n",
498 mcp->irq, err); 500 mcp->irq, err);
499 return err; 501 return err;
500 } 502 }
@@ -542,7 +544,7 @@ static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip)
542 int t; 544 int t;
543 unsigned mask; 545 unsigned mask;
544 546
545 mcp = container_of(chip, struct mcp23s08, chip); 547 mcp = gpiochip_get_data(chip);
546 548
547 /* NOTE: we only handle one bank for now ... */ 549 /* NOTE: we only handle one bank for now ... */
548 bank = '0' + ((mcp->addr >> 1) & 0x7); 550 bank = '0' + ((mcp->addr >> 1) & 0x7);
@@ -638,7 +640,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
638 640
639 mcp->chip.base = pdata->base; 641 mcp->chip.base = pdata->base;
640 mcp->chip.can_sleep = true; 642 mcp->chip.can_sleep = true;
641 mcp->chip.dev = dev; 643 mcp->chip.parent = dev;
642 mcp->chip.owner = THIS_MODULE; 644 mcp->chip.owner = THIS_MODULE;
643 645
644 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work, 646 /* verify MCP_IOCON.SEQOP = 0, so sequential reads work,
@@ -652,7 +654,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
652 mcp->irq_controller = pdata->irq_controller; 654 mcp->irq_controller = pdata->irq_controller;
653 if (mcp->irq && mcp->irq_controller) { 655 if (mcp->irq && mcp->irq_controller) {
654 mcp->irq_active_high = 656 mcp->irq_active_high =
655 of_property_read_bool(mcp->chip.dev->of_node, 657 of_property_read_bool(mcp->chip.parent->of_node,
656 "microchip,irq-active-high"); 658 "microchip,irq-active-high");
657 659
658 if (type == MCP_TYPE_017) 660 if (type == MCP_TYPE_017)
@@ -702,7 +704,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
702 goto fail; 704 goto fail;
703 } 705 }
704 706
705 status = gpiochip_add(&mcp->chip); 707 status = gpiochip_add_data(&mcp->chip, mcp);
706 if (status < 0) 708 if (status < 0)
707 goto fail; 709 goto fail;
708 710