Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2025e7f authored by Dirk Opfer's avatar Dirk Opfer Committed by Russell King
Browse files

[ARM] 3863/1: Add Locomo SPI Device



The Locomo chip has a SPI interface which is used for SD/MMC cards (only collie).
This patch adds the definition for the SPI device inside the Locomo chip.

Signed-off-by: default avatarDirk Opfer <Dirk@Opfer-Online.de>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 8d48427e
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -121,6 +121,13 @@ static struct locomo_dev_info locomo_devices[] = {
		.offset		= 0,
		.length		= 0,
	},
	{
		.devid		= LOCOMO_DEVID_SPI,
		.irq		= {},
		.name		= "locomo-spi",
		.offset		= LOCOMO_SPI,
		.length		= 0x30,
	},
};


@@ -374,7 +381,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc,
	struct irqdesc *d;
	void __iomem *mapbase = get_irq_chipdata(irq);

	req = locomo_readl(mapbase + LOCOMO_SPIIR) & 0x000F;
	req = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIR) & 0x000F;
	if (req) {
		irq = LOCOMO_IRQ_SPI_START;
		d = irq_desc + irq;
@@ -391,35 +398,35 @@ static void locomo_spi_ack_irq(unsigned int irq)
{
	void __iomem *mapbase = get_irq_chipdata(irq);
	unsigned int r;
	r = locomo_readl(mapbase + LOCOMO_SPIWE);
	r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIWE);
	r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START));
	locomo_writel(r, mapbase + LOCOMO_SPIWE);
	locomo_writel(r, mapbase + LOCOMO_SPI + LOCOMO_SPIWE);

	r = locomo_readl(mapbase + LOCOMO_SPIIS);
	r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIS);
	r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START));
	locomo_writel(r, mapbase + LOCOMO_SPIIS);
	locomo_writel(r, mapbase + LOCOMO_SPI + LOCOMO_SPIIS);

	r = locomo_readl(mapbase + LOCOMO_SPIWE);
	r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIWE);
	r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START));
	locomo_writel(r, mapbase + LOCOMO_SPIWE);
	locomo_writel(r, mapbase + LOCOMO_SPI + LOCOMO_SPIWE);
}

static void locomo_spi_mask_irq(unsigned int irq)
{
	void __iomem *mapbase = get_irq_chipdata(irq);
	unsigned int r;
	r = locomo_readl(mapbase + LOCOMO_SPIIE);
	r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
	r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START));
	locomo_writel(r, mapbase + LOCOMO_SPIIE);
	locomo_writel(r, mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
}

static void locomo_spi_unmask_irq(unsigned int irq)
{
	void __iomem *mapbase = get_irq_chipdata(irq);
	unsigned int r;
	r = locomo_readl(mapbase + LOCOMO_SPIIE);
	r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
	r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START));
	locomo_writel(r, mapbase + LOCOMO_SPIIE);
	locomo_writel(r, mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
}

static struct irq_chip locomo_spi_chip = {
+13 −11
Original line number Diff line number Diff line
@@ -54,17 +54,18 @@
#define	LOCOMO_DAC_SDAOEB	0x01	/* SDA pin output data       */

/* SPI interface */
#define LOCOMO_SPIMD	0x60		/* SPI mode setting */
#define LOCOMO_SPICT	0x64		/* SPI mode control */
#define LOCOMO_SPIST	0x68		/* SPI status */
#define LOCOMO_SPIIS	0x70		/* SPI interrupt status */
#define LOCOMO_SPIWE	0x74		/* SPI interrupt status write enable */
#define LOCOMO_SPIIE	0x78		/* SPI interrupt enable */
#define LOCOMO_SPIIR	0x7c		/* SPI interrupt request */
#define LOCOMO_SPITD	0x80		/* SPI transfer data write */
#define LOCOMO_SPIRD	0x84		/* SPI receive data read */
#define LOCOMO_SPITS	0x88		/* SPI transfer data shift */
#define LOCOMO_SPIRS	0x8C		/* SPI receive data shift */
#define LOCOMO_SPI	0x60
#define LOCOMO_SPIMD	0x00		/* SPI mode setting */
#define LOCOMO_SPICT	0x04		/* SPI mode control */
#define LOCOMO_SPIST	0x08		/* SPI status */
#define LOCOMO_SPIIS	0x10		/* SPI interrupt status */
#define LOCOMO_SPIWE	0x14		/* SPI interrupt status write enable */
#define LOCOMO_SPIIE	0x18		/* SPI interrupt enable */
#define LOCOMO_SPIIR	0x1c		/* SPI interrupt request */
#define LOCOMO_SPITD	0x20		/* SPI transfer data write */
#define LOCOMO_SPIRD	0x24		/* SPI receive data read */
#define LOCOMO_SPITS	0x28		/* SPI transfer data shift */
#define LOCOMO_SPIRS	0x2C		/* SPI receive data shift */
#define	LOCOMO_SPI_TEND	(1 << 3)	/* Transfer end bit */
#define	LOCOMO_SPI_OVRN	(1 << 2)	/* Over Run bit */
#define	LOCOMO_SPI_RFW	(1 << 1)	/* write buffer bit */
@@ -161,6 +162,7 @@ extern struct bus_type locomo_bus_type;
#define LOCOMO_DEVID_AUDIO	3
#define LOCOMO_DEVID_LED	4
#define LOCOMO_DEVID_UART	5
#define LOCOMO_DEVID_SPI		6

struct locomo_dev {
	struct device	dev;