aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-10-26 13:24:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-10-26 13:24:19 -0400
commitf76ddd98075de950cbb13f47b8356262d9f44c6d (patch)
tree93feb11d14bb8992134cdfde8b83023917b71826
parent561ec64ae67ef25cac8d72bb9c4bfc955edfd415 (diff)
parent2cb55a2f47a3c695a0105b7fc04a3b70c3bc4e4f (diff)
Merge tag 'char-misc-3.7-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg Kroah-Hartman: "Here are some driver fixes for 3.7. They include extcon driver fixes, a hyper-v bugfix, and two other minor driver fixes. All of these have been in the linux-next releases for a while. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>" * tag 'char-misc-3.7-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: sonypi: suspend/resume callbacks should be conditionally compiled on CONFIG_PM_SLEEP Drivers: hv: Cleanup error handling in vmbus_open() extcon : register for cable interest by cable name extcon: trivial: kfree missed from remove path extcon: driver model release call not needed extcon: MAX77693: Add platform data for MUIC device to initialize registers extcon: max77693: Use max77693_update_reg for rmw operations extcon: Fix kerneldoc for extcon_set_cable_state and extcon_set_cable_state_ extcon: adc-jack: Add missing MODULE_LICENSE extcon: adc-jack: Fix checking return value of request_any_context_irq extcon: Fix return value in extcon_register_interest() extcon: unregister compat link on cleanup extcon: Unregister compat class at module unload to fix oops extcon: optimising the check_mutually_exclusive function extcon: standard cable names definition and declaration changed extcon-max8997: remove usage of ret in max8997_muic_handle_charger_type_detach extcon: Remove duplicate inclusion of extcon.h header file
-rw-r--r--drivers/char/sonypi.c2
-rw-r--r--drivers/extcon/extcon-adc-jack.c10
-rw-r--r--drivers/extcon/extcon-class.c142
-rw-r--r--drivers/extcon/extcon-gpio.c1
-rw-r--r--drivers/extcon/extcon-max77693.c46
-rw-r--r--drivers/extcon/extcon-max8997.c6
-rw-r--r--drivers/hv/channel.c24
-rw-r--r--include/linux/extcon.h2
-rw-r--r--include/linux/mfd/max77693.h13
9 files changed, 152 insertions, 94 deletions
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c
index 320debbe32fa..9b4f0116ff21 100644
--- a/drivers/char/sonypi.c
+++ b/drivers/char/sonypi.c
@@ -1456,7 +1456,7 @@ static int __devexit sonypi_remove(struct platform_device *dev)
1456 return 0; 1456 return 0;
1457} 1457}
1458 1458
1459#ifdef CONFIG_PM 1459#ifdef CONFIG_PM_SLEEP
1460static int old_camera_power; 1460static int old_camera_power;
1461 1461
1462static int sonypi_suspend(struct device *dev) 1462static int sonypi_suspend(struct device *dev)
diff --git a/drivers/extcon/extcon-adc-jack.c b/drivers/extcon/extcon-adc-jack.c
index 725eb5aa8d8c..e87196f6d2d2 100644
--- a/drivers/extcon/extcon-adc-jack.c
+++ b/drivers/extcon/extcon-adc-jack.c
@@ -14,6 +14,7 @@
14 * 14 *
15 */ 15 */
16 16
17#include <linux/module.h>
17#include <linux/slab.h> 18#include <linux/slab.h>
18#include <linux/device.h> 19#include <linux/device.h>
19#include <linux/platform_device.h> 20#include <linux/platform_device.h>
@@ -161,13 +162,12 @@ static int __devinit adc_jack_probe(struct platform_device *pdev)
161 err = request_any_context_irq(data->irq, adc_jack_irq_thread, 162 err = request_any_context_irq(data->irq, adc_jack_irq_thread,
162 pdata->irq_flags, pdata->name, data); 163 pdata->irq_flags, pdata->name, data);
163 164
164 if (err) { 165 if (err < 0) {
165 dev_err(&pdev->dev, "error: irq %d\n", data->irq); 166 dev_err(&pdev->dev, "error: irq %d\n", data->irq);
166 err = -EINVAL;
167 goto err_irq; 167 goto err_irq;
168 } 168 }
169 169
170 goto out; 170 return 0;
171 171
172err_irq: 172err_irq:
173 extcon_dev_unregister(&data->edev); 173 extcon_dev_unregister(&data->edev);
@@ -196,3 +196,7 @@ static struct platform_driver adc_jack_driver = {
196}; 196};
197 197
198module_platform_driver(adc_jack_driver); 198module_platform_driver(adc_jack_driver);
199
200MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");
201MODULE_DESCRIPTION("ADC Jack extcon driver");
202MODULE_LICENSE("GPL v2");
diff --git a/drivers/extcon/extcon-class.c b/drivers/extcon/extcon-class.c
index 946a3188b2b7..d398821097f3 100644
--- a/drivers/extcon/extcon-class.c
+++ b/drivers/extcon/extcon-class.c
@@ -41,7 +41,7 @@
41 * every single port-type of the following cable names. Please choose cable 41 * every single port-type of the following cable names. Please choose cable
42 * names that are actually used in your extcon device. 42 * names that are actually used in your extcon device.
43 */ 43 */
44const char *extcon_cable_name[] = { 44const char extcon_cable_name[][CABLE_NAME_MAX + 1] = {
45 [EXTCON_USB] = "USB", 45 [EXTCON_USB] = "USB",
46 [EXTCON_USB_HOST] = "USB-Host", 46 [EXTCON_USB_HOST] = "USB-Host",
47 [EXTCON_TA] = "TA", 47 [EXTCON_TA] = "TA",
@@ -62,8 +62,6 @@ const char *extcon_cable_name[] = {
62 [EXTCON_VIDEO_IN] = "Video-in", 62 [EXTCON_VIDEO_IN] = "Video-in",
63 [EXTCON_VIDEO_OUT] = "Video-out", 63 [EXTCON_VIDEO_OUT] = "Video-out",
64 [EXTCON_MECHANICAL] = "Mechanical", 64 [EXTCON_MECHANICAL] = "Mechanical",
65
66 NULL,
67}; 65};
68 66
69static struct class *extcon_class; 67static struct class *extcon_class;
@@ -91,17 +89,13 @@ static int check_mutually_exclusive(struct extcon_dev *edev, u32 new_state)
91 return 0; 89 return 0;
92 90
93 for (i = 0; edev->mutually_exclusive[i]; i++) { 91 for (i = 0; edev->mutually_exclusive[i]; i++) {
94 int count = 0, j; 92 int weight;
95 u32 correspondants = new_state & edev->mutually_exclusive[i]; 93 u32 correspondants = new_state & edev->mutually_exclusive[i];
96 u32 exp = 1; 94
97 95 /* calculate the total number of bits set */
98 for (j = 0; j < 32; j++) { 96 weight = hweight32(correspondants);
99 if (exp & correspondants) 97 if (weight > 1)
100 count++; 98 return i + 1;
101 if (count > 1)
102 return i + 1;
103 exp <<= 1;
104 }
105 } 99 }
106 100
107 return 0; 101 return 0;
@@ -362,7 +356,7 @@ int extcon_get_cable_state(struct extcon_dev *edev, const char *cable_name)
362EXPORT_SYMBOL_GPL(extcon_get_cable_state); 356EXPORT_SYMBOL_GPL(extcon_get_cable_state);
363 357
364/** 358/**
365 * extcon_get_cable_state_() - Set the status of a specific cable. 359 * extcon_set_cable_state_() - Set the status of a specific cable.
366 * @edev: the extcon device that has the cable. 360 * @edev: the extcon device that has the cable.
367 * @index: cable index that can be retrieved by extcon_find_cable_index(). 361 * @index: cable index that can be retrieved by extcon_find_cable_index().
368 * @cable_state: the new cable status. The default semantics is 362 * @cable_state: the new cable status. The default semantics is
@@ -382,7 +376,7 @@ int extcon_set_cable_state_(struct extcon_dev *edev,
382EXPORT_SYMBOL_GPL(extcon_set_cable_state_); 376EXPORT_SYMBOL_GPL(extcon_set_cable_state_);
383 377
384/** 378/**
385 * extcon_get_cable_state() - Set the status of a specific cable. 379 * extcon_set_cable_state() - Set the status of a specific cable.
386 * @edev: the extcon device that has the cable. 380 * @edev: the extcon device that has the cable.
387 * @cable_name: cable name. 381 * @cable_name: cable name.
388 * @cable_state: the new cable status. The default semantics is 382 * @cable_state: the new cable status. The default semantics is
@@ -447,6 +441,8 @@ static int _call_per_cable(struct notifier_block *nb, unsigned long val,
447 * extcon device. 441 * extcon device.
448 * @obj: an empty extcon_specific_cable_nb object to be returned. 442 * @obj: an empty extcon_specific_cable_nb object to be returned.
449 * @extcon_name: the name of extcon device. 443 * @extcon_name: the name of extcon device.
444 * if NULL, extcon_register_interest will register
445 * every cable with the target cable_name given.
450 * @cable_name: the target cable name. 446 * @cable_name: the target cable name.
451 * @nb: the notifier block to get notified. 447 * @nb: the notifier block to get notified.
452 * 448 *
@@ -466,22 +462,44 @@ int extcon_register_interest(struct extcon_specific_cable_nb *obj,
466 const char *extcon_name, const char *cable_name, 462 const char *extcon_name, const char *cable_name,
467 struct notifier_block *nb) 463 struct notifier_block *nb)
468{ 464{
469 if (!obj || !extcon_name || !cable_name || !nb) 465 if (!obj || !cable_name || !nb)
470 return -EINVAL; 466 return -EINVAL;
471 467
472 obj->edev = extcon_get_extcon_dev(extcon_name); 468 if (extcon_name) {
473 if (!obj->edev) 469 obj->edev = extcon_get_extcon_dev(extcon_name);
474 return -ENODEV; 470 if (!obj->edev)
471 return -ENODEV;
475 472
476 obj->cable_index = extcon_find_cable_index(obj->edev, cable_name); 473 obj->cable_index = extcon_find_cable_index(obj->edev, cable_name);
477 if (obj->cable_index < 0) 474 if (obj->cable_index < 0)
478 return -ENODEV; 475 return -ENODEV;
476
477 obj->user_nb = nb;
479 478
480 obj->user_nb = nb; 479 obj->internal_nb.notifier_call = _call_per_cable;
481 480
482 obj->internal_nb.notifier_call = _call_per_cable; 481 return raw_notifier_chain_register(&obj->edev->nh, &obj->internal_nb);
482 } else {
483 struct class_dev_iter iter;
484 struct e