linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: UCB1400: Passing IRQ through platform_data
       [not found] <4BA70831.1040606@gmail.com>
@ 2010-03-22 13:13 ` Marek Vasut
  2010-03-22 22:44   ` Graham Gower
  0 siblings, 1 reply; 10+ messages in thread
From: Marek Vasut @ 2010-03-22 13:13 UTC (permalink / raw)
  To: Graham Gower, linux-input; +Cc: linux-arm-kernel

Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
> Hi Marek,
> I wish to use the ucb1400_ts driver on my device. But I'm having trouble
> passing the platform_data to the ucb1400_core driver.
> 
> I couldn't see any in tree examples of this being done and my attempts to
> do this via registering a platform_driver for ucb1400_core have failed
> (probably since this driver is ac97_bus_type, not a platform_driver).
> 
> Can you provide me with info regarding the correct method for passing the
> irq to the driver?
> 
> Thanks,
> -Graham
> 

static struct ucb1400_pdata pdata = {
	.irq	= IRQ_GPIO(123),
};

static struct platform_device ucb1400_core = {
        .name   = "ucb1400_core",
        .id     = -1,
	.dev	= {
		.platform_data = &pdata,
	},
};

init() {
	platform_device_register(&ucb1400_core);
}

Like this ?

btw. you don't have to pass pdata at all ... the logic for auto-detecting IRQ is 
still there and is active if no pdata are supplied.
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-22 13:13 ` UCB1400: Passing IRQ through platform_data Marek Vasut
@ 2010-03-22 22:44   ` Graham Gower
  2010-03-23  0:59     ` Marek Vasut
  0 siblings, 1 reply; 10+ messages in thread
From: Graham Gower @ 2010-03-22 22:44 UTC (permalink / raw)
  To: Marek Vasut; +Cc: linux-input

Marek Vasut wrote:
> Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
>> Hi Marek,
>> I wish to use the ucb1400_ts driver on my device. But I'm having trouble
>> passing the platform_data to the ucb1400_core driver.
>>
>> I couldn't see any in tree examples of this being done and my attempts to
>> do this via registering a platform_driver for ucb1400_core have failed
>> (probably since this driver is ac97_bus_type, not a platform_driver).
>>
>> Can you provide me with info regarding the correct method for passing the
>> irq to the driver?
>>
>> Thanks,
>> -Graham
>>
> 
> static struct ucb1400_pdata pdata = {
> 	.irq	= IRQ_GPIO(123),
> };
> 
> static struct platform_device ucb1400_core = {
>         .name   = "ucb1400_core",
>         .id     = -1,
> 	.dev	= {
> 		.platform_data = &pdata,
> 	},
> };
> 
> init() {
> 	platform_device_register(&ucb1400_core);
> }
> 
> Like this ?

That is the first thing I tried and it doesn't work. I suggest you printk
the pdata in the ucb1400_core driver after having done this to confirm (I got
NULL). You don't need to register a platform driver for ucb1400_core_probe()
to be called anyway - presumably its enumerated from the ac97 bus.

> 
> btw. you don't have to pass pdata at all ... the logic for auto-detecting IRQ is 
> still there and is active if no pdata are supplied.

This does not work for me. I have not yet investigated why.

-Graham

PS: I am on mips, not arm. Arm CC removed.
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-22 22:44   ` Graham Gower
@ 2010-03-23  0:59     ` Marek Vasut
  2010-03-23  1:25       ` H Hartley Sweeten
  0 siblings, 1 reply; 10+ messages in thread
From: Marek Vasut @ 2010-03-23  0:59 UTC (permalink / raw)
  To: Graham Gower; +Cc: linux-input

Dne Po 22. března 2010 23:44:26 Graham Gower napsal(a):
> Marek Vasut wrote:
> > Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
> >> Hi Marek,
> >> I wish to use the ucb1400_ts driver on my device. But I'm having trouble
> >> passing the platform_data to the ucb1400_core driver.
> >>
> >> I couldn't see any in tree examples of this being done and my attempts
> >> to do this via registering a platform_driver for ucb1400_core have
> >> failed (probably since this driver is ac97_bus_type, not a
> >> platform_driver).
> >>
> >> Can you provide me with info regarding the correct method for passing
> >> the irq to the driver?
> >>
> >> Thanks,
> >> -Graham
> >
> > static struct ucb1400_pdata pdata = {
> > 	.irq	= IRQ_GPIO(123),
> > };
> >
> > static struct platform_device ucb1400_core = {
> >         .name   = "ucb1400_core",
> >         .id     = -1,
> > 	.dev	= {
> > 		.platform_data = &pdata,
> > 	},
> > };
> >
> > init() {
> > 	platform_device_register(&ucb1400_core);
> > }
> >
> > Like this ?
> 
> That is the first thing I tried and it doesn't work. I suggest you printk
> the pdata in the ucb1400_core driver after having done this to confirm (I
>  got NULL). You don't need to register a platform driver for
>  ucb1400_core_probe() to be called anyway - presumably its enumerated from
>  the ac97 bus.

