Re: Problem with SPI on S3C2412

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]


José Miguel Gonçalves wrote:
Ben,

I attach the current patch that I use for my machine. The machine is a SX-560 module from Silex ( http://www.silexeurope.com/en/home/products/embedded-modules/sx-560.html ).

Meanwhile I think I've spotted the (first) problem. In arch/arm/mach-s3c2412/s3c2412.c the SPI device is renamed "s3c2412-spi" (it was set in arch/arm/plat-s3c24xx/devs.c with "s3c2410-spi") but the spi_s3c24xx driver expects a platform driver named "s3c2410-spi", so it fails to initialize.
Do you mean a different name? Yes that's may be the cause of all that.!

The function matching platfrom_devic-es to their drivers just comparing the names due to decide to the probe function of which drived to feed
the instance of platfrom_device

Commenting the driving renaming I get a little bit further:

s3c2410-spi s3c2410-spi.0: No platform data supplied
s3c2410-spi: probe of s3c2410-spi.0 failed with error -2
modprobe: failed to load module spi_s3c24xx: No such device

Now it seems I need some architecture dependent initialization, correct?
looks like you are right...
your arcg/arm/s3c2410/<your_board>.c have to register platform_device s3c_device_spi0,
and this device have to hav epointer to platfrom_data to be properly set.

The platfrom_data is something which the S3Cxxx SPI driver knows about.
Something likes this:

struct sc3_spi_platform_data {
    int base_addr;
    int irq_num;
    int min_clk_freq;
    int max_clk_freq;
    int enable_puuldown;
    int what_ever_driver_needs_to_kow_due_to_use_SPI_controller;

}


The SPI driver probe function casts the "priv" pointer of platfrom device to (struct sc3_spi_platform_data*) and uses all that fields above.
See in the probe function of the drivver and find out what it needs.

The things likes base_addr and irq_num should correspond of the real construction of your processor and board.
You either need to consult the data sheet or set all that fields manually bu yourself.

You can declare instance of struct sc3_spi_platform_data as statio variable inside the file where the platfrom_device is added


If the driver is renamed verify that other driver uses the same declaration of private platfrom_data  structure   (in my example struct sc3_spi_platform_data),
and uses it's fields for the same purpose.

Regards,
José Gonçalves

José Miguel Gonçalves wrote:
Hi,

I am trying to setup Linux 2.6.27 on an embedded board with a S3C2412 SoC.
After setting some architecture specific configuration on /arch/arm/mach-s3c2412/, I have finally booted my board with success.
Now I am trying to access a temperature sensor that is connected to the SPI bus.
For this I am thinking to use the spidev userspace API. I have compiled spidev and spi_s3c24xx as modules. I'm able to load spidev but, when I modprobe spi_s3c24xx, I'm getting the following error:

modprobe: failed to load module spi_s3c24xx: No such device

Any idea of what could be the problem?

Regards,
José Miguel Gonçalves



diff -Naur linux-2.6.27.38.original/arch/arm/mach-s3c2412/Kconfig linux-2.6.27.38/arch/arm/mach-s3c2412/Kconfig --- linux-2.6.27.38.original/arch/arm/mach-s3c2412/Kconfig 2009-10-22 08:22:46.000000000 +0100 +++ linux-2.6.27.38/arch/arm/mach-s3c2412/Kconfig 2009-11-04 09:15:46.000000000 +0000 @@ -60,13 +60,10 @@ selected config MACH_SMDK2412 - bool "SMDK2412" - select MACH_SMDK2413 + bool "SX560" + select CPU_S3C2412 help - Say Y here if you are using an SMDK2412 - - Note, this shares support with SMDK2413, so will automatically - select MACH_SMDK2413. + Say Y here if you are using a Silex SX-560 embedded WLAN module. config MACH_VSTMS bool "VMSTMS" diff -Naur linux-2.6.27.38.original/arch/arm/mach-s3c2412/mach-sx560.c linux-2.6.27.38/arch/arm/mach-s3c2412/mach-sx560.c --- linux-2.6.27.38.original/arch/arm/mach-s3c2412/mach-sx560.c 1970-01-01 01:00:00.000000000 +0100 +++ linux-2.6.27.38/arch/arm/mach-s3c2412/mach-sx560.c 2009-11-04 10:03:27.000000000 +0000 @@ -0,0 +1,135 @@ +/* linux/arch/arm/mach-s3c2412/mach-sx560.c + * + * Copyright (c) 2009 INOV - INESC Inovacao + * Jose Goncalves <jose.goncalves@xxxxxxx> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. +*/ + +#include <linux/kernel.h> +#include <linux/types.h> +#include <linux/interrupt.h> +#include <linux/list.h> +#include <linux/timer.h> +#include <linux/init.h> +#include <linux/serial_core.h> +#include <linux/platform_device.h> + +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/irq.h> + +#include <mach/hardware.h> +#include <asm/hardware/iomd.h> +#include <asm/setup.h> +#include <asm/io.h> +#include <asm/irq.h> +#include <asm/mach-types.h> + +#include <asm/plat-s3c/regs-serial.h> +#include <mach/regs-gpio.h> + +#include <mach/idle.h> + +#include <asm/plat-s3c24xx/s3c2410.h> +#include <asm/plat-s3c24xx/s3c2412.h> +#include <asm/plat-s3c24xx/clock.h> +#include <asm/plat-s3c24xx/devs.h> +#include <asm/plat-s3c24xx/cpu.h> + +static struct map_desc sx560_iodesc[] __initdata = { +}; + +static struct s3c2410_uartcfg sx560_uartcfgs[] __initdata = { + [0] = { + .hwport = 0, + .flags = 0, + .ucon = 0x3c5, + .ulcon = 0x03, + .ufcon = 0x51, + }, + [1] = { + .hwport = 1, + .flags = 0, + .ucon = 0x3c5, + .ulcon = 0x03, + .ufcon = 0x51, + }, + [2] = { + .hwport = 2, + .flags = 0, + .ucon = 0x3c5, + .ulcon = 0x03, + .ufcon = 0x51, + } +}; + +static struct platform_device *sx560_devices[] __initdata = { + &s3c_device_usb, + &s3c_device_wdt, + &s3c_device_rtc, + &s3c_device_i2c, + &s3c_device_spi0, + &s3c_device_usbgadget, + &s3c_device_sdi, +}; + +static void __init sx560_fixup(struct machine_desc *desc, + struct tag *tags, char **cmdline, + struct meminfo *mi) +{ + if (tags != phys_to_virt(S3C2410_SDRAM_PA + 0x100)) { + mi->nr_banks=1; + mi->bank[0].start = 0x30000000; + mi->bank[0].size = SZ_16M; + mi->bank[0].node = 0; + } +} + +static void __init sx560_map_io(void) +{ + s3c24xx_init_io(sx560_iodesc, ARRAY_SIZE(sx560_iodesc)); + s3c24xx_init_clocks(0); + s3c24xx_init_uarts(sx560_uartcfgs, ARRAY_SIZE(sx560_uartcfgs)); +} + +static void __init sx560_machine_init(void) +{ + /* Configure temperature sensor chip enable pin + * as output and disable the sensor */ + s3c2410_gpio_setpin(S3C2410_GPF3, 0); + s3c2410_gpio_cfgpin(S3C2410_GPF3, S3C2410_GPIO_OUTPUT); + + /* Configure SPI0 usage on pins GPE11, 12 and 13 */ + s3c2410_gpio_cfgpin(S3C2410_GPE13, S3C2410_GPE13_SPICLK0); + s3c2410_gpio_cfgpin(S3C2410_GPE12, S3C2410_GPE12_SPIMOSI0); + s3c2410_gpio_cfgpin(S3C2410_GPE11, S3C2410_GPE11_SPIMISO0); + s3c2410_gpio_pullup(S3C2410_GPE11, 0); + s3c2410_gpio_pullup(S3C2410_GPE13, 0); + + /* Turn off suspend for the selectable USB port and + * switch it to USB host mode. Turn on suspend for the + * host port since it is not connected on the SX-560. */ + s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST | + S3C2410_MISCCR_USBSUSPND0 | + S3C2410_MISCCR_USBSUSPND1, + S3C2410_MISCCR_USBHOST | + S3C2410_MISCCR_USBSUSPND0); + + platform_add_devices(sx560_devices, ARRAY_SIZE(sx560_devices)); +} + +MACHINE_START(SMDK2412, "SMDK2412") + /* Maintainer: Jose Goncalves <jose.goncalves@xxxxxxx> */ + .phys_io = S3C2410_PA_UART, + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, + .boot_params = S3C2410_SDRAM_PA + 0x100, + + .fixup = sx560_fixup, + .init_irq = s3c24xx_init_irq, + .map_io = sx560_map_io, + .init_machine = sx560_machine_init, + .timer = &s3c24xx_timer, +MACHINE_END diff -Naur linux-2.6.27.38.original/arch/arm/mach-s3c2412/Makefile linux-2.6.27.38/arch/arm/mach-s3c2412/Makefile --- linux-2.6.27.38.original/arch/arm/mach-s3c2412/Makefile 2009-10-22 08:22:46.000000000 +0100 +++ linux-2.6.27.38/arch/arm/mach-s3c2412/Makefile 2009-11-04 09:15:46.000000000 +0000 @@ -21,3 +21,4 @@ obj-$(CONFIG_MACH_JIVE) += mach-jive.o obj-$(CONFIG_MACH_SMDK2413) += mach-smdk2413.o obj-$(CONFIG_MACH_VSTMS) += mach-vstms.o +obj-$(CONFIG_MACH_SMDK2412) += mach-sx560.o

_______________________________________________ linux-arm mailing list linux-arm@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/linux-arm

_______________________________________________
linux-arm mailing list
linux-arm@xxxxxxxxxxxxxxxxxxx
http://lists.infradead.org/mailman/listinfo/linux-arm

[Linux ARM]     [Linux ARM MSM]     [Linux ARM Kernel]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

Add to Google Follow linuxarm on Twitter