aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/u-boot/u-boot-2009.11/at91/0004-Support-selecting-SPI-mode-in-dataflash-driver.patch
blob: ec075d8ffbe32c9316ec53d6a05a6ecb6f9b524d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
From 33f977f42bfb2f62dff2b2441c06eb5265c61293 Mon Sep 17 00:00:00 2001
From: Ulf Samuelsson <ulf.samuelsson@atmel.com>
Date: Sat, 27 Feb 2010 09:49:43 +0100
Subject: [PATCH] Support selecting SPI mode in dataflash driver

By setting AT91_SPI_MODE in the config to
AT91_SPI_MODE[3..0] you can select the SPI mode.
when the dataflash driver is used.

I.E
.#define AT91_SPI_MODE AT91_SPI_MODE0

Signed-off-by: Ulf Samuelsson <ulf.samuelsson@atmel.com>
---
 drivers/spi/atmel_dataflash_spi.c    |   26 ++++++++++++++++++++++----
 include/asm-arm/arch-at91/at91_spi.h |    8 ++++++++
 2 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/atmel_dataflash_spi.c b/drivers/spi/atmel_dataflash_spi.c
index 3a648e6..5307e34 100644
--- a/drivers/spi/atmel_dataflash_spi.c
+++ b/drivers/spi/atmel_dataflash_spi.c
@@ -34,8 +34,15 @@
 #define AT91_SPI_PCS2_DATAFLASH_CARD	0xB	/* Chip Select 2: NPCS2%1011 */
 #define AT91_SPI_PCS3_DATAFLASH_CARD	0x7	/* Chip Select 3: NPCS3%0111 */
 
+#ifndef	AT91_SPI_MODE
+#define	AT91_SPI_MODE	AT91_SPI_MODE0
+#endif
+
 void AT91F_SpiInit(void)
 {
+	unsigned int	mr,sr,imr;
+	unsigned int	csr0, csr1, csr2, csr3;
+
 	/* Reset the SPI */
 	writel(AT91_SPI_SWRST, AT91_BASE_SPI + AT91_SPI_CR);
 
@@ -44,7 +51,7 @@ void AT91F_SpiInit(void)
 	       AT91_BASE_SPI + AT91_SPI_MR);
 
 	/* Configure CS0 */
-	writel(AT91_SPI_NCPHA |
+	writel(AT91_SPI_MODE |
 	       (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
 	       (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
 	       ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
@@ -52,7 +59,7 @@ void AT91F_SpiInit(void)
 
 #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS1
 	/* Configure CS1 */
-	writel(AT91_SPI_NCPHA |
+	writel(AT91_SPI_MODE |
 	       (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
 	       (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
 	       ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
@@ -60,7 +67,7 @@ void AT91F_SpiInit(void)
 #endif
 #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS2
 	/* Configure CS2 */
-	writel(AT91_SPI_NCPHA |
+	writel(AT91_SPI_MODE |
 	       (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
 	       (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
 	       ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
@@ -68,7 +75,7 @@ void AT91F_SpiInit(void)
 #endif
 #ifdef CONFIG_SYS_DATAFLASH_LOGIC_ADDR_CS3
 	/* Configure CS3 */
-	writel(AT91_SPI_NCPHA |
+	writel(AT91_SPI_MODE |
 	       (AT91_SPI_DLYBS & DATAFLASH_TCSS) |
 	       (AT91_SPI_DLYBCT & DATAFLASH_TCHS) |
 	       ((get_mck_clk_rate() / AT91_SPI_CLK) << 8),
@@ -84,7 +91,18 @@ void AT91F_SpiInit(void)
 	 * Add tempo to get SPI in a safe state.
 	 * Should not be needed for new silicon (Rev B)
 	 */
+	printf("CPU running at %d Hz\n",get_cpu_clk_rate());
+	printf("MCK running at %d Hz\n",get_mck_clk_rate());
+	printf("SPI_MR		0x%08x\n",mr=readl(AT91_BASE_SPI + AT91_SPI_MR));
+	printf("SPI_SR		0x%08x\n",sr=readl(AT91_BASE_SPI + AT91_SPI_SR));
+	printf("SPI_IMR		0x%08x\n",imr=readl(AT91_BASE_SPI + AT91_SPI_IMR));
+	printf("SPI_CSR0	0x%08x\n",csr0=readl(AT91_BASE_SPI + AT91_SPI_CSR(0)));
+	printf("SPI_CSR1	0x%08x\n",csr1=readl(AT91_BASE_SPI + AT91_SPI_CSR(1)));
+	printf("SPI_CSR2	0x%08x\n",csr2=readl(AT91_BASE_SPI + AT91_SPI_CSR(2)));
+	printf("SPI_CSR3	0x%08x\n",csr3=readl(AT91_BASE_SPI + AT91_SPI_CSR(3)));
+	printf("SPI SPEED = 	%d Hz\n", get_mck_clk_rate()/ ((csr0 >> 8) & 0xff));
 	udelay(500000);
+
 	readl(AT91_BASE_SPI + AT91_SPI_SR);
 	readl(AT91_BASE_SPI + AT91_SPI_RDR);
 
diff --git a/include/asm-arm/arch-at91/at91_spi.h b/include/asm-arm/arch-at91/at91_spi.h
index 30643c6..8924996 100644
--- a/include/asm-arm/arch-at91/at91_spi.h
+++ b/include/asm-arm/arch-at91/at91_spi.h
@@ -62,7 +62,15 @@
 
 #define AT91_SPI_CSR(n)		(0x30 + ((n) * 4))	/* Chip Select Registers 0-3 */
 #define		AT91_SPI_CPOL		(1    <<  0)		/* Clock Polarity */
+#define		AT91_SPI_NCPOL		(0    <<  0)		/* Clock Polarity */
 #define		AT91_SPI_NCPHA		(1    <<  1)		/* Clock Phase */
+#define		AT91_SPI_CPHA		(0    <<  1)		/* Clock Phase */
+
+#define		AT91_SPI_MODE0	(AT91_SPI_NCPOL | AT91_SPI_NCPHA)
+#define		AT91_SPI_MODE1	(AT91_SPI_NCPOL | AT91_SPI_CPHA)
+#define		AT91_SPI_MODE2	(AT91_SPI_CPOL	| AT91_SPI_NCPHA)
+#define		AT91_SPI_MODE3	(AT91_SPI_CPOL	| AT91_SPI_CPHA)
+
 #define		AT91_SPI_CSAAT		(1    <<  3)		/* Chip Select Active After Transfer [SAM9261 only] */
 #define		AT91_SPI_BITS		(0xf  <<  4)		/* Bits Per Transfer */
 #define			AT91_SPI_BITS_8		(0 << 4)
-- 
1.6.0.2