Quantcast
Channel: Forum - Recent Threads
Viewing all articles
Browse latest Browse all 1583

RE: SPI chip select signal stay low too long

$
0
0

You would edit the file drivers/spi/spi-rspi.c

Then, you would make the following changes:

#include <linux/spinlock.h>

static int rspi_wait_for_interrupt(struct rspi_data *rspi, u8 wait_mask,
				   u8 enable_bit)
{
#ifdef DISABLE_IRQ_TEST
	while(1)
	{
		rspi->spsr = rspi_read8(rspi, RSPI_SPSR);
		if (rspi->spsr & wait_mask)
			return 0;
	}
#else
	int ret;

	rspi->spsr = rspi_read8(rspi, RSPI_SPSR);
	if (rspi->spsr & wait_mask)
		return 0;

	rspi_enable_irq(rspi, enable_bit);
	ret = wait_event_timeout(rspi->wait, rspi->spsr & wait_mask, HZ);
	if (ret == 0 && !(rspi->spsr & wait_mask))
		return -ETIMEDOUT;

	return 0;
#endif
}

#ifdef DISABLE_IRQ_TEST
static DEFINE_SPINLOCK(rspi_lock);
#endif
static int rspi_rz_transfer_one(struct spi_master *master,
				struct spi_device *spi,
				struct spi_transfer *xfer)
{
	struct rspi_data *rspi = spi_master_get_devdata(master);
	int ret;
#ifdef DISABLE_IRQ_TEST
	unsigned long flags;
#endif

#ifdef DISABLE_IRQ_TEST
	spin_lock_irqsave(&rspi_lock, flags);
#endif

	rspi_rz_receive_init(rspi);

//	return rspi_common_transfer(rspi, xfer);
	ret = rspi_common_transfer(rspi, xfer);

#ifdef DISABLE_IRQ_TEST
	spin_unlock_irqrestore(&rspi_lock, flags);
#endif
	return ret;
}


Viewing all articles
Browse latest Browse all 1583

Trending Articles