Oh yes you have to, otherwise the pdata won't be passed. Besides, it's weird 
probe()'s called if you didn't register it. But obviously whatever calls it 
doesn't pass the pdata.

And yes, I printk'd it when I was sending this patch in and it worked for me ... 
register the platform device and you should be ok.
> 
> > btw. you don't have to pass pdata at all ... the logic for auto-detecting
> > IRQ is still there and is active if no pdata are supplied.
> 
> This does not work for me. I have not yet investigated why.

I'd better get rid of that autodetection stuff altogether, but fttb it can be 
there.
> 
> -Graham
> 
> PS: I am on mips, not arm. Arm CC removed.
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* RE: UCB1400: Passing IRQ through platform_data
  2010-03-23  0:59     ` Marek Vasut
@ 2010-03-23  1:25       ` H Hartley Sweeten
  2010-03-23  1:39         ` Graham Gower
  0 siblings, 1 reply; 10+ messages in thread
From: H Hartley Sweeten @ 2010-03-23  1:25 UTC (permalink / raw)
  To: Marek Vasut, Graham Gower; +Cc: linux-input@vger.kernel.org

On Monday, March 22, 2010 5:59 PM, Marek Vasut wrote:
> Dne Po 22. března 2010 23:44:26 Graham Gower napsal(a):
>> Marek Vasut wrote:
>>> Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
>>>> Hi Marek,
>>>> I wish to use the ucb1400_ts driver on my device. But I'm having trouble
>>>> passing the platform_data to the ucb1400_core driver.
>>>>
>>>> I couldn't see any in tree examples of this being done and my attempts
>>>> to do this via registering a platform_driver for ucb1400_core have
>>>> failed (probably since this driver is ac97_bus_type, not a
>>>> platform_driver).
>>>>
>>>> Can you provide me with info regarding the correct method for passing
>>>> the irq to the driver?
>>>>
>>>> Thanks,
>>>> -Graham
>>>
>>> static struct ucb1400_pdata pdata = {
>>> 	.irq	= IRQ_GPIO(123),
>>> };
>>>
>>> static struct platform_device ucb1400_core = {
>>>         .name   = "ucb1400_core",
>>>         .id     = -1,
>>> 	.dev	= {
>>> 		.platform_data = &pdata,
>>> 	},
>>> };
>>>
>>> init() {
>>> 	platform_device_register(&ucb1400_core);
>>> }
>>>
>>> Like this ?
>> 
>> That is the first thing I tried and it doesn't work. I suggest you printk
>> the pdata in the ucb1400_core driver after having done this to confirm (I
>>  got NULL). You don't need to register a platform driver for
>>  ucb1400_core_probe() to be called anyway - presumably its enumerated from
>>  the ac97 bus.
>
> Oh yes you have to, otherwise the pdata won't be passed. Besides, it's weird 
> probe()'s called if you didn't register it. But obviously whatever calls it 
> doesn't pass the pdata.

The driver is registered with platform_driver_register, as such it will be tied
to the platform bus not the ac97 bus.  Being a platform driver, you do need a
matching platform_device_register so that you get a device<->driver binding.

> And yes, I printk'd it when I was sending this patch in and it worked for me ... 
> register the platform device and you should be ok.
>> 
>>> btw. you don't have to pass pdata at all ... the logic for auto-detecting
>>> IRQ is still there and is active if no pdata are supplied.
>> 
>> This does not work for me. I have not yet investigated why.
>
> I'd better get rid of that autodetection stuff altogether, but fttb it can be 
> there.

Another reason your irq might not be working is that its not valid.  Is gpio 123
a valid IRQ producer on your platform?  IRQ_GPIO(123) might resolve to
(ucb->irq < 0) which would cause the probe to try auto detecting the irq.

BTW, this driver looks a little scary.

The 'platform data' that is passed to the driver is also the 'private data' used
by the driver.  Since the only data passed by the platform is the irq it would
probably be cleaner to pass a struct ucb1400_pdata to the driver and kzalloc
the private struct ucb1400_ts data in the driver.

Just my 0.02...

Regards,
Hartley

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-23  1:25       ` H Hartley Sweeten
@ 2010-03-23  1:39         ` Graham Gower
  2010-03-23  2:08           ` H Hartley Sweeten
  2010-03-23  3:01           ` Marek Vasut
  0 siblings, 2 replies; 10+ messages in thread
From: Graham Gower @ 2010-03-23  1:39 UTC (permalink / raw)
  To: H Hartley Sweeten; +Cc: Marek Vasut, linux-input@vger.kernel.org

H Hartley Sweeten wrote:
> On Monday, March 22, 2010 5:59 PM, Marek Vasut wrote:
>> Dne Po 22. března 2010 23:44:26 Graham Gower napsal(a):
>>> Marek Vasut wrote:
>>>> Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
>>>>> Hi Marek,
>>>>> I wish to use the ucb1400_ts driver on my device. But I'm having trouble
>>>>> passing the platform_data to the ucb1400_core driver.
>>>>>
>>>>> I couldn't see any in tree examples of this being done and my attempts
>>>>> to do this via registering a platform_driver for ucb1400_core have
>>>>> failed (probably since this driver is ac97_bus_type, not a
>>>>> platform_driver).
>>>>>
>>>>> Can you provide me with info regarding the correct method for passing
>>>>> the irq to the driver?
>>>>>
>>>>> Thanks,
>>>>> -Graham
>>>> static struct ucb1400_pdata pdata = {
>>>> 	.irq	= IRQ_GPIO(123),
>>>> };
>>>>
>>>> static struct platform_device ucb1400_core = {
>>>>         .name   = "ucb1400_core",
>>>>         .id     = -1,
>>>> 	.dev	= {
>>>> 		.platform_data = &pdata,
>>>> 	},
>>>> };
>>>>
>>>> init() {
>>>> 	platform_device_register(&ucb1400_core);
>>>> }
>>>>
>>>> Like this ?
>>> That is the first thing I tried and it doesn't work. I suggest you printk
>>> the pdata in the ucb1400_core driver after having done this to confirm (I
>>>  got NULL). You don't need to register a platform driver for
>>>  ucb1400_core_probe() to be called anyway - presumably its enumerated from
>>>  the ac97 bus.
>> Oh yes you have to, otherwise the pdata won't be passed. Besides, it's weird 
>> probe()'s called if you didn't register it. But obviously whatever calls it 
>> doesn't pass the pdata.
> 
> The driver is registered with platform_driver_register, as such it will be tied
> to the platform bus not the ac97 bus.  Being a platform driver, you do need a
> matching platform_device_register so that you get a device<->driver binding.

I suspect we are looking at different files, or different versions of the file.
I'm looking at drivers/mfd/ucb1400_core.c, which looks like this:
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=drivers/mfd/ucb1400_core.c;hb=HEAD

The ucb1400_core is registered with driver_register.

I have grepped my tree and the only places I see "ucb12400_core" are in a couple
of arm board files and in my board file. Mine is commented out, and I definitely
still get the probe being called.

I added dump_stack() to the probe function.

[<80014f50>] dump_stack+0x8/0x34
[<801b1dec>] ucb1400_core_probe+0x48/0x1ac
[<801ab114>] driver_probe_device+0x128/0x254
[<801aa440>] bus_for_each_drv+0x60/0xb0
[<801ab3e4>] device_attach+0x60/0x88
[<801aa234>] bus_probe_device+0x30/0x54
[<801a8a74>] device_add+0x368/0x4f0
[<80210970>] snd_ac97_dev_register+0xa0/0xd8
[<801ef6e8>] snd_device_register_all+0x44/0x80
[<801eb2f4>] snd_card_register+0x64/0x18c
[<80216f3c>] snd_soc_instantiate_cards+0x368/0x5c4
[<80217214>] soc_probe+0x7c/0xc4
[<801ab114>] driver_probe_device+0x128/0x254
[<801aa440>] bus_for_each_drv+0x60/0xb0
[<801ab3e4>] device_attach+0x60/0x88
[<801aa234>] bus_probe_device+0x30/0x54
[<801a8a74>] device_add+0x368/0x4f0
[<801aca5c>] platform_device_add+0x14c/0x1b8
[<803813a4>] quokka_init+0x98/0xec
[<800180f0>] do_one_initcall+0x68/0x200
[<80371328>] kernel_init+0xc4/0x164
[<8001ac2c>] kernel_thread_helper+0x10/0x18


> 
>> And yes, I printk'd it when I was sending this patch in and it worked for me ... 
>> register the platform device and you should be ok.
>>>> btw. you don't have to pass pdata at all ... the logic for auto-detecting
>>>> IRQ is still there and is active if no pdata are supplied.
>>> This does not work for me. I have not yet investigated why.
>> I'd better get rid of that autodetection stuff altogether, but fttb it can be 
>> there.
> 
> Another reason your irq might not be working is that its not valid.  Is gpio 123
> a valid IRQ producer on your platform?  IRQ_GPIO(123) might resolve to
> (ucb->irq < 0) which would cause the probe to try auto detecting the irq.

This has nothing to do with the irq number that I'm passing (which is not 123
anyway). The ucb1400_core's dev->platform_data pointer is NULL.


> 
> BTW, this driver looks a little scary.
> 
> The 'platform data' that is passed to the driver is also the 'private data' used
> by the driver.  Since the only data passed by the platform is the irq it would
> probably be cleaner to pass a struct ucb1400_pdata to the driver and kzalloc
> the private struct ucb1400_ts data in the driver.
> 
> Just my 0.02...
> 
> Regards,
> Hartley

-Graham
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* RE: UCB1400: Passing IRQ through platform_data
  2010-03-23  1:39         ` Graham Gower
