linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain
@ 2012-11-13 13:48 Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 1/3] mfd: Convert tps6586x to irq_domain Laxman Dewangan
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Laxman Dewangan @ 2012-11-13 13:48 UTC (permalink / raw)
  To: sameo, grant.likely, linus.walleij, broonie
  Cc: swarren, linux-kernel, Laxman Dewangan

This patch series convert the irq implementation to use the
irq domain.
Accordingly, gpio driver and rtc registration is updated.

Reposting the series and adding the reviwed by Mark and acked by Linus W
for the respective patches.

Laxman Dewangan (3):
  mfd: Convert tps6586x to irq_domain
  mfd: tps6586x: add irq io-resource for rtc sub driver
  mfd: tps6586x: implement gpio_to_irq

 drivers/gpio/gpio-tps6586x.c |    9 ++++
 drivers/mfd/tps6586x.c       |  103 +++++++++++++++++++++++++++++++-----------
 include/linux/mfd/tps6586x.h |    1 +
 3 files changed, 87 insertions(+), 26 deletions(-)


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH RESEND 1/3] mfd: Convert tps6586x to irq_domain
  2012-11-13 13:48 [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Laxman Dewangan
@ 2012-11-13 13:48 ` Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 2/3] mfd: tps6586x: add irq io-resource for rtc sub driver Laxman Dewangan
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Laxman Dewangan @ 2012-11-13 13:48 UTC (permalink / raw)
  To: sameo, grant.likely, linus.walleij, broonie
  Cc: swarren, linux-kernel, Laxman Dewangan

Allocate the irq base if it base is not porvided i.e.
in case of device tree invocation of this driver.
Convert the tps6586x driver to irq domain, using a
legacy IRQ mapping if an irq_base is specified in
platform data or dynamically allocated and otherwise
using a linear mapping.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
Reposting in case of patch missed.
Also added Reviewed by Mark as he already reviewed the patches.

 drivers/mfd/tps6586x.c       |   91 ++++++++++++++++++++++++++++++-----------
 include/linux/mfd/tps6586x.h |    1 +
 2 files changed, 67 insertions(+), 25 deletions(-)

diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
index 4674643..2cdf1e6 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -17,12 +17,14 @@
 
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/irqdomain.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/i2c.h>
+#include <linux/platform_device.h>
 #include <linux/regmap.h>
 #include <linux/regulator/of_regulator.h>
 #include <linux/regulator/machine.h>
@@ -116,6 +118,7 @@ struct tps6586x {
 	int			irq_base;
 	u32			irq_en;
 	u8			mask_reg[5];
+	struct irq_domain	*irq_domain;
 };
 
 static inline struct tps6586x *dev_to_tps6586x(struct device *dev)
@@ -184,6 +187,14 @@ int tps6586x_update(struct device *dev, int reg, uint8_t val, uint8_t mask)
 }
 EXPORT_SYMBOL_GPL(tps6586x_update);
 
+int tps6586x_irq_get_virq(struct device *dev, int irq)
+{
+	struct tps6586x *tps6586x = dev_to_tps6586x(dev);
+
+	return irq_create_mapping(tps6586x->irq_domain, irq);
+}
+EXPORT_SYMBOL_GPL(tps6586x_irq_get_virq);
+
 static int __remove_subdev(struct device *dev, void *unused)
 {
 	platform_device_unregister(to_platform_device(dev));
@@ -205,7 +216,7 @@ static void tps6586x_irq_lock(struct irq_data *data)
 static void tps6586x_irq_enable(struct irq_data *irq_data)
 {
 	struct tps6586x *tps6586x = irq_data_get_irq_chip_data(irq_data);
-	unsigned int __irq = irq_data->irq - tps6586x->irq_base;
+	unsigned int __irq = irq_data->hwirq;
 	const struct tps6586x_irq_data *data = &tps6586x_irqs[__irq];
 
 	tps6586x->mask_reg[data->mask_reg] &= ~data->mask_mask;
@@ -216,7 +227,7 @@ static void tps6586x_irq_disable(struct irq_data *irq_data)
 {
 	struct tps6586x *tps6586x = irq_data_get_irq_chip_data(irq_data);
 
-	unsigned int __irq = irq_data->irq - tps6586x->irq_base;
+	unsigned int __irq = irq_data->hwirq;
 	const struct tps6586x_irq_data *data = &tps6586x_irqs[__irq];
 
 	tps6586x->mask_reg[data->mask_reg] |= data->mask_mask;
@@ -239,6 +250,39 @@ static void tps6586x_irq_sync_unlock(struct irq_data *data)
 	mutex_unlock(&tps6586x->irq_lock);
 }
 
+static struct irq_chip tps6586x_irq_chip = {
+	.name = "tps6586x",
+	.irq_bus_lock = tps6586x_irq_lock,
+	.irq_bus_sync_unlock = tps6586x_irq_sync_unlock,
+	.irq_disable = tps6586x_irq_disable,
+	.irq_enable = tps6586x_irq_enable,
+};
+
+static int tps6586x_irq_map(struct irq_domain *h, unsigned int virq,
+				irq_hw_number_t hw)
+{
+	struct tps6586x *tps6586x = h->host_data;
+
+	irq_set_chip_data(virq, tps6586x);
+	irq_set_chip_and_handler(virq, &tps6586x_irq_chip, handle_simple_irq);
+	irq_set_nested_thread(virq, 1);
+
+	/* ARM needs us to explicitly flag the IRQ as valid
+	 * and will set them noprobe when we do so. */
+#ifdef CONFIG_ARM
+	set_irq_flags(virq, IRQF_VALID);
+#else
+	irq_set_noprobe(virq);
+#endif
+
+	return 0;
+}
+
+static struct irq_domain_ops tps6586x_domain_ops = {
+	.map    = tps6586x_irq_map,
+	.xlate  = irq_domain_xlate_twocell,
+};
+
 static irqreturn_t tps6586x_irq(int irq, void *data)
 {
 	struct tps6586x *tps6586x = data;
@@ -259,7 +303,8 @@ static irqreturn_t tps6586x_irq(int irq, void *data)
 		int i = __ffs(acks);
 
 		if (tps6586x->irq_en & (1 << i))
-			handle_nested_irq(tps6586x->irq_base + i);
+			handle_nested_irq(
+				irq_find_mapping(tps6586x->irq_domain, i));
 
 		acks &= ~(1 << i);
 	}
@@ -272,11 +317,8 @@ static int __devinit tps6586x_irq_init(struct tps6586x *tps6586x, int irq,
 {
 	int i, ret;
 	u8 tmp[4];
-
-	if (!irq_base) {
-		dev_warn(tps6586x->dev, "No interrupt support on IRQ base\n");
-		return -EINVAL;
-	}
+	int new_irq_base;
+	int irq_num = ARRAY_SIZE(tps6586x_irqs);
 
 	mutex_init(&tps6586x->irq_lock);
 	for (i = 0; i < 5; i++) {
@@ -286,25 +328,24 @@ static int __devinit tps6586x_irq_init(struct tps6586x *tps6586x, int irq,
 
 	tps6586x_reads(tps6586x->dev, TPS6586X_INT_ACK1, sizeof(tmp), tmp);
 
-	tps6586x->irq_base = irq_base;
-
-	tps6586x->irq_chip.name = "tps6586x";
-	tps6586x->irq_chip.irq_enable = tps6586x_irq_enable;
-	tps6586x->irq_chip.irq_disable = tps6586x_irq_disable;
-	tps6586x->irq_chip.irq_bus_lock = tps6586x_irq_lock;
-	tps6586x->irq_chip.irq_bus_sync_unlock = tps6586x_irq_sync_unlock;
-
-	for (i = 0; i < ARRAY_SIZE(tps6586x_irqs); i++) {
-		int __irq = i + tps6586x->irq_base;
-		irq_set_chip_data(__irq, tps6586x);
-		irq_set_chip_and_handler(__irq, &tps6586x->irq_chip,
-					 handle_simple_irq);
-		irq_set_nested_thread(__irq, 1);
-#ifdef CONFIG_ARM
-		set_irq_flags(__irq, IRQF_VALID);
-#endif
+	if  (irq_base > 0) {
+		new_irq_base = irq_alloc_descs(irq_base, 0, irq_num, -1);
+		if (new_irq_base < 0) {
+			dev_err(tps6586x->dev,
+				"Failed to alloc IRQs: %d\n", new_irq_base);
+			return new_irq_base;
+		}
+	} else {
+		new_irq_base = 0;
 	}
 
+	tps6586x->irq_domain = irq_domain_add_simple(tps6586x->dev->of_node,
+				irq_num, new_irq_base, &tps6586x_domain_ops,
+				tps6586x);
+	if (!tps6586x->irq_domain) {
+		dev_err(tps6586x->dev, "Failed to create IRQ domain\n");
+		return -ENOMEM;
+	}
 	ret = request_threaded_irq(irq, NULL, tps6586x_irq, IRQF_ONESHOT,
 				   "tps6586x", tps6586x);
 
diff --git a/include/linux/mfd/tps6586x.h b/include/linux/mfd/tps6586x.h
index 2dd1231..ebd8b08 100644
--- a/include/linux/mfd/tps6586x.h
+++ b/include/linux/mfd/tps6586x.h
@@ -93,5 +93,6 @@ extern int tps6586x_set_bits(struct device *dev, int reg, uint8_t bit_mask);
 extern int tps6586x_clr_bits(struct device *dev, int reg, uint8_t bit_mask);
 extern int tps6586x_update(struct device *dev, int reg, uint8_t val,
 			   uint8_t mask);
+extern int tps6586x_irq_get_virq(struct device *dev, int irq);
 
 #endif /*__LINUX_MFD_TPS6586X_H */
-- 
1.7.1.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH RESEND 2/3] mfd: tps6586x: add irq io-resource for rtc sub driver
  2012-11-13 13:48 [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 1/3] mfd: Convert tps6586x to irq_domain Laxman Dewangan
@ 2012-11-13 13:48 ` Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 3/3] mfd: tps6586x: implement gpio_to_irq Laxman Dewangan
  2012-11-13 19:04 ` [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Samuel Ortiz
  3 siblings, 0 replies; 6+ messages in thread
From: Laxman Dewangan @ 2012-11-13 13:48 UTC (permalink / raw)
  To: sameo, grant.likely, linus.walleij, broonie
  Cc: swarren, linux-kernel, Laxman Dewangan

Add IRQ IORESOURCE for rtc sub driver of this device.
The rtc driver can get the irq by calling platform_get_irq().

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
---
Reposting in case of patch missed.
Also added Reviewed by Mark as he already reviewed the patches.

 drivers/mfd/tps6586x.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
index 2cdf1e6..c11539a 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -96,12 +96,22 @@ static const struct tps6586x_irq_data tps6586x_irqs[] = {
 	[TPS6586X_INT_RTC_ALM2] = TPS6586X_IRQ(TPS6586X_INT_MASK4, 1 << 1),
 };
 
+static struct resource tps6586x_rtc_resources[] = {
+	{
+		.start  = TPS6586X_INT_RTC_ALM1,
+		.end	= TPS6586X_INT_RTC_ALM1,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
 static struct mfd_cell tps6586x_cell[] = {
 	{
 		.name = "tps6586x-gpio",
 	},
 	{
 		.name = "tps6586x-rtc",
+		.num_resources = ARRAY_SIZE(tps6586x_rtc_resources),
+		.resources = &tps6586x_rtc_resources[0],
 	},
 	{
 		.name = "tps6586x-onkey",
@@ -562,7 +572,7 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
 
 	ret = mfd_add_devices(tps6586x->dev, -1,
 			      tps6586x_cell, ARRAY_SIZE(tps6586x_cell),
-			      NULL, 0, NULL);
+			      NULL, 0, tps6586x->irq_domain);
 	if (ret < 0) {
 		dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret);
 		goto err_mfd_add;
-- 
1.7.1.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH RESEND 3/3] mfd: tps6586x: implement gpio_to_irq
  2012-11-13 13:48 [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 1/3] mfd: Convert tps6586x to irq_domain Laxman Dewangan
  2012-11-13 13:48 ` [PATCH RESEND 2/3] mfd: tps6586x: add irq io-resource for rtc sub driver Laxman Dewangan
