extcon: Add support irq domain for MAX8997 muic

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>
This commit is contained in:
Chanwoo Choi 2012-07-02 09:03:00 +09:00 committed by Samuel Ortiz
parent b41511f713
commit dca1a71e41
2 changed files with 19 additions and 12 deletions

View File

@ -23,7 +23,7 @@ config EXTCON_GPIO
config EXTCON_MAX8997 config EXTCON_MAX8997
tristate "MAX8997 EXTCON Support" tristate "MAX8997 EXTCON Support"
depends on MFD_MAX8997 depends on MFD_MAX8997 && IRQ_DOMAIN
help help
If you say yes here you get support for the MUIC device of If you say yes here you get support for the MUIC device of
Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory Maxim MAX8997 PMIC. The MAX8997 MUIC is a USB port accessory

View File

@ -26,6 +26,7 @@
#include <linux/mfd/max8997.h> #include <linux/mfd/max8997.h>
#include <linux/mfd/max8997-private.h> #include <linux/mfd/max8997-private.h>
#include <linux/extcon.h> #include <linux/extcon.h>
#include <linux/irqdomain.h>
#define DEV_NAME "max8997-muic" #define DEV_NAME "max8997-muic"
@ -77,6 +78,7 @@
struct max8997_muic_irq { struct max8997_muic_irq {
unsigned int irq; unsigned int irq;
const char *name; const char *name;
unsigned int virq;
}; };
static struct max8997_muic_irq muic_irqs[] = { static struct max8997_muic_irq muic_irqs[] = {
@ -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 *info = container_of(work,
struct max8997_muic_info, irq_work); struct max8997_muic_info, irq_work);
struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
u8 status[2]; u8 status[2];
u8 adc, chg_type; u8 adc, chg_type;
int irq_type = 0;
int irq_type = info->irq - max8997->irq_base; int i, ret;
int ret;
mutex_lock(&info->mutex); mutex_lock(&info->mutex);
@ -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__, dev_dbg(info->dev, "%s: STATUS1:0x%x, 2:0x%x\n", __func__,
status[0], status[1]); 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) { switch (irq_type) {
case MAX8997_MUICIRQ_ADC: case MAX8997_MUICIRQ_ADC:
adc = status[0] & STATUS1_ADC_MASK; adc = status[0] & STATUS1_ADC_MASK;
@ -448,11 +452,15 @@ static int __devinit max8997_muic_probe(struct platform_device *pdev)
for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
struct max8997_muic_irq *muic_irq = &muic_irqs[i]; struct max8997_muic_irq *muic_irq = &muic_irqs[i];
int virq = 0;
ret = request_threaded_irq(pdata->irq_base + muic_irq->irq, virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq);
NULL, max8997_muic_irq_handler, if (!virq)
0, muic_irq->name, goto err_irq;
info); muic_irq->virq = virq;
ret = request_threaded_irq(virq, NULL,max8997_muic_irq_handler,
0, muic_irq->name, info);
if (ret) { if (ret) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"failed: irq request (IRQ: %d," "failed: irq request (IRQ: %d,"
@ -496,7 +504,7 @@ err_extcon:
kfree(info->edev); kfree(info->edev);
err_irq: err_irq:
while (--i >= 0) while (--i >= 0)
free_irq(pdata->irq_base + muic_irqs[i].irq, info); free_irq(muic_irqs[i].virq, info);
kfree(info); kfree(info);
err_kfree: err_kfree:
return ret; return ret;
@ -505,11 +513,10 @@ err_kfree:
static int __devexit max8997_muic_remove(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_muic_info *info = platform_get_drvdata(pdev);
struct max8997_dev *max8997 = i2c_get_clientdata(info->muic);
int i; int i;
for (i = 0; i < ARRAY_SIZE(muic_irqs); 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); cancel_work_sync(&info->irq_work);
extcon_dev_unregister(info->edev); extcon_dev_unregister(info->edev);