@ 2010-03-23  2:08           ` H Hartley Sweeten
  2010-03-23  3:13             ` Marek Vasut
  2010-03-23  3:01           ` Marek Vasut
  1 sibling, 1 reply; 10+ messages in thread
From: H Hartley Sweeten @ 2010-03-23  2:08 UTC (permalink / raw)
  To: Graham Gower; +Cc: Marek Vasut, linux-input@vger.kernel.org

On Monday, March 22, 2010 6:39 PM, Graham Gower wrote:
> H Hartley Sweeten wrote:
>>>> That is the first thing I tried and it doesn't work. I suggest you printk
>>>> the pdata in the ucb1400_core driver after having done this to confirm (I
>>>>  got NULL). You don't need to register a platform driver for
>>>>  ucb1400_core_probe() to be called anyway - presumably its enumerated from
>>>>  the ac97 bus.
>>> Oh yes you have to, otherwise the pdata won't be passed. Besides, it's weird 
>>> probe()'s called if you didn't register it. But obviously whatever calls it 
>>> doesn't pass the pdata.
>> 
>> The driver is registered with platform_driver_register, as such it will be tied
>> to the platform bus not the ac97 bus.  Being a platform driver, you do need a
>> matching platform_device_register so that you get a device<->driver binding.
>
> I suspect we are looking at different files, or different versions of the file.
> I'm looking at drivers/mfd/ucb1400_core.c, which looks like this:
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=drivers/mfd/ucb1400_core.c;hb=HEAD

Ah, I just saw that.  I was only looking at the ucb1400_ts.c driver itself and
the only direct in-tree user arch/avr32/boards/atngw100/mrmt.c.  I didn't notice
that there was also a mfd driver.

> The ucb1400_core is registered with driver_register.

That mfd driver still registers it's children as platform drivers using
platform_device_alloc, platform_device_add_data, and platform_device_add.

> I have grepped my tree and the only places I see "ucb12400_core" are in a couple
> of arm board files and in my board file. Mine is commented out, and I definitely
> still get the probe being called.

The only in tree users of the mfd driver appear to be mach-pxa/cm-x2xx.c and
mach-pxa/palmtc.c, neither of which pass the platform_data.

>> 
>>> And yes, I printk'd it when I was sending this patch in and it worked for me ... 
>>> register the platform device and you should be ok.
>>>>> btw. you don't have to pass pdata at all ... the logic for auto-detecting
>>>>> IRQ is still there and is active if no pdata are supplied.
>>>> This does not work for me. I have not yet investigated why.
>>> I'd better get rid of that autodetection stuff altogether, but fttb it can be 
>>> there.
>> 
>> Another reason your irq might not be working is that its not valid.  Is gpio 123
>> a valid IRQ producer on your platform?  IRQ_GPIO(123) might resolve to
>> (ucb->irq < 0) which would cause the probe to try auto detecting the irq.
>
> This has nothing to do with the irq number that I'm passing (which is not 123
> anyway). The ucb1400_core's dev->platform_data pointer is NULL.

That number was from the avr code.  Sorry for any confusion.

>> 
>> BTW, this driver looks a little scary.
>> 
>> The 'platform data' that is passed to the driver is also the 'private data' used
>> by the driver.  Since the only data passed by the platform is the irq it would
>> probably be cleaner to pass a struct ucb1400_pdata to the driver and kzalloc
>> the private struct ucb1400_ts data in the driver.
>> 
>> Just my 0.02...

I'm going to step out of this one.

I started looking at the mfd driver to see if I could help out with your problem.
I honestly don't even get how this all works....

The two in-tree users register the 'ucb1400_core' device differently.  cm-x2xx.c
uses platform_device_register and palmtc.c uses platform_add_devices.  Those two
paths are completely different, but they probably get to the same state eventually.

The ucb1400_core driver registers a 'device_driver' on the ac97 bus.  As such, it
probably does get probed by the ac97 bus not the platform bus.  The actual ucb1400_core
probe function probably isn't even tied to the correct platform data, it's parameter
is a struct device * not a struct platform_device *.

Anyway, good luck.  Sorry I can't offer any help.

Regards,
Hartley

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-23  1:39         ` Graham Gower
  2010-03-23  2:08           ` H Hartley Sweeten
@ 2010-03-23  3:01           ` Marek Vasut
  2010-03-23  3:31             ` Graham Gower
  1 sibling, 1 reply; 10+ messages in thread
From: Marek Vasut @ 2010-03-23  3:01 UTC (permalink / raw)
  To: Graham Gower; +Cc: H Hartley Sweeten, linux-input@vger.kernel.org

Dne Út 23. března 2010 02:39:19 Graham Gower napsal(a):
> H Hartley Sweeten wrote:
> > On Monday, March 22, 2010 5:59 PM, Marek Vasut wrote:
> >> Dne Po 22. března 2010 23:44:26 Graham Gower napsal(a):
> >>> Marek Vasut wrote:
> >>>> Dne Po 22. března 2010 07:03:29 Graham Gower napsal(a):
> >>>>> Hi Marek,
> >>>>> I wish to use the ucb1400_ts driver on my device. But I'm having
> >>>>> trouble passing the platform_data to the ucb1400_core driver.
> >>>>>
> >>>>> I couldn't see any in tree examples of this being done and my
> >>>>> attempts to do this via registering a platform_driver for
> >>>>> ucb1400_core have failed (probably since this driver is
> >>>>> ac97_bus_type, not a
> >>>>> platform_driver).
> >>>>>
> >>>>> Can you provide me with info regarding the correct method for passing
> >>>>> the irq to the driver?
> >>>>>
> >>>>> Thanks,
> >>>>> -Graham
> >>>>
> >>>> static struct ucb1400_pdata pdata = {
> >>>> 	.irq	= IRQ_GPIO(123),
> >>>> };
> >>>>
> >>>> static struct platform_device ucb1400_core = {
> >>>>         .name   = "ucb1400_core",
> >>>>         .id     = -1,
> >>>> 	.dev	= {
> >>>> 		.platform_data = &pdata,
> >>>> 	},
> >>>> };
> >>>>
> >>>> init() {
> >>>> 	platform_device_register(&ucb1400_core);
> >>>> }
> >>>>
> >>>> Like this ?
> >>>
> >>> That is the first thing I tried and it doesn't work. I suggest you
> >>> printk the pdata in the ucb1400_core driver after having done this to
> >>> confirm (I got NULL). You don't need to register a platform driver for
> >>>  ucb1400_core_probe() to be called anyway - presumably its enumerated
> >>> from the ac97 bus.
> >>
> >> Oh yes you have to, otherwise the pdata won't be passed. Besides, it's
> >> weird probe()'s called if you didn't register it. But obviously whatever
> >> calls it doesn't pass the pdata.
> >
> > The driver is registered with platform_driver_register, as such it will
> > be tied to the platform bus not the ac97 bus.  Being a platform driver,
> > you do need a matching platform_device_register so that you get a
> > device<->driver binding.
> 
> I suspect we are looking at different files, or different versions of the
>  file. I'm looking at drivers/mfd/ucb1400_core.c, which looks like this:
> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=d
> rivers/mfd/ucb1400_core.c;hb=HEAD
> 
> The ucb1400_core is registered with driver_register.
> 
> I have grepped my tree and the only places I see "ucb12400_core" are in a
>  couple of arm board files and in my board file. Mine is commented out, and
>  I definitely still get the probe being called.
> 
> I added dump_stack() to the probe function.
> 
> [<80014f50>] dump_stack+0x8/0x34
> [<801b1dec>] ucb1400_core_probe+0x48/0x1ac
> [<801ab114>] driver_probe_device+0x128/0x254
> [<801aa440>] bus_for_each_drv+0x60/0xb0
> [<801ab3e4>] device_attach+0x60/0x88
> [<801aa234>] bus_probe_device+0x30/0x54
> [<801a8a74>] device_add+0x368/0x4f0
> [<80210970>] snd_ac97_dev_register+0xa0/0xd8
> [<801ef6e8>] snd_device_register_all+0x44/0x80
> [<801eb2f4>] snd_card_register+0x64/0x18c
> [<80216f3c>] snd_soc_instantiate_cards+0x368/0x5c4
> [<80217214>] soc_probe+0x7c/0xc4
> [<801ab114>] driver_probe_device+0x128/0x254
> [<801aa440>] bus_for_each_drv+0x60/0xb0
> [<801ab3e4>] device_attach+0x60/0x88
> [<801aa234>] bus_probe_device+0x30/0x54
> [<801a8a74>] device_add+0x368/0x4f0
> [<801aca5c>] platform_device_add+0x14c/0x1b8
> [<803813a4>] quokka_init+0x98/0xec
> [<800180f0>] do_one_initcall+0x68/0x200
> [<80371328>] kernel_init+0xc4/0x164
> [<8001ac2c>] kernel_thread_helper+0x10/0x18

Aren't you probing it from some driver or something ?
> 
> >> And yes, I printk'd it when I was sending this patch in and it worked
> >> for me ... register the platform device and you should be ok.
> >>
> >>>> btw. you don't have to pass pdata at all ... the logic for
> >>>> auto-detecting IRQ is still there and is active if no pdata are
> >>>> supplied.
> >>>
> >>> This does not work for me. I have not yet investigated why.
> >>
> >> I'd better get rid of that autodetection stuff altogether, but fttb it
> >> can be there.
> >
> > Another reason your irq might not be working is that its not valid.  Is
> > gpio 123 a valid IRQ producer on your platform?  IRQ_GPIO(123) might
> > resolve to (ucb->irq < 0) which would cause the probe to try auto
> > detecting the irq.
> 
> This has nothing to do with the irq number that I'm passing (which is not
>  123 anyway). The ucb1400_core's dev->platform_data pointer is NULL.

We know it is NULL ... that's because you're not passing it.
> 
> > BTW, this driver looks a little scary.
> >
> > The 'platform data' that is passed to the driver is also the 'private
> > data' used by the driver.  Since the only data passed by the platform is
> > the irq it would probably be cleaner to pass a struct ucb1400_pdata to
> > the driver and kzalloc the private struct ucb1400_ts data in the driver.
> >
> > Just my 0.02...
> >
> > Regards,
> > Hartley
> 
> -Graham
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-23  2:08           ` H Hartley Sweeten
@ 2010-03-23  3:13             ` Marek Vasut
  2010-03-24  5:07               ` Graham Gower
  0 siblings, 1 reply; 10+ messages in thread
