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

[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
...@@ -121,6 +121,13 @@ static struct locomo_dev_info locomo_devices[] = { ...@@ -121,6 +121,13 @@ static struct locomo_dev_info locomo_devices[] = {
.offset = 0, .offset = 0,
.length = 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, ...@@ -374,7 +381,7 @@ static void locomo_spi_handler(unsigned int irq, struct irqdesc *desc,
struct irqdesc *d; struct irqdesc *d;
void __iomem *mapbase = get_irq_chipdata(irq); 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) { if (req) {
irq = LOCOMO_IRQ_SPI_START; irq = LOCOMO_IRQ_SPI_START;
d = irq_desc + irq; d = irq_desc + irq;
...@@ -391,35 +398,35 @@ static void locomo_spi_ack_irq(unsigned int irq) ...@@ -391,35 +398,35 @@ static void locomo_spi_ack_irq(unsigned int irq)
{ {
void __iomem *mapbase = get_irq_chipdata(irq); void __iomem *mapbase = get_irq_chipdata(irq);
unsigned int r; unsigned int r;
r = locomo_readl(mapbase + LOCOMO_SPIWE); r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIWE);
r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START)); 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)); 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)); 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) static void locomo_spi_mask_irq(unsigned int irq)
{ {
void __iomem *mapbase = get_irq_chipdata(irq); void __iomem *mapbase = get_irq_chipdata(irq);
unsigned int r; unsigned int r;
r = locomo_readl(mapbase + LOCOMO_SPIIE); r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
r &= ~(0x0001 << (irq - LOCOMO_IRQ_SPI_START)); 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) static void locomo_spi_unmask_irq(unsigned int irq)
{ {
void __iomem *mapbase = get_irq_chipdata(irq); void __iomem *mapbase = get_irq_chipdata(irq);
unsigned int r; unsigned int r;
r = locomo_readl(mapbase + LOCOMO_SPIIE); r = locomo_readl(mapbase + LOCOMO_SPI + LOCOMO_SPIIE);
r |= (0x0001 << (irq - LOCOMO_IRQ_SPI_START)); 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 = { static struct irq_chip locomo_spi_chip = {
......
...@@ -54,17 +54,18 @@ ...@@ -54,17 +54,18 @@
#define LOCOMO_DAC_SDAOEB 0x01 /* SDA pin output data */ #define LOCOMO_DAC_SDAOEB 0x01 /* SDA pin output data */
/* SPI interface */ /* SPI interface */
#define LOCOMO_SPIMD 0x60 /* SPI mode setting */ #define LOCOMO_SPI 0x60
#define LOCOMO_SPICT 0x64 /* SPI mode control */ #define LOCOMO_SPIMD 0x00 /* SPI mode setting */
#define LOCOMO_SPIST 0x68 /* SPI status */ #define LOCOMO_SPICT 0x04 /* SPI mode control */
#define LOCOMO_SPIIS 0x70 /* SPI interrupt status */ #define LOCOMO_SPIST 0x08 /* SPI status */
#define LOCOMO_SPIWE 0x74 /* SPI interrupt status write enable */ #define LOCOMO_SPIIS 0x10 /* SPI interrupt status */
#define LOCOMO_SPIIE 0x78 /* SPI interrupt enable */ #define LOCOMO_SPIWE 0x14 /* SPI interrupt status write enable */
#define LOCOMO_SPIIR 0x7c /* SPI interrupt request */ #define LOCOMO_SPIIE 0x18 /* SPI interrupt enable */
#define LOCOMO_SPITD 0x80 /* SPI transfer data write */ #define LOCOMO_SPIIR 0x1c /* SPI interrupt request */
#define LOCOMO_SPIRD 0x84 /* SPI receive data read */ #define LOCOMO_SPITD 0x20 /* SPI transfer data write */
#define LOCOMO_SPITS 0x88 /* SPI transfer data shift */ #define LOCOMO_SPIRD 0x24 /* SPI receive data read */
#define LOCOMO_SPIRS 0x8C /* SPI receive data shift */ #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_TEND (1 << 3) /* Transfer end bit */
#define LOCOMO_SPI_OVRN (1 << 2) /* Over Run bit */ #define LOCOMO_SPI_OVRN (1 << 2) /* Over Run bit */
#define LOCOMO_SPI_RFW (1 << 1) /* write buffer bit */ #define LOCOMO_SPI_RFW (1 << 1) /* write buffer bit */
...@@ -161,6 +162,7 @@ extern struct bus_type locomo_bus_type; ...@@ -161,6 +162,7 @@ extern struct bus_type locomo_bus_type;
#define LOCOMO_DEVID_AUDIO 3 #define LOCOMO_DEVID_AUDIO 3
#define LOCOMO_DEVID_LED 4 #define LOCOMO_DEVID_LED 4
#define LOCOMO_DEVID_UART 5 #define LOCOMO_DEVID_UART 5
#define LOCOMO_DEVID_SPI 6
struct locomo_dev { struct locomo_dev {
struct device dev; struct device dev;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment