I tried to make use of the irq-controller mode of the GPT as
suggested, however I'm not getting the IRQ.
Does anyone have an idea what I could be missing? (I've been testing
with 2.6.30).


The driver reports from it's probe:
[    1.502853] spi_master spi32766.0 Unable to get sample IRQ from of

My driver has:
        pdata->sample_irq = irq_of_parse_and_map(np, 0);
        if (pdata->sample_irq == NO_IRQ) {
                ret = pdata->sample_irq;
                dev_err(dev, "Unable to get sample IRQ from of\n");
                ..
                }


My dts has:
        gpt6: ti...@660 {       // General Purpose Timer GPT6 in GPIO mode for
SMC4000IO sample irq.
                interrupt-controller;
                #interrupt-cells = <1>;
                compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt";
                reg = <0x660 0x10>;
                interrupts = <1 15 0>;
                interrupt-parent = <&mpc5200_pic>;
        };


        io-control...@0 {
                compatible = "microkey,smc4000io";
                linux,modalias = "of_smc4000io";
                spi-max-frequency = <800000>;
                spi-cpha;
                reg = <0>;
                word-delay-us = <30>;
                interrupt-controller = <&gpt6>; // Use GPT6 as the IRQ 
controller
                interrupts = <2>; // And make it edge falling
        };


Thanks in advance,

Henk.

On Fri, Feb 13, 2009 at 5:19 PM, Grant Likely<grant.lik...@secretlab.ca> wrote:
> On Fri, Feb 13, 2009 at 3:40 AM, Henk Stegeman <henk.stege...@gmail.com> 
> wrote:
>> I'm busy adding support for slave deviced behind mpc52xx-psc-spi.
>> One complication I have is that my SPI slave device has an interrupt output
>> to the CPU.
>> My idea is to add it as a gpios property in the slave device's
>> configuration:
>>
>>         s...@2400 {        // PSC3 (SPI IF to the IO-controller )
>>             device_type = "spi";
>>             #address-cells = <1>;
>>             #size-cells = <0>;
>>             compatible = "fsl,mpc5200-psc-spi","fsl,mpc5200b-psc-spi";
>>             cell-index = <2>;
>>             reg = <0x2400 0x100>;
>>             interrupts = <2 3 0>;
>>             interrupt-parent = <&mpc5200_pic>;
>>             gpios = <&gpt4 0 0>;
>>
>>             io-control...@0 {
>>                 compatible = "microkey,smc4000io";
>>                 spi-max-frequency = <1000000>;
>>                 reg = <0>;
>>                 // gpios: first is IRQ to cpu
>>                 gpios = <&gpt6 0 0>;
>>             };
>
> There is a better way to do this, and driver support for it is
> currently merged into Ben Herrenschmidt's -next tree.
>
> Do this instead:
>        io-control...@0 {
>                compatible = "microkey,smc4000io";
>                spi-max-frequency = <1000000>;
>                reg = <0>;
>                interrupt-controller = < &gpt6 >;     // Use GPT6 as
> the IRQ controller
>                interrupts = < 1 >;    // And make it rising edge.
>        };
>
> Then add these two properties to the GPT node:
>
>        interrupt-controller;
>        #interrupt-cells = <1>;
>
> Then you can use normal irq_of_parse_and_map() to set up your handler.
>
>> How should I then register my spi slave driver? My smc4000io_probe function
>> gets called correctly by of_spi support but when I register as follows:
>>
>> static struct spi_driver smc4000io_driver = {
>>     .driver = {
>>         .name    = "smc4000io",
>>         .bus    = &spi_bus_type,
>>         .owner    = THIS_MODULE,
>>     },
>>     .probe        = smc4000io_probe,
>>     .remove        = __devexit_p(smc4000io_remove),
>> };
>>
>> static int __init smc4000io_init(void)
>> {
>>     return spi_register_driver(&smc4000io_driver);
>> }
>>
>> static void __exit smc4000io_exit(void)
>> {
>>     spi_unregister_driver(&smc4000io_driver);
>> }
>>
>> module_init(smc4000io_init);
>
> Yes, this is right.  The psc_spi driver automatically registers all
> spi children that it finds in the device tree onto the SPI bus.
> Therefore registering an spi_driver() is the right thing to do.
>
>> But when I do:
>>
>> static struct of_platform_driver smc4000_spi_of_driver = {
>>     .name = "smc4000io",
>>     .match_table = smc4000io_of_match,
>>     .probe = smc4000io_of_probe,
>>     .remove        = __devexit_p(smc4000io_of_remove),
>> };
>>
>> static int __init smc4000io_init(void)
>> {
>>     return of_register_platform_driver(&smc4000_spi_of_driver);
>> }
>> module_init(smc4000io_init);
>>
>> Then my smc4000io_of_probe function never gets called.
>
> Correct.  of_platform_driver isn't useful in this case because the
> device cannot exist independently of the SPI bus.  Plus an
> of_platform_device doesn't provide any information about the SPI bus
> itself.
>
> g.
>
> --
> Grant Likely, B.Sc., P.Eng.
> Secret Lab Technologies Ltd.
>
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to