summaryrefslogtreecommitdiff
path: root/drivers/extcon/extcon.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-25 11:05:04 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-01-25 11:05:04 +0100
commit36bebcff6f3895384fd2566f4c4adb91cfdfecdb (patch)
tree8046cc32df8a696a64c22177f48ec45b7e283481 /drivers/extcon/extcon.c
parent8e27a236312c4ab6dc8dbd303552b771d3569cf1 (diff)
parent567ab5a81ba569b823b51f4af74f26c437e98b56 (diff)
Merge tag 'extcon-next-for-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/extcon into char-misc-next
Chanwoo writes: Update extcon for 4.11 Detailed description for this pull request: 1. Add the new extcon driver. - Intel INT3496 ACPI USB id detection driver detects whether EXTCON_USB_HOST is attached or detached. (extcon-intel-int3496.c) 2. Add the new type of external connector. - EXTCON_CHG_USB_PD (USB Power Delivery) provides the increased power more than 7.5W to device with larger power demand. 3. Add the description for EXTCON_CHG_USB_(SDP|ACA|SLOW|FAST) - EXTCON_CHG_USB_SDP should always appear together with EXTCON_USB - EXTCON_CHG_USB_ACA would normally appear with EXTCON_USB_HOST. - EXTCON_CHG_USB_SLOW can provide at least 500mA of current at 5V - EXTCON_CHG_USB_FAST can provide at least 1A of current at 5V. 4. Modify the connector name of EXTCON_USB_HOST - "USB_HOST" -> "USB-HOST" 5. Update the extcon core - Move the private extcon structure into driver/extcon directory. The 'struct extcon_dev' should be only handled by extcon core to prevent the direct access and to maintain the integrity of it. - Remove the ambigous operation of extcon_register_notifier() in case of the 'extcon_dev' instance is NULL. The user of extcon_register_notifier() have to specify the correct instance of the provider extcon driver. 6. Update the extcon drivers and fix the minor issues - Update the extcon-axp288 driver to remove the unncessary code. - Add pinctrl operation during suspend mode to extcon-usb-gpio driver. - Clean up the extcon-arizona/adc-jack driver. - Use the dev_dbg() for debug messsage on extcon-palmas driver. - Return the error code on failure of extcon_sync()
Diffstat (limited to 'drivers/extcon/extcon.c')
-rw-r--r--drivers/extcon/extcon.c43
1 files changed, 15 insertions, 28 deletions
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c
index 7c1e3a7b14e0..09ac5e70c2f3 100644
--- a/drivers/extcon/extcon.c
+++ b/drivers/extcon/extcon.c
@@ -30,11 +30,12 @@
#include <linux/device.h>
#include <linux/fs.h>
#include <linux/err.h>
-#include <linux/extcon.h>
#include <linux/of.h>
#include <linux/slab.h>
#include <linux/sysfs.h>
+#include "extcon.h"
+
#define SUPPORTED_CABLE_MAX 32
#define CABLE_NAME_MAX 30
@@ -59,7 +60,7 @@ struct __extcon_info {
[EXTCON_USB_HOST] = {
.type = EXTCON_TYPE_USB,
.id = EXTCON_USB_HOST,
- .name = "USB_HOST",
+ .name = "USB-HOST",
},
/* Charging external connector */
@@ -98,6 +99,11 @@ struct __extcon_info {
.id = EXTCON_CHG_WPT,
.name = "WPT",
},
+ [EXTCON_CHG_USB_PD] = {
+ .type = EXTCON_TYPE_CHG | EXTCON_TYPE_USB,
+ .id = EXTCON_CHG_USB_PD,
+ .name = "PD",
+ },
/* Jack external connector */
[EXTCON_JACK_MICROPHONE] = {
@@ -906,35 +912,16 @@ int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
unsigned long flags;
int ret, idx = -EINVAL;
- if (!nb)
+ if (!edev || !nb)
return -EINVAL;
- if (edev) {
- idx = find_cable_index_by_id(edev, id);
- if (idx < 0)
- return idx;
-
- spin_lock_irqsave(&edev->lock, flags);
- ret = raw_notifier_chain_register(&edev->nh[idx], nb);
- spin_unlock_irqrestore(&edev->lock, flags);
- } else {
- struct extcon_dev *extd;
-
- mutex_lock(&extcon_dev_list_lock);
- list_for_each_entry(extd, &extcon_dev_list, entry) {
- idx = find_cable_index_by_id(extd, id);
- if (idx >= 0)
- break;
- }
- mutex_unlock(&extcon_dev_list_lock);
+ idx = find_cable_index_by_id(edev, id);
+ if (idx < 0)
+ return idx;
- if (idx >= 0) {
- edev = extd;
- return extcon_register_notifier(extd, id, nb);
- } else {
- ret = -ENODEV;
- }
- }
+ spin_lock_irqsave(&edev->lock, flags);
+ ret = raw_notifier_chain_register(&edev->nh[idx], nb);
+ spin_unlock_irqrestore(&edev->lock, flags);
return ret;
}