@ 2012-11-13 13:48 ` Laxman Dewangan
  2012-11-13 19:04 ` [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Samuel Ortiz
  3 siblings, 0 replies; 6+ messages in thread
From: Laxman Dewangan @ 2012-11-13 13:48 UTC (permalink / raw)
  To: sameo, grant.likely, linus.walleij, broonie
  Cc: swarren, linux-kernel, Laxman Dewangan

The TPS6586x adds the interrupt of this device using
linear mapping on irq domain.
Hence, implement gpio_to_irq to get the irq number
corresponding to TPS6586x GPIOs which is created
dynamically.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
---
Reposting in case of patch missed.
Also added Reviewed by Mark as he already reviewed the patches.
Linus W has already acked it as adding his ack.

 drivers/gpio/gpio-tps6586x.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/drivers/gpio/gpio-tps6586x.c b/drivers/gpio/gpio-tps6586x.c
index 2526b3b..62e9e1c 100644
--- a/drivers/gpio/gpio-tps6586x.c
+++ b/drivers/gpio/gpio-tps6586x.c
@@ -80,6 +80,14 @@ static int tps6586x_gpio_output(struct gpio_chip *gc, unsigned offset,
 				val, mask);
 }
 
+static int tps6586x_gpio_to_irq(struct gpio_chip *gc, unsigned offset)
+{
+	struct tps6586x_gpio *tps6586x_gpio = to_tps6586x_gpio(gc);
+
+	return tps6586x_irq_get_virq(tps6586x_gpio->parent,
+				TPS6586X_INT_PLDO_0 + offset);
+}
+
 static int __devinit tps6586x_gpio_probe(struct platform_device *pdev)
 {
 	struct tps6586x_platform_data *pdata;
@@ -106,6 +114,7 @@ static int __devinit tps6586x_gpio_probe(struct platform_device *pdev)
 	tps6586x_gpio->gpio_chip.direction_output = tps6586x_gpio_output;
 	tps6586x_gpio->gpio_chip.set	= tps6586x_gpio_set;
 	tps6586x_gpio->gpio_chip.get	= tps6586x_gpio_get;
+	tps6586x_gpio->gpio_chip.to_irq	= tps6586x_gpio_to_irq;
 
 #ifdef CONFIG_OF_GPIO
 	tps6586x_gpio->gpio_chip.of_node = pdev->dev.parent->of_node;
-- 
1.7.1.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain
  2012-11-13 13:48 [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Laxman Dewangan
                   ` (2 preceding siblings ...)
  2012-11-13 13:48 ` [PATCH RESEND 3/3] mfd: tps6586x: implement gpio_to_irq Laxman Dewangan
@ 2012-11-13 19:04 ` Samuel Ortiz
  2012-11-14 15:46   ` Laxman Dewangan
  3 siblings, 1 reply; 6+ messages in thread
From: Samuel Ortiz @ 2012-11-13 19:04 UTC (permalink / raw)
  To: Laxman Dewangan
  Cc: grant.likely, linus.walleij, broonie, swarren, linux-kernel

Hi Laxman,

On Tue, Nov 13, 2012 at 07:18:04PM +0530, Laxman Dewangan wrote:
> This patch series convert the irq implementation to use the
> irq domain.
> Accordingly, gpio driver and rtc registration is updated.
> 
> Reposting the series and adding the reviwed by Mark and acked by Linus W
> for the respective patches.
Thanks for the repost and for adding the reviewers and ackers name.
This patchset is applied to my for-next branch.

Cheers,
Samuel.

-- 
Intel Open Source Technology Centre
http://oss.intel.com/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain
  2012-11-13 19:04 ` [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Samuel Ortiz
@ 2012-11-14 15:46   ` Laxman Dewangan
  0 siblings, 0 replies; 6+ messages in thread
From: Laxman Dewangan @ 2012-11-14 15:46 UTC (permalink / raw)
  To: Samuel Ortiz
  Cc: grant.likely, linus.walleij, broonie, Stephen Warren, linux-kernel

On Wednesday 14 November 2012 12:34 AM, Samuel Ortiz wrote:
> Hi Laxman,
>
> On Tue, Nov 13, 2012 at 07:18:04PM +0530, Laxman Dewangan wrote:
>> This patch series convert the irq implementation to use the
>> irq domain.
>> Accordingly, gpio driver and rtc registration is updated.
>>
>> Reposting the series and adding the reviwed by Mark and acked by Linus W
>> for the respective patches.
> Thanks for the repost and for adding the reviewers and ackers name.
> This patchset is applied to my for-next branch.
Thank you very much for taking care. This will enable us to add rtc 
support in our platform.

Thanks,
Laxman

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-11-14 15:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-11-13 13:48 [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Laxman Dewangan
2012-11-13 13:48 ` [PATCH RESEND 1/3] mfd: Convert tps6586x to irq_domain Laxman Dewangan
2012-11-13 13:48 ` [PATCH RESEND 2/3] mfd: tps6586x: add irq io-resource for rtc sub driver Laxman Dewangan
2012-11-13 13:48 ` [PATCH RESEND 3/3] mfd: tps6586x: implement gpio_to_irq Laxman Dewangan
2012-11-13 19:04 ` [PATCH RESEND 0/3] mfd: tps6586x: Convert to irq domain Samuel Ortiz
2012-11-14 15:46   ` Laxman Dewangan

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).