Skip to content

Commit

Permalink
extcon: Add support irq domain for MAX8997 muic
Browse files Browse the repository at this point in the history
This patch add support irq domain for Maxim MAX8997 muic
instead of irq_base in platform data and max8997 driver
private data are instead. It is tested on TRATS board.

Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
Signed-off-by: Myungjoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Chanwoo Choi authored and Samuel Ortiz committed Jul 8, 2012
1 parent b41511f commit dca1a71
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 12 deletions.
2 changes: 1 addition & 1 deletion 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 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 dca1a71

Please sign in to comment.