diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-voodoo3.c')
-rw-r--r-- | drivers/i2c/busses/i2c-voodoo3.c | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/drivers/i2c/busses/i2c-voodoo3.c b/drivers/i2c/busses/i2c-voodoo3.c deleted file mode 100644 index 7663d57833a0..000000000000 --- a/drivers/i2c/busses/i2c-voodoo3.c +++ /dev/null | |||
@@ -1,248 +0,0 @@ | |||
1 | /* | ||
2 | Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>, | ||
3 | Philip Edelbrock <phil@netroedge.com>, | ||
4 | Ralph Metzler <rjkm@thp.uni-koeln.de>, and | ||
5 | Mark D. Studebaker <mdsxyz123@yahoo.com> | ||
6 | |||
7 | Based on code written by Ralph Metzler <rjkm@thp.uni-koeln.de> and | ||
8 | Simon Vogl | ||
9 | |||
10 | This program is free software; you can redistribute it and/or modify | ||
11 | it under the terms of the GNU General Public License as published by | ||
12 | the Free Software Foundation; either version 2 of the License, or | ||
13 | (at your option) any later version. | ||
14 | |||
15 | This program is distributed in the hope that it will be useful, | ||
16 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 | GNU General Public License for more details. | ||
19 | |||
20 | You should have received a copy of the GNU General Public License | ||
21 | along with this program; if not, write to the Free Software | ||
22 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
23 | */ | ||
24 | |||
25 | /* This interfaces to the I2C bus of the Voodoo3 to gain access to | ||
26 | the BT869 and possibly other I2C devices. */ | ||
27 | |||
28 | #include <linux/kernel.h> | ||
29 | #include <linux/module.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/pci.h> | ||
32 | #include <linux/i2c.h> | ||
33 | #include <linux/i2c-algo-bit.h> | ||
34 | #include <asm/io.h> | ||
35 | |||
36 | /* the only registers we use */ | ||
37 | #define REG 0x78 | ||
38 | #define REG2 0x70 | ||
39 | |||
40 | /* bit locations in the register */ | ||
41 | #define DDC_ENAB 0x00040000 | ||
42 | #define DDC_SCL_OUT 0x00080000 | ||
43 | #define DDC_SDA_OUT 0x00100000 | ||
44 | #define DDC_SCL_IN 0x00200000 | ||
45 | #define DDC_SDA_IN 0x00400000 | ||
46 | #define I2C_ENAB 0x00800000 | ||
47 | #define I2C_SCL_OUT 0x01000000 | ||
48 | #define I2C_SDA_OUT 0x02000000 | ||
49 | #define I2C_SCL_IN 0x04000000 | ||
50 | #define I2C_SDA_IN 0x08000000 | ||
51 | |||
52 | /* initialization states */ | ||
53 | #define INIT2 0x2 | ||
54 | #define INIT3 0x4 | ||
55 | |||
56 | /* delays */ | ||
57 | #define CYCLE_DELAY 10 | ||
58 | #define TIMEOUT (HZ / 2) | ||
59 | |||
60 | |||
61 | static void __iomem *ioaddr; | ||
62 | |||
63 | /* The voo GPIO registers don't have individual masks for each bit | ||
64 | so we always have to read before writing. */ | ||
65 | |||
66 | static void bit_vooi2c_setscl(void *data, int val) | ||
67 | { | ||
68 | unsigned int r; | ||
69 | r = readl(ioaddr + REG); | ||
70 | if (val) | ||
71 | r |= I2C_SCL_OUT; | ||
72 | else | ||
73 | r &= ~I2C_SCL_OUT; | ||
74 | writel(r, ioaddr + REG); | ||
75 | readl(ioaddr + REG); /* flush posted write */ | ||
76 | } | ||
77 | |||
78 | static void bit_vooi2c_setsda(void *data, int val) | ||
79 | { | ||
80 | unsigned int r; | ||
81 | r = readl(ioaddr + REG); | ||
82 | if (val) | ||
83 | r |= I2C_SDA_OUT; | ||
84 | else | ||
85 | r &= ~I2C_SDA_OUT; | ||
86 | writel(r, ioaddr + REG); | ||
87 | readl(ioaddr + REG); /* flush posted write */ | ||
88 | } | ||
89 | |||
90 | /* The GPIO pins are open drain, so the pins always remain outputs. | ||
91 | We rely on the i2c-algo-bit routines to set the pins high before | ||
92 | reading the input from other chips. */ | ||
93 | |||
94 | static int bit_vooi2c_getscl(void *data) | ||
95 | { | ||
96 | return (0 != (readl(ioaddr + REG) & I2C_SCL_IN)); | ||
97 | } | ||
98 | |||
99 | static int bit_vooi2c_getsda(void *data) | ||
100 | { | ||
101 | return (0 != (readl(ioaddr + REG) & I2C_SDA_IN)); | ||
102 | } | ||
103 | |||
104 | static void bit_vooddc_setscl(void *data, int val) | ||
105 | { | ||
106 | unsigned int r; | ||
107 | r = readl(ioaddr + REG); | ||
108 | if (val) | ||
109 | r |= DDC_SCL_OUT; | ||
110 | else | ||
111 | r &= ~DDC_SCL_OUT; | ||
112 | writel(r, ioaddr + REG); | ||
113 | readl(ioaddr + REG); /* flush posted write */ | ||
114 | } | ||
115 | |||
116 | static void bit_vooddc_setsda(void *data, int val) | ||
117 | { | ||
118 | unsigned int r; | ||
119 | r = readl(ioaddr + REG); | ||
120 | if (val) | ||
121 | r |= DDC_SDA_OUT; | ||
122 | else | ||
123 | r &= ~DDC_SDA_OUT; | ||
124 | writel(r, ioaddr + REG); | ||
125 | readl(ioaddr + REG); /* flush posted write */ | ||
126 | } | ||
127 | |||
128 | static int bit_vooddc_getscl(void *data) | ||
129 | { | ||
130 | return (0 != (readl(ioaddr + REG) & DDC_SCL_IN)); | ||
131 | } | ||
132 | |||
133 | static int bit_vooddc_getsda(void *data) | ||
134 | { | ||
135 | return (0 != (readl(ioaddr + REG) & DDC_SDA_IN)); | ||
136 | } | ||
137 | |||
138 | static int config_v3(struct pci_dev *dev) | ||
139 | { | ||
140 | unsigned long cadr; | ||
141 | |||
142 | /* map Voodoo3 memory */ | ||
143 | cadr = dev->resource[0].start; | ||
144 | cadr &= PCI_BASE_ADDRESS_MEM_MASK; | ||
145 | ioaddr = ioremap_nocache(cadr, 0x1000); | ||
146 | if (ioaddr) { | ||
147 | writel(0x8160, ioaddr + REG2); | ||
148 | writel(0xcffc0020, ioaddr + REG); | ||
149 | dev_info(&dev->dev, "Using Banshee/Voodoo3 I2C device at %p\n", ioaddr); | ||
150 | return 0; | ||
151 | } | ||
152 | return -ENODEV; | ||
153 | } | ||
154 | |||
155 | static struct i2c_algo_bit_data voo_i2c_bit_data = { | ||
156 | .setsda = bit_vooi2c_setsda, | ||
157 | .setscl = bit_vooi2c_setscl, | ||
158 | .getsda = bit_vooi2c_getsda, | ||
159 | .getscl = bit_vooi2c_getscl, | ||
160 | .udelay = CYCLE_DELAY, | ||
161 | .timeout = TIMEOUT | ||
162 | }; | ||
163 | |||
164 | static struct i2c_adapter voodoo3_i2c_adapter = { | ||
165 | .owner = THIS_MODULE, | ||
166 | .name = "I2C Voodoo3/Banshee adapter", | ||
167 | .algo_data = &voo_i2c_bit_data, | ||
168 | }; | ||
169 | |||
170 | static struct i2c_algo_bit_data voo_ddc_bit_data = { | ||
171 | .setsda = bit_vooddc_setsda, | ||
172 | .setscl = bit_vooddc_setscl, | ||
173 | .getsda = bit_vooddc_getsda, | ||
174 | .getscl = bit_vooddc_getscl, | ||
175 | .udelay = CYCLE_DELAY, | ||
176 | .timeout = TIMEOUT | ||
177 | }; | ||
178 | |||
179 | static struct i2c_adapter voodoo3_ddc_adapter = { | ||
180 | .owner = THIS_MODULE, | ||
181 | .class = I2C_CLASS_DDC, | ||
182 | .name = "DDC Voodoo3/Banshee adapter", | ||
183 | .algo_data = &voo_ddc_bit_data, | ||
184 | }; | ||
185 | |||
186 | static struct pci_device_id voodoo3_ids[] __devinitdata = { | ||
187 | { PCI_DEVICE(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3) }, | ||
188 | { PCI_DEVICE(PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE) }, | ||
189 | { 0, } | ||
190 | }; | ||
191 | |||
192 | MODULE_DEVICE_TABLE (pci, voodoo3_ids); | ||
193 | |||
194 | static int __devinit voodoo3_probe(struct pci_dev *dev, const struct pci_device_id *id) | ||
195 | { | ||
196 | int retval; | ||
197 | |||
198 | retval = config_v3(dev); | ||
199 | if (retval) | ||
200 | return retval; | ||
201 | |||
202 | /* set up the sysfs linkage to our parent device */ | ||
203 | voodoo3_i2c_adapter.dev.parent = &dev->dev; | ||
204 | voodoo3_ddc_adapter.dev.parent = &dev->dev; | ||
205 | |||
206 | retval = i2c_bit_add_bus(&voodoo3_i2c_adapter); | ||
207 | if (retval) | ||
208 | return retval; | ||
209 | retval = i2c_bit_add_bus(&voodoo3_ddc_adapter); | ||
210 | if (retval) | ||
211 | i2c_del_adapter(&voodoo3_i2c_adapter); | ||
212 | return retval; | ||
213 | } | ||
214 | |||
215 | static void __devexit voodoo3_remove(struct pci_dev *dev) | ||
216 | { | ||
217 | i2c_del_adapter(&voodoo3_i2c_adapter); | ||
218 | i2c_del_adapter(&voodoo3_ddc_adapter); | ||
219 | iounmap(ioaddr); | ||
220 | } | ||
221 | |||
222 | static struct pci_driver voodoo3_driver = { | ||
223 | .name = "voodoo3_smbus", | ||
224 | .id_table = voodoo3_ids, | ||
225 | .probe = voodoo3_probe, | ||
226 | .remove = __devexit_p(voodoo3_remove), | ||
227 | }; | ||
228 | |||
229 | static int __init i2c_voodoo3_init(void) | ||
230 | { | ||
231 | return pci_register_driver(&voodoo3_driver); | ||
232 | } | ||
233 | |||
234 | static void __exit i2c_voodoo3_exit(void) | ||
235 | { | ||
236 | pci_unregister_driver(&voodoo3_driver); | ||
237 | } | ||
238 | |||
239 | |||
240 | MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl>, " | ||
241 | "Philip Edelbrock <phil@netroedge.com>, " | ||
242 | "Ralph Metzler <rjkm@thp.uni-koeln.de>, " | ||
243 | "and Mark D. Studebaker <mdsxyz123@yahoo.com>"); | ||
244 | MODULE_DESCRIPTION("Voodoo3 I2C/SMBus driver"); | ||
245 | MODULE_LICENSE("GPL"); | ||
246 | |||
247 | module_init(i2c_voodoo3_init); | ||
248 | module_exit(i2c_voodoo3_exit); | ||