Hi Daniel, sorry, my example was incomplete...
for a fast you can add in your platform file something like this: .......................... #ifdef CONFIG_SPI_IDS8247 #include <linux/spi/spi.h> #include <linux/spi/mmc_spi.h> #include <linux/mmc/host.h> #endif ........ #ifdef CONFIG_SPI_IDS8247 #define GPIO_CS (224+22) static void ids8247_spi_activate_cs(u8 cs, u8 polarity) { pr_debug("%s %d %d\n", __func__, cs, polarity); //gpio_set_value(GPIO_CS, (int)polarity); } static void ids8247_spi_deactivate_cs(u8 cs, u8 polarity) { pr_debug("%s %d %d\n", __func__, cs, polarity); //gpio_set_value(GPIO_CS, (int)(!polarity)); } static struct mmc_spi_platform_data ids8247_mmc_pdata = { .ocr_mask = MMC_VDD_32_33, }; static struct spi_board_info ids8247_spi_boardinfo = { .bus_num = 0, .chip_select = 0, .max_speed_hz = 20000000, .modalias = "mmc_spi", .platform_data = &ids8247_mmc_pdata, }; static __init int ids8247_spi_setup(void) { int ret = 0; struct platform_device *spi_dev; struct resource r[3]; struct device_node *np = NULL; struct fsl_spi_platform_data spi_data; /*if (!gpio_get_value(GPIO_CS)) return; */ if( (np = of_find_compatible_node(NULL, "spi", "platform-mapped")) ==0 ) return 0; //fsl_get_sys_freq(); memset(&spi_data, 0, sizeof(struct fsl_spi_platform_data)); spi_data.activate_cs = ids8247_spi_activate_cs; spi_data.deactivate_cs = ids8247_spi_deactivate_cs; spi_data.bus_num = 0; spi_data.max_chipselect = 1; memset(r, 0, sizeof(struct resource)*3); ret = of_address_to_resource(np, 0, &r[0]); if (ret) goto spi_err; ret = of_address_to_resource(np, 1, &r[1]); if (ret) goto spi_err; ret = of_irq_to_resource(np, 0, &r[2]); if (ret == NO_IRQ) goto spi_err; spi_data.qe_mode = 0; spi_data.sysclk = 24750000; spi_dev = platform_device_register_simple("ids8247_spi", 0, &r[0], 3); if (IS_ERR(spi_dev)) { ret = PTR_ERR(spi_dev); return ret; } ret = platform_device_add_data(spi_dev, &spi_data, sizeof(struct fsl_spi_platform_data)); if(ret) { platform_device_unregister(spi_dev); return ret; } of_node_put(np); return spi_register_board_info(&ids8247_spi_boardinfo, 1); spi_err: of_node_put(np); return -1; } arch_initcall(ids8247_spi_setup); #endif /* CONFIG_SPI_IDS8247 */ .......... Sorry, i know it looks very dirty... Regards Sergej. ________________________________________ Von: Daniel Ng [daniel.ng1...@gmail.com] Gesendet: Freitag, 20. März 2009 02:19 An: Stepanov, Sergej Cc: linuxppc-dev@ozlabs.org Betreff: Re: spidev.c driver on the ppc8247 (kernel 2.6.27.19) On Thu, Mar 19, 2009 at 7:32 PM, Daniel Ng <daniel.ng1...@gmail.com> wrote: > > So, I tried to call spidev_probe() directly from the probe() function > of my SPI Controller driver. However in this case spidev_probe() > failed because its call to device_create_drvdata() failed with error > code ENODEV. Why would this be? > > This is how I make the call from my SPI Controller driver: > > spidev_probe(to_spi_device(&ofdev->dev)); > > And this is the relevant code in spidev_probe(): > > dev = device_create_drvdata(spidev_class, &spi->dev, spidev->devt, > spidev, "spidev%d.%d", > /*spi->master->bus_num*/0, spi->chip_select); It looks like spidev_class was uninitialised because spidev_init() had not yet been called. To force spidev_init() to be called before my SPI Controller's driver initialisation, I just used: subsys_initcall(spidev_init); This seems to do the job... _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev