diff options
Diffstat (limited to 'drivers/gpio/gpio-mcp23s08.c')
-rw-r--r-- | drivers/gpio/gpio-mcp23s08.c | 30 |
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 | ||
270 | static int mcp23s08_direction_input(struct gpio_chip *chip, unsigned offset) | 270 | static 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 | ||
282 | static int mcp23s08_get(struct gpio_chip *chip, unsigned offset) | 282 | static 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 | ||
313 | static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value) | 313 | static 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) | |||
323 | static int | 323 | static int |
324 | mcp23s08_direction_output(struct gpio_chip *chip, unsigned offset, int value) | 324 | mcp23s08_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 | ||
378 | static int mcp23s08_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | 378 | static 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 | ||