2 * Copyright 2009 Red Hat Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
26 #include "nouveau_drv.h"
27 #include "nouveau_i2c.h"
28 #include "nouveau_hw.h"
31 nv04_i2c_setscl(void *data
, int state
)
33 struct nouveau_i2c_chan
*i2c
= data
;
34 struct drm_device
*dev
= i2c
->dev
;
37 val
= (NVReadVgaCrtc(dev
, 0, i2c
->wr
) & 0xd0) | (state
? 0x20 : 0);
38 NVWriteVgaCrtc(dev
, 0, i2c
->wr
, val
| 0x01);
42 nv04_i2c_setsda(void *data
, int state
)
44 struct nouveau_i2c_chan
*i2c
= data
;
45 struct drm_device
*dev
= i2c
->dev
;
48 val
= (NVReadVgaCrtc(dev
, 0, i2c
->wr
) & 0xe0) | (state
? 0x10 : 0);
49 NVWriteVgaCrtc(dev
, 0, i2c
->wr
, val
| 0x01);
53 nv04_i2c_getscl(void *data
)
55 struct nouveau_i2c_chan
*i2c
= data
;
56 struct drm_device
*dev
= i2c
->dev
;
58 return !!(NVReadVgaCrtc(dev
, 0, i2c
->rd
) & 4);
62 nv04_i2c_getsda(void *data
)
64 struct nouveau_i2c_chan
*i2c
= data
;
65 struct drm_device
*dev
= i2c
->dev
;
67 return !!(NVReadVgaCrtc(dev
, 0, i2c
->rd
) & 8);
71 nv4e_i2c_setscl(void *data
, int state
)
73 struct nouveau_i2c_chan
*i2c
= data
;
74 struct drm_device
*dev
= i2c
->dev
;
77 val
= (nv_rd32(dev
, i2c
->wr
) & 0xd0) | (state
? 0x20 : 0);
78 nv_wr32(dev
, i2c
->wr
, val
| 0x01);
82 nv4e_i2c_setsda(void *data
, int state
)
84 struct nouveau_i2c_chan
*i2c
= data
;
85 struct drm_device
*dev
= i2c
->dev
;
88 val
= (nv_rd32(dev
, i2c
->wr
) & 0xe0) | (state
? 0x10 : 0);
89 nv_wr32(dev
, i2c
->wr
, val
| 0x01);
93 nv4e_i2c_getscl(void *data
)
95 struct nouveau_i2c_chan
*i2c
= data
;
96 struct drm_device
*dev
= i2c
->dev
;
98 return !!((nv_rd32(dev
, i2c
->rd
) >> 16) & 4);
102 nv4e_i2c_getsda(void *data
)
104 struct nouveau_i2c_chan
*i2c
= data
;
105 struct drm_device
*dev
= i2c
->dev
;
107 return !!((nv_rd32(dev
, i2c
->rd
) >> 16) & 8);
110 static const uint32_t nv50_i2c_port
[] = {
111 0x00e138, 0x00e150, 0x00e168, 0x00e180,
112 0x00e254, 0x00e274, 0x00e764, 0x00e780,
115 #define NV50_I2C_PORTS ARRAY_SIZE(nv50_i2c_port)
118 nv50_i2c_getscl(void *data
)
120 struct nouveau_i2c_chan
*i2c
= data
;
121 struct drm_device
*dev
= i2c
->dev
;
123 return !!(nv_rd32(dev
, i2c
->rd
) & 1);
128 nv50_i2c_getsda(void *data
)
130 struct nouveau_i2c_chan
*i2c
= data
;
131 struct drm_device
*dev
= i2c
->dev
;
133 return !!(nv_rd32(dev
, i2c
->rd
) & 2);
137 nv50_i2c_setscl(void *data
, int state
)
139 struct nouveau_i2c_chan
*i2c
= data
;
141 nv_wr32(i2c
->dev
, i2c
->wr
, 4 | (i2c
->data
? 2 : 0) | (state
? 1 : 0));
145 nv50_i2c_setsda(void *data
, int state
)
147 struct nouveau_i2c_chan
*i2c
= data
;
149 nv_mask(i2c
->dev
, i2c
->wr
, 0x00000006, 4 | (state
? 2 : 0));
154 nvd0_i2c_getscl(void *data
)
156 struct nouveau_i2c_chan
*i2c
= data
;
157 return !!(nv_rd32(i2c
->dev
, i2c
->rd
) & 0x10);
161 nvd0_i2c_getsda(void *data
)
163 struct nouveau_i2c_chan
*i2c
= data
;
164 return !!(nv_rd32(i2c
->dev
, i2c
->rd
) & 0x20);
168 nouveau_i2c_init(struct drm_device
*dev
, struct dcb_i2c_entry
*entry
, int index
)
170 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
171 struct nouveau_i2c_chan
*i2c
;
177 if (dev_priv
->card_type
>= NV_50
&&
178 dev_priv
->card_type
<= NV_C0
&& entry
->read
>= NV50_I2C_PORTS
) {
179 NV_ERROR(dev
, "unknown i2c port %d\n", entry
->read
);
183 i2c
= kzalloc(sizeof(*i2c
), GFP_KERNEL
);
187 switch (entry
->port_type
) {
189 i2c
->bit
.setsda
= nv04_i2c_setsda
;
190 i2c
->bit
.setscl
= nv04_i2c_setscl
;
191 i2c
->bit
.getsda
= nv04_i2c_getsda
;
192 i2c
->bit
.getscl
= nv04_i2c_getscl
;
193 i2c
->rd
= entry
->read
;
194 i2c
->wr
= entry
->write
;
197 i2c
->bit
.setsda
= nv4e_i2c_setsda
;
198 i2c
->bit
.setscl
= nv4e_i2c_setscl
;
199 i2c
->bit
.getsda
= nv4e_i2c_getsda
;
200 i2c
->bit
.getscl
= nv4e_i2c_getscl
;
201 i2c
->rd
= 0x600800 + entry
->read
;
202 i2c
->wr
= 0x600800 + entry
->write
;
205 i2c
->bit
.setsda
= nv50_i2c_setsda
;
206 i2c
->bit
.setscl
= nv50_i2c_setscl
;
207 if (dev_priv
->card_type
< NV_D0
) {
208 i2c
->bit
.getsda
= nv50_i2c_getsda
;
209 i2c
->bit
.getscl
= nv50_i2c_getscl
;
210 i2c
->rd
= nv50_i2c_port
[entry
->read
];
213 i2c
->bit
.getsda
= nvd0_i2c_getsda
;
214 i2c
->bit
.getscl
= nvd0_i2c_getscl
;
215 i2c
->rd
= 0x00d014 + (entry
->read
* 0x20);
220 i2c
->rd
= entry
->read
;
221 i2c
->wr
= entry
->write
;
224 NV_ERROR(dev
, "DCB I2C port type %d unknown\n",
230 snprintf(i2c
->adapter
.name
, sizeof(i2c
->adapter
.name
),
231 "nouveau-%s-%d", pci_name(dev
->pdev
), index
);
232 i2c
->adapter
.owner
= THIS_MODULE
;
233 i2c
->adapter
.dev
.parent
= &dev
->pdev
->dev
;
235 i2c_set_adapdata(&i2c
->adapter
, i2c
);
237 if (entry
->port_type
< 6) {
238 i2c
->adapter
.algo_data
= &i2c
->bit
;
239 i2c
->bit
.udelay
= 40;
240 i2c
->bit
.timeout
= usecs_to_jiffies(5000);
242 ret
= i2c_bit_add_bus(&i2c
->adapter
);
244 i2c
->adapter
.algo
= &nouveau_dp_i2c_algo
;
245 ret
= i2c_add_adapter(&i2c
->adapter
);
249 NV_ERROR(dev
, "Failed to register i2c %d\n", index
);
259 nouveau_i2c_fini(struct drm_device
*dev
, struct dcb_i2c_entry
*entry
)
264 i2c_del_adapter(&entry
->chan
->adapter
);
269 struct nouveau_i2c_chan
*
270 nouveau_i2c_find(struct drm_device
*dev
, int index
)
272 struct drm_nouveau_private
*dev_priv
= dev
->dev_private
;
273 struct dcb_i2c_entry
*i2c
= &dev_priv
->vbios
.dcb
.i2c
[index
];
275 if (index
>= DCB_MAX_NUM_I2C_ENTRIES
)
278 if (dev_priv
->card_type
>= NV_50
&& (i2c
->entry
& 0x00000100)) {
279 uint32_t reg
= 0xe500, val
;
281 if (i2c
->port_type
== 6) {
282 reg
+= i2c
->read
* 0x50;
285 reg
+= ((i2c
->entry
& 0x1e00) >> 9) * 0x50;
289 /* nfi, but neither auxch or i2c work if it's 1 */
290 nv_mask(dev
, reg
+ 0x0c, 0x00000001, 0x00000000);
291 /* nfi, but switches auxch vs normal i2c */
292 nv_mask(dev
, reg
+ 0x00, 0x0000f003, val
);
295 if (!i2c
->chan
&& nouveau_i2c_init(dev
, i2c
, index
))
301 nouveau_probe_i2c_addr(struct nouveau_i2c_chan
*i2c
, int addr
)
303 uint8_t buf
[] = { 0 };
304 struct i2c_msg msgs
[] = {
319 return i2c_transfer(&i2c
->adapter
, msgs
, 2) == 2;
323 nouveau_i2c_identify(struct drm_device
*dev
, const char *what
,
324 struct i2c_board_info
*info
,
325 bool (*match
)(struct nouveau_i2c_chan
*,
326 struct i2c_board_info
*),
329 struct nouveau_i2c_chan
*i2c
= nouveau_i2c_find(dev
, index
);
332 NV_DEBUG(dev
, "Probing %ss on I2C bus: %d\n", what
, index
);
334 for (i
= 0; info
[i
].addr
; i
++) {
335 if (nouveau_probe_i2c_addr(i2c
, info
[i
].addr
) &&
336 (!match
|| match(i2c
, &info
[i
]))) {
337 NV_INFO(dev
, "Detected %s: %s\n", what
, info
[i
].type
);
342 NV_DEBUG(dev
, "No devices found.\n");