From: Marek Vasut @ 2010-03-23  3:13 UTC (permalink / raw)
  To: H Hartley Sweeten; +Cc: Graham Gower, linux-input@vger.kernel.org

Dne Út 23. března 2010 03:08:21 H Hartley Sweeten napsal(a):
> On Monday, March 22, 2010 6:39 PM, Graham Gower wrote:
> > H Hartley Sweeten wrote:
> >>>> That is the first thing I tried and it doesn't work. I suggest you
> >>>> printk the pdata in the ucb1400_core driver after having done this to
> >>>> confirm (I got NULL). You don't need to register a platform driver for
> >>>>  ucb1400_core_probe() to be called anyway - presumably its enumerated
> >>>> from the ac97 bus.
> >>>
> >>> Oh yes you have to, otherwise the pdata won't be passed. Besides, it's
> >>> weird probe()'s called if you didn't register it. But obviously
> >>> whatever calls it doesn't pass the pdata.
> >>
> >> The driver is registered with platform_driver_register, as such it will
> >> be tied to the platform bus not the ac97 bus.  Being a platform driver,
> >> you do need a matching platform_device_register so that you get a
> >> device<->driver binding.
> >
> > I suspect we are looking at different files, or different versions of the
> > file. I'm looking at drivers/mfd/ucb1400_core.c, which looks like this:
> > http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f
> >=drivers/mfd/ucb1400_core.c;hb=HEAD
> 
> Ah, I just saw that.  I was only looking at the ucb1400_ts.c driver itself
>  and the only direct in-tree user arch/avr32/boards/atngw100/mrmt.c.  I
>  didn't notice that there was also a mfd driver.

