diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 15:41:17 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-30 15:41:17 -0400 |
commit | 3e701cdfe601306817604ca7f79f1d1c1088007c (patch) | |
tree | 1b0a4088a091f035d8be06758a604ca449223fc0 /drivers/extcon | |
parent | 7d3d09b01a028e9dd1282149fdcd2a6e0edd73e4 (diff) | |
parent | 3c1534c7ecffeb4330bba4c55d17f301528195b6 (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/Kconfig | 2 | ||||
-rw-r--r-- | drivers/extcon/extcon-max8997.c | 29 |
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 | ||
34 | config EXTCON_MAX8997 | 34 | config 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 @@ | |||
77 | struct max8997_muic_irq { | 78 | struct 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 | ||
82 | static struct max8997_muic_irq muic_irqs[] = { | 84 | static 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); |
497 | err_irq: | 505 | err_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); |
501 | err_kfree: | 509 | err_kfree: |
502 | return ret; | 510 | return ret; |
@@ -505,11 +513,10 @@ err_kfree: | |||
505 | static int __devexit max8997_muic_remove(struct platform_device *pdev) | 513 | static 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); |