.. | .. |
---|
16 | 16 | #include <linux/platform_data/i2c-ocores.h> |
---|
17 | 17 | #include <linux/platform_device.h> |
---|
18 | 18 | |
---|
19 | | -#define TQMX86_IOBASE 0x160 |
---|
20 | | -#define TQMX86_IOSIZE 0x3f |
---|
| 19 | +#define TQMX86_IOBASE 0x180 |
---|
| 20 | +#define TQMX86_IOSIZE 0x20 |
---|
21 | 21 | #define TQMX86_IOBASE_I2C 0x1a0 |
---|
22 | 22 | #define TQMX86_IOSIZE_I2C 0xa |
---|
23 | 23 | #define TQMX86_IOBASE_WATCHDOG 0x18b |
---|
.. | .. |
---|
25 | 25 | #define TQMX86_IOBASE_GPIO 0x18d |
---|
26 | 26 | #define TQMX86_IOSIZE_GPIO 0x4 |
---|
27 | 27 | |
---|
28 | | -#define TQMX86_REG_BOARD_ID 0x20 |
---|
| 28 | +#define TQMX86_REG_BOARD_ID 0x00 |
---|
29 | 29 | #define TQMX86_REG_BOARD_ID_E38M 1 |
---|
30 | 30 | #define TQMX86_REG_BOARD_ID_50UC 2 |
---|
31 | 31 | #define TQMX86_REG_BOARD_ID_E38C 3 |
---|
32 | 32 | #define TQMX86_REG_BOARD_ID_60EB 4 |
---|
33 | | -#define TQMX86_REG_BOARD_ID_E39M 5 |
---|
34 | | -#define TQMX86_REG_BOARD_ID_E39C 6 |
---|
35 | | -#define TQMX86_REG_BOARD_ID_E39x 7 |
---|
| 33 | +#define TQMX86_REG_BOARD_ID_E39MS 5 |
---|
| 34 | +#define TQMX86_REG_BOARD_ID_E39C1 6 |
---|
| 35 | +#define TQMX86_REG_BOARD_ID_E39C2 7 |
---|
36 | 36 | #define TQMX86_REG_BOARD_ID_70EB 8 |
---|
37 | 37 | #define TQMX86_REG_BOARD_ID_80UC 9 |
---|
38 | | -#define TQMX86_REG_BOARD_ID_90UC 10 |
---|
39 | | -#define TQMX86_REG_BOARD_REV 0x21 |
---|
40 | | -#define TQMX86_REG_IO_EXT_INT 0x26 |
---|
| 38 | +#define TQMX86_REG_BOARD_ID_110EB 11 |
---|
| 39 | +#define TQMX86_REG_BOARD_ID_E40M 12 |
---|
| 40 | +#define TQMX86_REG_BOARD_ID_E40S 13 |
---|
| 41 | +#define TQMX86_REG_BOARD_ID_E40C1 14 |
---|
| 42 | +#define TQMX86_REG_BOARD_ID_E40C2 15 |
---|
| 43 | +#define TQMX86_REG_BOARD_REV 0x01 |
---|
| 44 | +#define TQMX86_REG_IO_EXT_INT 0x06 |
---|
41 | 45 | #define TQMX86_REG_IO_EXT_INT_NONE 0 |
---|
42 | 46 | #define TQMX86_REG_IO_EXT_INT_7 1 |
---|
43 | 47 | #define TQMX86_REG_IO_EXT_INT_9 2 |
---|
44 | 48 | #define TQMX86_REG_IO_EXT_INT_12 3 |
---|
45 | 49 | #define TQMX86_REG_IO_EXT_INT_MASK 0x3 |
---|
46 | 50 | #define TQMX86_REG_IO_EXT_INT_GPIO_SHIFT 4 |
---|
| 51 | +#define TQMX86_REG_SAUC 0x17 |
---|
47 | 52 | |
---|
48 | | -#define TQMX86_REG_I2C_DETECT 0x47 |
---|
| 53 | +#define TQMX86_REG_I2C_DETECT 0x1a7 |
---|
49 | 54 | #define TQMX86_REG_I2C_DETECT_SOFT 0xa5 |
---|
50 | | -#define TQMX86_REG_I2C_INT_EN 0x49 |
---|
51 | 55 | |
---|
52 | 56 | static uint gpio_irq; |
---|
53 | 57 | module_param(gpio_irq, uint, 0); |
---|
.. | .. |
---|
107 | 111 | }, |
---|
108 | 112 | }; |
---|
109 | 113 | |
---|
110 | | -static const char *tqmx86_board_id_to_name(u8 board_id) |
---|
| 114 | +static const char *tqmx86_board_id_to_name(u8 board_id, u8 sauc) |
---|
111 | 115 | { |
---|
112 | 116 | switch (board_id) { |
---|
113 | 117 | case TQMX86_REG_BOARD_ID_E38M: |
---|
.. | .. |
---|
118 | 122 | return "TQMxE38C"; |
---|
119 | 123 | case TQMX86_REG_BOARD_ID_60EB: |
---|
120 | 124 | return "TQMx60EB"; |
---|
121 | | - case TQMX86_REG_BOARD_ID_E39M: |
---|
122 | | - return "TQMxE39M"; |
---|
123 | | - case TQMX86_REG_BOARD_ID_E39C: |
---|
124 | | - return "TQMxE39C"; |
---|
125 | | - case TQMX86_REG_BOARD_ID_E39x: |
---|
126 | | - return "TQMxE39x"; |
---|
| 125 | + case TQMX86_REG_BOARD_ID_E39MS: |
---|
| 126 | + return (sauc == 0xff) ? "TQMxE39M" : "TQMxE39S"; |
---|
| 127 | + case TQMX86_REG_BOARD_ID_E39C1: |
---|
| 128 | + return "TQMxE39C1"; |
---|
| 129 | + case TQMX86_REG_BOARD_ID_E39C2: |
---|
| 130 | + return "TQMxE39C2"; |
---|
127 | 131 | case TQMX86_REG_BOARD_ID_70EB: |
---|
128 | 132 | return "TQMx70EB"; |
---|
129 | 133 | case TQMX86_REG_BOARD_ID_80UC: |
---|
130 | 134 | return "TQMx80UC"; |
---|
131 | | - case TQMX86_REG_BOARD_ID_90UC: |
---|
132 | | - return "TQMx90UC"; |
---|
| 135 | + case TQMX86_REG_BOARD_ID_110EB: |
---|
| 136 | + return "TQMx110EB"; |
---|
| 137 | + case TQMX86_REG_BOARD_ID_E40M: |
---|
| 138 | + return "TQMxE40M"; |
---|
| 139 | + case TQMX86_REG_BOARD_ID_E40S: |
---|
| 140 | + return "TQMxE40S"; |
---|
| 141 | + case TQMX86_REG_BOARD_ID_E40C1: |
---|
| 142 | + return "TQMxE40C1"; |
---|
| 143 | + case TQMX86_REG_BOARD_ID_E40C2: |
---|
| 144 | + return "TQMxE40C2"; |
---|
133 | 145 | default: |
---|
134 | 146 | return "Unknown"; |
---|
135 | 147 | } |
---|
.. | .. |
---|
142 | 154 | case TQMX86_REG_BOARD_ID_60EB: |
---|
143 | 155 | case TQMX86_REG_BOARD_ID_70EB: |
---|
144 | 156 | case TQMX86_REG_BOARD_ID_80UC: |
---|
145 | | - case TQMX86_REG_BOARD_ID_90UC: |
---|
| 157 | + case TQMX86_REG_BOARD_ID_110EB: |
---|
| 158 | + case TQMX86_REG_BOARD_ID_E40M: |
---|
| 159 | + case TQMX86_REG_BOARD_ID_E40S: |
---|
| 160 | + case TQMX86_REG_BOARD_ID_E40C1: |
---|
| 161 | + case TQMX86_REG_BOARD_ID_E40C2: |
---|
146 | 162 | return 24000; |
---|
147 | | - case TQMX86_REG_BOARD_ID_E39M: |
---|
148 | | - case TQMX86_REG_BOARD_ID_E39C: |
---|
149 | | - case TQMX86_REG_BOARD_ID_E39x: |
---|
| 163 | + case TQMX86_REG_BOARD_ID_E39MS: |
---|
| 164 | + case TQMX86_REG_BOARD_ID_E39C1: |
---|
| 165 | + case TQMX86_REG_BOARD_ID_E39C2: |
---|
150 | 166 | return 25000; |
---|
151 | 167 | case TQMX86_REG_BOARD_ID_E38M: |
---|
152 | 168 | case TQMX86_REG_BOARD_ID_E38C: |
---|
.. | .. |
---|
158 | 174 | |
---|
159 | 175 | static int tqmx86_probe(struct platform_device *pdev) |
---|
160 | 176 | { |
---|
161 | | - u8 board_id, rev, i2c_det, io_ext_int_val; |
---|
| 177 | + u8 board_id, sauc, rev, i2c_det, io_ext_int_val; |
---|
162 | 178 | struct device *dev = &pdev->dev; |
---|
163 | 179 | u8 gpio_irq_cfg, readback; |
---|
164 | 180 | const char *board_name; |
---|
.. | .. |
---|
188 | 204 | return -ENOMEM; |
---|
189 | 205 | |
---|
190 | 206 | board_id = ioread8(io_base + TQMX86_REG_BOARD_ID); |
---|
191 | | - board_name = tqmx86_board_id_to_name(board_id); |
---|
| 207 | + sauc = ioread8(io_base + TQMX86_REG_SAUC); |
---|
| 208 | + board_name = tqmx86_board_id_to_name(board_id, sauc); |
---|
192 | 209 | rev = ioread8(io_base + TQMX86_REG_BOARD_REV); |
---|
193 | 210 | |
---|
194 | 211 | dev_info(dev, |
---|
195 | 212 | "Found %s - Board ID %d, PCB Revision %d, PLD Revision %d\n", |
---|
196 | 213 | board_name, board_id, rev >> 4, rev & 0xf); |
---|
197 | 214 | |
---|
198 | | - i2c_det = ioread8(io_base + TQMX86_REG_I2C_DETECT); |
---|
| 215 | + /* |
---|
| 216 | + * The I2C_DETECT register is in the range assigned to the I2C driver |
---|
| 217 | + * later, so we don't extend TQMX86_IOSIZE. Use inb() for this one-off |
---|
| 218 | + * access instead of ioport_map + unmap. |
---|
| 219 | + */ |
---|
| 220 | + i2c_det = inb(TQMX86_REG_I2C_DETECT); |
---|
199 | 221 | |
---|
200 | 222 | if (gpio_irq_cfg) { |
---|
201 | 223 | io_ext_int_val = |
---|