Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
icontrol.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-pxa/icontrol.c
3  *
4  * Support for the iControl and SafeTcam platforms from TMT Services
5  * using the Embedian MXM-8x10 Computer on Module
6  *
7  * Copyright (C) 2009 TMT Services & Supplies (Pty) Ltd.
8  *
9  * 2010-01-21 Hennie van der Merve <[email protected]>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 
16 #include <linux/irq.h>
17 #include <linux/platform_device.h>
18 #include <linux/gpio.h>
19 
20 #include <asm/mach-types.h>
21 #include <asm/mach/arch.h>
22 
23 #include <mach/pxa320.h>
24 #include <mach/mxm8x10.h>
25 
26 #include <linux/spi/spi.h>
27 #include <linux/spi/pxa2xx_spi.h>
29 
30 #include "generic.h"
31 
32 #define ICONTROL_MCP251x_nCS1 (15)
33 #define ICONTROL_MCP251x_nCS2 (16)
34 #define ICONTROL_MCP251x_nCS3 (17)
35 #define ICONTROL_MCP251x_nCS4 (24)
36 
37 #define ICONTROL_MCP251x_nIRQ1 (74)
38 #define ICONTROL_MCP251x_nIRQ2 (75)
39 #define ICONTROL_MCP251x_nIRQ3 (76)
40 #define ICONTROL_MCP251x_nIRQ4 (77)
41 
42 static struct pxa2xx_spi_chip mcp251x_chip_info1 = {
43  .tx_threshold = 8,
44  .rx_threshold = 128,
45  .dma_burst_size = 8,
46  .timeout = 235,
47  .gpio_cs = ICONTROL_MCP251x_nCS1
48 };
49 
50 static struct pxa2xx_spi_chip mcp251x_chip_info2 = {
51  .tx_threshold = 8,
52  .rx_threshold = 128,
53  .dma_burst_size = 8,
54  .timeout = 235,
55  .gpio_cs = ICONTROL_MCP251x_nCS2
56 };
57 
58 static struct pxa2xx_spi_chip mcp251x_chip_info3 = {
59  .tx_threshold = 8,
60  .rx_threshold = 128,
61  .dma_burst_size = 8,
62  .timeout = 235,
63  .gpio_cs = ICONTROL_MCP251x_nCS3
64 };
65 
66 static struct pxa2xx_spi_chip mcp251x_chip_info4 = {
67  .tx_threshold = 8,
68  .rx_threshold = 128,
69  .dma_burst_size = 8,
70  .timeout = 235,
71  .gpio_cs = ICONTROL_MCP251x_nCS4
72 };
73 
74 static struct mcp251x_platform_data mcp251x_info = {
75  .oscillator_frequency = 16E6,
76  .board_specific_setup = NULL,
77  .power_enable = NULL,
78  .transceiver_enable = NULL
79 };
80 
81 static struct spi_board_info mcp251x_board_info[] = {
82  {
83  .modalias = "mcp2515",
84  .max_speed_hz = 6500000,
85  .bus_num = 3,
86  .chip_select = 0,
87  .platform_data = &mcp251x_info,
88  .controller_data = &mcp251x_chip_info1,
90  },
91  {
92  .modalias = "mcp2515",
93  .max_speed_hz = 6500000,
94  .bus_num = 3,
95  .chip_select = 1,
96  .platform_data = &mcp251x_info,
97  .controller_data = &mcp251x_chip_info2,
99  },
100  {
101  .modalias = "mcp2515",
102  .max_speed_hz = 6500000,
103  .bus_num = 4,
104  .chip_select = 0,
105  .platform_data = &mcp251x_info,
106  .controller_data = &mcp251x_chip_info3,
108  },
109  {
110  .modalias = "mcp2515",
111  .max_speed_hz = 6500000,
112  .bus_num = 4,
113  .chip_select = 1,
114  .platform_data = &mcp251x_info,
115  .controller_data = &mcp251x_chip_info4,
117  }
118 };
119 
120 static struct pxa2xx_spi_master pxa_ssp3_spi_master_info = {
121  .clock_enable = CKEN_SSP3,
122  .num_chipselect = 2,
123  .enable_dma = 1
124 };
125 
126 static struct pxa2xx_spi_master pxa_ssp4_spi_master_info = {
127  .clock_enable = CKEN_SSP4,
128  .num_chipselect = 2,
129  .enable_dma = 1
130 };
131 
133  .name = "pxa2xx-spi",
134  .id = 3,
135  .dev = {
136  .platform_data = &pxa_ssp3_spi_master_info,
137  }
138 };
139 
141  .name = "pxa2xx-spi",
142  .id = 4,
143  .dev = {
144  .platform_data = &pxa_ssp4_spi_master_info,
145  }
146 };
147 
148 static struct platform_device *icontrol_spi_devices[] __initdata = {
149  &pxa_spi_ssp3,
150  &pxa_spi_ssp4,
151 };
152 
153 static mfp_cfg_t mfp_can_cfg[] __initdata = {
154  /* CAN CS lines */
155  GPIO15_GPIO,
156  GPIO16_GPIO,
157  GPIO17_GPIO,
158  GPIO24_GPIO,
159 
160  /* SPI (SSP3) lines */
164 
165  /* SPI (SSP4) lines */
169 
170  /* CAN nIRQ lines */
175 };
176 
177 static void __init icontrol_can_init(void)
178 {
179  pxa3xx_mfp_config(ARRAY_AND_SIZE(mfp_can_cfg));
180  platform_add_devices(ARRAY_AND_SIZE(icontrol_spi_devices));
181  spi_register_board_info(ARRAY_AND_SIZE(mcp251x_board_info));
182 }
183 
184 static void __init icontrol_init(void)
185 {
188  mxm_8x10_mmc_init();
189 
190  icontrol_can_init();
191 }
192 
193 MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM")
194  .atag_offset = 0x100,
195  .map_io = pxa3xx_map_io,
196  .nr_irqs = PXA_NR_IRQS,
197  .init_irq = pxa3xx_init_irq,
198  .handle_irq = pxa3xx_handle_irq,
199  .timer = &pxa_timer,
200  .init_machine = icontrol_init,
201  .restart = pxa_restart,