| .. | .. |
|---|
| 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 = |
|---|