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:

        spi@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-controller@0 {
                compatible = "microkey,smc4000io";
                spi-max-frequency = <1000000>;
                reg = <0>;
                // gpios: first is IRQ to cpu
                gpios = <&gpt6 0 0>;
            };
        };


Are there better/easier ways to do this?

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

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.

Thanks in advance,

Henk.






On Wed, Oct 29, 2008 at 3:45 PM, Grant Likely <grant.likely@secretlab.ca> wrote:
On Wed, Oct 29, 2008 at 7:43 AM, Henk Stegeman <henk.stegeman@gmail.com> wrote:
> ..
> ..
> In my dts
>
> I have my chipselect defined as follows:
>
>         gpt4: timer@640 {    // General Purpose Timer GPT4 in GPIO mode for
> SMC4000IO chip select.
>             compatible = "fsl,mpc5200b-gpt-gpio","fsl,mpc5200-gpt-gpio";
>             cell-index = <4>;
>             reg = <0x640 0x10>;
>             interrupts = <1 13 0>;
>             interrupt-parent = <&mpc5200_pic>;
>             gpio-controller;
>             #gpio-cells = <2>;
>         };
>
> I found the gpio in
> # cat /sys/class/gpio/gpiochip215/label
> /soc5200@f0000000/timer@640
>
> The spi controller is defined like this:
>
>         spi@2400 {
>             device_type = "spi";
>             #address-cells = <1>;
>             #size-cells = <0>;
>             compatible = "fsl,mpc5200-psc-spi","fsl,mpc5200b-psc-spi";
>             cell-index = <2>;
>             reg = <2400 100>;
>             interrupts = <2 3 0>;
>             interrupt-parent = <&mpc5200_pic>;
>             gpios = <&gpt4 0 0>;
>
>             io-controller@0 {
>                 compatible = "microkey,smc4000io";
>                 spi-max-frequency = <1000000>;
>                 reg = <0>;
>             };
>         };
>
> At bootup linux (2.6.27) reports:
>
> mpc52xx-psc-spi f0000960.spi: probe called without platform data, no
> (de)activate_cs function will be called.
>
> Is my assumption wrong that the gpios property is the way to map chipselects
> to the spi driver?

Yes, that is the way you should work specify the chip selects, but the
driver hasn't been updated to support it yet.

g.

--
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.