* IRQs in i2c-mpc.c
@ 2007-11-10 19:44 Jon Smirl
2007-11-10 23:09 ` Kumar Gala
0 siblings, 1 reply; 9+ messages in thread
From: Jon Smirl @ 2007-11-10 19:44 UTC (permalink / raw)
To: PowerPC dev list
I'm doing final clean up the i2c open firmware support. What is the
intention of this code? Is it meant for a missing IRQ attribute to
return a zero and not get an IRQ for the device? Does the device
function without an IRQ? If so, it needs a comment explaining things.
Otherwise IRQ of zero should be an error.
i2c->irq = irq_of_parse_and_map(op->node, 0);
if (i2c->irq <= 0) {
result = -ENXIO;
goto fail_irq;
}
if (i2c->irq != 0)
if ((result = request_irq(i2c->irq, mpc_i2c_isr,
IRQF_SHARED, "i2c-mpc", i2c)) < 0) {
printk(KERN_ERR "i2c-mpc - failed to attach interrupt\n");
goto fail_irq;
}
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 19:44 IRQs in i2c-mpc.c Jon Smirl
@ 2007-11-10 23:09 ` Kumar Gala
2007-11-10 23:16 ` Jon Smirl
0 siblings, 1 reply; 9+ messages in thread
From: Kumar Gala @ 2007-11-10 23:09 UTC (permalink / raw)
To: Jon Smirl; +Cc: PowerPC dev list
On Nov 10, 2007, at 1:44 PM, Jon Smirl wrote:
> I'm doing final clean up the i2c open firmware support. What is the
> intention of this code? Is it meant for a missing IRQ attribute to
> return a zero and not get an IRQ for the device? Does the device
> function without an IRQ? If so, it needs a comment explaining things.
> Otherwise IRQ of zero should be an error.
>
> i2c->irq = irq_of_parse_and_map(op->node, 0);
> if (i2c->irq <= 0) {
> result = -ENXIO;
> goto fail_irq;
> }
>
> if (i2c->irq != 0)
> if ((result = request_irq(i2c->irq, mpc_i2c_isr,
> IRQF_SHARED, "i2c-mpc", i2c)) < 0) {
> printk(KERN_ERR "i2c-mpc - failed to attach interrupt\n");
> goto fail_irq;
> }
Looking at the current driver it looks like we could get ride of if
check since the previous code checked the return of platform_get_irq().
- k
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 23:09 ` Kumar Gala
@ 2007-11-10 23:16 ` Jon Smirl
2007-11-10 23:18 ` Kumar Gala
0 siblings, 1 reply; 9+ messages in thread
From: Jon Smirl @ 2007-11-10 23:16 UTC (permalink / raw)
To: Kumar Gala; +Cc: PowerPC dev list
On 11/10/07, Kumar Gala <galak@kernel.crashing.org> wrote:
> Looking at the current driver it looks like we could get ride of if
> check since the previous code checked the return of platform_get_irq().
The code was a snippet from the larger patch that is converting i2c
from being a platform driver to a of_platform driver.
The question is, what to do about a missing IRQ tag in the device tree
or a IRQ of zero. What is an error and what should be ignored, etc.
+static int mpc_i2c_probe(struct of_device *op, const struct
of_device_id *match)
{
int result = 0;
struct mpc_i2c *i2c;
- struct fsl_i2c_platform_data *pdata;
- struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
- pdata = (struct fsl_i2c_platform_data *) pdev->dev.platform_data;
if (!(i2c = kzalloc(sizeof(*i2c), GFP_KERNEL))) {
return -ENOMEM;
}
- i2c->irq = platform_get_irq(pdev, 0);
- if (i2c->irq < 0) {
- result = -ENXIO;
- goto fail_get_irq;
- }
- i2c->flags = pdata->device_flags;
- init_waitqueue_head(&i2c->queue);
+ if (of_get_property(op->node, "dfsrr", NULL))
+ i2c->flags |= FSL_I2C_DEV_SEPARATE_DFSRR;
- i2c->base = ioremap((phys_addr_t)r->start, MPC_I2C_REGION);
+ if (of_device_is_compatible(op->node, "mpc5200-i2c"))
+ i2c->flags |= FSL_I2C_DEV_CLOCK_5200;
+ init_waitqueue_head(&i2c->queue);
+
+ i2c->base = of_iomap(op->node, 0);
if (!i2c->base) {
printk(KERN_ERR "i2c-mpc - failed to map controller\n");
result = -ENOMEM;
goto fail_map;
}
+ i2c->irq = irq_of_parse_and_map(op->node, 0);
+ if (i2c->irq < 0) {
+ result = -ENXIO;
+ goto fail_irq;
+ }
+
if (i2c->irq != 0)
if ((result = request_irq(i2c->irq, mpc_i2c_isr,
- IRQF_SHARED, "i2c-mpc", i2c)) < 0) {
- printk(KERN_ERR
- "i2c-mpc - failed to attach interrupt\n");
+ IRQF_SHARED, "i2c-mpc", i2c)) < 0) {
+ printk(KERN_ERR "i2c-mpc - failed to attach interrupt\n");
goto fail_irq;
}
mpc_i2c_setclock(i2c);
- platform_set_drvdata(pdev, i2c);
+
+ dev_set_drvdata(&op->dev, i2c);
i2c->adap = mpc_ops;
- i2c->adap.nr = pdev->id;
i2c_set_adapdata(&i2c->adap, i2c);
- i2c->adap.dev.parent = &pdev->dev;
- if ((result = i2c_add_numbered_adapter(&i2c->adap)) < 0) {
+ i2c->adap.dev.parent = &op->dev;
+ if ((result = i2c_add_adapter(&i2c->adap)) < 0) {
printk(KERN_ERR "i2c-mpc - failed to add adapter\n");
goto fail_add;
}
+
+ of_register_i2c_devices(&i2c->adap, op->node);
return result;
- fail_add:
+fail_add:
if (i2c->irq != 0)
free_irq(i2c->irq, i2c);
- fail_irq:
+fail_irq:
iounmap(i2c->base);
- fail_map:
- fail_get_irq:
+fail_map:
kfree(i2c);
return result;
};
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 23:16 ` Jon Smirl
@ 2007-11-10 23:18 ` Kumar Gala
2007-11-10 23:44 ` Jon Smirl
2007-11-11 6:26 ` Benjamin Herrenschmidt
0 siblings, 2 replies; 9+ messages in thread
From: Kumar Gala @ 2007-11-10 23:18 UTC (permalink / raw)
To: Jon Smirl; +Cc: PowerPC dev list
On Nov 10, 2007, at 5:16 PM, Jon Smirl wrote:
> On 11/10/07, Kumar Gala <galak@kernel.crashing.org> wrote:
>> Looking at the current driver it looks like we could get ride of if
>> check since the previous code checked the return of
>> platform_get_irq().
>
> The code was a snippet from the larger patch that is converting i2c
> from being a platform driver to a of_platform driver.
>
> The question is, what to do about a missing IRQ tag in the device tree
> or a IRQ of zero. What is an error and what should be ignored, etc.
I think the lack of an IRQ in the device tree should be an error. If
the IRQ value is zero, than its zero.
- k
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 23:18 ` Kumar Gala
@ 2007-11-10 23:44 ` Jon Smirl
2007-11-11 6:27 ` Benjamin Herrenschmidt
2007-11-11 6:26 ` Benjamin Herrenschmidt
1 sibling, 1 reply; 9+ messages in thread
From: Jon Smirl @ 2007-11-10 23:44 UTC (permalink / raw)
To: Kumar Gala; +Cc: PowerPC dev list
On 11/10/07, Kumar Gala <galak@kernel.crashing.org> wrote:
>
> On Nov 10, 2007, at 5:16 PM, Jon Smirl wrote:
>
> > On 11/10/07, Kumar Gala <galak@kernel.crashing.org> wrote:
> >> Looking at the current driver it looks like we could get ride of if
> >> check since the previous code checked the return of
> >> platform_get_irq().
> >
> > The code was a snippet from the larger patch that is converting i2c
> > from being a platform driver to a of_platform driver.
> >
> > The question is, what to do about a missing IRQ tag in the device tree
> > or a IRQ of zero. What is an error and what should be ignored, etc.
>
> I think the lack of an IRQ in the device tree should be an error. If
> the IRQ value is zero, than its zero.
irq_of_parse_and_map() returns NO_IRQ when the irq parameter is missing.
This API appears to be broken. In asm-powerpc/irq.h NO_IRQ is defined
as (0). There is no way to tell an error in the attribute from a valid
attribute selecting interrupt zero.
NO_IRQ used to be (-1).
/* This number is used when no interrupt has been assigned */
#ifdef CONFIG_PPC_MERGE
#define NO_IRQ (0)
#else
#define NO_IRQ (-1)
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 23:18 ` Kumar Gala
2007-11-10 23:44 ` Jon Smirl
@ 2007-11-11 6:26 ` Benjamin Herrenschmidt
1 sibling, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2007-11-11 6:26 UTC (permalink / raw)
To: Kumar Gala; +Cc: PowerPC dev list
On Sat, 2007-11-10 at 17:18 -0600, Kumar Gala wrote:
> On Nov 10, 2007, at 5:16 PM, Jon Smirl wrote:
>
> > On 11/10/07, Kumar Gala <galak@kernel.crashing.org> wrote:
> >> Looking at the current driver it looks like we could get ride of if
> >> check since the previous code checked the return of
> >> platform_get_irq().
> >
> > The code was a snippet from the larger patch that is converting i2c
> > from being a platform driver to a of_platform driver.
> >
> > The question is, what to do about a missing IRQ tag in the device tree
> > or a IRQ of zero. What is an error and what should be ignored, etc.
>
> I think the lack of an IRQ in the device tree should be an error. If
> the IRQ value is zero, than its zero.
virq 0 is always illegal so if platform_get_irq() returns 0, it can be
safely treated as an error or the absence of irq, on both powerpc and
x86.
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-10 23:44 ` Jon Smirl
@ 2007-11-11 6:27 ` Benjamin Herrenschmidt
2007-11-11 15:34 ` Jon Smirl
0 siblings, 1 reply; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2007-11-11 6:27 UTC (permalink / raw)
To: Jon Smirl; +Cc: PowerPC dev list
> irq_of_parse_and_map() returns NO_IRQ when the irq parameter is missing.
>
> This API appears to be broken. In asm-powerpc/irq.h NO_IRQ is defined
> as (0). There is no way to tell an error in the attribute from a valid
> attribute selecting interrupt zero.
No, it is not broken. Interrupt numbers in arch/powerpc are virtually
mapped and 0 is never a legal value, thus NO_IRQ is 0. This was done in
part because Linus wanted it that way.
The hardware number can perfectly be 0 though, that's a different thing,
and has nothing to do with what you pass to request_irq().
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-11 6:27 ` Benjamin Herrenschmidt
@ 2007-11-11 15:34 ` Jon Smirl
2007-11-11 20:44 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 9+ messages in thread
From: Jon Smirl @ 2007-11-11 15:34 UTC (permalink / raw)
To: benh; +Cc: PowerPC dev list
On 11/11/07, Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:
>
> > irq_of_parse_and_map() returns NO_IRQ when the irq parameter is missing.
> >
> > This API appears to be broken. In asm-powerpc/irq.h NO_IRQ is defined
> > as (0). There is no way to tell an error in the attribute from a valid
> > attribute selecting interrupt zero.
>
> No, it is not broken. Interrupt numbers in arch/powerpc are virtually
> mapped and 0 is never a legal value, thus NO_IRQ is 0. This was done in
> part because Linus wanted it that way.
>
> The hardware number can perfectly be 0 though, that's a different thing,
> and has nothing to do with what you pass to request_irq().
Is the only error return from irq_of_parse_and_map() NO_IRQ? or can we
get standard negative returns? I started tracing out the returns from
irq_of_parse_and_map() but there are a lot of them.
--
Jon Smirl
jonsmirl@gmail.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: IRQs in i2c-mpc.c
2007-11-11 15:34 ` Jon Smirl
@ 2007-11-11 20:44 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 9+ messages in thread
From: Benjamin Herrenschmidt @ 2007-11-11 20:44 UTC (permalink / raw)
To: Jon Smirl; +Cc: PowerPC dev list
> Is the only error return from irq_of_parse_and_map() NO_IRQ? or can we
> get standard negative returns? I started tracing out the returns from
> irq_of_parse_and_map() but there are a lot of them.
NP_IRQ is the only error return.
Ben.
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-11-11 20:44 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-10 19:44 IRQs in i2c-mpc.c Jon Smirl
2007-11-10 23:09 ` Kumar Gala
2007-11-10 23:16 ` Jon Smirl
2007-11-10 23:18 ` Kumar Gala
2007-11-10 23:44 ` Jon Smirl
2007-11-11 6:27 ` Benjamin Herrenschmidt
2007-11-11 15:34 ` Jon Smirl
2007-11-11 20:44 ` Benjamin Herrenschmidt
2007-11-11 6:26 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox