SPI remains in read mode (infinitely) after giving command root@beagleboard:~# cat < /dev/spidev4.0

Hi,

We are using beagleboard xm in our project - we have configure our board for SPI4.0,also configured GPIO pin 16 as irq pin ,
The problem with this code is if we try to read spidev4.0 by giving command as root@beagleboard:~# cat < /dev/spidev4.0
it remains in read mode and reads the following data contineously.

[ 764.107574] read-8 00
[ 764.110321] read-8 00
[ 764.112579] read-8 00
[ 764.114868] read-8 00
[ 764.117340] read-8 00
[ 764.119628] read-8 00
[ 764.121917] read-8 00
[ 764.124389] read-8 00

Any suggestions to come out from this infinite loop from spi read

******************************************************************************************** CODE ********************************************************************************************

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

PATH => vim arch/arm/mach-omap2/board-omap3beagle.c

#define OMAP3BEAGLE_GPIO_GS_IRQ 16 /* Pin No. 16 (GPIO) is converted into irq */

static void __init omap3_beagle_config_mcspi4_mux(void)
{
omap_mux_init_signal(“mcbsp1_clkr.mcspi4_clk”, OMAP_PIN_INPUT);
omap_mux_init_signal(“mcbsp1_fsx.mcspi4_cs0”, OMAP_PIN_OUTPUT);
omap_mux_init_signal(“mcbsp1_dx.mcspi4_simo”, OMAP_PIN_OUTPUT);
omap_mux_init_signal(“mcbsp1_dr.mcspi4_somi”, OMAP_PIN_INPUT_PULLUP);
omap_mux_init_signal(“etk_d2.gpio_16”, OMAP_PIN_INPUT);
omap_mux_init_signal(“etk_d1.gpio_15”, OMAP_PIN_INPUT);
}

static struct spi_board_info beagle_mcspi_board_info[] __initdata = {
// spi 4.0
{
.modalias = “spidev”,
.max_speed_hz = 1000000, //1MHz
.bus_num = 4,
.chip_select = 0,
.mode = SPI_MODE_1,
.irq = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_GS_IRQ),
.controller_data = &beagle_mcspi_config,
},
};

static void __init omap3beagle_gs_init(void)
{
if ((gpio_request(OMAP3BEAGLE_GPIO_GS_IRQ, “GS_IRQ”) == 0) &&
(gpio_direction_input(OMAP3BEAGLE_GPIO_GS_IRQ) == 0)) {
gpio_export(OMAP3BEAGLE_GPIO_GS_IRQ, 0);
beagle_mcspi_board_info[0].irq = OMAP_GPIO_IRQ(OMAP3BEAGLE_GPIO_GS_IRQ);
set_irq_type(beagle_mcspi_board_info[0].irq, IRQ_TYPE_EDGE_BOTH);

printk(KERN_INFO “OMAP3BEAGLE_GPIO_GS_IRQ… registered …\n”);

} else {
printk(KERN_ERR “could not obtain gpio for GS_IRQ\n”);
return;
}
spi_register_board_info(beagle_mcspi_board_info,
ARRAY_SIZE(beagle_mcspi_board_info));
}

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

static unsigned
omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
{

if (word_len <= 8) {
u8 *rx;
const u8 *tx;

rx = xfer->rx_buf;
tx = xfer->tx_buf;

do {
c -= 1;
if (tx != NULL) {
if (mcspi_wait_for_reg_bit(chstat_reg,
OMAP2_MCSPI_CHSTAT_TXS) < 0) {
dev_err(&spi->dev, “TXS timed out\n”);
goto out;
}
#ifdef DBG_PRINT
printk(KERN_INFO “write-%d %02x\n”, word_len, *tx);
#endif
#ifdef VERBOSE
dev_dbg(&spi->dev, “write-%d %02x\n”,
word_len, *tx);
#endif
__raw_writel(tx++, tx_reg);
}
if (rx != NULL) {
if (mcspi_wait_for_reg_bit(chstat_reg,
OMAP2_MCSPI_CHSTAT_RXS) < 0) {
dev_err(&spi->dev, “RXS timed out\n”);
goto out;
}
/
prevent last RX_ONLY read from triggering

  • more word i/o: switch to rx+tx
    */
    if (c == 0 && tx == NULL)
    mcspi_write_chconf0(spi, l);
    *rx++ = __raw_readl(rx_reg);
    #ifdef VERBOSE
    dev_dbg(&spi->dev, “read-%d %02x\n”,
    word_len, *(rx - 1));
    #endif

#ifdef DBG_PRINT
printk(KERN_INFO “read-%d %02x\n”, word_len, *(rx - 1));
#endif

}

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX