Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 319719
b: refs/heads/master
c: dca1a71
h: refs/heads/master
i:
  319717: 1e3801c
  319715: 532972c
  319711: a5aba16
v: v3
  • Loading branch information
Chanwoo Choi authored and Samuel Ortiz committed Jul 8, 2012
1 parent 68838b1 commit 81062a0
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b41511f713ccaef666e450fae8cb18909897fe4e
refs/heads/master: dca1a71e4108a0a9051a653d885297e9d1cc656c
2 changes: 1 addition & 1 deletion trunk/drivers/extcon/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ config EXTCON_GPIO

config EXTCON_MAX8997
tristate "MAX8997 EXTCON Support"
depends on MFD_MAX8997
depends on MFD_MAX8997 && IRQ_DOMAIN
help
If you say yes here you get support for the MUIC device of
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory
Expand Down
29 changes: 18 additions & 11 deletions trunk/drivers/extcon/extcon-max8997.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/mfd/max8997.h>
#include <linux/mfd/max8997-private.h>
#include <linux/extcon.h>
#include <linux/irqdomain.h>

#define DEV_NAME "max8997-muic"

Expand Down Expand Up @@ -77,6 +78,7 @@
struct max8997_muic_irq {
unsigned int irq;
const char *name;
unsigned int virq;
};

static struct max8997_muic_irq muic_irqs[] = {
Expand Down Expand Up @@ -343,12 +345,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
{
struct max8997_muic_info *info = container_of(work,
struct max8997_muic_info, irq_work);
struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
u8 status[2];
u8 adc, chg_type;

int irq_type = info->irq - max8997->irq_base;
int ret;
int irq_type = 0;
int i, ret;

mutex_lock(&info->mutex);

Expand All @@ -363,6 +363,10 @@ static void max8997_muic_irq_work(struct work_struct *work)
dev_dbg(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__,
status[0], status[1]);

for (i = 0 ; i < ARRAY_SIZE(muic_irqs) ; i++)
if (info->irq == muic_irqs[i].virq)
irq_type = muic_irqs[i].irq;

switch (irq_type) {
case MAX8997_MUICIRQ_ADC:
adc = status[0] & STATUS1_ADC_MASK;
Expand Down Expand Up @@ -448,11 +452,15 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)

for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
struct max8997_muic_irq *muic_irq = &muic_irqs[i];
int virq = 0;

virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq);
if (!virq)
goto err_irq;
muic_irq->virq = virq;

ret = request_threaded_irq(pdata->irq_base + muic_irq->irq,
NULL, max8997_muic_irq_handler,
0, muic_irq->name,
info);
ret = request_threaded_irq(virq, NULL,max8997_muic_irq_handler,
0, muic_irq->name, info);
if (ret) {
dev_err(&pdev->dev,
"failed: irq request (IRQ: %d,"
Expand Down Expand Up @@ -496,7 +504,7 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)
kfree(info->edev);
err_irq:
while (--i >= 0)
free_irq(pdata->irq_base + muic_irqs[i].irq, info);
free_irq(muic_irqs[i].virq, info);
kfree(info);
err_kfree:
return ret;
Expand All @@ -505,11 +513,10 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)
static int __devexit max8997_muic_remove(struct platform_device *pdev)
{
struct max8997_muic_info *info = platform_get_drvdata(pdev);
struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
int i;

for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
free_irq(max8997->irq_base + muic_irqs[i].irq, info);
free_irq(muic_irqs[i].virq, info);
cancel_work_sync(&info->irq_work);

extcon_dev_unregister(info->edev);
Expand Down

0 comments on commit 81062a0

Please sign in to comment.