hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/mfd/tqmx86.c
....@@ -16,8 +16,8 @@
1616 #include <linux/platform_data/i2c-ocores.h>
1717 #include <linux/platform_device.h>
1818
19
-#define TQMX86_IOBASE 0x160
20
-#define TQMX86_IOSIZE 0x3f
19
+#define TQMX86_IOBASE 0x180
20
+#define TQMX86_IOSIZE 0x20
2121 #define TQMX86_IOBASE_I2C 0x1a0
2222 #define TQMX86_IOSIZE_I2C 0xa
2323 #define TQMX86_IOBASE_WATCHDOG 0x18b
....@@ -25,29 +25,33 @@
2525 #define TQMX86_IOBASE_GPIO 0x18d
2626 #define TQMX86_IOSIZE_GPIO 0x4
2727
28
-#define TQMX86_REG_BOARD_ID 0x20
28
+#define TQMX86_REG_BOARD_ID 0x00
2929 #define TQMX86_REG_BOARD_ID_E38M 1
3030 #define TQMX86_REG_BOARD_ID_50UC 2
3131 #define TQMX86_REG_BOARD_ID_E38C 3
3232 #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
3636 #define TQMX86_REG_BOARD_ID_70EB 8
3737 #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
4145 #define TQMX86_REG_IO_EXT_INT_NONE 0
4246 #define TQMX86_REG_IO_EXT_INT_7 1
4347 #define TQMX86_REG_IO_EXT_INT_9 2
4448 #define TQMX86_REG_IO_EXT_INT_12 3
4549 #define TQMX86_REG_IO_EXT_INT_MASK 0x3
4650 #define TQMX86_REG_IO_EXT_INT_GPIO_SHIFT 4
51
+#define TQMX86_REG_SAUC 0x17
4752
48
-#define TQMX86_REG_I2C_DETECT 0x47
53
+#define TQMX86_REG_I2C_DETECT 0x1a7
4954 #define TQMX86_REG_I2C_DETECT_SOFT 0xa5
50
-#define TQMX86_REG_I2C_INT_EN 0x49
5155
5256 static uint gpio_irq;
5357 module_param(gpio_irq, uint, 0);
....@@ -107,7 +111,7 @@
107111 },
108112 };
109113
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)
111115 {
112116 switch (board_id) {
113117 case TQMX86_REG_BOARD_ID_E38M:
....@@ -118,18 +122,26 @@
118122 return "TQMxE38C";
119123 case TQMX86_REG_BOARD_ID_60EB:
120124 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";
127131 case TQMX86_REG_BOARD_ID_70EB:
128132 return "TQMx70EB";
129133 case TQMX86_REG_BOARD_ID_80UC:
130134 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";
133145 default:
134146 return "Unknown";
135147 }
....@@ -142,11 +154,15 @@
142154 case TQMX86_REG_BOARD_ID_60EB:
143155 case TQMX86_REG_BOARD_ID_70EB:
144156 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:
146162 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:
150166 return 25000;
151167 case TQMX86_REG_BOARD_ID_E38M:
152168 case TQMX86_REG_BOARD_ID_E38C:
....@@ -158,7 +174,7 @@
158174
159175 static int tqmx86_probe(struct platform_device *pdev)
160176 {
161
- u8 board_id, rev, i2c_det, io_ext_int_val;
177
+ u8 board_id, sauc, rev, i2c_det, io_ext_int_val;
162178 struct device *dev = &pdev->dev;
163179 u8 gpio_irq_cfg, readback;
164180 const char *board_name;
....@@ -188,14 +204,20 @@
188204 return -ENOMEM;
189205
190206 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);
192209 rev = ioread8(io_base + TQMX86_REG_BOARD_REV);
193210
194211 dev_info(dev,
195212 "Found %s - Board ID %d, PCB Revision %d, PLD Revision %d\n",
196213 board_name, board_id, rev >> 4, rev & 0xf);
197214
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);
199221
200222 if (gpio_irq_cfg) {
201223 io_ext_int_val =