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
|