Browse Source

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>
Chanwoo Choi 13 years ago
parent
commit
dca1a71e41
2 changed files with 19 additions and 12 deletions
  1. 1 1
      drivers/extcon/Kconfig
  2. 18 11
      drivers/extcon/extcon-max8997.c

+ 1 - 1
drivers/extcon/Kconfig

@@ -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

+ 18 - 11
drivers/extcon/extcon-max8997.c

@@ -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 = info->irq - max8997->irq_base;
-	int ret;
+	int irq_type = 0;
+	int i, 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;
+
+		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) {
 		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);