~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to arch/m68k/platform/523x/config.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************/
 
2
 
 
3
/*
 
4
 *      linux/arch/m68knommu/platform/523x/config.c
 
5
 *
 
6
 *      Sub-architcture dependent initialization code for the Freescale
 
7
 *      523x CPUs.
 
8
 *
 
9
 *      Copyright (C) 1999-2005, Greg Ungerer (gerg@snapgear.com)
 
10
 *      Copyright (C) 2001-2003, SnapGear Inc. (www.snapgear.com)
 
11
 */
 
12
 
 
13
/***************************************************************************/
 
14
 
 
15
#include <linux/kernel.h>
 
16
#include <linux/param.h>
 
17
#include <linux/init.h>
 
18
#include <linux/io.h>
 
19
#include <linux/spi/spi.h>
 
20
#include <linux/gpio.h>
 
21
#include <asm/machdep.h>
 
22
#include <asm/coldfire.h>
 
23
#include <asm/mcfsim.h>
 
24
#include <asm/mcfuart.h>
 
25
#include <asm/mcfqspi.h>
 
26
 
 
27
/***************************************************************************/
 
28
 
 
29
static struct mcf_platform_uart m523x_uart_platform[] = {
 
30
        {
 
31
                .mapbase        = MCFUART_BASE1,
 
32
                .irq            = MCFINT_VECBASE + MCFINT_UART0,
 
33
        },
 
34
        {
 
35
                .mapbase        = MCFUART_BASE2,
 
36
                .irq            = MCFINT_VECBASE + MCFINT_UART0 + 1,
 
37
        },
 
38
        {
 
39
                .mapbase        = MCFUART_BASE3,
 
40
                .irq            = MCFINT_VECBASE + MCFINT_UART0 + 2,
 
41
        },
 
42
        { },
 
43
};
 
44
 
 
45
static struct platform_device m523x_uart = {
 
46
        .name                   = "mcfuart",
 
47
        .id                     = 0,
 
48
        .dev.platform_data      = m523x_uart_platform,
 
49
};
 
50
 
 
51
static struct resource m523x_fec_resources[] = {
 
52
        {
 
53
                .start          = MCFFEC_BASE,
 
54
                .end            = MCFFEC_BASE + MCFFEC_SIZE - 1,
 
55
                .flags          = IORESOURCE_MEM,
 
56
        },
 
57
        {
 
58
                .start          = 64 + 23,
 
59
                .end            = 64 + 23,
 
60
                .flags          = IORESOURCE_IRQ,
 
61
        },
 
62
        {
 
63
                .start          = 64 + 27,
 
64
                .end            = 64 + 27,
 
65
                .flags          = IORESOURCE_IRQ,
 
66
        },
 
67
        {
 
68
                .start          = 64 + 29,
 
69
                .end            = 64 + 29,
 
70
                .flags          = IORESOURCE_IRQ,
 
71
        },
 
72
};
 
73
 
 
74
static struct platform_device m523x_fec = {
 
75
        .name                   = "fec",
 
76
        .id                     = 0,
 
77
        .num_resources          = ARRAY_SIZE(m523x_fec_resources),
 
78
        .resource               = m523x_fec_resources,
 
79
};
 
80
 
 
81
#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)
 
82
static struct resource m523x_qspi_resources[] = {
 
83
        {
 
84
                .start          = MCFQSPI_IOBASE,
 
85
                .end            = MCFQSPI_IOBASE + MCFQSPI_IOSIZE - 1,
 
86
                .flags          = IORESOURCE_MEM,
 
87
        },
 
88
        {
 
89
                .start          = MCFINT_VECBASE + MCFINT_QSPI,
 
90
                .end            = MCFINT_VECBASE + MCFINT_QSPI,
 
91
                .flags          = IORESOURCE_IRQ,
 
92
        },
 
93
};
 
94
 
 
95
#define MCFQSPI_CS0    91
 
96
#define MCFQSPI_CS1    92
 
97
#define MCFQSPI_CS2    103
 
98
#define MCFQSPI_CS3    99
 
99
 
 
100
static int m523x_cs_setup(struct mcfqspi_cs_control *cs_control)
 
101
{
 
102
        int status;
 
103
 
 
104
        status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");
 
105
        if (status) {
 
106
                pr_debug("gpio_request for MCFQSPI_CS0 failed\n");
 
107
                goto fail0;
 
108
        }
 
109
        status = gpio_direction_output(MCFQSPI_CS0, 1);
 
110
        if (status) {
 
111
                pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");
 
112
                goto fail1;
 
113
        }
 
114
 
 
115
        status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");
 
116
        if (status) {
 
117
                pr_debug("gpio_request for MCFQSPI_CS1 failed\n");
 
118
                goto fail1;
 
119
        }
 
120
        status = gpio_direction_output(MCFQSPI_CS1, 1);
 
121
        if (status) {
 
122
                pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");
 
123
                goto fail2;
 
124
        }
 
125
 
 
126
        status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");
 
127
        if (status) {
 
128
                pr_debug("gpio_request for MCFQSPI_CS2 failed\n");
 
129
                goto fail2;
 
130
        }
 
131
        status = gpio_direction_output(MCFQSPI_CS2, 1);
 
132
        if (status) {
 
133
                pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");
 
134
                goto fail3;
 
135
        }
 
136
 
 
137
        status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");
 
138
        if (status) {
 
139
                pr_debug("gpio_request for MCFQSPI_CS3 failed\n");
 
140
                goto fail3;
 
141
        }
 
142
        status = gpio_direction_output(MCFQSPI_CS3, 1);
 
143
        if (status) {
 
144
                pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");
 
145
                goto fail4;
 
146
        }
 
147
 
 
148
        return 0;
 
149
 
 
150
fail4:
 
151
        gpio_free(MCFQSPI_CS3);
 
152
fail3:
 
153
        gpio_free(MCFQSPI_CS2);
 
154
fail2:
 
155
        gpio_free(MCFQSPI_CS1);
 
156
fail1:
 
157
        gpio_free(MCFQSPI_CS0);
 
158
fail0:
 
159
        return status;
 
160
}
 
