Here I post a detail of what I changed:
A) U-BOOT
I modified muxes in u-boot in the following file ~/board/omap3/
omap3517mcm1/omap3517mcm1.h
#define MUX_OMAP3517MCM1() \
...
MUX_VAL(CP(MCBSP1_CLKR), (IEN | PTD | DIS | M1)) /*MCSPI4_CLK */\
MUX_VAL(CP(MCBSP1_FSR), (IDIS | PTU | EN | M4)) /*GPIO_157*/\
MUX_VAL(CP(MCBSP1_DX), (IEN | PTD | DIS | M1)) /*MCSPI4_SIMO*/\
MUX_VAL(CP(MCBSP1_DR), (IEN | PTD | DIS | M1)) /*MCSPI4_SOMI*/\
MUX_VAL(CP(MCBSP_CLKS), (IEN | PTU | DIS | M4)) /*GPIO_160*/\
MUX_VAL(CP(MCBSP1_FSX), (IEN | PTD | EN | M1)) /*MCSPI4_CS0*/\
MUX_VAL(CP(MCBSP1_CLKX), (IEN | PTD | DIS | M4)) /*GPIO_162 */\
...
MUX_VAL(CP(MCSPI1_CLK), (IEN | PTD | DIS | M0)) /*McSPI1_CLK*/\
MUX_VAL(CP(MCSPI1_SIMO), (IEN | PTD | DIS | M0)) /*McSPI1_SIMO */\
MUX_VAL(CP(MCSPI1_SOMI), (IEN | PTD | DIS | M0)) /*McSPI1_SOMI */\
MUX_VAL(CP(MCSPI1_CS0), (IEN | PTD | EN | M0)) /*McSPI1_CS0*/\
MUX_VAL(CP(MCSPI1_CS1), (IEN | PTD | EN | M4)) /*GPIO_175*/\
/* TS_PEN_IRQ */\
MUX_VAL(CP(MCSPI1_CS2), (IEN | PTU | DIS | M4)) /*GPIO_176*/\
/* - LAN_INTR*/\
MUX_VAL(CP(MCSPI1_CS3), (IEN | PTD | EN | M0)) /*McSPI1_CS3*/\
...
Compiled everything and got u-boot running.
B) KERNEL
As I did in u-boot, I also changed muxing here in the kernel in the
following files:
~/kernel/arch/arm/mach-omap2/mux.h
enum omap34xx_index {
...
/* SPI1 */
AE14_3517_MCSPI1_CLK,
AD15_3517_MCSPI1_SIMO,
AC15_3517_MCSPI1_SOMI,
AB15_3517_MCSPI1_CS0,
AD14_3517_MCSPI1_CS1,
AE15_3517_MCSPI1_CS2,
AE16_3517_MCSPI1_CS3,
/* SPI 4 */
OMAP_3517_MCSPI4_CLK,
OMAP_3517_MCSPI4_SIMO,
OMAP_3517_MCSPI4_SOMI,
OMAP_3517_MCSPI4_CS0,
};
And in ~/kernel/arch/arm/mach-omap2/mux.c
#ifdef CONFIG_ARCH_OMAP34XX
static struct pin_config __initdata_or_module omap34xx_pins[] = {
...
/* MCSPI1 mux configuration */
MUX_CFG_34XX("AE14_3517_MCSPI1_CLK", 0x1c8,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("AD15_3517_MCSPI1_SIMO", 0x1ca,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("AC15_3517_MCSPI1_SOMI", 0x1cc,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
MUX_CFG_34XX("AB15_3517_MCSPI1_CS0", 0x1ce,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("AD14_3517_MCSPI1_CS1", 0x1d0,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("AE15_3517_MCSPI1_CS2", 0x1d2,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("AE16_3517_MCSPI1_CS3", 0x1d4,
OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
/* MCSPI4 mux configuration */
MUX_CFG_34XX("OMAP_3517_MCSPI4_CLK", 0x18c,
OMAP34XX_MUX_MODE1 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("OMAP_3517_MCSPI4_SIMO", 0x190,
OMAP34XX_MUX_MODE1 | OMAP34XX_PIN_OUTPUT)
MUX_CFG_34XX("OMAP_3517_MCSPI4_SOMI", 0x192,
OMAP34XX_MUX_MODE1 | OMAP34XX_PIN_INPUT_PULLUP)
MUX_CFG_34XX("OMAP_3517_MCSPI4_CS0", 0x196,
OMAP34XX_MUX_MODE1 | OMAP34XX_PIN_OUTPUT)
};
....
Alignment is maintained between the two files in fact I don't have any
muxing errors and the display is still working.
Then I also added/modified ~/kernel/arch/arm/mach-omap2/board-
omap3517mcm1.c
/*
* SPI
*/
static struct omap2_mcspi_device_config mcm1_mcspi1_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct omap2_mcspi_device_config mcm1_mcspi4_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct spi_board_info omap3517mcm1_spi_board_info[] __initdata
= {
[0] = {
.modalias = "spidev",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &mcm1_mcspi1_config,
.mode = SPI_MODE_0,
},
[1] = {
.modalias = "spidev",
.bus_num = 4,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &mcm1_mcspi4_config,
},
};
static void __init omap3517mcm1_mcspi_init(void)
{
// Configurating mux pins
omap_cfg_reg(AE14_3517_MCSPI1_CLK);
omap_cfg_reg(AD15_3517_MCSPI1_SIMO);
omap_cfg_reg(AC15_3517_MCSPI1_SOMI);
omap_cfg_reg(AB15_3517_MCSPI1_CS0);
omap_cfg_reg(AD14_3517_MCSPI1_CS1);
omap_cfg_reg(AE15_3517_MCSPI1_CS2);
omap_cfg_reg(AE16_3517_MCSPI1_CS3);
omap_cfg_reg(OMAP_3517_MCSPI4_CLK);
omap_cfg_reg(OMAP_3517_MCSPI4_SIMO);
omap_cfg_reg(OMAP_3517_MCSPI4_SOMI);
omap_cfg_reg(OMAP_3517_MCSPI4_CS0);
spi_register_board_info(omap3517mcm1_spi_board_info,
ARRAY_SIZE(omap3517mcm1_spi_board_info));
}
And called this function in the board initializations:
static void __init omap3517_mcm1_init(void)
{
...
omap3517mcm1_mcspi_init();
...
}
C) Finally in menuconfig I've added all the features I wanted for the
SPI to be included in the kernel (not as modules)
# CONFIG_SCSI_SPI_ATTRS is not set
CONFIG_SPI=y
CONFIG_SPI_DEBUG=y
CONFIG_SPI_MASTER=y
# SPI Master Controller Drivers
# CONFIG_SPI_BITBANG is not set
# CONFIG_SPI_GPIO is not set
CONFIG_SPI_OMAP24XX=y
# SPI Protocol Masters
CONFIG_SPI_SPIDEV=y
# CONFIG_SPI_TLE62X0 is not set
# SPI GPIO expanders:
# CONFIG_MMC_SPI is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
This is what I get from an egrep.
The crucial things ASAIK which need to be set are CONFIG_SPI,
CONFIG_SPI_MASTER, CONFIG_SPI_OMAP24XX and CONFIG_SPI_SPIDEV. The
problem is that in the end no devices such as spidev1.0 and spidev4.0
gets created by the kernel during boot in the dev folder.
I'd be so glad if you guys could help me out with this one,
thank you in advance,
best regards,
ivan