aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/extcon
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-07-30 15:41:17 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-07-30 15:41:17 -0400
commit3e701cdfe601306817604ca7f79f1d1c1088007c (patch)
tree1b0a4088a091f035d8be06758a604ca449223fc0 /drivers/extcon
parent7d3d09b01a028e9dd1282149fdcd2a6e0edd73e4 (diff)
parent3c1534c7ecffeb4330bba4c55d17f301528195b6 (diff)
Merge tag 'mfd-3.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6
Pull MFD bits from Samuel Ortiz: "We have support for a few new drivers: - Samsung s2mps11 - Wolfson Microelectronics wm5102 and wm5110 - Marvell 88PM800 and 88PM805 - TI twl6041 We also have our regular driver improvements: - Device tree and IRQ domain support for STE AB8500 - Regmap and devm_* API conversion for TI tps6586x - Device tree support for Samsung max77686 - devm_* API conversion for STE AB3100 Besides that, quite a lot of fixing and cleanup for mc13xxx, tps65910, tps65090, da9052 and twl-core." Fix up mostly trivial conflicts, with the exception of drivers/usb/host/ehci-omap.c in particular, which had some re-organization of the reset sequence (commit 1a49e2ac9651: "EHCI: centralize controller initialization") that clashed with commit 2761a6394516 ("mfd: USB: Fix the omap-usb EHCI ULPI PHY reset fix issues"). In particular, commit 2761a6394516 moved the usb_add_hcd() to the *middle* of the reset sequence, which clashes fairly badly with the reset sequence re-organization (although it could have been done inside the new omap_ehci_init() function). I left that part of commit 2761a6394516 just undone. * tag 'mfd-3.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (110 commits) mfd: Ensure AB8500 platform data is passed through db8500-prcmu to MFD Core mfd: Arizone core should select MFD_CORE mfd: Fix arizona-irq.c build by selecting REGMAP_IRQ mfd: Add debug trace on entering and leaving arizone runtime suspend mfd: Correct tps65090 cell names mfd: Remove gpio support from tps6586x core driver ARM: tegra: defconfig: Enable tps6586x gpio gpio: tps6586x: Add gpio support through platform driver mfd: Cache tps6586x register through regmap mfd: Use regmap for tps6586x register access. mfd: Use devm managed resources for tps6586x input: Add onkey support for 88PM80X PMIC mfd: Add support for twl6041 mfd: Fix twl6040 revision information mfd: Matches should be NULL when populate anatop child devices input: ab8500-ponkey: Create AB8500 domain IRQ mapping mfd: Add missing out of memory check for pcf50633 Documentation: Describe the AB8500 Device Tree bindings mfd: Add tps65910 32-kHz-crystal-input init mfd: Drop modifying mc13xxx driver's id_table in probe ...
Diffstat (limited to 'drivers/extcon')
-rw-r--r--drivers/extcon/Kconfig2
-rw-r--r--drivers/extcon/extcon-max8997.c29
2 files changed, 19 insertions, 12 deletions
diff --git a/drivers/extcon/Kconfig b/drivers/extcon/Kconfig
index 16716356d1fe..e175c8ed4ec4 100644
--- a/drivers/extcon/Kconfig
+++ b/drivers/extcon/Kconfig
@@ -33,7 +33,7 @@ config EXTCON_MAX77693
33 33
34config EXTCON_MAX8997 34config EXTCON_MAX8997
35 tristate "MAX8997 EXTCON Support" 35 tristate "MAX8997 EXTCON Support"
36 depends on MFD_MAX8997 36 depends on MFD_MAX8997 && IRQ_DOMAIN
37 help 37 help
38 If you say yes here you get support for the MUIC device of 38 If you say yes here you get support for the MUIC device of
39 Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory 39 Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
index a4ed30bd9a41..ef9090a4271d 100644
--- a/drivers/extcon/extcon-max8997.c
+++ b/drivers/extcon/extcon-max8997.c
@@ -26,6 +26,7 @@
26#include <linux/mfd/max8997.h> 26#include <linux/mfd/max8997.h>
27#include <linux/mfd/max8997-private.h> 27#include <linux/mfd/max8997-private.h>
28#include <linux/extcon.h> 28#include <linux/extcon.h>
29#include <linux/irqdomain.h>
29 30
30#define DEV_NAME "max8997-muic" 31#define DEV_NAME "max8997-muic"
31 32
@@ -77,6 +78,7 @@
77struct max8997_muic_irq { 78struct max8997_muic_irq {
78 unsigned int irq; 79 unsigned int irq;
79 const char *name; 80 const char *name;
81 unsigned int virq;
80}; 82};
81 83
82static struct max8997_muic_irq muic_irqs[] = { 84static struct max8997_muic_irq muic_irqs[] = {
@@ -343,12 +345,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
343{ 345{
344 struct max8997_muic_info *info = container_of(work, 346 struct max8997_muic_info *info = container_of(work,
345 struct max8997_muic_info, irq_work); 347 struct max8997_muic_info, irq_work);
346 struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
347 u8 status[2]; 348 u8 status[2];
348 u8 adc, chg_type; 349 u8 adc, chg_type;
349 350 int irq_type = 0;
350 int irq_type = info->irq - max8997->irq_base; 351 int i, ret;
351 int ret;
352 352
353 mutex_lock(&info->mutex); 353 mutex_lock(&info->mutex);
354 354
@@ -363,6 +363,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
363 dev_dbg(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__, 363 dev_dbg(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__,
364 status[0], status[1]); 364 status[0], status[1]);
365 365
366 for (i = 0 ; i < ARRAY_SIZE(muic_irqs) ; i++)
367 if (info->irq == muic_irqs[i].virq)
368 irq_type = muic_irqs[i].irq;
369
366 switch (irq_type) { 370 switch (irq_type) {
367 case MAX8997_MUICIRQ_ADC: 371 case MAX8997_MUICIRQ_ADC:
368 adc = status[0] & STATUS1_ADC_MASK; 372 adc = status[0] & STATUS1_ADC_MASK;
@@ -448,11 +452,15 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)
448 452
449 for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { 453 for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
450 struct max8997_muic_irq *muic_irq = &muic_irqs[i]; 454 struct max8997_muic_irq *muic_irq = &muic_irqs[i];
455 int virq = 0;
456
457 virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq);
458 if (!virq)
459 goto err_irq;
460 muic_irq->virq = virq;
451 461
452 ret = request_threaded_irq(pdata->irq_base + muic_irq->irq, 462 ret = request_threaded_irq(virq, NULL,max8997_muic_irq_handler,
453 NULL, max8997_muic_irq_handler, 463 0, muic_irq->name, info);
454 0, muic_irq->name,
455 info);
456 if (ret) { 464 if (ret) {
457 dev_err(&pdev->dev, 465 dev_err(&pdev->dev,
458 "failed: irq request (IRQ: %d," 466 "failed: irq request (IRQ: %d,"
@@ -496,7 +504,7 @@ err_extcon:
496 kfree(info->edev); 504 kfree(info->edev);
497err_irq: 505err_irq:
498 while (--i >= 0) 506 while (--i >= 0)
499 free_irq(pdata->irq_base + muic_irqs[i].irq, info); 507 free_irq(muic_irqs[i].virq, info);
500 kfree(info); 508 kfree(info);
501err_kfree: 509err_kfree:
502 return ret; 510 return ret;
@@ -505,11 +513,10 @@ err_kfree:
505static int __devexit max8997_muic_remove(struct platform_device *pdev) 513static int __devexit max8997_muic_remove(struct platform_device *pdev)
506{ 514{
507 struct max8997_muic_info *info = platform_get_drvdata(pdev); 515 struct max8997_muic_info *info = platform_get_drvdata(pdev);
508 struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
509 int i; 516 int i;
510 517
511 for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) 518 for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
512 free_irq(max8997->irq_base + muic_irqs[i].irq, info); 519 free_irq(muic_irqs[i].virq, info);
513 cancel_work_sync(&info->irq_work); 520 cancel_work_sync(&info->irq_work);
514 521
515 extcon_dev_unregister(info->edev); 522 extcon_dev_unregister(info->edev);