[PATCH] I2C: Separate non-i2c hwmon drivers from i2c-core (3/9)
[linux-2.6] / drivers / i2c / busses / i2c-nforce2.c
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         .name = "Non-I2C SMBus adapter",
114         .id = I2C_ALGO_SMBUS,
115         .smbus_xfer = nforce2_access,
116         .functionality = nforce2_func,
117 };
118
119 static struct i2c_adapter nforce2_adapter = {
120         .owner          = THIS_MODULE,
121         .class          = I2C_CLASS_HWMON,
122         .algo           = &smbus_algorithm,
123         .name           = "unset",
124 };
125
126 /* Return -1 on error. See smbus.h for more information */
127 static s32 nforce2_access(struct i2c_adapter * adap, u16 addr,
128                 unsigned short flags, char read_write,
129                 u8 command, int size, union i2c_smbus_data * data)
130 {
131         struct nforce2_smbus *smbus = adap->algo_data;
132         unsigned char protocol, pec, temp;
133         unsigned char len = 0; /* to keep the compiler quiet */
134         int i;
135
136         protocol = (read_write == I2C_SMBUS_READ) ? NVIDIA_SMB_PRTCL_READ :
137                 NVIDIA_SMB_PRTCL_WRITE;
138         pec = (flags & I2C_CLIENT_PEC) ? NVIDIA_SMB_PRTCL_PEC : 0;
139
140         switch (size) {
141
142                 case I2C_SMBUS_QUICK:
143                         protocol |= NVIDIA_SMB_PRTCL_QUICK;
144                         read_write = I2C_SMBUS_WRITE;
145                         break;
146
147                 case I2C_SMBUS_BYTE:
148                         if (read_write == I2C_SMBUS_WRITE)
149                                 outb_p(command, NVIDIA_SMB_CMD);
150                         protocol |= NVIDIA_SMB_PRTCL_BYTE;
151                         break;
152
153                 case I2C_SMBUS_BYTE_DATA:
154                         outb_p(command, NVIDIA_SMB_CMD);
155                         if (read_write == I2C_SMBUS_WRITE)
156                                 outb_p(data->byte, NVIDIA_SMB_DATA);
157                         protocol |= NVIDIA_SMB_PRTCL_BYTE_DATA;
158                         break;
159
160                 case I2C_SMBUS_WORD_DATA:
161                         outb_p(command, NVIDIA_SMB_CMD);
162                         if (read_write == I2C_SMBUS_WRITE) {
163                                  outb_p(data->word, NVIDIA_SMB_DATA);
164                                  outb_p(data->word >> 8, NVIDIA_SMB_DATA+1);
165                         }
166                         protocol |= NVIDIA_SMB_PRTCL_WORD_DATA | pec;
167                         break;
168
169                 case I2C_SMBUS_BLOCK_DATA:
170                         outb_p(command, NVIDIA_SMB_CMD);
171                         if (read_write == I2C_SMBUS_WRITE) {
172                                 len = min_t(u8, data->block[0], 32);
173                                 outb_p(len, NVIDIA_SMB_BCNT);
174                                 for (i = 0; i < len; i++)
175                                         outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i);
176                         }
177                         protocol |= NVIDIA_SMB_PRTCL_BLOCK_DATA | pec;
178                         break;
179
180                 case I2C_SMBUS_I2C_BLOCK_DATA:
181                         len = min_t(u8, data->block[0], 32);
182                         outb_p(command, NVIDIA_SMB_CMD);
183                         outb_p(len, NVIDIA_SMB_BCNT);
184                         if (read_write == I2C_SMBUS_WRITE)
185                                 for (i = 0; i < len; i++)
186                                         outb_p(data->block[i + 1], NVIDIA_SMB_DATA+i);
187                         protocol |= NVIDIA_SMB_PRTCL_I2C_BLOCK_DATA;
188                         break;
189
190                 case I2C_SMBUS_PROC_CALL:
191                         dev_err(&adap->dev, "I2C_SMBUS_PROC_CALL not supported!\n");
192                         return -1;
193
194                 case I2C_SMBUS_BLOCK_PROC_CALL:
195                         dev_err(&adap->dev, "I2C_SMBUS_BLOCK_PROC_CALL not supported!\n");
196                         return -1;
197
198                 case I2C_SMBUS_WORD_DATA_PEC:
199                 case I2C_SMBUS_BLOCK_DATA_PEC:
200                 case I2C_SMBUS_PROC_CALL_PEC:
201                 case I2C_SMBUS_BLOCK_PROC_CALL_PEC:
202                         dev_err(&adap->dev, "Unexpected software PEC transaction %d\n.", size);
203                         return -1;
204
205                 default:
206                         dev_err(&adap->dev, "Unsupported transaction %d\n", size);
207                         return -1;
208         }
209
210         outb_p((addr & 0x7f) << 1, NVIDIA_SMB_ADDR);
211         outb_p(protocol, NVIDIA_SMB_PRTCL);
212
213         temp = inb_p(NVIDIA_SMB_STS);
214
215         if (~temp & NVIDIA_SMB_STS_DONE) {
216                 udelay(500);
217                 temp = inb_p(NVIDIA_SMB_STS);
218         }
219         if (~temp & NVIDIA_SMB_STS_DONE) {
220                 msleep(10);
221                 temp = inb_p(NVIDIA_SMB_STS);
222         }
223
224         if ((~temp & NVIDIA_SMB_STS_DONE) || (temp & NVIDIA_SMB_STS_STATUS)) {
225                 dev_dbg(&adap->dev, "SMBus Timeout! (0x%02x)\n", temp);
226                 return -1;
227         }
228
229         if (read_write == I2C_SMBUS_WRITE)
230                 return 0;
231
232         switch (size) {
233
234                 case I2C_SMBUS_BYTE:
235                 case I2C_SMBUS_BYTE_DATA:
236                         data->byte = inb_p(NVIDIA_SMB_DATA);
237                         break;
238
239                 case I2C_SMBUS_WORD_DATA:
240                 /* case I2C_SMBUS_PROC_CALL: not supported */
241                         data->word = inb_p(NVIDIA_SMB_DATA) | (inb_p(NVIDIA_SMB_DATA+1) << 8);
242                         break;
243
244                 case I2C_SMBUS_BLOCK_DATA:
245                 /* case I2C_SMBUS_BLOCK_PROC_CALL: not supported */
246                         len = inb_p(NVIDIA_SMB_BCNT);
247                         len = min_t(u8, len, 32);
248                 case I2C_SMBUS_I2C_BLOCK_DATA:
249                         for (i = 0; i < len; i++)
250                                 data->block[i+1] = inb_p(NVIDIA_SMB_DATA + i);
251                         data->block[0] = len;
252                         break;
253         }
254
255         return 0;
256 }
257
258
259 static u32 nforce2_func(struct i2c_adapter *adapter)
260 {
261         /* other functionality might be possible, but is not tested */
262         return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
263             I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA /* |
264             I2C_FUNC_SMBUS_BLOCK_DATA */;
265 }
266
267
268 static struct pci_device_id nforce2_ids[] = {
269         { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) },
270         { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS) },
271         { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) },
272         { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS) },
273         { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE4_SMBUS) },
274         { 0 }
275 };
276
277
278 MODULE_DEVICE_TABLE (pci, nforce2_ids);
279
280
281 static int __devinit nforce2_probe_smb (struct pci_dev *dev, int reg,
282         struct nforce2_smbus *smbus, char *name)
283 {
284         u16 iobase;
285         int error;
286
287         if (pci_read_config_word(dev, reg, &iobase) != PCIBIOS_SUCCESSFUL) {
288                 dev_err(&smbus->adapter.dev, "Error reading PCI config for %s\n", name);
289                 return -1;
290         }
291         smbus->dev  = dev;
292         smbus->base = iobase & 0xfffc;
293         smbus->size = 8;
294
295         if (!request_region(smbus->base, smbus->size, "nForce2 SMBus")) {
296                 dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
297                         smbus->base, smbus->base+smbus->size-1, name);
298                 return -1;
299         }
300         smbus->adapter = nforce2_adapter;
301         smbus->adapter.algo_data = smbus;
302         smbus->adapter.dev.parent = &dev->dev;
303         snprintf(smbus->adapter.name, I2C_NAME_SIZE,
304                 "SMBus nForce2 adapter at %04x", smbus->base);
305
306         error = i2c_add_adapter(&smbus->adapter);
307         if (error) {
308                 dev_err(&smbus->adapter.dev, "Failed to register adapter.\n");
309                 release_region(smbus->base, smbus->size);
310                 return -1;
311         }
312         dev_info(&smbus->adapter.dev, "nForce2 SMBus adapter at %#x\n", smbus->base);
313         return 0;
314 }
315
316
317 static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id)
318 {
319         struct nforce2_smbus *smbuses;
320         int res1, res2;
321
322         /* we support 2 SMBus adapters */
323         if (!(smbuses = (void *)kmalloc(2*sizeof(struct nforce2_smbus),
324                                         GFP_KERNEL)))
325                 return -ENOMEM;
326         memset (smbuses, 0, 2*sizeof(struct nforce2_smbus));
327         pci_set_drvdata(dev, smbuses);
328
329         /* SMBus adapter 1 */
330         res1 = nforce2_probe_smb (dev, NFORCE_PCI_SMB1, &smbuses[0], "SMB1");
331         if (res1 < 0) {
332                 dev_err(&dev->dev, "Error probing SMB1.\n");
333                 smbuses[0].base = 0;    /* to have a check value */
334         }
335         res2 = nforce2_probe_smb (dev, NFORCE_PCI_SMB2, &smbuses[1], "SMB2");
336         if (res2 < 0) {
337                 dev_err(&dev->dev, "Error probing SMB2.\n");
338                 smbuses[1].base = 0;    /* to have a check value */
339         }
340         if ((res1 < 0) && (res2 < 0)) {
341                 /* we did not find even one of the SMBuses, so we give up */
342                 kfree(smbuses);
343                 return -ENODEV;
344         }
345
346         return 0;
347 }
348
349
350 static void __devexit nforce2_remove(struct pci_dev *dev)
351 {
352         struct nforce2_smbus *smbuses = (void*) pci_get_drvdata(dev);
353
354         if (smbuses[0].base) {
355                 i2c_del_adapter(&smbuses[0].adapter);
356                 release_region(smbuses[0].base, smbuses[0].size);
357         }
358         if (smbuses[1].base) {
359                 i2c_del_adapter(&smbuses[1].adapter);
360                 release_region(smbuses[1].base, smbuses[1].size);
361         }
362         kfree(smbuses);
363 }
364
365 static struct pci_driver nforce2_driver = {
366         .name           = "nForce2_smbus",
367         .id_table       = nforce2_ids,
368         .probe          = nforce2_probe,
369         .remove         = __devexit_p(nforce2_remove),
370 };
371
372 static int __init nforce2_init(void)
373 {
374         return pci_register_driver(&nforce2_driver);
375 }
376
377 static void __exit nforce2_exit(void)
378 {
379         pci_unregister_driver(&nforce2_driver);
380 }
381
382 module_init(nforce2_init);
383 module_exit(nforce2_exit);
384