diff options
| -rw-r--r-- | drivers/extcon/extcon-arizona.c | 1 | ||||
| -rw-r--r-- | drivers/extcon/extcon-class.c | 2 | ||||
| -rw-r--r-- | drivers/extcon/extcon-max77693.c | 36 | ||||
| -rw-r--r-- | drivers/extcon/extcon-max8997.c | 28 | ||||
| -rw-r--r-- | include/linux/extcon.h | 50 |
5 files changed, 56 insertions, 61 deletions
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c index f10f05d4ee9c..414aed50b1bc 100644 --- a/drivers/extcon/extcon-arizona.c +++ b/drivers/extcon/extcon-arizona.c | |||
| @@ -166,6 +166,7 @@ static irqreturn_t arizona_micdet(int irq, void *data) | |||
| 166 | ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val); | 166 | ret = regmap_read(arizona->regmap, ARIZONA_MIC_DETECT_3, &val); |
| 167 | if (ret != 0) { | 167 | if (ret != 0) { |
| 168 | dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret); | 168 | dev_err(arizona->dev, "Failed to read MICDET: %d\n", ret); |
| 169 | mutex_unlock(&info->lock); | ||
| 169 | return IRQ_NONE; | 170 | return IRQ_NONE; |
| 170 | } | 171 | } |
| 171 | 172 | ||
diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c index d398821097f3..60adc04b0561 100644 --- a/drivers/extcon/extcon-class.c +++ b/drivers/extcon/extcon-class.c | |||
| @@ -472,7 +472,7 @@ int extcon_register_interest(struct extcon_specific_cable_nb *obj, | |||
| 472 | 472 | ||
| 473 | obj->cable_index = extcon_find_cable_index(obj->edev, cable_name); | 473 | obj->cable_index = extcon_find_cable_index(obj->edev, cable_name); |
| 474 | if (obj->cable_index < 0) | 474 | if (obj->cable_index < 0) |
| 475 | return -ENODEV; | 475 | return obj->cable_index; |
| 476 | 476 | ||
| 477 | obj->user_nb = nb; | 477 | obj->user_nb = nb; |
| 478 | 478 | ||
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c index b656dfa401a6..8c17b65eb74d 100644 --- a/drivers/extcon/extcon-max77693.c +++ b/drivers/extcon/extcon-max77693.c | |||
| @@ -657,17 +657,17 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 657 | int ret, i; | 657 | int ret, i; |
| 658 | u8 id; | 658 | u8 id; |
| 659 | 659 | ||
| 660 | info = kzalloc(sizeof(struct max77693_muic_info), GFP_KERNEL); | 660 | info = devm_kzalloc(&pdev->dev, sizeof(struct max77693_muic_info), |
| 661 | GFP_KERNEL); | ||
| 661 | if (!info) { | 662 | if (!info) { |
| 662 | dev_err(&pdev->dev, "failed to allocate memory\n"); | 663 | dev_err(&pdev->dev, "failed to allocate memory\n"); |
| 663 | ret = -ENOMEM; | 664 | return -ENOMEM; |
| 664 | goto err_kfree; | ||
| 665 | } | 665 | } |
| 666 | info->dev = &pdev->dev; | 666 | info->dev = &pdev->dev; |
| 667 | info->max77693 = max77693; | 667 | info->max77693 = max77693; |
| 668 | if (info->max77693->regmap_muic) | 668 | if (info->max77693->regmap_muic) { |
| 669 | dev_dbg(&pdev->dev, "allocate register map\n"); | 669 | dev_dbg(&pdev->dev, "allocate register map\n"); |
| 670 | else { | 670 | } else { |
| 671 | info->max77693->regmap_muic = devm_regmap_init_i2c( | 671 | info->max77693->regmap_muic = devm_regmap_init_i2c( |
| 672 | info->max77693->muic, | 672 | info->max77693->muic, |
| 673 | &max77693_muic_regmap_config); | 673 | &max77693_muic_regmap_config); |
| @@ -675,7 +675,7 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 675 | ret = PTR_ERR(info->max77693->regmap_muic); | 675 | ret = PTR_ERR(info->max77693->regmap_muic); |
| 676 | dev_err(max77693->dev, | 676 | dev_err(max77693->dev, |
| 677 | "failed to allocate register map: %d\n", ret); | 677 | "failed to allocate register map: %d\n", ret); |
| 678 | goto err_regmap; | 678 | return ret; |
| 679 | } | 679 | } |
| 680 | } | 680 | } |
| 681 | platform_set_drvdata(pdev, info); | 681 | platform_set_drvdata(pdev, info); |
| @@ -686,11 +686,13 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 686 | /* Support irq domain for MAX77693 MUIC device */ | 686 | /* Support irq domain for MAX77693 MUIC device */ |
| 687 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { | 687 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { |
| 688 | struct max77693_muic_irq *muic_irq = &muic_irqs[i]; | 688 | struct max77693_muic_irq *muic_irq = &muic_irqs[i]; |
| 689 | int virq = 0; | 689 | unsigned int virq = 0; |
| 690 | 690 | ||
| 691 | virq = irq_create_mapping(max77693->irq_domain, muic_irq->irq); | 691 | virq = irq_create_mapping(max77693->irq_domain, muic_irq->irq); |
| 692 | if (!virq) | 692 | if (!virq) { |
| 693 | ret = -EINVAL; | ||
| 693 | goto err_irq; | 694 | goto err_irq; |
| 695 | } | ||
| 694 | muic_irq->virq = virq; | 696 | muic_irq->virq = virq; |
| 695 | 697 | ||
| 696 | ret = request_threaded_irq(virq, NULL, | 698 | ret = request_threaded_irq(virq, NULL, |
| @@ -702,14 +704,13 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 702 | " error :%d)\n", | 704 | " error :%d)\n", |
| 703 | muic_irq->irq, ret); | 705 | muic_irq->irq, ret); |
| 704 | 706 | ||
| 705 | for (i = i - 1; i >= 0; i--) | ||
| 706 | free_irq(muic_irq->virq, info); | ||
| 707 | goto err_irq; | 707 | goto err_irq; |
| 708 | } | 708 | } |
| 709 | } | 709 | } |
| 710 | 710 | ||
| 711 | /* Initialize extcon device */ | 711 | /* Initialize extcon device */ |
| 712 | info->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); | 712 | info->edev = devm_kzalloc(&pdev->dev, sizeof(struct extcon_dev), |
| 713 | GFP_KERNEL); | ||
| 713 | if (!info->edev) { | 714 | if (!info->edev) { |
| 714 | dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); | 715 | dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); |
| 715 | ret = -ENOMEM; | 716 | ret = -ENOMEM; |
| @@ -720,7 +721,7 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 720 | ret = extcon_dev_register(info->edev, NULL); | 721 | ret = extcon_dev_register(info->edev, NULL); |
| 721 | if (ret) { | 722 | if (ret) { |
| 722 | dev_err(&pdev->dev, "failed to register extcon device\n"); | 723 | dev_err(&pdev->dev, "failed to register extcon device\n"); |
| 723 | goto err_extcon; | 724 | goto err_irq; |
| 724 | } | 725 | } |
| 725 | 726 | ||
| 726 | /* Initialize MUIC register by using platform data */ | 727 | /* Initialize MUIC register by using platform data */ |
| @@ -753,7 +754,7 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 753 | MAX77693_MUIC_REG_ID, &id); | 754 | MAX77693_MUIC_REG_ID, &id); |
| 754 | if (ret < 0) { | 755 | if (ret < 0) { |
| 755 | dev_err(&pdev->dev, "failed to read revision number\n"); | 756 | dev_err(&pdev->dev, "failed to read revision number\n"); |
| 756 | goto err_extcon; | 757 | goto err_irq; |
| 757 | } | 758 | } |
| 758 | dev_info(info->dev, "device ID : 0x%x\n", id); | 759 | dev_info(info->dev, "device ID : 0x%x\n", id); |
| 759 | 760 | ||
| @@ -765,12 +766,9 @@ static int max77693_muic_probe(struct platform_device *pdev) | |||
| 765 | 766 | ||
| 766 | return ret; | 767 | return ret; |
| 767 | 768 | ||
| 768 | err_extcon: | ||
| 769 | kfree(info->edev); | ||
| 770 | err_irq: | 769 | err_irq: |
| 771 | err_regmap: | 770 | while (--i >= 0) |
| 772 | kfree(info); | 771 | free_irq(muic_irqs[i].virq, info); |
| 773 | err_kfree: | ||
| 774 | return ret; | 772 | return ret; |
| 775 | } | 773 | } |
| 776 | 774 | ||
| @@ -783,8 +781,6 @@ static int max77693_muic_remove(struct platform_device *pdev) | |||
| 783 | free_irq(muic_irqs[i].virq, info); | 781 | free_irq(muic_irqs[i].virq, info); |
| 784 | cancel_work_sync(&info->irq_work); | 782 | cancel_work_sync(&info->irq_work); |
| 785 | extcon_dev_unregister(info->edev); | 783 | extcon_dev_unregister(info->edev); |
| 786 | kfree(info->edev); | ||
| 787 | kfree(info); | ||
| 788 | 784 | ||
| 789 | return 0; | 785 | return 0; |
| 790 | } | 786 | } |
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c index bad76f51161b..93009fe6ef05 100644 --- a/drivers/extcon/extcon-max8997.c +++ b/drivers/extcon/extcon-max8997.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * extcon-max8997.c - MAX8997 extcon driver to support MAX8997 MUIC | 2 | * extcon-max8997.c - MAX8997 extcon driver to support MAX8997 MUIC |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2012 Samsung Electrnoics | 4 | * Copyright (C) 2012 Samsung Electronics |
| 5 | * Donggeun Kim <dg77.kim@samsung.com> | 5 | * Donggeun Kim <dg77.kim@samsung.com> |
| 6 | * | 6 | * |
| 7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
| @@ -433,11 +433,11 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 433 | struct max8997_muic_info *info; | 433 | struct max8997_muic_info *info; |
| 434 | int ret, i; | 434 | int ret, i; |
| 435 | 435 | ||
| 436 | info = kzalloc(sizeof(struct max8997_muic_info), GFP_KERNEL); | 436 | info = devm_kzalloc(&pdev->dev, sizeof(struct max8997_muic_info), |
| 437 | GFP_KERNEL); | ||
| 437 | if (!info) { | 438 | if (!info) { |
| 438 | dev_err(&pdev->dev, "failed to allocate memory\n"); | 439 | dev_err(&pdev->dev, "failed to allocate memory\n"); |
| 439 | ret = -ENOMEM; | 440 | return -ENOMEM; |
| 440 | goto err_kfree; | ||
| 441 | } | 441 | } |
| 442 | 442 | ||
| 443 | info->dev = &pdev->dev; | 443 | info->dev = &pdev->dev; |
| @@ -450,14 +450,16 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 450 | 450 | ||
| 451 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { | 451 | for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { |
| 452 | struct max8997_muic_irq *muic_irq = &muic_irqs[i]; | 452 | struct max8997_muic_irq *muic_irq = &muic_irqs[i]; |
| 453 | int virq = 0; | 453 | unsigned int virq = 0; |
| 454 | 454 | ||
| 455 | virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq); | 455 | virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq); |
| 456 | if (!virq) | 456 | if (!virq) { |
| 457 | ret = -EINVAL; | ||
| 457 | goto err_irq; | 458 | goto err_irq; |
| 459 | } | ||
| 458 | muic_irq->virq = virq; | 460 | muic_irq->virq = virq; |
| 459 | 461 | ||
| 460 | ret = request_threaded_irq(virq, NULL,max8997_muic_irq_handler, | 462 | ret = request_threaded_irq(virq, NULL, max8997_muic_irq_handler, |
| 461 | 0, muic_irq->name, info); | 463 | 0, muic_irq->name, info); |
| 462 | if (ret) { | 464 | if (ret) { |
| 463 | dev_err(&pdev->dev, | 465 | dev_err(&pdev->dev, |
| @@ -469,7 +471,8 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 469 | } | 471 | } |
| 470 | 472 | ||
| 471 | /* External connector */ | 473 | /* External connector */ |
| 472 | info->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); | 474 | info->edev = devm_kzalloc(&pdev->dev, sizeof(struct extcon_dev), |
| 475 | GFP_KERNEL); | ||
| 473 | if (!info->edev) { | 476 | if (!info->edev) { |
| 474 | dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); | 477 | dev_err(&pdev->dev, "failed to allocate memory for extcon\n"); |
| 475 | ret = -ENOMEM; | 478 | ret = -ENOMEM; |
| @@ -480,7 +483,7 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 480 | ret = extcon_dev_register(info->edev, NULL); | 483 | ret = extcon_dev_register(info->edev, NULL); |
| 481 | if (ret) { | 484 | if (ret) { |
| 482 | dev_err(&pdev->dev, "failed to register extcon device\n"); | 485 | dev_err(&pdev->dev, "failed to register extcon device\n"); |
| 483 | goto err_extcon; | 486 | goto err_irq; |
| 484 | } | 487 | } |
| 485 | 488 | ||
| 486 | /* Initialize registers according to platform data */ | 489 | /* Initialize registers according to platform data */ |
| @@ -498,13 +501,9 @@ static int max8997_muic_probe(struct platform_device *pdev) | |||
| 498 | 501 | ||
| 499 | return ret; | 502 | return ret; |
| 500 | 503 | ||
| 501 | err_extcon: | ||
| 502 | kfree(info->edev); | ||
| 503 | err_irq: | 504 | err_irq: |
| 504 | while (--i >= 0) | 505 | while (--i >= 0) |
| 505 | free_irq(muic_irqs[i].virq, info); | 506 | free_irq(muic_irqs[i].virq, info); |
| 506 | kfree(info); | ||
| 507 | err_kfree: | ||
| 508 | return ret; | 507 | return ret; |
| 509 | } | 508 | } |
| 510 | 509 | ||
| @@ -519,9 +518,6 @@ static int max8997_muic_remove(struct platform_device *pdev) | |||
| 519 | 518 | ||
| 520 | extcon_dev_unregister(info->edev); | 519 | extcon_dev_unregister(info->edev); |
| 521 | 520 | ||
| 522 | kfree(info->edev); | ||
| 523 | kfree(info); | ||
| 524 | |||
| 525 | return 0; | 521 | return 0; |
| 526 | } | 522 | } |
| 527 | 523 | ||
diff --git a/include/linux/extcon.h b/include/linux/extcon.h index 2c26c14cd710..fcb51c88319f 100644 --- a/include/linux/extcon.h +++ b/include/linux/extcon.h | |||
| @@ -23,7 +23,9 @@ | |||
| 23 | #ifndef __LINUX_EXTCON_H__ | 23 | #ifndef __LINUX_EXTCON_H__ |
| 24 | #define __LINUX_EXTCON_H__ | 24 | #define __LINUX_EXTCON_H__ |
| 25 | 25 | ||
| 26 | #include <linux/device.h> | ||
| 26 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
| 28 | #include <linux/sysfs.h> | ||
| 27 | 29 | ||
| 28 | #define SUPPORTED_CABLE_MAX 32 | 30 | #define SUPPORTED_CABLE_MAX 32 |
| 29 | #define CABLE_NAME_MAX 30 | 31 | #define CABLE_NAME_MAX 30 |
| @@ -74,12 +76,12 @@ struct extcon_cable; | |||
| 74 | 76 | ||
| 75 | /** | 77 | /** |
| 76 | * struct extcon_dev - An extcon device represents one external connector. | 78 | * struct extcon_dev - An extcon device represents one external connector. |
| 77 | * @name The name of this extcon device. Parent device name is used | 79 | * @name: The name of this extcon device. Parent device name is used |
| 78 | * if NULL. | 80 | * if NULL. |
| 79 | * @supported_cable Array of supported cable names ending with NULL. | 81 | * @supported_cable: Array of supported cable names ending with NULL. |
| 80 | * If supported_cable is NULL, cable name related APIs | 82 | * If supported_cable is NULL, cable name related APIs |
| 81 | * are disabled. | 83 | * are disabled. |
| 82 | * @mutually_exclusive Array of mutually exclusive set of cables that cannot | 84 | * @mutually_exclusive: Array of mutually exclusive set of cables that cannot |
| 83 | * be attached simultaneously. The array should be | 85 | * be attached simultaneously. The array should be |
| 84 | * ending with NULL or be NULL (no mutually exclusive | 86 | * ending with NULL or be NULL (no mutually exclusive |
| 85 | * cables). For example, if it is { 0x7, 0x30, 0}, then, | 87 | * cables). For example, if it is { 0x7, 0x30, 0}, then, |
| @@ -87,21 +89,21 @@ struct extcon_cable; | |||
| 87 | * be attached simulataneously. {0x7, 0} is equivalent to | 89 | * be attached simulataneously. {0x7, 0} is equivalent to |
| 88 | * {0x3, 0x6, 0x5, 0}. If it is {0xFFFFFFFF, 0}, there | 90 | * {0x3, 0x6, 0x5, 0}. If it is {0xFFFFFFFF, 0}, there |
| 89 | * can be no simultaneous connections. | 91 | * can be no simultaneous connections. |
| 90 | * @print_name An optional callback to override the method to print the | 92 | * @print_name: An optional callback to override the method to print the |
| 91 | * name of the extcon device. | 93 | * name of the extcon device. |
| 92 | * @print_state An optional callback to override the method to print the | 94 | * @print_state: An optional callback to override the method to print the |
| 93 | * status of the extcon device. | 95 | * status of the extcon device. |
| 94 | * @dev Device of this extcon. Do not provide at register-time. | 96 | * @dev: Device of this extcon. Do not provide at register-time. |
| 95 | * @state Attach/detach state of this extcon. Do not provide at | 97 | * @state: Attach/detach state of this extcon. Do not provide at |
| 96 | * register-time | 98 | * register-time |
| 97 | * @nh Notifier for the state change events from this extcon | 99 | * @nh: Notifier for the state change events from this extcon |
| 98 | * @entry To support list of extcon devices so that users can search | 100 | * @entry: To support list of extcon devices so that users can search |
| 99 | * for extcon devices based on the extcon name. | 101 | * for extcon devices based on the extcon name. |
| 100 | * @lock | 102 | * @lock: |
| 101 | * @max_supported Internal value to store the number of cables. | 103 | * @max_supported: Internal value to store the number of cables. |
| 102 | * @extcon_dev_type Device_type struct to provide attribute_groups | 104 | * @extcon_dev_type: Device_type struct to provide attribute_groups |
| 103 | * customized for each extcon device. | 105 | * customized for each extcon device. |
| 104 | * @cables Sysfs subdirectories. Each represents one cable. | 106 | * @cables: Sysfs subdirectories. Each represents one cable. |
| 105 | * | 107 | * |
| 106 | * In most cases, users only need to provide "User initializing data" of | 108 | * In most cases, users only need to provide "User initializing data" of |
| 107 | * this struct when registering an extcon. In some exceptional cases, | 109 | * this struct when registering an extcon. In some exceptional cases, |
| @@ -137,12 +139,12 @@ struct extcon_dev { | |||
| 137 | 139 | ||
| 138 | /** | 140 | /** |
| 139 | * struct extcon_cable - An internal data for each cable of extcon device. | 141 | * struct extcon_cable - An internal data for each cable of extcon device. |
| 140 | * @edev The extcon device | 142 | * @edev: The extcon device |
| 141 | * @cable_index Index of this cable in the edev | 143 | * @cable_index: Index of this cable in the edev |
| 142 | * @attr_g Attribute group for the cable | 144 | * @attr_g: Attribute group for the cable |
| 143 | * @attr_name "name" sysfs entry | 145 | * @attr_name: "name" sysfs entry |
| 144 | * @attr_state "state" sysfs entry | 146 | * @attr_state: "state" sysfs entry |
| 145 | * @attrs Array pointing to attr_name and attr_state for attr_g | 147 | * @attrs: Array pointing to attr_name and attr_state for attr_g |
| 146 | */ | 148 | */ |
| 147 | struct extcon_cable { | 149 | struct extcon_cable { |
| 148 | struct extcon_dev *edev; | 150 | struct extcon_dev *edev; |
| @@ -158,11 +160,11 @@ struct extcon_cable { | |||
| 158 | /** | 160 | /** |
| 159 | * struct extcon_specific_cable_nb - An internal data for | 161 | * struct extcon_specific_cable_nb - An internal data for |
| 160 | * extcon_register_interest(). | 162 | * extcon_register_interest(). |
| 161 | * @internal_nb a notifier block bridging extcon notifier and cable notifier. | 163 | * @internal_nb: a notifier block bridging extcon notifier and cable notifier. |
| 162 | * @user_nb user provided notifier block for events from a specific cable. | 164 | * @user_nb: user provided notifier block for events from a specific cable. |
| 163 | * @cable_index the target cable. | 165 | * @cable_index: the target cable. |
| 164 | * @edev the target extcon device. | 166 | * @edev: the target extcon device. |
| 165 | * @previous_value the saved previous event value. | 167 | * @previous_value: the saved previous event value. |
| 166 | */ | 168 | */ |
| 167 | struct extcon_specific_cable_nb { | 169 | struct extcon_specific_cable_nb { |
| 168 | struct notifier_block internal_nb; | 170 | struct notifier_block internal_nb; |
