linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: lee.jones@linaro.org (Lee Jones)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 09/35] mfd: ab8500-core: Add ADC support for ab8540
Date: Fri, 15 Feb 2013 12:56:40 +0000	[thread overview]
Message-ID: <1360933026-30325-10-git-send-email-lee.jones@linaro.org> (raw)
In-Reply-To: <1360933026-30325-1-git-send-email-lee.jones@linaro.org>

Signed-off-by: Lee Jones <lee.jones@linaro.org>
---
 drivers/mfd/ab8500-core.c  |   74 +++++++++++++++++++++++++++++++++++---------
 drivers/mfd/ab8500-gpadc.c |   67 ++++++++++++++++++++++-----------------
 2 files changed, 98 insertions(+), 43 deletions(-)

diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index 678afd0..ecf570f 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -604,6 +604,15 @@ static struct resource ab8500_gpadc_resources[] = {
 	},
 };
 
+static struct resource ab8540_gpadc_resources[] = {
+	{
+		.name	= "SW_CONV_END",
+		.start	= AB8500_INT_GP_SW_ADC_CONV_END,
+		.end	= AB8500_INT_GP_SW_ADC_CONV_END,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
 static struct resource ab8500_rtc_resources[] = {
 	{
 		.name	= "60S",
@@ -954,12 +963,6 @@ static struct mfd_cell abx500_common_devs[] = {
 		.of_compatible = "stericsson,abx500-clk",
 	},
 	{
-		.name = "ab8500-gpadc",
-		.of_compatible = "stericsson,ab8500-gpadc",
-		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
-		.resources = ab8500_gpadc_resources,
-	},
-	{
 		.name = "ab8500-rtc",
 		.of_compatible = "stericsson,ab8500-rtc",
 		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
@@ -1066,6 +1069,12 @@ static struct mfd_cell ab8500_devs[] = {
 		.name = "ab8500-codec",
 		.of_compatible = "stericsson,ab8500-codec",
 	},
+	{
+		.name = "ab8500-gpadc",
+		.of_compatible = "stericsson,ab8500-gpadc",
+		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
+		.resources = ab8500_gpadc_resources,
+	},
 };
 
 static struct mfd_cell ab9540_devs[] = {
@@ -1080,10 +1089,44 @@ static struct mfd_cell ab9540_devs[] = {
 	{
 		.name = "ab9540-codec",
 	},
+	{
+		.name = "ab8500-gpadc",
+		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
+		.resources = ab8500_gpadc_resources,
+	},
+	{
+		.name = "ab-iddet",
+		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
+		.resources = ab8505_iddet_resources,
+	},
 };
 
-/* Device list common to ab9540 and ab8505 */
-static struct mfd_cell ab9540_ab8505_devs[] = {
+/* Device list for ab8505  */
+static struct mfd_cell ab8505_devs[] = {
+	{
+		.name = "ab-iddet",
+		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
+		.resources = ab8505_iddet_resources,
+	},
+};
+
+static struct mfd_cell ab8540_devs[] = {
+	{
+		.name = "ab8500-gpio",
+	},
+	{
+		.name = "ab8540-usb",
+		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
+		.resources = ab8500_usb_resources,
+	},
+	{
+		.name = "ab8540-codec",
+	},
+	{
+		.name = "ab8500-gpadc",
+		.num_resources = ARRAY_SIZE(ab8540_gpadc_resources),
+		.resources = ab8540_gpadc_resources,
+	},
 	{
 		.name = "ab-iddet",
 		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
@@ -1416,6 +1459,14 @@ static int ab8500_probe(struct platform_device *pdev)
 		ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
 				ARRAY_SIZE(ab9540_devs), NULL,
 				ab8500->irq_base, ab8500->domain);
+	else if (is_ab8540(ab8500))
+		ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs,
+			      ARRAY_SIZE(ab8540_devs), NULL,
+			      ab8500->irq_base, ab8500->domain);
+	else if (is_ab8505(ab8500))
+		ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs,
+			      ARRAY_SIZE(ab8505_devs), NULL,
+			      ab8500->irq_base, ab8500->domain);
 	else
 		ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
 				ARRAY_SIZE(ab8500_devs), NULL,
@@ -1423,13 +1474,6 @@ static int ab8500_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	if (is_ab9540(ab8500) || is_ab8505(ab8500))
-		ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
-				ARRAY_SIZE(ab9540_ab8505_devs), NULL,
-				ab8500->irq_base, ab8500->domain);
-	if (ret)
-		return ret;
-
 	if (!no_bm) {
 		/* Add battery management devices */
 		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
diff --git a/drivers/mfd/ab8500-gpadc.c b/drivers/mfd/ab8500-gpadc.c
index 5942f2f..6b18975 100644
--- a/drivers/mfd/ab8500-gpadc.c
+++ b/drivers/mfd/ab8500-gpadc.c
@@ -314,6 +314,12 @@ int ab8500_gpadc_read_raw(struct ab8500_gpadc *gpadc, u8 channel,
 	if (!gpadc)
 		return -ENODEV;
 
+	/* check if convertion is supported */
+	if ((gpadc->irq_sw < 0) && (conv_type == ADC_SW))
+		return -ENOTSUPP;
+	if ((gpadc->irq_hw < 0) && (conv_type == ADC_HW))
+		return -ENOTSUPP;
+
 	mutex_lock(&gpadc->ab8500_gpadc_lock);
 	/* Enable VTVout LDO this is required for GPADC */
 	pm_runtime_get_sync(gpadc->dev);
@@ -766,20 +772,12 @@ static int ab8500_gpadc_probe(struct platform_device *pdev)
 	}
 
 	gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END");
-	if (gpadc->irq_sw < 0) {
-		dev_err(gpadc->dev, "failed to get platform irq-%d\n",
-			gpadc->irq_sw);
-		ret = gpadc->irq_sw;
-		goto fail;
-	}
+	if (gpadc->irq_sw < 0)
+		dev_err(gpadc->dev, "failed to get platform sw_conv_end irq\n");
 
 	gpadc->irq_hw = platform_get_irq_byname(pdev, "HW_CONV_END");
-	if (gpadc->irq_hw < 0) {
-		dev_err(gpadc->dev, "failed to get platform irq-%d\n",
-			gpadc->irq_hw);
-		ret = gpadc->irq_hw;
-		goto fail;
-	}
+	if (gpadc->irq_hw < 0)
+		dev_err(gpadc->dev, "failed to get platform hw_conv_end irq\n");
 
 	gpadc->dev = &pdev->dev;
 	gpadc->parent = dev_get_drvdata(pdev->dev.parent);
@@ -789,21 +787,30 @@ static int ab8500_gpadc_probe(struct platform_device *pdev)
 	init_completion(&gpadc->ab8500_gpadc_complete);
 
 	/* Register interrupts */
-	ret = request_threaded_irq(gpadc->irq_sw, NULL,
-		ab8500_bm_gpadcconvend_handler,
-		IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw", gpadc);
-	if (ret < 0) {
-		dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n",
-			gpadc->irq_sw);
-		goto fail;
+	if (gpadc->irq_sw >= 0) {
+		ret = request_threaded_irq(gpadc->irq_sw, NULL,
+			ab8500_bm_gpadcconvend_handler,
+			IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-sw",
+			gpadc);
+		if (ret < 0) {
+			dev_err(gpadc->dev,
+				"Failed to register interrupt irq: %d\n",
+				gpadc->irq_sw);
+			goto fail;
+		}
 	}
-	ret = request_threaded_irq(gpadc->irq_hw, NULL,
-		ab8500_bm_gpadcconvend_handler,
-		IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw", gpadc);
-	if (ret < 0) {
-		dev_err(gpadc->dev, "Failed to register interrupt, irq: %d\n",
-			gpadc->irq_hw);
-		goto fail;
+
+	if (gpadc->irq_hw >= 0) {
+		ret = request_threaded_irq(gpadc->irq_hw, NULL,
+			ab8500_bm_gpadcconvend_handler,
+			IRQF_NO_SUSPEND | IRQF_SHARED, "ab8500-gpadc-hw",
+			gpadc);
+		if (ret < 0) {
+			dev_err(gpadc->dev,
+				"Failed to register interrupt irq: %d\n",
+				gpadc->irq_hw);
+			goto fail_irq;
+		}
 	}
 
 	/* VTVout LDO used to power up ab8500-GPADC */
@@ -825,7 +832,9 @@ static int ab8500_gpadc_probe(struct platform_device *pdev)
 	ab8500_gpadc_read_calibration_data(gpadc);
 	list_add_tail(&gpadc->node, &ab8500_gpadc_list);
 	dev_dbg(gpadc->dev, "probe success\n");
+
 	return 0;
+
 fail_irq:
 	free_irq(gpadc->irq_sw, gpadc);
 	free_irq(gpadc->irq_hw, gpadc);
@@ -842,8 +851,10 @@ static int ab8500_gpadc_remove(struct platform_device *pdev)
 	/* remove this gpadc entry from the list */
 	list_del(&gpadc->node);
 	/* remove interrupt  - completion of Sw ADC conversion */
-	free_irq(gpadc->irq_sw, gpadc);
-	free_irq(gpadc->irq_hw, gpadc);
+	if (gpadc->irq_sw >= 0)
+		free_irq(gpadc->irq_sw, gpadc);
+	if (gpadc->irq_hw >= 0)
+		free_irq(gpadc->irq_hw, gpadc);
 
 	pm_runtime_get_sync(gpadc->dev);
 	pm_runtime_disable(gpadc->dev);
-- 
1.7.10.4

  parent reply	other threads:[~2013-02-15 12:56 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-02-15 12:56 [PATCH 00/35] mfd: ab8500: Internal development push Lee Jones
2013-02-15 12:56 ` [PATCH 01/35] mfd: ab8500-gpadc: Implemented suspend/resume Lee Jones
2013-02-20 13:19   ` Mark Brown
2013-02-21 22:45     ` Ulf Hansson
2013-02-22  7:55       ` Lee Jones
2013-02-22 10:38       ` Mark Brown
2013-02-25  9:27         ` Ulf Hansson
2013-02-25 13:51           ` Mark Brown
2013-02-25 14:52             ` Ulf Hansson
2013-02-15 12:56 ` [PATCH 02/35] mfd: ab8500-gpadc: Allow tvout regulator to be missing Lee Jones
2013-02-20 13:23   ` Mark Brown
2013-02-20 16:38     ` Lee Jones
2013-02-15 12:56 ` [PATCH 03/35] mfd: ab8500-gpadc: Reread on failure Lee Jones
2013-02-15 12:56 ` [PATCH 04/35] mfd: ab8500-gpadc: Add gpadc hw conversion Lee Jones
2013-02-15 12:56 ` [PATCH 05/35] mfd: ab8500-core: APE Interrupts are not cleared Lee Jones
2013-02-15 12:56 ` [PATCH 06/35] mfd: ab8500-core: Sysfs chip id modification Lee Jones
2013-02-19 22:04   ` Arnd Bergmann
2013-02-20  8:13     ` Lee Jones
2013-02-20  8:53       ` Marcus Cooper
2013-02-20 10:43         ` Lee Jones
2013-02-15 12:56 ` [PATCH 07/35] mfd: ab8500-debug: Print banks in hex Lee Jones
2013-02-15 12:56 ` [PATCH 08/35] mfd: ab8500-debug: Function to save all ABB registers to mem Lee Jones
2013-02-15 12:56 ` Lee Jones [this message]
2013-02-15 12:56 ` [PATCH 10/35] mfd: ab8500-core: Rework MFD sub-device initialisation structures Lee Jones
2013-02-19 22:07   ` Arnd Bergmann
2013-02-20  8:09     ` Lee Jones
2013-02-15 12:56 ` [PATCH 11/35] mfd: ab8500-core: Add Interrupt support for ab8540 Lee Jones
2013-02-15 12:56 ` [PATCH 12/35] mfd: ab8500-debug: Better error handling on crash Lee Jones
2013-02-15 12:56 ` [PATCH 13/35] mfd: ab8500-debug: Add wake-up info Lee Jones
2013-02-15 12:56 ` [PATCH 14/35] mfd: ab8500-sysctrl: Error check clean up Lee Jones
2013-02-15 12:56 ` [PATCH 15/35] mfd: ab8500-debugfs: Add tests for ab8540 based platform initialisations Lee Jones
2013-02-15 12:56 ` [PATCH 16/35] mfd: ab8500: Add more platform checks Lee Jones
2013-02-15 12:56 ` [PATCH 17/35] mfd: ab8500: Introduce AB8540 cuts definition Lee Jones
2013-02-15 12:56 ` [PATCH 18/35] mfd: ab8500-sysctrl: Update correct turn on status Lee Jones
2013-02-15 12:56 ` [PATCH 19/35] mfd: ab8500-debug: Add support for ab8505 and ab9540 Lee Jones
2013-02-15 12:56 ` [PATCH 20/35] mfd: ab8500-sysctrl: Add new reset function Lee Jones
2013-02-15 12:56 ` [PATCH 21/35] mfd: ab8500-gpadc: Add support for the AB8540 Lee Jones
2013-02-15 12:56 ` [PATCH 22/35] mfd: ab8500-debug: " Lee Jones
2013-02-15 12:56 ` [PATCH 23/35] mfd: ab8500-gpadc: Optimise GPADC driver Lee Jones
2013-02-15 12:56 ` [PATCH 24/35] mfd: ab8500: Remove unnecessary 'struct device' declaration Lee Jones
2013-02-25 14:33   ` Arnd Bergmann
2013-02-25 14:49     ` Lee Jones
2013-02-25 16:27       ` Arnd Bergmann
2013-02-15 12:56 ` [PATCH 25/35] mfd: ab8500-core: Add additional resources to ab8505_iddet_resources Lee Jones
2013-02-15 12:56 ` [PATCH 26/35] mfd: ab8500-sysctrl: AB8505 doesn't have SYSCLKREQ5..8 Lee Jones
2013-02-15 12:56 ` [PATCH 27/35] mfd: ab8500-debugfs: Dump sim registers Lee Jones
2013-02-15 12:56 ` [PATCH 28/35] mfd: ab8500-debug: Add ADC input channel usb_id in debugfs Lee Jones
2013-02-15 12:57 ` [PATCH 29/35] mfd: ab8500-core: Show turn on status at boot Lee Jones
2013-02-15 12:57 ` [PATCH 30/35] mfd: ab8500-debugfs: Change AB8500 debug permissions Lee Jones
2013-02-15 12:57 ` [PATCH 31/35] mfd: ab8500-debug: Add register map for ab8540 Lee Jones
2013-02-15 12:57 ` [PATCH 32/35] mfd: ab8500-core: Add abx500-clk as an mfd child device Lee Jones
2013-02-15 12:57 ` [PATCH 33/35] mfd: ab8500-debug: Add explicit dependencies Lee Jones
2013-02-15 12:57 ` [PATCH 34/35] mfd: ab8500-debug: Convert to kstrtoul_from_user Lee Jones
2013-02-15 12:57 ` [PATCH 35/35] mfd: ab8500-core: Hierarchical interrupt registers Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1360933026-30325-10-git-send-email-lee.jones@linaro.org \
    --to=lee.jones@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).