161
 
 
162
static void m523x_cs_teardown(struct mcfqspi_cs_control *cs_control)
 
163
{
 
164
        gpio_free(MCFQSPI_CS3);
 
165
        gpio_free(MCFQSPI_CS2);
 
166
        gpio_free(MCFQSPI_CS1);
 
167
        gpio_free(MCFQSPI_CS0);
 
168
}
 
169
 
 
170
static void m523x_cs_select(struct mcfqspi_cs_control *cs_control,
 
171
                            u8 chip_select, bool cs_high)
 
172
{
 
173
        switch (chip_select) {
 
174
        case 0:
 
175
                gpio_set_value(MCFQSPI_CS0, cs_high);
 
176
                break;
 
177
        case 1:
 
178
                gpio_set_value(MCFQSPI_CS1, cs_high);
 
179
                break;
 
180
        case 2:
 
181
                gpio_set_value(MCFQSPI_CS2, cs_high);
 
182
                break;
 
183
        case 3:
 
184
                gpio_set_value(MCFQSPI_CS3, cs_high);
 
185
                break;
 
186
        }
 
187
}
 
188
 
 
189
static void m523x_cs_deselect(struct mcfqspi_cs_control *cs_control,
 
190
                              u8 chip_select, bool cs_high)
 
191
{
 
192
        switch (chip_select) {
 
193
        case 0:
 
194
                gpio_set_value(MCFQSPI_CS0, !cs_high);
 
195
                break;
 
196
        case 1:
 
197
                gpio_set_value(MCFQSPI_CS1, !cs_high);
 
198
                break;
 
199
        case 2:
 
200
                gpio_set_value(MCFQSPI_CS2, !cs_high);
 
201
                break;
 
202
        case 3:
 
203
                gpio_set_value(MCFQSPI_CS3, !cs_high);
 
204
                break;
 
205
        }
 
206
}
 
207
 
 
208
static struct mcfqspi_cs_control m523x_cs_control = {
 
209
        .setup                  = m523x_cs_setup,
 
210
        .teardown               = m523x_cs_teardown,
 
211
        .select                 = m523x_cs_select,
 
212
        .deselect               = m523x_cs_deselect,
 
213
};
 
214
 
 
215
static struct mcfqspi_platform_data m523x_qspi_data = {
 
216
        .bus_num                = 0,
 
217
        .num_chipselect         = 4,
 
218
        .cs_control             = &m523x_cs_control,
 
219
};
 
220
 
 
221
static struct platform_device m523x_qspi = {
 
222
        .name                   = "mcfqspi",
 
223
        .id                     = 0,
 
224
        .num_resources          = ARRAY_SIZE(m523x_qspi_resources),
 
225
        .resource               = m523x_qspi_resources,
 
226
        .dev.platform_data      = &m523x_qspi_data,
 
227
};
 
228
 
 
229
static void __init m523x_qspi_init(void)
 
230
{
 
231
        u16 par;
 
232
 
 
233
        /* setup QSPS pins for QSPI with gpio CS control */
 
234
        writeb(0x1f, MCFGPIO_PAR_QSPI);
 
235
        /* and CS2 & CS3 as gpio */
 
236
        par = readw(MCFGPIO_PAR_TIMER);
 
237
        par &= 0x3f3f;
 
238
        writew(par, MCFGPIO_PAR_TIMER);
 
239
}
 
240
#endif /* defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE) */
 
241
 
 
242
static struct platform_device *m523x_devices[] __initdata = {
 
243
        &m523x_uart,
 
244
        &m523x_fec,
 
245
#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)
 
246
        &m523x_qspi,
 
247
#endif
 
248
};
 
249
 
 
250
/***************************************************************************/
 
251
 
 
252
static void __init m523x_fec_init(void)
 
253
{
 
254
        u16 par;
 
255
        u8 v;
 
256
 
 
257
        /* Set multi-function pins to ethernet use */
 
258
        par = readw(MCF_IPSBAR + 0x100082);
 
259
        writew(par | 0xf00, MCF_IPSBAR + 0x100082);
 
260
        v = readb(MCF_IPSBAR + 0x100078);
 
261
        writeb(v | 0xc0, MCF_IPSBAR + 0x100078);
 
262
}
 
263
 
 
264
/***************************************************************************/
 
265
 
 
266
static void m523x_cpu_reset(void)
 
267
{
 
268
        local_irq_disable();
 
269
        __raw_writeb(MCF_RCR_SWRESET, MCF_IPSBAR + MCF_RCR);
 
270
}
 
271
 
 
272
/***************************************************************************/
 
273
 
 
274
void __init config_BSP(char *commandp, int size)
 
275
{
 
276
        mach_reset = m523x_cpu_reset;
 
277
}
 
278
 
 
279
/***************************************************************************/
 
280
 
 
281
static int __init init_BSP(void)
 
282
{
 
283
        m523x_fec_init();
 
284
#if defined(CONFIG_SPI_COLDFIRE_QSPI) || defined(CONFIG_SPI_COLDFIRE_QSPI_MODULE)
 
285
        m523x_qspi_init();
 
286
#endif
 
287
        platform_add_devices(m523x_devices, ARRAY_SIZE(m523x_devices));
 
288
        return 0;
 
289
}
 
290
 
 
291
arch_initcall(init_BSP);
 
292
 
 
293
/***************************************************************************/