There's no ucb1400_ts anymore. There's only the MFD driver, nothing else.
> 
> > The ucb1400_core is registered with driver_register.
> 
> That mfd driver still registers it's children as platform drivers using
> platform_device_alloc, platform_device_add_data, and platform_device_add.
> 
> > I have grepped my tree and the only places I see "ucb12400_core" are in a
> > couple of arm board files and in my board file. Mine is commented out,
> > and I definitely still get the probe being called.
> 
> The only in tree users of the mfd driver appear to be mach-pxa/cm-x2xx.c
>  and mach-pxa/palmtc.c, neither of which pass the platform_data.

You can pass platform data as I said in the earlier example. That was tested on 
PalmTC.
> 
> >>> And yes, I printk'd it when I was sending this patch in and it worked
> >>> for me ... register the platform device and you should be ok.
> >>>
> >>>>> btw. you don't have to pass pdata at all ... the logic for
> >>>>> auto-detecting IRQ is still there and is active if no pdata are
> >>>>> supplied.
> >>>>
> >>>> This does not work for me. I have not yet investigated why.
> >>>
> >>> I'd better get rid of that autodetection stuff altogether, but fttb it
> >>> can be there.
> >>
> >> Another reason your irq might not be working is that its not valid.  Is
> >> gpio 123 a valid IRQ producer on your platform?  IRQ_GPIO(123) might
> >> resolve to (ucb->irq < 0) which would cause the probe to try auto
> >> detecting the irq.
> >
> > This has nothing to do with the irq number that I'm passing (which is not
> > 123 anyway). The ucb1400_core's dev->platform_data pointer is NULL.
> 
> That number was from the avr code.  Sorry for any confusion.

