xref: /linux/drivers/i2c/busses/i2c-nforce2.c (revision 2624f124b3b5d550ab2fbef7ee3bc0e1fed09722)
1 /*
2     SMBus driver for nVidia nForce2 MCP
3 
4     Added nForce3 Pro 150  Thomas Leibold <thomas@plx.com>,
5 	Ported to 2.5 Patrick Dreker <patrick@dreker.de>,
6     Copyright (c) 2003  Hans-Frieder Vogt <hfvogt@arcor.de>,
7     Based on
8     SMBus 2.0 driver for AMD-8111 IO-Hub
9     Copyright (c) 2002 Vojtech Pavlik
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 as published by
13     the Free Software Foundation; either version 2 of the License, or
14     (at your option) any later version.
15 
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20 
21     You should have received a copy of the GNU General Public License
22     along with this program; if not, write to the Free Software
23     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25 
26 /*
27     SUPPORTED DEVICES		PCI ID
28     nForce2 MCP			0064
29     nForce2 Ultra 400 MCP	0084
30     nForce3 Pro150 MCP		00D4
31     nForce3 250Gb MCP		00E4
32     nForce4 MCP			0052
33 
34     This driver supports the 2 SMBuses that are included in the MCP of the
35     nForce2/3/4 chipsets.
36 */
37 
38 /* Note: we assume there can only be one nForce2, with two SMBus interfaces */
39 
40 #include <linux/module.h>
41 #include <linux/pci.h>
42 #include <linux/kernel.h>
43 #include <linux/stddef.h>
44 #include <linux/sched.h>
45 #include <linux/ioport.h>
46 #include <linux/init.h>
47 #include <linux/i2c.h>
48 #include <linux/delay.h>
49 #include <asm/io.h>
50 
51 MODULE_LICENSE("GPL");
52 MODULE_AUTHOR ("Hans-Frieder Vogt <hfvogt@arcor.de>");
53 MODULE_DESCRIPTION("nForce2 SMBus driver");
54 
55 
56 struct nforce2_smbus {
57 	struct pci_dev *dev;
58 	struct i2c_adapter adapter;
59 	int base;
60 	int size;
61 };
62 
63 
64 /*
65  * nVidia nForce2 SMBus control register definitions
66  */
67 #define NFORCE_PCI_SMB1	0x50
68 #define NFORCE_PCI_SMB2	0x54
69 
70 
71 /*
72  * ACPI 2.0 chapter 13 SMBus 2.0 EC register model
73  */
74 #define NVIDIA_SMB_PRTCL	(smbus->base + 0x00)	/* protocol, PEC */
75 #define NVIDIA_SMB_STS		(smbus->base + 0x01)	/* status */
76 #define NVIDIA_SMB_ADDR		(smbus->base + 0x02)	/* address */
77 #define NVIDIA_SMB_CMD		(smbus->base + 0x03)	/* command */
78 #define NVIDIA_SMB_DATA		(smbus->base + 0x04)	/* 32 data registers */
79 #define NVIDIA_SMB_BCNT		(smbus->base + 0x24)	/* number of data bytes */
80 #define NVIDIA_SMB_ALRM_A	(smbus->base + 0x25)	/* alarm address */
81 #define NVIDIA_SMB_ALRM_D	(smbus->base + 0x26)	/* 2 bytes alarm data */
82 
83 #define NVIDIA_SMB_STS_DONE	0x80
84 #define NVIDIA_SMB_STS_ALRM	0x40
85 #define NVIDIA_SMB_STS_RES	0x20
86 #define NVIDIA_SMB_STS_STATUS	0x1f
87 
88 #define NVIDIA_SMB_PRTCL_WRITE			0x00
89 #define NVIDIA_SMB_PRTCL_READ			0x01
90 #define NVIDIA_SMB_PRTCL_QUICK			0x02
91 #define NVIDIA_SMB_PRTCL_BYTE			0x04
92 #define NVIDIA_SMB_PRTCL_BYTE_DATA		0x06
93 #define NVIDIA_SMB_PRTCL_WORD_DATA		0x08
94 #define NVIDIA_SMB_PRTCL_BLOCK_DATA		0x0a
95 #define NVIDIA_SMB_PRTCL_PROC_CALL		0x0c
96 #define NVIDIA_SMB_PRTCL_BLOCK_PROC_CALL	0x0d
97 #define NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA		0x4a
98 #define NVIDIA_SMB_PRTCL_PEC			0x80
99 
100 
101 /* Other settings */
102 #define MAX_TIMEOUT 256
103 
104 
105 
106 static s32 nforce2_access(struct i2c_adapter *adap, u16 addr,
107 		       unsigned short flags, char read_write,
108 		       u8 command, int size, union i2c_smbus_data *data);
109 static u32 nforce2_func(struct i2c_adapter *adapter);
110 
111 
112 static struct i2c_algorithm smbus_algorithm = {
113 	.smbus_xfer = nforce2_access,
114 	.functionality = nforce2_func,
115 };
116 
117 static struct i2c_adapter nforce2_adapter = {
118 	.owner          = THIS_MODULE,
119 	.class          = I2C_CLASS_HWMON,
120 	.algo           = &smbus_algorithm,
121 	.name   	= "unset",
122 };
123 
124 /* Return -1 on error. See smbus.h for more information */
125 static s32 nforce2_access(struct i2c_adapter * adap, u16 addr,
126 		unsigned short flags, char read_write,
127 		u8 command, int size, union i2c_smbus_data * data)
128 {
129 	struct nforce2_smbus *smbus = adap->algo_data;
130 	unsigned char protocol, pec, temp;
131 	unsigned char len = 0; /* to keep the compiler quiet */
132 	int i;
133 
134 	protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ :
135 		NVIDIA_SMB_PRTCL_WRITE;
136 	pec = (flags & I2C_CLIENT_PEC) ? NVIDIA_SMB_PRTCL_PEC : 0;
137 
138 	switch (size) {
139 
140 		case I2C_SMBUS_QUICK:
141 			protocol |= NVIDIA_SMB_PRTCL_QUICK;
142 			read_write = I2C_SMBUS_WRITE;
143 			break;
144 
145 		case I2C_SMBUS_BYTE:
146 			if (read_write == I2C_SMBUS_WRITE)
147 				outb_p(command, NVIDIA_SMB_CMD);
148 			protocol |= NVIDIA_SMB_PRTCL_BYTE;
149 			break;
150 
151 		case I2C_SMBUS_BYTE_DATA:
152 			outb_p(command, NVIDIA_SMB_CMD);
153 			if (read_write == I2C_SMBUS_WRITE)
154 				outb_p(data->byte, NVIDIA_SMB_DATA);
155 			protocol |= NVIDIA_SMB_PRTCL_BYTE_DATA;
156 			break;
157 
158 		case I2C_SMBUS_WORD_DATA:
159 			outb_p(command, NVIDIA_SMB_CMD);
160 			if (read_write == I2C_SMBUS_WRITE) {
161 				 outb_p(data->word, NVIDIA_SMB_DATA);
162 				 outb_p(data->word >> 8, NVIDIA_SMB_DATA+1);
163 			}
164 			protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec;
165 			break;
166 
167 		case I2C_SMBUS_BLOCK_DATA:
168 			outb_p(command, NVIDIA_SMB_CMD);
169 			if (read_write == I2C_SMBUS_WRITE) {
170 				len = min_t(u8, data->block[0], 32);
171 				outb_p(len, NVIDIA_SMB_BCNT);
172 				for (i = 0; i < len; i++)
173 					outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i);
174 			}
175 			protocol |= NVIDIA_SMB_PRTCL_BLOCK_DATA | pec;
176 			break;
177 
178 		case I2C_SMBUS_I2C_BLOCK_DATA:
179 			len = min_t(u8, data->block[0], 32);
180 			outb_p(command, NVIDIA_SMB_CMD);
181 			outb_p(len, NVIDIA_SMB_BCNT);
182 			if (read_write == I2C_SMBUS_WRITE)
183 				for (i = 0; i < len; i++)
184 					outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i);
185 			protocol |= NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA;
186 			break;
187 
188 		case I2C_SMBUS_PROC_CALL:
189 			dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n");
190 			return -1;
191 
192 		case I2C_SMBUS_BLOCK_PROC_CALL:
193 			dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n");
194 			return -1;
195 
196 		case I2C_SMBUS_WORD_DATA_PEC:
197 		case I2C_SMBUS_BLOCK_DATA_PEC:
198 		case I2C_SMBUS_PROC_CALL_PEC:
199 		case I2C_SMBUS_BLOCK_PROC_CALL_PEC:
200 			dev_err(&adap->dev, "Unexpected software PEC transaction %d\n.", size);
201 			return -1;
202 
203 		default:
204 			dev_err(&adap->dev, "Unsupported transaction %d\n", size);
205 			return -1;
206 	}
207 
208 	outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR);
209 	outb_p(protocol, NVIDIA_SMB_PRTCL);
210 
211 	temp = inb_p(NVIDIA_SMB_STS);
212 
213 	if (~temp & NVIDIA_SMB_STS_DONE) {
214 		udelay(500);
215 		temp = inb_p(NVIDIA_SMB_STS);
216 	}
217 	if (~temp & NVIDIA_SMB_STS_DONE) {
218 		msleep(10);
219 		temp = inb_p(NVIDIA_SMB_STS);
220 	}
221 
222 	if ((~temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) {
223 		dev_dbg(&adap->dev, "SMBus Timeout! (0x%02x)\n", temp);
224 		return -1;
225 	}
226 
227 	if (read_write == I2C_SMBUS_WRITE)
228 		return 0;
229 
230 	switch (size) {
231 
232 		case I2C_SMBUS_BYTE:
233 		case I2C_SMBUS_BYTE_DATA:
234 			data->byte = inb_p(NVIDIA_SMB_DATA);
235 			break;
236 
237 		case I2C_SMBUS_WORD_DATA:
238 		/* case I2C_SMBUS_PROC_CALL: not supported */
239 			data->word = inb_p(NVIDIA_SMB_DATA) | (inb_p(NVIDIA_SMB_DATA+1) << 8);
240 			break;
241 
242 		case I2C_SMBUS_BLOCK_DATA:
243 		/* case I2C_SMBUS_BLOCK_PROC_CALL: not supported */
244 			len = inb_p(NVIDIA_SMB_BCNT);
245 			len = min_t(u8, len, 32);
246 		case I2C_SMBUS_I2C_BLOCK_DATA:
247 			for (i = 0; i < len; i++)
248 				data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i);
249 			data->block[0] = len;
250 			break;
251 	}
252 
253 	return 0;
254 }
255 
256 
257 static u32 nforce2_func(struct i2c_adapter *adapter)
258 {
259 	/* other functionality might be possible, but is not tested */
260 	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
261 	    I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA /* |
262 	    I2C_FUNC_SMBUS_BLOCK_DATA */;
263 }
264 
265 
266 static struct pci_device_id nforce2_ids[] = {
267 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) },
268 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS) },
269 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) },
270 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS) },
271 	{ PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_SMBUS) },
272 	{ 0 }
273 };
274 
275 
276 MODULE_DEVICE_TABLE (pci, nforce2_ids);
277 
278 
279 static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
280 	struct nforce2_smbus *smbus, char *name)
281 {
282 	u16 iobase;
283 	int error;
284 
285 	if (pci_read_config_word(dev, reg, &iobase) != PCIBIOS_SUCCESSFUL) {
286 		dev_err(&smbus->adapter.dev, "Error reading PCI config for %s\n", name);
287 		return -1;
288 	}
289 	smbus->dev  = dev;
290 	smbus->base = iobase & 0xfffc;
291 	smbus->size = 8;
292 
293 	if (!request_region(smbus->base, smbus->size, "nForce2 SMBus")) {
294 		dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
295 			smbus->base, smbus->base+smbus->size-1, name);
296 		return -1;
297 	}
298 	smbus->adapter = nforce2_adapter;
299 	smbus->adapter.algo_data = smbus;
300 	smbus->adapter.dev.parent = &dev->dev;
301 	snprintf(smbus->adapter.name, I2C_NAME_SIZE,
302 		"SMBus nForce2 adapter at %04x", smbus->base);
303 
304 	error = i2c_add_adapter(&smbus->adapter);
305 	if (error) {
306 		dev_err(&smbus->adapter.dev, "Failed to register adapter.\n");
307 		release_region(smbus->base, smbus->size);
308 		return -1;
309 	}
310 	dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n", smbus->base);
311 	return 0;
312 }
313 
314 
315 static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id)
316 {
317 	struct nforce2_smbus *smbuses;
318 	int res1, res2;
319 
320 	/* we support 2 SMBus adapters */
321 	if (!(smbuses = (void *)kmalloc(2*sizeof(struct nforce2_smbus),
322 				       	GFP_KERNEL)))
323 		return -ENOMEM;
324 	memset (smbuses, 0, 2*sizeof(struct nforce2_smbus));
325 	pci_set_drvdata(dev, smbuses);
326 
327 	/* SMBus adapter 1 */
328 	res1 = nforce2_probe_smb (dev, NFORCE_PCI_SMB1, &smbuses[0], "SMB1");
329 	if (res1 < 0) {
330 		dev_err(&dev->dev, "Error probing SMB1.\n");
331 		smbuses[0].base = 0;	/* to have a check value */
332 	}
333 	res2 = nforce2_probe_smb (dev, NFORCE_PCI_SMB2, &smbuses[1], "SMB2");
334 	if (res2 < 0) {
335 		dev_err(&dev->dev, "Error probing SMB2.\n");
336 		smbuses[1].base = 0;	/* to have a check value */
337 	}
338 	if ((res1 < 0) && (res2 < 0)) {
339 		/* we did not find even one of the SMBuses, so we give up */
340 		kfree(smbuses);
341 		return -ENODEV;
342 	}
343 
344 	return 0;
345 }
346 
347 
348 static void __devexit nforce2_remove(struct pci_dev *dev)
349 {
350 	struct nforce2_smbus *smbuses = (void*) pci_get_drvdata(dev);
351 
352 	if (smbuses[0].base) {
353 		i2c_del_adapter(&smbuses[0].adapter);
354 		release_region(smbuses[0].base, smbuses[0].size);
355 	}
356 	if (smbuses[1].base) {
357 		i2c_del_adapter(&smbuses[1].adapter);
358 		release_region(smbuses[1].base, smbuses[1].size);
359 	}
360 	kfree(smbuses);
361 }
362 
363 static struct pci_driver nforce2_driver = {
364 	.name		= "nForce2_smbus",
365 	.id_table	= nforce2_ids,
366 	.probe		= nforce2_probe,
367 	.remove		= __devexit_p(nforce2_remove),
368 };
369 
370 static int __init nforce2_init(void)
371 {
372 	return pci_register_driver(&nforce2_driver);
373 }
374 
375 static void __exit nforce2_exit(void)
376 {
377 	pci_unregister_driver(&nforce2_driver);
378 }
379 
380 module_init(nforce2_init);
381 module_exit(nforce2_exit);
382 
383