2 * Copyright 2013 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.
25 #include <core/option.h>
27 #include <subdev/bios.h>
28 #include <subdev/bios/dcb.h>
29 #include <subdev/bios/i2c.h>
30 #include <subdev/i2c.h>
31 #include <subdev/vga.h>
33 /******************************************************************************
34 * interface to linux i2c bit-banging algorithm
35 *****************************************************************************/
37 #ifdef CONFIG_NOUVEAU_I2C_INTERNAL_DEFAULT
44 nouveau_i2c_pre_xfer(struct i2c_adapter
*adap
)
46 struct i2c_algo_bit_data
*bit
= adap
->algo_data
;
47 struct nouveau_i2c_port
*port
= bit
->data
;
48 if (port
->func
->acquire
)
49 port
->func
->acquire(port
);
54 nouveau_i2c_setscl(void *data
, int state
)
56 struct nouveau_i2c_port
*port
= data
;
57 port
->func
->drive_scl(port
, state
);
61 nouveau_i2c_setsda(void *data
, int state
)
63 struct nouveau_i2c_port
*port
= data
;
64 port
->func
->drive_sda(port
, state
);
68 nouveau_i2c_getscl(void *data
)
70 struct nouveau_i2c_port
*port
= data
;
71 return port
->func
->sense_scl(port
);
75 nouveau_i2c_getsda(void *data
)
77 struct nouveau_i2c_port
*port
= data
;
78 return port
->func
->sense_sda(port
);
81 /******************************************************************************
82 * base i2c "port" class implementation
83 *****************************************************************************/
86 _nouveau_i2c_port_dtor(struct nouveau_object
*object
)
88 struct nouveau_i2c_port
*port
= (void *)object
;
89 i2c_del_adapter(&port
->adapter
);
90 nouveau_object_destroy(&port
->base
);
94 nouveau_i2c_port_create_(struct nouveau_object
*parent
,
95 struct nouveau_object
*engine
,
96 struct nouveau_oclass
*oclass
, u8 index
,
97 const struct i2c_algorithm
*algo
,
98 const struct nouveau_i2c_func
*func
,
99 int size
, void **pobject
)
101 struct nouveau_device
*device
= nv_device(parent
);
102 struct nouveau_i2c
*i2c
= (void *)engine
;
103 struct nouveau_i2c_port
*port
;
106 ret
= nouveau_object_create_(parent
, engine
, oclass
, 0, size
, pobject
);
111 snprintf(port
->adapter
.name
, sizeof(port
->adapter
.name
),
112 "nouveau-%s-%d", device
->name
, index
);
113 port
->adapter
.owner
= THIS_MODULE
;
114 port
->adapter
.dev
.parent
= nv_device_base(device
);
117 i2c_set_adapdata(&port
->adapter
, i2c
);
119 if ( algo
== &nouveau_i2c_bit_algo
&&
120 !nouveau_boolopt(device
->cfgopt
, "NvI2C", CSTMSEL
)) {
121 struct i2c_algo_bit_data
*bit
;
123 bit
= kzalloc(sizeof(*bit
), GFP_KERNEL
);
128 bit
->timeout
= usecs_to_jiffies(2200);
130 bit
->pre_xfer
= nouveau_i2c_pre_xfer
;
131 bit
->setsda
= nouveau_i2c_setsda
;
132 bit
->setscl
= nouveau_i2c_setscl
;
133 bit
->getsda
= nouveau_i2c_getsda
;
134 bit
->getscl
= nouveau_i2c_getscl
;
136 port
->adapter
.algo_data
= bit
;
137 ret
= i2c_bit_add_bus(&port
->adapter
);
139 port
->adapter
.algo_data
= port
;
140 port
->adapter
.algo
= algo
;
141 ret
= i2c_add_adapter(&port
->adapter
);
144 /* drop port's i2c subdev refcount, i2c handles this itself */
146 list_add_tail(&port
->head
, &i2c
->ports
);
150 /******************************************************************************
151 * base i2c subdev class implementation
152 *****************************************************************************/
154 static struct nouveau_i2c_port
*
155 nouveau_i2c_find(struct nouveau_i2c
*i2c
, u8 index
)
157 struct nouveau_bios
*bios
= nouveau_bios(i2c
);
158 struct nouveau_i2c_port
*port
;
160 if (index
== NV_I2C_DEFAULT(0) ||
161 index
== NV_I2C_DEFAULT(1)) {
162 u8 ver
, hdr
, cnt
, len
;
163 u16 i2c
= dcb_i2c_table(bios
, &ver
, &hdr
, &cnt
, &len
);
164 if (i2c
&& ver
>= 0x30) {
165 u8 auxidx
= nv_ro08(bios
, i2c
+ 4);
166 if (index
== NV_I2C_DEFAULT(0))
167 index
= (auxidx
& 0x0f) >> 0;
169 index
= (auxidx
& 0xf0) >> 4;
175 list_for_each_entry(port
, &i2c
->ports
, head
) {
176 if (port
->index
== index
)
183 static struct nouveau_i2c_port
*
184 nouveau_i2c_find_type(struct nouveau_i2c
*i2c
, u16 type
)
186 struct nouveau_i2c_port
*port
;
188 list_for_each_entry(port
, &i2c
->ports
, head
) {
189 if (nv_hclass(port
) == type
)
197 nouveau_i2c_identify(struct nouveau_i2c
*i2c
, int index
, const char *what
,
198 struct nouveau_i2c_board_info
*info
,
199 bool (*match
)(struct nouveau_i2c_port
*,
200 struct i2c_board_info
*, void *), void *data
)
202 struct nouveau_i2c_port
*port
= nouveau_i2c_find(i2c
, index
);
206 nv_debug(i2c
, "no bus when probing %s on %d\n", what
, index
);
210 nv_debug(i2c
, "probing %ss on bus: %d\n", what
, port
->index
);
211 for (i
= 0; info
[i
].dev
.addr
; i
++) {
214 if ((port
->adapter
.algo
== &i2c_bit_algo
) &&
215 (info
[i
].udelay
!= 0)) {
216 struct i2c_algo_bit_data
*algo
= port
->adapter
.algo_data
;
217 nv_debug(i2c
, "using custom udelay %d instead of %d\n",
218 info
[i
].udelay
, algo
->udelay
);
219 orig_udelay
= algo
->udelay
;
220 algo
->udelay
= info
[i
].udelay
;
223 if (nv_probe_i2c(port
, info
[i
].dev
.addr
) &&
224 (!match
|| match(port
, &info
[i
].dev
, data
))) {
225 nv_info(i2c
, "detected %s: %s\n", what
,
231 struct i2c_algo_bit_data
*algo
= port
->adapter
.algo_data
;
232 algo
->udelay
= orig_udelay
;
236 nv_debug(i2c
, "no devices found.\n");
241 _nouveau_i2c_fini(struct nouveau_object
*object
, bool suspend
)
243 struct nouveau_i2c
*i2c
= (void *)object
;
244 struct nouveau_i2c_port
*port
;
247 list_for_each_entry(port
, &i2c
->ports
, head
) {
248 ret
= nv_ofuncs(port
)->fini(nv_object(port
), suspend
);
253 return nouveau_subdev_fini(&i2c
->base
, suspend
);
255 list_for_each_entry_continue_reverse(port
, &i2c
->ports
, head
) {
256 nv_ofuncs(port
)->init(nv_object(port
));
263 _nouveau_i2c_init(struct nouveau_object
*object
)
265 struct nouveau_i2c
*i2c
= (void *)object
;
266 struct nouveau_i2c_port
*port
;
269 ret
= nouveau_subdev_init(&i2c
->base
);
271 list_for_each_entry(port
, &i2c
->ports
, head
) {
272 ret
= nv_ofuncs(port
)->init(nv_object(port
));
280 list_for_each_entry_continue_reverse(port
, &i2c
->ports
, head
) {
281 nv_ofuncs(port
)->fini(nv_object(port
), false);
288 _nouveau_i2c_dtor(struct nouveau_object
*object
)
290 struct nouveau_i2c
*i2c
= (void *)object
;
291 struct nouveau_i2c_port
*port
, *temp
;
293 list_for_each_entry_safe(port
, temp
, &i2c
->ports
, head
) {
294 nouveau_object_ref(NULL
, (struct nouveau_object
**)&port
);
297 nouveau_subdev_destroy(&i2c
->base
);
300 static struct nouveau_oclass
*
301 nouveau_i2c_extdev_sclass
[] = {
302 nouveau_anx9805_sclass
,
306 nouveau_i2c_create_(struct nouveau_object
*parent
,
307 struct nouveau_object
*engine
,
308 struct nouveau_oclass
*oclass
,
309 struct nouveau_oclass
*sclass
,
310 int length
, void **pobject
)
312 struct nouveau_bios
*bios
= nouveau_bios(parent
);
313 struct nouveau_i2c
*i2c
;
314 struct nouveau_object
*object
;
315 struct dcb_i2c_entry info
;
316 int ret
, i
, j
, index
= -1;
317 struct dcb_output outp
;
321 ret
= nouveau_subdev_create(parent
, engine
, oclass
, 0,
323 *pobject
= nv_object(i2c
);
327 i2c
->find
= nouveau_i2c_find
;
328 i2c
->find_type
= nouveau_i2c_find_type
;
329 i2c
->identify
= nouveau_i2c_identify
;
330 INIT_LIST_HEAD(&i2c
->ports
);
332 while (!dcb_i2c_parse(bios
, ++index
, &info
)) {
333 if (info
.type
== DCB_I2C_UNUSED
)
339 if (oclass
->handle
== info
.type
) {
340 ret
= nouveau_object_ctor(*pobject
, *pobject
,
344 } while (ret
&& (++oclass
)->handle
);
347 /* in addition to the busses specified in the i2c table, there
348 * may be ddc/aux channels hiding behind external tmds/dp/etc
351 index
= ((index
+ 0x0f) / 0x10) * 0x10;
353 while ((data
= dcb_outp_parse(bios
, ++i
, &ver
, &hdr
, &outp
))) {
354 if (!outp
.location
|| !outp
.extdev
)
358 case DCB_OUTPUT_TMDS
:
359 info
.type
= NV_I2C_TYPE_EXTDDC(outp
.extdev
);
362 info
.type
= NV_I2C_TYPE_EXTAUX(outp
.extdev
);
370 while (ret
&& ++j
< ARRAY_SIZE(nouveau_i2c_extdev_sclass
)) {
371 parent
= nv_object(i2c
->find(i2c
, outp
.i2c_index
));
372 oclass
= nouveau_i2c_extdev_sclass
[j
];
374 if (oclass
->handle
!= info
.type
)
376 ret
= nouveau_object_ctor(parent
, *pobject
,
379 } while (ret
&& (++oclass
)->handle
);