The '123' was just a silly number, an example, you need to fill you own ... it 
wasnt from AVR code.
> 
> >> BTW, this driver looks a little scary.
> >>
> >> The 'platform data' that is passed to the driver is also the 'private
> >> data' used by the driver.  Since the only data passed by the platform is
> >> the irq it would probably be cleaner to pass a struct ucb1400_pdata to
> >> the driver and kzalloc the private struct ucb1400_ts data in the driver.
> >>
> >> Just my 0.02...
> 
> I'm going to step out of this one.
> 
> I started looking at the mfd driver to see if I could help out with your
>  problem. I honestly don't even get how this all works....

Maybe I'm starting to recall how that whole thing worked. I took a look at the 
code and my guess might be -- it takes pdata from the ac97 bus. I'm not sure 
here, but pxa2xx-ac97 allows passing platform data through the ac97 bus, dunno 
how are other platform's ac97 implementations. If I'm right here, you might need 
to fix your mips-whatever-ac97 to allow passing platform data and then pass them 
through there.

If that's the case, the earlier example was wrong and you should start digging 
around ac97 (see git log for pxa2xx-ac97.c and find a patch that added this 
passing of platform data there).
> 
> The two in-tree users register the 'ucb1400_core' device differently. 
>  cm-x2xx.c uses platform_device_register and palmtc.c uses
>  platform_add_devices.  Those two paths are completely different, but they
>  probably get to the same state eventually.
> 
> The ucb1400_core driver registers a 'device_driver' on the ac97 bus.  As
>  such, it probably does get probed by the ac97 bus not the platform bus. 
>  The actual ucb1400_core probe function probably isn't even tied to the
>  correct platform data, it's parameter is a struct device * not a struct
>  platform_device *.
> 
> Anyway, good luck.  Sorry I can't offer any help.
> 
> Regards,
> Hartley
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-23  3:01           ` Marek Vasut
@ 2010-03-23  3:31             ` Graham Gower
  0 siblings, 0 replies; 10+ messages in thread
