mirror of https://github.com/hak5/openwrt-owl.git
1138 lines
35 KiB
Diff
1138 lines
35 KiB
Diff
From acc2bc0cd419c176820d4a384eb36498a066366d Mon Sep 17 00:00:00 2001
|
|
From: Kurt Mahan <kmahan@freescale.com>
|
|
Date: Wed, 30 Apr 2008 14:20:48 -0600
|
|
Subject: [PATCH] DSPI support for M547x/M548x.
|
|
|
|
LTIBName: m547x-8x-dspi
|
|
Signed-off-by: Kurt Mahan <kmahan@freescale.com>
|
|
---
|
|
arch/m68k/coldfire/Makefile | 1 +
|
|
arch/m68k/coldfire/m547x_8x-devices.c | 150 +++++++++++++
|
|
drivers/spi/Makefile | 3 +-
|
|
drivers/spi/spi_coldfire.c | 382 ++++++++++++++++-----------------
|
|
include/asm-m68k/m5485dspi.h | 144 +++++++++++++
|
|
include/asm-m68k/mcfqspi.h | 1 +
|
|
include/asm-m68k/mcfsim.h | 1 +
|
|
7 files changed, 485 insertions(+), 197 deletions(-)
|
|
create mode 100644 arch/m68k/coldfire/m547x_8x-devices.c
|
|
create mode 100644 include/asm-m68k/m5485dspi.h
|
|
|
|
--- a/arch/m68k/coldfire/Makefile
|
|
+++ b/arch/m68k/coldfire/Makefile
|
|
@@ -10,4 +10,5 @@ endif
|
|
|
|
obj-$(CONFIG_PCI) += pci.o mcf5445x-pci.o iomap.o
|
|
obj-$(CONFIG_M54455) += mcf5445x-devices.o
|
|
+obj-$(CONFIG_M547X_8X) += m547x_8x-devices.o
|
|
obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
|
|
--- /dev/null
|
|
+++ b/arch/m68k/coldfire/m547x_8x-devices.c
|
|
@@ -0,0 +1,150 @@
|
|
+/*
|
|
+ * arch/m68k/coldfire/m547x_8x-devices.c
|
|
+ *
|
|
+ * Coldfire M547x/M548x Platform Device Configuration
|
|
+ *
|
|
+ * Copyright (c) 2008 Freescale Semiconductor, Inc.
|
|
+ * Kurt Mahan <kmahan@freescale.com>
|
|
+ */
|
|
+#include <linux/module.h>
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/init.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/fsl_devices.h>
|
|
+#include <linux/spi/spi.h>
|
|
+
|
|
+#include <asm/coldfire.h>
|
|
+#include <asm/mcfsim.h>
|
|
+#include <asm/mcfqspi.h>
|
|
+
|
|
+
|
|
+#ifdef CONFIG_SPI
|
|
+/*
|
|
+ *
|
|
+ * DSPI
|
|
+ *
|
|
+ */
|
|
+
|
|
+/* number of supported SPI selects */
|
|
+#define SPI_NUM_CHIPSELECTS 4
|
|
+
|
|
+void coldfire_spi_cs_control(u8 cs, u8 command)
|
|
+{
|
|
+ /* nothing special required */
|
|
+}
|
|
+
|
|
+static struct spi_board_info spi_board_info[] = {
|
|
+ /* no board info */
|
|
+};
|
|
+
|
|
+static int spi_irq_list[] = {
|
|
+ /* IRQ, ICR Offset, ICR Val, Mask */
|
|
+ 64 + ISC_DSPI_OVRFW, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_RFOF, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_RFDF, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_TFUF, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_TCF, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_TFFF, 0, 0, 0,
|
|
+ 64 + ISC_DSPI_EOQF, 0, 0, 0,
|
|
+ 0,0,0,0,
|
|
+};
|
|
+
|
|
+static struct coldfire_spi_master coldfire_master_info = {
|
|
+ .bus_num = 1,
|
|
+ .num_chipselect = SPI_NUM_CHIPSELECTS,
|
|
+ .irq_list = spi_irq_list,
|
|
+ .irq_source = 0, /* not used */
|
|
+ .irq_vector = 0, /* not used */
|
|
+ .irq_mask = 0, /* not used */
|
|
+ .irq_lp = 0, /* not used */
|
|
+ .par_val = 0, /* not used */
|
|
+ .cs_control = coldfire_spi_cs_control,
|
|
+};
|
|
+
|
|
+static struct resource coldfire_spi_resources[] = {
|
|
+ [0] = {
|
|
+ .name = "spi-par",
|
|
+ .start = MCF_MBAR + 0x00000a50, /* PAR_DSPI */
|
|
+ .end = MCF_MBAR + 0x00000a50, /* PAR_DSPI */
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [1] = {
|
|
+ .name = "spi-module",
|
|
+ .start = MCF_MBAR + 0x00008a00, /* DSPI MCR Base */
|
|
+ .end = MCF_MBAR + 0x00008ab8, /* DSPI mem map end */
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [2] = {
|
|
+ .name = "spi-int-level",
|
|
+ .start = MCF_MBAR + 0x740, /* ICR start */
|
|
+ .end = MCF_MBAR + 0x740 + ISC_DSPI_EOQF, /* ICR end */
|
|
+ .flags = IORESOURCE_MEM
|
|
+ },
|
|
+
|
|
+ [3] = {
|
|
+ .name = "spi-int-mask",
|
|
+ .start = MCF_MBAR + 0x70c, /* IMRL */
|
|
+ .end = MCF_MBAR + 0x70c, /* IMRL */
|
|
+ .flags = IORESOURCE_MEM
|
|
+ }
|
|
+};
|
|
+
|
|
+static struct platform_device coldfire_spi = {
|
|
+ .name = "spi_coldfire",
|
|
+ .id = -1,
|
|
+ .resource = coldfire_spi_resources,
|
|
+ .num_resources = ARRAY_SIZE(coldfire_spi_resources),
|
|
+ .dev = {
|
|
+ .platform_data = &coldfire_master_info,
|
|
+ }
|
|
+};
|
|
+
|
|
+/**
|
|
+ * m547x_8x_spi_init - Initialize SPI
|
|
+ */
|
|
+static int __init m547x_8x_spi_init(void)
|
|
+{
|
|
+ int retval;
|
|
+
|
|
+ /* initialize the DSPI PAR */
|
|
+ MCF_GPIO_PAR_DSPI = (MCF_GPIO_PAR_DSPI_PAR_CS5 |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_SCK_SCK |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_SIN_SIN |
|
|
+ MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT);
|
|
+
|
|
+ /* register device */
|
|
+ retval = platform_device_register(&coldfire_spi);
|
|
+ if (retval < 0) {
|
|
+ printk(KERN_ERR "SPI-m547x_8x: platform_device_register failed with code=%d\n", retval);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ /* register board info */
|
|
+ if (ARRAY_SIZE(spi_board_info))
|
|
+ retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
|
|
+
|
|
+out:
|
|
+ return retval;
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+/**
|
|
+ * m547x_8x_init_devices - Initialize M547X_8X devices
|
|
+ *
|
|
+ * Returns 0 on success.
|
|
+ */
|
|
+static int __init m547x_8x_init_devices(void)
|
|
+{
|
|
+#ifdef CONFIG_SPI
|
|
+ m547x_8x_spi_init();
|
|
+#endif
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+arch_initcall(m547x_8x_init_devices);
|
|
--- a/drivers/spi/Makefile
|
|
+++ b/drivers/spi/Makefile
|
|
@@ -18,7 +18,8 @@ obj-$(CONFIG_SPI_BFIN) += spi_bfin5xx.
|
|
obj-$(CONFIG_SPI_BITBANG) += spi_bitbang.o
|
|
obj-$(CONFIG_SPI_AU1550) += au1550_spi.o
|
|
obj-$(CONFIG_SPI_BUTTERFLY) += spi_butterfly.o
|
|
-obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o
|
|
+# obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o spi-m5445x.o
|
|
+obj-$(CONFIG_SPI_COLDFIRE) += spi_coldfire.o
|
|
obj-$(CONFIG_SPI_GPIO) += spi_gpio.o
|
|
obj-$(CONFIG_SPI_IMX) += spi_imx.o
|
|
obj-$(CONFIG_SPI_LM70_LLP) += spi_lm70llp.o
|
|
--- a/drivers/spi/spi_coldfire.c
|
|
+++ b/drivers/spi/spi_coldfire.c
|
|
@@ -1,29 +1,39 @@
|
|
-/****************************************************************************/
|
|
-
|
|
/*
|
|
- * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
|
|
+ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
|
|
+ *
|
|
*
|
|
* (C) Copyright 2005, Intec Automation,
|
|
* Mike Lavender (mike@steroidmicros)
|
|
*
|
|
- * (C) Copyright 2007, Freescale Inc,
|
|
- * Yaroslav Vinogradov (yaroslav.vinogradov@freescale.com)
|
|
+ * (C) Copyright 2007-2008, Freescale Inc,
|
|
+ * Yaroslav Vinogradov
|
|
+ * Andrey Butok
|
|
+ * Kurt Mahan
|
|
*
|
|
-
|
|
- This program is free software; you can redistribute it and/or modify
|
|
- it under the terms of the GNU General Public License as published by
|
|
- the Free Software Foundation; either version 2 of the License, or
|
|
- (at your option) any later version.
|
|
-
|
|
- This program is distributed in the hope that it will be useful,
|
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
- GNU General Public License for more details.
|
|
-
|
|
- You should have received a copy of the GNU General Public License
|
|
- along with this program; if not, write to the Free Software
|
|
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|
-/* ------------------------------------------------------------------------- */
|
|
+ * This program is free software; you can redistribute it and/or modify it
|
|
+ * under the terms of the GNU General Public License as published by the
|
|
+ * Free Software Foundation; either version 2 of the License, or (at your
|
|
+ * option) any later version.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful,
|
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ * GNU General Public License for more details.
|
|
+ *
|
|
+ * You should have received a copy of the GNU General Public License
|
|
+ * along with this program; if not, write to the Free Software
|
|
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
+ *
|
|
+ ***************************************************************************
|
|
+ * Changes:
|
|
+ * v0.003 12 February 2008 Andrey Butok, Freescale Semiconductor
|
|
+ * Added suport of MCF5227x DSPI module.
|
|
+ * v0.002 2007 Yaroslav Vinogradov, Freescale Semiconductor
|
|
+ * Added suport of MCF5445x DSPI module.
|
|
+ * v0.001 2005 Mike Lavender, Intec Automation,
|
|
+ * Intial version. Coldfire QSPI master driver.
|
|
+ *
|
|
+ */
|
|
|
|
|
|
/****************************************************************************/
|
|
@@ -46,41 +56,52 @@
|
|
#include <asm/mcfsim.h>
|
|
#include <asm/mcfqspi.h>
|
|
#include <asm/coldfire.h>
|
|
-#include <asm/virtconvert.h>
|
|
|
|
#if defined(CONFIG_M54455)
|
|
+ #include <asm/virtconvert.h>
|
|
+
|
|
#define SPI_DSPI
|
|
#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
|
|
#define SPI_DSPI_EDMA
|
|
#ifdef CONFIG_MMU
|
|
#define SPI_USE_MMU
|
|
#endif
|
|
+ #include <asm/mcf5445x_edma.h>
|
|
#endif
|
|
+
|
|
+ #include <asm/mcf5445x_dspi.h>
|
|
#endif
|
|
|
|
-#ifdef SPI_DSPI
|
|
-#include <asm/mcf5445x_dspi.h>
|
|
+#if defined(CONFIG_M547X_8X)
|
|
+ #define SPI_DSPI
|
|
+
|
|
+ #include <asm/virtconvert.h>
|
|
+ #include <asm/m5485dspi.h>
|
|
+#endif
|
|
|
|
+#ifdef CONFIG_M5227x
|
|
+ #define SPI_DSPI
|
|
|
|
+ #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
|
|
+ #define SPI_DSPI_EDMA
|
|
+ #endif
|
|
#endif
|
|
|
|
+
|
|
#if defined(SPI_DSPI_EDMA)
|
|
|
|
/* edma buffer size in transfer units (32bits) */
|
|
#define EDMA_BUFFER_SIZE (PAGE_SIZE/4)
|
|
-#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4)
|
|
-
|
|
-#define DSPI_DMA_RX_TCD 12
|
|
-#define DSPI_DMA_TX_TCD 13
|
|
+#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4)
|
|
|
|
+#define DSPI_DMA_RX_TCD MCF_EDMA_CHAN_DSPI_RX
|
|
+#define DSPI_DMA_TX_TCD MCF_EDMA_CHAN_DSPI_TX
|
|
|
|
-#include <asm/coldfire_edma.h>
|
|
-#include <asm/mcf5445x_edma.h>
|
|
+#include <asm/mcf_edma.h>
|
|
#endif
|
|
|
|
-
|
|
MODULE_AUTHOR("Mike Lavender");
|
|
-MODULE_DESCRIPTION("ColdFire QSPI Contoller");
|
|
+MODULE_DESCRIPTION("ColdFire SPI Contoller");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
#define DRIVER_NAME "Coldfire QSPI/DSPI"
|
|
@@ -92,7 +113,6 @@ MODULE_LICENSE("GPL");
|
|
*/
|
|
|
|
#define QSPI_RAM_SIZE 0x10 /* 16 word table */
|
|
-
|
|
#define QSPI_TRANSMIT_RAM 0x00
|
|
#define QSPI_RECEIVE_RAM 0x10
|
|
#define QSPI_COMMAND_RAM 0x20
|
|
@@ -296,13 +316,10 @@ struct driver_data {
|
|
u32 *dspi_rser; /* DSPI RSER register */
|
|
u32 *dspi_sr; /* DSPI status register */
|
|
u8 dspi_ctas; /* DSPI CTAS value*/
|
|
-
|
|
#if defined(SPI_DSPI_EDMA)
|
|
void* edma_tx_buf;
|
|
void* edma_rx_buf;
|
|
#endif
|
|
-
|
|
-
|
|
#else
|
|
u16 *qmr; /* QSPI mode register */
|
|
u16 *qdlyr; /* QSPI delay register */
|
|
@@ -312,7 +329,11 @@ struct driver_data {
|
|
u16 *qdr; /* QSPI data register */
|
|
u16 *qcr; /* QSPI command register */
|
|
#endif
|
|
+#if defined(CONFIG_M532x) || defined(CONFIG_M537x)
|
|
+ u16 *par; /* Pin assignment register */
|
|
+#else
|
|
u8 *par; /* Pin assignment register */
|
|
+#endif
|
|
u8 *int_icr; /* Interrupt level and priority register */
|
|
u32 *int_mr; /* Interrupt mask register */
|
|
void (*cs_control)(u8 cs, u8 command);
|
|
@@ -327,8 +348,6 @@ struct driver_data {
|
|
* SPI local functions
|
|
*/
|
|
|
|
-//#define SPI_COLDFIRE_DEBUG
|
|
-
|
|
static void *next_transfer(struct driver_data *drv_data)
|
|
{
|
|
struct spi_message *msg = drv_data->cur_msg;
|
|
@@ -387,11 +406,9 @@ static int write(struct driver_data *drv
|
|
int tx_word;
|
|
|
|
#if defined(SPI_DSPI)
|
|
-
|
|
#if defined(SPI_DSPI_EDMA)
|
|
u32* edma_wr;
|
|
#endif
|
|
-
|
|
u16 d16;
|
|
u8 d8;
|
|
u32 dspi_pushr;
|
|
@@ -400,9 +417,9 @@ static int write(struct driver_data *drv
|
|
|
|
tx_word = is_word_transfer(drv_data);
|
|
|
|
- // If we are in word mode, but only have a single byte to transfer
|
|
- // then switch to byte mode temporarily. Will switch back at the
|
|
- // end of the transfer.
|
|
+ /* If we are in word mode, but only have a single byte to transfer
|
|
+ * then switch to byte mode temporarily. Will switch back at the
|
|
+ * end of the transfer. */
|
|
if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
|
|
drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
|
|
set_8bit_transfer_mode(drv_data);
|
|
@@ -411,12 +428,10 @@ static int write(struct driver_data *drv
|
|
|
|
|
|
#if defined(SPI_DSPI)
|
|
-
|
|
#if defined(SPI_DSPI_EDMA)
|
|
edma_wr = (u32*)(drv_data->edma_tx_buf);
|
|
#endif
|
|
|
|
-
|
|
#if defined(SPI_DSPI_EDMA)
|
|
while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) {
|
|
#else
|
|
@@ -432,19 +447,16 @@ static int write(struct driver_data *drv
|
|
}
|
|
|
|
dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16)
|
|
- | DSPI_CS(drv_data->cs)
|
|
- | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
|
|
- //| MCF_DSPI_DTFR_CONT
|
|
- ;
|
|
-
|
|
+ | DSPI_CS(drv_data->cs)
|
|
+ | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas);
|
|
drv_data->tx += 2;
|
|
|
|
#if defined(SPI_DSPI_EDMA)
|
|
if (drv_data->tx == drv_data->tx_end || tx_count==EDMA_BUFFER_SIZE-1) {
|
|
-#else
|
|
+#else
|
|
if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) {
|
|
-#endif
|
|
- // last transfer in queue
|
|
+#endif
|
|
+ /* last transfer in the queue */
|
|
dspi_pushr |= MCF_DSPI_DTFR_EOQ;
|
|
if (drv_data->cs_change) {
|
|
dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
|
|
@@ -453,14 +465,13 @@ static int write(struct driver_data *drv
|
|
|
|
if (first) {
|
|
first = 0;
|
|
- dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
|
|
+ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
|
|
}
|
|
#if defined(SPI_DSPI_EDMA)
|
|
*edma_wr = dspi_pushr;
|
|
- edma_wr++;
|
|
+ edma_wr++;
|
|
#else
|
|
*drv_data->dspi_dtfr = dspi_pushr;
|
|
- //MCF_DSPI_DTFR = dspi_pushr;
|
|
#endif
|
|
|
|
|
|
@@ -473,14 +484,13 @@ static int write(struct driver_data *drv
|
|
|
|
dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8)
|
|
| DSPI_CS(drv_data->cs)
|
|
- /* | MCF_DSPI_DTFR_PCS5 | */
|
|
| MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
|
|
| MCF_DSPI_DTFR_CONT;
|
|
|
|
drv_data->tx++;
|
|
|
|
if (drv_data->tx == drv_data->tx_end || tx_count==DSPI_FIFO_SIZE-1) {
|
|
- // last transfer in queue
|
|
+ /* last transfer in the queue */
|
|
dspi_pushr |= MCF_DSPI_DTFR_EOQ;
|
|
if (drv_data->cs_change) {
|
|
dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
|
|
@@ -489,16 +499,15 @@ static int write(struct driver_data *drv
|
|
|
|
if (first) {
|
|
first = 0;
|
|
- dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
|
|
+ dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
|
|
}
|
|
|
|
#if defined(SPI_DSPI_EDMA)
|
|
*edma_wr = dspi_pushr;
|
|
- edma_wr++;
|
|
-#else
|
|
+ edma_wr++;
|
|
+#else
|
|
*drv_data->dspi_dtfr = dspi_pushr;
|
|
- //MCF_DSPI_DTFR = dspi_pushr;
|
|
-#endif
|
|
+#endif
|
|
|
|
}
|
|
tx_count++;
|
|
@@ -508,8 +517,8 @@ static int write(struct driver_data *drv
|
|
|
|
if (tx_count>0) {
|
|
|
|
- // TODO: initiate eDMA transfer
|
|
- set_edma_params(DSPI_DMA_TX_TCD,
|
|
+ /* TBD: initiate eDMA transfer */
|
|
+ mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD,
|
|
#ifdef SPI_USE_MMU
|
|
virt_to_phys(drv_data->edma_tx_buf),
|
|
#else
|
|
@@ -517,18 +526,18 @@ static int write(struct driver_data *drv
|
|
#endif
|
|
(u32)drv_data->dspi_dtfr,
|
|
MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
|
|
- 4, // soff
|
|
- 4, // nbytes
|
|
- 0, // slast
|
|
- tx_count, // citer
|
|
- tx_count, // biter
|
|
- 0, // doff
|
|
- 0, // dlastsga
|
|
- 0, // major_int
|
|
- 1 // disable_req
|
|
+ 4, /* soff */
|
|
+ 4, /* nbytes */
|
|
+ 0, /* slast */
|
|
+ tx_count, /* citer */
|
|
+ tx_count, /* biter */
|
|
+ 0, /* doff */
|
|
+ 0, /* dlastsga */
|
|
+ 0, /* major_int */
|
|
+ 1 /* disable_req */
|
|
);
|
|
|
|
- set_edma_params(DSPI_DMA_RX_TCD,
|
|
+ mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD,
|
|
(u32)drv_data->dspi_drfr,
|
|
#ifdef SPI_USE_MMU
|
|
virt_to_phys(drv_data->edma_rx_buf),
|
|
@@ -536,20 +545,20 @@ static int write(struct driver_data *drv
|
|
drv_data->edma_rx_buf,
|
|
#endif
|
|
MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
|
|
- 0, // soff
|
|
- 4, // nbytes
|
|
- 0, // slast
|
|
- tx_count, // citer
|
|
- tx_count, // biter
|
|
- 4, // doff
|
|
- 0, // dlastsga
|
|
- 0, // major_int
|
|
- 1 // disable_req
|
|
+ 0, /* soff */
|
|
+ 4, /* nbytes */
|
|
+ 0, /* slast */
|
|
+ tx_count, /* citer */
|
|
+ tx_count, /* biter */
|
|
+ 4, /* doff */
|
|
+ 0, /* dlastsga */
|
|
+ 0, /* major_int */
|
|
+ 1 /* disable_req */
|
|
);
|
|
|
|
|
|
- start_edma_transfer(DSPI_DMA_TX_TCD); // transmit SPI data
|
|
- start_edma_transfer(DSPI_DMA_RX_TCD); // receive SPI data
|
|
+ start_edma_transfer(DSPI_DMA_TX_TCD); /* transmit SPI data */
|
|
+ start_edma_transfer(DSPI_DMA_RX_TCD); /* receive SPI data */
|
|
}
|
|
#endif
|
|
|
|
@@ -583,9 +592,9 @@ static int write(struct driver_data *drv
|
|
| QCR_CONT
|
|
| (~((0x01 << drv_data->cs) << 8) & 0x0F00);
|
|
|
|
- if ( (cmd_count == tx_count - 1)
|
|
- && (drv_data->tx == drv_data->tx_end)
|
|
- && (drv_data->cs_change) ) {
|
|
+ if ( (cmd_count == tx_count - 1)
|
|
+ && (drv_data->tx == drv_data->tx_end)
|
|
+ && (drv_data->cs_change) ) {
|
|
qcr &= ~QCR_CONT;
|
|
}
|
|
*drv_data->qcr = qcr;
|
|
@@ -613,7 +622,6 @@ static int read(struct driver_data *drv_
|
|
rx_word = is_word_transfer(drv_data);
|
|
|
|
#if defined(SPI_DSPI)
|
|
-
|
|
#if defined(SPI_DSPI_EDMA)
|
|
rx_edma = (u32*) drv_data->edma_tx_buf;
|
|
while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) {
|
|
@@ -646,10 +654,7 @@ static int read(struct driver_data *drv_
|
|
}
|
|
rx_count++;
|
|
}
|
|
-
|
|
-
|
|
#else
|
|
-
|
|
*drv_data->qar = QSPI_RECEIVE_RAM;
|
|
while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) {
|
|
if (rx_word) {
|
|
@@ -680,19 +685,18 @@ static inline void qspi_setup_chip(struc
|
|
|
|
*drv_data->mcr = chip->mcr_val;
|
|
|
|
- // TODO: remove later
|
|
+ /* TBD: remove later */
|
|
+/* JKM -- validate */
|
|
chip->ctar_val = 0x78560118;
|
|
|
|
*drv_data->ctar = chip->ctar_val;
|
|
*drv_data->dspi_rser = 0
|
|
- | MCF_DSPI_DRSER_EOQFE
|
|
+ | MCF_DSPI_DRSER_EOQFE
|
|
#if defined(SPI_DSPI_EDMA)
|
|
- | MCF_DSPI_DRSER_TFFFE
|
|
- | MCF_DSPI_DRSER_TFFFS
|
|
+ | MCF_DSPI_DRSER_TFFFE
|
|
+ | MCF_DSPI_DRSER_TFFFS
|
|
#endif
|
|
- ;
|
|
-
|
|
-
|
|
+ ;
|
|
#else
|
|
*drv_data->qmr = chip->qmr_val;
|
|
*drv_data->qdlyr = chip->qdlyr_val;
|
|
@@ -770,7 +774,6 @@ static irqreturn_t qspi_interrupt(int ir
|
|
* transfer tasklet
|
|
*/
|
|
if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) {
|
|
- //*drv_data->qmr &= ~QMR_BITS;
|
|
set_16bit_transfer_mode(drv_data);
|
|
}
|
|
|
|
@@ -857,10 +860,8 @@ static void pump_transfers(unsigned long
|
|
if (message->state == START_STATE) {
|
|
qspi_setup_chip(drv_data);
|
|
|
|
- if (drv_data->cs_control) {
|
|
- //printk( "m s\n" );
|
|
- drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
|
|
- }
|
|
+ if (drv_data->cs_control)
|
|
+ drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
|
|
}
|
|
|
|
/* Delay if requested at end of transfer*/
|
|
@@ -902,12 +903,12 @@ static void pump_transfers(unsigned long
|
|
}
|
|
|
|
|
|
-static void pump_messages(struct work_struct * work)
|
|
+static void pump_messages(struct work_struct *work)
|
|
{
|
|
struct driver_data *drv_data;
|
|
unsigned long flags;
|
|
|
|
- drv_data = container_of(work, struct driver_data, pump_messages);
|
|
+ drv_data = container_of(work, struct driver_data, pump_messages);
|
|
|
|
/* Lock queue and check for queue work */
|
|
spin_lock_irqsave(&drv_data->lock, flags);
|
|
@@ -1002,7 +1003,7 @@ static int setup(struct spi_device *spi)
|
|
chip->mcr.cont_scke = 0;
|
|
chip->mcr.dconf = 0;
|
|
chip->mcr.frz = 0;
|
|
- chip->mcr.mtfe = 1;
|
|
+ chip->mcr.mtfe = 0;
|
|
chip->mcr.pcsse = 0;
|
|
chip->mcr.rooe = 0;
|
|
chip->mcr.pcsis = 0xFF;
|
|
@@ -1019,7 +1020,7 @@ static int setup(struct spi_device *spi)
|
|
if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
|
|
chip->ctar.fmsz = spi->bits_per_word-1;
|
|
} else {
|
|
- printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
|
|
+ printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
|
|
kfree(chip);
|
|
return -ENODEV;
|
|
}
|
|
@@ -1056,9 +1057,9 @@ static int setup(struct spi_device *spi)
|
|
|
|
#else
|
|
|
|
- chip->qwr.csiv = 1; // Chip selects are active low
|
|
- chip->qmr.master = 1; // Must set to master mode
|
|
- chip->qmr.dohie = 1; // Data output high impediance enabled
|
|
+ chip->qwr.csiv = 1; /* Chip selects are active low */
|
|
+ chip->qmr.master = 1; /* Must set to master mode */
|
|
+ chip->qmr.dohie = 1; /* Data output high impediance enabled */
|
|
chip->void_write_data = chip_info->void_write_data;
|
|
|
|
chip->qdlyr.qcd = chip_info->del_cs_to_clk;
|
|
@@ -1075,8 +1076,8 @@ static int setup(struct spi_device *spi)
|
|
|
|
chip->qmr.baud = baud_divisor;
|
|
|
|
- //printk( "QSPI: spi->max_speed_hz %d\n", spi->max_speed_hz );
|
|
- //printk( "QSPI: Baud set to %d\n", chip->qmr.baud );
|
|
+ /*printk( "SPI: spi->max_speed_hz %d\n", spi->max_speed_hz );*/
|
|
+ /*printk( "SPI: Baud set to %d\n", chip->qmr.baud );*/
|
|
|
|
if (spi->mode & SPI_CPHA)
|
|
chip->qmr.cpha = 1;
|
|
@@ -1089,7 +1090,7 @@ static int setup(struct spi_device *spi)
|
|
} else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) {
|
|
chip->qmr.bits = spi->bits_per_word;
|
|
} else {
|
|
- printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
|
|
+ printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
|
|
kfree(chip);
|
|
return -ENODEV;
|
|
}
|
|
@@ -1112,7 +1113,7 @@ static int init_queue(struct driver_data
|
|
tasklet_init(&drv_data->pump_transfers,
|
|
pump_transfers, (unsigned long)drv_data);
|
|
|
|
- INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/);
|
|
+ INIT_WORK(&drv_data->pump_messages, pump_messages);
|
|
|
|
drv_data->workqueue = create_singlethread_workqueue(
|
|
drv_data->master->dev.parent->bus_id);
|
|
@@ -1185,7 +1186,7 @@ static int destroy_queue(struct driver_d
|
|
}
|
|
|
|
|
|
-static void cleanup(const struct spi_device *spi)
|
|
+static void cleanup(struct spi_device *spi)
|
|
{
|
|
struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
|
|
|
|
@@ -1213,11 +1214,7 @@ static int coldfire_spi_probe(struct pla
|
|
int status = 0;
|
|
int i;
|
|
|
|
-#if defined(SPI_DSPI_EDMA)
|
|
- init_edma();
|
|
-#endif
|
|
-
|
|
- platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
|
|
+ platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
|
|
|
|
master = spi_alloc_master(dev, sizeof(struct driver_data));
|
|
if (!master)
|
|
@@ -1241,7 +1238,7 @@ static int coldfire_spi_probe(struct pla
|
|
drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
|
|
|
|
/* Setup register addresses */
|
|
- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-module");
|
|
+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-module");
|
|
if (!memory_resource) {
|
|
dev_dbg(dev, "can not find platform module memory\n");
|
|
goto out_error_master_alloc;
|
|
@@ -1259,13 +1256,13 @@ static int coldfire_spi_probe(struct pla
|
|
dev_dbg(dev, "cannot allocate eDMA RX memory\n");
|
|
goto out_error_master_alloc;
|
|
}
|
|
-#endif
|
|
+#endif
|
|
|
|
#if defined(SPI_DSPI)
|
|
|
|
- drv_data->mcr = (void *)(memory_resource->start + 0x00000000);
|
|
- drv_data->ctar = (void *)(memory_resource->start + 0x0000000C);
|
|
- drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C);
|
|
+ drv_data->mcr = (void *)(memory_resource->start + 0x00000000);
|
|
+ drv_data->ctar = (void *)(memory_resource->start + 0x0000000C);
|
|
+ drv_data->dspi_sr = (void *)(memory_resource->start + 0x0000002C);
|
|
drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030);
|
|
drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034);
|
|
drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038);
|
|
@@ -1283,7 +1280,7 @@ static int coldfire_spi_probe(struct pla
|
|
#endif
|
|
|
|
/* Setup register addresses */
|
|
- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-par");
|
|
+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-par");
|
|
if (!memory_resource) {
|
|
dev_dbg(dev, "can not find platform par memory\n");
|
|
goto out_error_master_alloc;
|
|
@@ -1292,7 +1289,7 @@ static int coldfire_spi_probe(struct pla
|
|
drv_data->par = (void *)memory_resource->start;
|
|
|
|
/* Setup register addresses */
|
|
- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-level");
|
|
+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-level");
|
|
if (!memory_resource) {
|
|
dev_dbg(dev, "can not find platform par memory\n");
|
|
goto out_error_master_alloc;
|
|
@@ -1301,7 +1298,7 @@ static int coldfire_spi_probe(struct pla
|
|
drv_data->int_icr = (void *)memory_resource->start;
|
|
|
|
/* Setup register addresses */
|
|
- memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-mask");
|
|
+ memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-mask");
|
|
if (!memory_resource) {
|
|
dev_dbg(dev, "can not find platform par memory\n");
|
|
goto out_error_master_alloc;
|
|
@@ -1309,32 +1306,52 @@ static int coldfire_spi_probe(struct pla
|
|
|
|
drv_data->int_mr = (void *)memory_resource->start;
|
|
|
|
- irq = platform_info->irq_vector;
|
|
+ if (platform_info->irq_list) {
|
|
+ /* multiple IRQs */
|
|
+ int *irqlist = platform_info->irq_list;
|
|
+ while ((irq = *irqlist++)) {
|
|
+ int off = *irqlist++;
|
|
+ int lvl = *irqlist++;
|
|
+ int msk = *irqlist++;
|
|
+ status = request_irq(irq, qspi_interrupt, IRQF_DISABLED,
|
|
+ dev->bus_id, drv_data);
|
|
+ if (status < 0) {
|
|
+ dev_err(&pdev->dev,
|
|
+ "unable to attach ColdFire DSPI interrupt\n");
|
|
+ goto out_error_master_alloc;
|
|
+ }
|
|
+
|
|
+ if (lvl)
|
|
+ *(drv_data->int_icr + off) = lvl;
|
|
|
|
- status = request_irq(platform_info->irq_vector, qspi_interrupt, IRQF_DISABLED, dev->bus_id, drv_data);
|
|
- if (status < 0) {
|
|
- dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
|
|
- goto out_error_master_alloc;
|
|
+ if (msk)
|
|
+ *drv_data->int_mr &= ~msk;
|
|
+ }
|
|
}
|
|
+ else {
|
|
+ irq = platform_info->irq_vector;
|
|
|
|
- /* Now that we have all the addresses etc. Let's set it up */
|
|
- // TODO:
|
|
- //*drv_data->par = platform_info->par_val;
|
|
+ status = request_irq(platform_info->irq_vector, qspi_interrupt,
|
|
+ IRQF_DISABLED, dev->bus_id, drv_data);
|
|
+ if (status < 0) {
|
|
+ dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
|
|
+ goto out_error_master_alloc;
|
|
+ }
|
|
|
|
- MCF_GPIO_PAR_DSPI = 0
|
|
- | MCF_GPIO_PAR_DSPI_PCS5_PCS5
|
|
- | MCF_GPIO_PAR_DSPI_PCS2_PCS2
|
|
- | MCF_GPIO_PAR_DSPI_PCS1_PCS1
|
|
- | MCF_GPIO_PAR_DSPI_PCS0_PCS0
|
|
- | MCF_GPIO_PAR_DSPI_SIN_SIN
|
|
- | MCF_GPIO_PAR_DSPI_SOUT_SOUT
|
|
- | MCF_GPIO_PAR_DSPI_SCK_SCK;
|
|
+ *drv_data->int_icr = platform_info->irq_lp;
|
|
+ *drv_data->int_mr &= ~platform_info->irq_mask;
|
|
+ }
|
|
+
|
|
+ /* Now that we have all the addresses etc. Let's set it up */
|
|
+ if (platform_info->par_val)
|
|
+ *drv_data->par = platform_info->par_val;
|
|
|
|
- *drv_data->int_icr = platform_info->irq_lp;
|
|
- *drv_data->int_mr &= ~platform_info->irq_mask;
|
|
+#ifdef CONFIG_M5227x
|
|
+ MCF_GPIO_PAR_IRQ = 0x04; /* Mistake in RM documentation */
|
|
+#endif
|
|
|
|
#ifdef SPI_DSPI
|
|
- drv_data->dspi_ctas = 0; // TODO: change later
|
|
+ drv_data->dspi_ctas = 0; /* TBD: change later */
|
|
#endif
|
|
|
|
/* Initial and start queue */
|
|
@@ -1359,40 +1376,37 @@ static int coldfire_spi_probe(struct pla
|
|
}
|
|
|
|
#if defined(SPI_DSPI_EDMA)
|
|
- if (request_edma_channel(DSPI_DMA_TX_TCD,
|
|
- edma_tx_handler,
|
|
- NULL,
|
|
- pdev,
|
|
- NULL, /* spinlock */
|
|
- DRIVER_NAME
|
|
- )!=0)
|
|
- {
|
|
+ if (mcf_edma_request_channel(DSPI_DMA_TX_TCD,
|
|
+ edma_tx_handler,
|
|
+ NULL,
|
|
+ pdev,
|
|
+ NULL, /* spinlock */
|
|
+ DRIVER_NAME
|
|
+ )!=0) {
|
|
dev_err(&pdev->dev, "problem requesting edma transmit channel\n");
|
|
status = -EINVAL;
|
|
- goto out_error_queue_alloc;
|
|
+ goto out_error_queue_alloc;
|
|
}
|
|
|
|
- if (request_edma_channel(DSPI_DMA_RX_TCD,
|
|
- edma_rx_handler,
|
|
- NULL,
|
|
- pdev,
|
|
- NULL, /* spinlock */
|
|
- DRIVER_NAME
|
|
- )!=0)
|
|
- {
|
|
+ if (mcf_edma_request_channel(DSPI_DMA_RX_TCD,
|
|
+ edma_rx_handler,
|
|
+ NULL,
|
|
+ pdev,
|
|
+ NULL, /* spinlock */
|
|
+ DRIVER_NAME
|
|
+ )!=0) {
|
|
dev_err(&pdev->dev, "problem requesting edma receive channel\n");
|
|
status = -EINVAL;
|
|
- goto out_edma_transmit;
|
|
+ goto out_edma_transmit;
|
|
}
|
|
#endif
|
|
|
|
- printk( "SPI: Coldfire master initialized\n" );
|
|
- //dev_info(&pdev->dev, "driver initialized\n");
|
|
+ printk(KERN_INFO "SPI: Coldfire master initialized\n" );
|
|
return status;
|
|
|
|
#if defined(SPI_DSPI_EDMA)
|
|
out_edma_transmit:
|
|
- free_edma_channel(DSPI_DMA_TX_TCD, pdev);
|
|
+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
|
|
#endif
|
|
|
|
out_error_queue_alloc:
|
|
@@ -1417,8 +1431,8 @@ static int coldfire_spi_remove(struct pl
|
|
return 0;
|
|
|
|
#if defined(SPI_DSPI_EDMA)
|
|
- free_edma_channel(DSPI_DMA_TX_TCD, pdev);
|
|
- free_edma_channel(DSPI_DMA_RX_TCD, pdev);
|
|
+ mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
|
|
+ mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev);
|
|
#endif
|
|
|
|
/* Remove the queue */
|
|
@@ -1426,27 +1440,8 @@ static int coldfire_spi_remove(struct pl
|
|
if (status != 0)
|
|
return status;
|
|
|
|
- /* Disable the SSP at the peripheral and SOC level */
|
|
- /*write_SSCR0(0, drv_data->ioaddr);
|
|
- pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
|
|
-
|
|
- /* Release DMA */
|
|
- /*if (drv_data->master_info->enable_dma) {
|
|
- if (drv_data->ioaddr == SSP1_VIRT) {
|
|
- DRCMRRXSSDR = 0;
|
|
- DRCMRTXSSDR = 0;
|
|
- } else if (drv_data->ioaddr == SSP2_VIRT) {
|
|
- DRCMRRXSS2DR = 0;
|
|
- DRCMRTXSS2DR = 0;
|
|
- } else if (drv_data->ioaddr == SSP3_VIRT) {
|
|
- DRCMRRXSS3DR = 0;
|
|
- DRCMRTXSS3DR = 0;
|
|
- }
|
|
- pxa_free_dma(drv_data->tx_channel);
|
|
- pxa_free_dma(drv_data->rx_channel);
|
|
- }*/
|
|
-
|
|
/* Release IRQ */
|
|
+/* JKM -- check for list and remove list */
|
|
irq = platform_get_irq(pdev, 0);
|
|
if (irq >= 0)
|
|
free_irq(irq, drv_data);
|
|
@@ -1496,8 +1491,6 @@ static int coldfire_spi_suspend(struct p
|
|
status = stop_queue(drv_data);
|
|
if (status != 0)
|
|
return status;
|
|
- /*write_SSCR0(0, drv_data->ioaddr);
|
|
- pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
|
|
|
|
return 0;
|
|
}
|
|
@@ -1507,9 +1500,6 @@ static int coldfire_spi_resume(struct pl
|
|
struct driver_data *drv_data = platform_get_drvdata(pdev);
|
|
int status = 0;
|
|
|
|
- /* Enable the SSP clock */
|
|
- /*pxa_set_cken(drv_data->master_info->clock_enable, 1);*/
|
|
-
|
|
/* Start the queue running */
|
|
status = start_queue(drv_data);
|
|
if (status != 0) {
|
|
--- /dev/null
|
|
+++ b/include/asm-m68k/m5485dspi.h
|
|
@@ -0,0 +1,144 @@
|
|
+/*
|
|
+ * File: mcf548x_dspi.h
|
|
+ * Purpose: Register and bit definitions for the MCF548X
|
|
+ *
|
|
+ * Notes:
|
|
+ *
|
|
+ */
|
|
+
|
|
+#ifndef _M5485DSPI_H_
|
|
+#define _M5485DSPI_H_
|
|
+
|
|
+/*
|
|
+ *
|
|
+ * DMA Serial Peripheral Interface (DSPI)
|
|
+ *
|
|
+ */
|
|
+
|
|
+/* Register read/write macros */
|
|
+#define MCF_DSPI_DMCR MCF_REG32(0x008A00)
|
|
+#define MCF_DSPI_DTCR MCF_REG32(0x008A08)
|
|
+#define MCF_DSPI_DCTAR0 MCF_REG32(0x008A0C)
|
|
+#define MCF_DSPI_DCTAR1 MCF_REG32(0x008A10)
|
|
+#define MCF_DSPI_DCTAR2 MCF_REG32(0x008A14)
|
|
+#define MCF_DSPI_DCTAR3 MCF_REG32(0x008A18)
|
|
+#define MCF_DSPI_DCTAR4 MCF_REG32(0x008A1C)
|
|
+#define MCF_DSPI_DCTAR5 MCF_REG32(0x008A20)
|
|
+#define MCF_DSPI_DCTAR6 MCF_REG32(0x008A24)
|
|
+#define MCF_DSPI_DCTAR7 MCF_REG32(0x008A28)
|
|
+#define MCF_DSPI_DCTARn(x) MCF_REG32(0x008A0C+(x*4))
|
|
+#define MCF_DSPI_DSR MCF_REG32(0x008A2C)
|
|
+#define MCF_DSPI_DRSER MCF_REG32(0x008A30)
|
|
+#define MCF_DSPI_DTFR MCF_REG32(0x008A34)
|
|
+#define MCF_DSPI_DRFR MCF_REG32(0x008A38)
|
|
+#define MCF_DSPI_DTFDR0 MCF_REG32(0x008A3C)
|
|
+#define MCF_DSPI_DTFDR1 MCF_REG32(0x008A40)
|
|
+#define MCF_DSPI_DTFDR2 MCF_REG32(0x008A44)
|
|
+#define MCF_DSPI_DTFDR3 MCF_REG32(0x008A48)
|
|
+#define MCF_DSPI_DTFDRn(x) MCF_REG32(0x008A3C+(x*4))
|
|
+#define MCF_DSPI_DRFDR0 MCF_REG32(0x008A7C)
|
|
+#define MCF_DSPI_DRFDR1 MCF_REG32(0x008A80)
|
|
+#define MCF_DSPI_DRFDR2 MCF_REG32(0x008A84)
|
|
+#define MCF_DSPI_DRFDR3 MCF_REG32(0x008A88)
|
|
+#define MCF_DSPI_DRFDRn(x) MCF_REG32(0x008A7C+(x*4))
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DMCR */
|
|
+#define MCF_DSPI_DMCR_HALT (0x00000001)
|
|
+#define MCF_DSPI_DMCR_SMPL_PT(x) (((x)&0x00000003)<<8)
|
|
+#define MCF_DSPI_DMCR_CRXF (0x00000400)
|
|
+#define MCF_DSPI_DMCR_CTXF (0x00000800)
|
|
+#define MCF_DSPI_DMCR_DRXF (0x00001000)
|
|
+#define MCF_DSPI_DMCR_DTXF (0x00002000)
|
|
+#define MCF_DSPI_DMCR_CSIS0 (0x00010000)
|
|
+#define MCF_DSPI_DMCR_CSIS2 (0x00040000)
|
|
+#define MCF_DSPI_DMCR_CSIS3 (0x00080000)
|
|
+#define MCF_DSPI_DMCR_CSIS5 (0x00200000)
|
|
+#define MCF_DSPI_DMCR_ROOE (0x01000000)
|
|
+#define MCF_DSPI_DMCR_PCSSE (0x02000000)
|
|
+#define MCF_DSPI_DMCR_MTFE (0x04000000)
|
|
+#define MCF_DSPI_DMCR_FRZ (0x08000000)
|
|
+#define MCF_DSPI_DMCR_DCONF(x) (((x)&0x00000003)<<28)
|
|
+#define MCF_DSPI_DMCR_CSCK (0x40000000)
|
|
+#define MCF_DSPI_DMCR_MSTR (0x80000000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DTCR */
|
|
+#define MCF_DSPI_DTCR_SPI_TCNT(x) (((x)&0x0000FFFF)<<16)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DCTARn */
|
|
+#define MCF_DSPI_DCTAR_BR(x) (((x)&0x0000000F)<<0)
|
|
+#define MCF_DSPI_DCTAR_DT(x) (((x)&0x0000000F)<<4)
|
|
+#define MCF_DSPI_DCTAR_ASC(x) (((x)&0x0000000F)<<8)
|
|
+#define MCF_DSPI_DCTAR_CSSCK(x) (((x)&0x0000000F)<<12)
|
|
+#define MCF_DSPI_DCTAR_PBR(x) (((x)&0x00000003)<<16)
|
|
+#define MCF_DSPI_DCTAR_PDT(x) (((x)&0x00000003)<<18)
|
|
+#define MCF_DSPI_DCTAR_PASC(x) (((x)&0x00000003)<<20)
|
|
+#define MCF_DSPI_DCTAR_PCSSCK(x) (((x)&0x00000003)<<22)
|
|
+#define MCF_DSPI_DCTAR_LSBFE (0x01000000)
|
|
+#define MCF_DSPI_DCTAR_CPHA (0x02000000)
|
|
+#define MCF_DSPI_DCTAR_CPOL (0x04000000)
|
|
+/* #define MCF_DSPI_DCTAR_TRSZ(x) (((x)&0x0000000F)<<27) */
|
|
+#define MCF_DSPI_DCTAR_FMSZ(x) (((x)&0x0000000F)<<27)
|
|
+#define MCF_DSPI_DCTAR_PCSSCK_1CLK (0x00000000)
|
|
+#define MCF_DSPI_DCTAR_PCSSCK_3CLK (0x00400000)
|
|
+#define MCF_DSPI_DCTAR_PCSSCK_5CLK (0x00800000)
|
|
+#define MCF_DSPI_DCTAR_PCSSCK_7CLK (0x00A00000)
|
|
+#define MCF_DSPI_DCTAR_PASC_1CLK (0x00000000)
|
|
+#define MCF_DSPI_DCTAR_PASC_3CLK (0x00100000)
|
|
+#define MCF_DSPI_DCTAR_PASC_5CLK (0x00200000)
|
|
+#define MCF_DSPI_DCTAR_PASC_7CLK (0x00300000)
|
|
+#define MCF_DSPI_DCTAR_PDT_1CLK (0x00000000)
|
|
+#define MCF_DSPI_DCTAR_PDT_3CLK (0x00040000)
|
|
+#define MCF_DSPI_DCTAR_PDT_5CLK (0x00080000)
|
|
+#define MCF_DSPI_DCTAR_PDT_7CLK (0x000A0000)
|
|
+#define MCF_DSPI_DCTAR_PBR_1CLK (0x00000000)
|
|
+#define MCF_DSPI_DCTAR_PBR_3CLK (0x00010000)
|
|
+#define MCF_DSPI_DCTAR_PBR_5CLK (0x00020000)
|
|
+#define MCF_DSPI_DCTAR_PBR_7CLK (0x00030000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DSR */
|
|
+#define MCF_DSPI_DSR_RXPTR(x) (((x)&0x0000000F)<<0)
|
|
+#define MCF_DSPI_DSR_RXCTR(x) (((x)&0x0000000F)<<4)
|
|
+#define MCF_DSPI_DSR_TXPTR(x) (((x)&0x0000000F)<<8)
|
|
+#define MCF_DSPI_DSR_TXCTR(x) (((x)&0x0000000F)<<12)
|
|
+#define MCF_DSPI_DSR_RFDF (0x00020000)
|
|
+#define MCF_DSPI_DSR_RFOF (0x00080000)
|
|
+#define MCF_DSPI_DSR_TFFF (0x02000000)
|
|
+#define MCF_DSPI_DSR_TFUF (0x08000000)
|
|
+#define MCF_DSPI_DSR_EOQF (0x10000000)
|
|
+#define MCF_DSPI_DSR_TXRXS (0x40000000)
|
|
+#define MCF_DSPI_DSR_TCF (0x80000000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DRSER */
|
|
+#define MCF_DSPI_DRSER_RFDFS (0x00010000)
|
|
+#define MCF_DSPI_DRSER_RFDFE (0x00020000)
|
|
+#define MCF_DSPI_DRSER_RFOFE (0x00080000)
|
|
+#define MCF_DSPI_DRSER_TFFFS (0x01000000)
|
|
+#define MCF_DSPI_DRSER_TFFFE (0x02000000)
|
|
+#define MCF_DSPI_DRSER_TFUFE (0x08000000)
|
|
+#define MCF_DSPI_DRSER_EOQFE (0x10000000)
|
|
+#define MCF_DSPI_DRSER_TCFE (0x80000000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DTFR */
|
|
+#define MCF_DSPI_DTFR_TXDATA(x) (((x)&0x0000FFFF)<<0)
|
|
+#define MCF_DSPI_DTFR_CS0 (0x00010000)
|
|
+#define MCF_DSPI_DTFR_CS2 (0x00040000)
|
|
+#define MCF_DSPI_DTFR_CS3 (0x00080000)
|
|
+#define MCF_DSPI_DTFR_CS5 (0x00200000)
|
|
+#define MCF_DSPI_DTFR_CTCNT (0x04000000)
|
|
+#define MCF_DSPI_DTFR_EOQ (0x08000000)
|
|
+#define MCF_DSPI_DTFR_CTAS(x) (((x)&0x00000007)<<28)
|
|
+#define MCF_DSPI_DTFR_CONT (0x80000000)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DRFR */
|
|
+#define MCF_DSPI_DRFR_RXDATA(x) (((x)&0x0000FFFF)<<0)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DTFDRn */
|
|
+#define MCF_DSPI_DTFDRn_TXDATA(x) (((x)&0x0000FFFF)<<0)
|
|
+#define MCF_DSPI_DTFDRn_TXCMD(x) (((x)&0x0000FFFF)<<16)
|
|
+
|
|
+/* Bit definitions and macros for MCF_DSPI_DRFDRn */
|
|
+#define MCF_DSPI_DRFDRn_RXDATA(x) (((x)&0x0000FFFF)<<0)
|
|
+
|
|
+/********************************************************************/
|
|
+
|
|
+#endif /* _M5485DSPI_H_ */
|
|
--- a/include/asm-m68k/mcfqspi.h
|
|
+++ b/include/asm-m68k/mcfqspi.h
|
|
@@ -36,6 +36,7 @@ struct coldfire_spi_master {
|
|
u32 irq_mask;
|
|
u8 irq_lp;
|
|
u8 par_val;
|
|
+ u32 *irq_list;
|
|
void (*cs_control)(u8 cs, u8 command);
|
|
};
|
|
|
|
--- a/include/asm-m68k/mcfsim.h
|
|
+++ b/include/asm-m68k/mcfsim.h
|
|
@@ -25,6 +25,7 @@
|
|
#include <asm/mcf5445x_dtim.h>
|
|
#elif defined(CONFIG_M547X_8X)
|
|
#include <asm/m5485sim.h>
|
|
+#include <asm/m5485gpio.h>
|
|
#endif
|
|
|
|
/*
|