From: Graham Gower @ 2010-03-23  3:31 UTC (permalink / raw)
  To: Marek Vasut; +Cc: H Hartley Sweeten, linux-input@vger.kernel.org

Marek Vasut wrote:
> Dne Út 23. března 2010 02:39:19 Graham Gower napsal(a):

>> The ucb1400_core is registered with driver_register.
>>
>> I have grepped my tree and the only places I see "ucb12400_core" are in a
>>  couple of arm board files and in my board file. Mine is commented out, and
>>  I definitely still get the probe being called.
>>
>> I added dump_stack() to the probe function.
>>
>> [<80014f50>] dump_stack+0x8/0x34
>> [<801b1dec>] ucb1400_core_probe+0x48/0x1ac
>> [<801ab114>] driver_probe_device+0x128/0x254
>> [<801aa440>] bus_for_each_drv+0x60/0xb0
>> [<801ab3e4>] device_attach+0x60/0x88
>> [<801aa234>] bus_probe_device+0x30/0x54
>> [<801a8a74>] device_add+0x368/0x4f0
>> [<80210970>] snd_ac97_dev_register+0xa0/0xd8
>> [<801ef6e8>] snd_device_register_all+0x44/0x80
>> [<801eb2f4>] snd_card_register+0x64/0x18c
>> [<80216f3c>] snd_soc_instantiate_cards+0x368/0x5c4
>> [<80217214>] soc_probe+0x7c/0xc4
>> [<801ab114>] driver_probe_device+0x128/0x254
>> [<801aa440>] bus_for_each_drv+0x60/0xb0
>> [<801ab3e4>] device_attach+0x60/0x88
>> [<801aa234>] bus_probe_device+0x30/0x54
>> [<801a8a74>] device_add+0x368/0x4f0
>> [<801aca5c>] platform_device_add+0x14c/0x1b8
>> [<803813a4>] quokka_init+0x98/0xec
>> [<800180f0>] do_one_initcall+0x68/0x200
>> [<80371328>] kernel_init+0xc4/0x164
>> [<8001ac2c>] kernel_thread_helper+0x10/0x18
> 
> Aren't you probing it from some driver or something ?

I register an ac97 platform driver from an arch_initcall function. It looks
like the ucb1400_core driver is probed once the ac97 device is found.


>> This has nothing to do with the irq number that I'm passing (which is not
>>  123 anyway). The ucb1400_core's dev->platform_data pointer is NULL.
> 
> We know it is NULL ... that's because you're not passing it.

When I attempt to pass it via a platform device with platform_add_devices, it
is still NULL. I suspected that it was NULL because the ucb1400_core
isn't a platform_driver  - thus I commented out the platform device
for ucb1400_core in my arch_initcall and sure enough the probe was still
being called.

-Graham
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: UCB1400: Passing IRQ through platform_data
  2010-03-23  3:13             ` Marek Vasut
@ 2010-03-24  5:07               ` Graham Gower
  0 siblings, 0 replies; 10+ messages in thread
From: Graham Gower @ 2010-03-24  5:07 UTC (permalink / raw)
  To: Marek Vasut; +Cc: H Hartley Sweeten, linux-input@vger.kernel.org

Marek Vasut wrote:
> Maybe I'm starting to recall how that whole thing worked. I took a look at the 
> code and my guess might be -- it takes pdata from the ac97 bus. I'm not sure 
> here, but pxa2xx-ac97 allows passing platform data through the ac97 bus, dunno 
> how are other platform's ac97 implementations. If I'm right here, you might need 
> to fix your mips-whatever-ac97 to allow passing platform data and then pass them 
> through there.
> 
> If that's the case, the earlier example was wrong and you should start digging 
> around ac97 (see git log for pxa2xx-ac97.c and find a patch that added this 
> passing of platform data there).

Thanks, that was the clue I needed. With a small fix[0], I can now pass the
platform_data successfully through the ac97 codec.

-Graham

[0] http://mailman.alsa-project.org/pipermail/alsa-devel/2010-March/026419.html

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

end of thread, other threads:[~2010-03-24  5:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <4BA70831.1040606@gmail.com>
2010-03-22 13:13 ` UCB1400: Passing IRQ through platform_data Marek Vasut
2010-03-22 22:44   ` Graham Gower
2010-03-23  0:59     ` Marek Vasut
2010-03-23  1:25       ` H Hartley Sweeten
2010-03-23  1:39         ` Graham Gower
2010-03-23  2:08           ` H Hartley Sweeten
2010-03-23  3:13             ` Marek Vasut
2010-03-24  5:07               ` Graham Gower
2010-03-23  3:01           ` Marek Vasut
2010-03-23  3:31             ` Graham Gower

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