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.
29 #include <core/notify.h>
30 #include <core/option.h>
31 #include <subdev/bios.h>
32 #include <subdev/bios/dcb.h>
33 #include <subdev/bios/i2c.h>
35 static struct nvkm_i2c_pad
*
36 nvkm_i2c_pad_find(struct nvkm_i2c
*i2c
, int id
)
38 struct nvkm_i2c_pad
*pad
;
40 list_for_each_entry(pad
, &i2c
->pad
, head
) {
49 nvkm_i2c_bus_find(struct nvkm_i2c
*i2c
, int id
)
51 struct nvkm_bios
*bios
= i2c
->subdev
.device
->bios
;
52 struct nvkm_i2c_bus
*bus
;
54 if (id
== NVKM_I2C_BUS_PRI
|| id
== NVKM_I2C_BUS_SEC
) {
55 u8 ver
, hdr
, cnt
, len
;
56 u16 i2c
= dcb_i2c_table(bios
, &ver
, &hdr
, &cnt
, &len
);
57 if (i2c
&& ver
>= 0x30) {
58 u8 auxidx
= nvbios_rd08(bios
, i2c
+ 4);
59 if (id
== NVKM_I2C_BUS_PRI
)
60 id
= NVKM_I2C_BUS_CCB((auxidx
& 0x0f) >> 0);
62 id
= NVKM_I2C_BUS_CCB((auxidx
& 0xf0) >> 4);
64 id
= NVKM_I2C_BUS_CCB(2);
68 list_for_each_entry(bus
, &i2c
->bus
, head
) {
77 nvkm_i2c_aux_find(struct nvkm_i2c
*i2c
, int id
)
79 struct nvkm_i2c_aux
*aux
;
81 list_for_each_entry(aux
, &i2c
->aux
, head
) {
90 nvkm_i2c_intr_fini(struct nvkm_event
*event
, int type
, int id
)
92 struct nvkm_i2c
*i2c
= container_of(event
, typeof(*i2c
), event
);
93 struct nvkm_i2c_aux
*aux
= nvkm_i2c_aux_find(i2c
, id
);
95 i2c
->func
->aux_mask(i2c
, type
, aux
->intr
, 0);
99 nvkm_i2c_intr_init(struct nvkm_event
*event
, int type
, int id
)
101 struct nvkm_i2c
*i2c
= container_of(event
, typeof(*i2c
), event
);
102 struct nvkm_i2c_aux
*aux
= nvkm_i2c_aux_find(i2c
, id
);
104 i2c
->func
->aux_mask(i2c
, type
, aux
->intr
, aux
->intr
);
108 nvkm_i2c_intr_ctor(struct nvkm_object
*object
, void *data
, u32 size
,
109 struct nvkm_notify
*notify
)
111 struct nvkm_i2c_ntfy_req
*req
= data
;
112 if (!WARN_ON(size
!= sizeof(*req
))) {
113 notify
->size
= sizeof(struct nvkm_i2c_ntfy_rep
);
114 notify
->types
= req
->mask
;
115 notify
->index
= req
->port
;
121 static const struct nvkm_event_func
122 nvkm_i2c_intr_func
= {
123 .ctor
= nvkm_i2c_intr_ctor
,
124 .init
= nvkm_i2c_intr_init
,
125 .fini
= nvkm_i2c_intr_fini
,
129 nvkm_i2c_intr(struct nvkm_subdev
*subdev
)
131 struct nvkm_i2c
*i2c
= nvkm_i2c(subdev
);
132 struct nvkm_i2c_aux
*aux
;
135 if (!i2c
->func
->aux_stat
)
138 i2c
->func
->aux_stat(i2c
, &hi
, &lo
, &rq
, &tx
);
139 if (!hi
&& !lo
&& !rq
&& !tx
)
142 list_for_each_entry(aux
, &i2c
->aux
, head
) {
144 if (hi
& aux
->intr
) mask
|= NVKM_I2C_PLUG
;
145 if (lo
& aux
->intr
) mask
|= NVKM_I2C_UNPLUG
;
146 if (rq
& aux
->intr
) mask
|= NVKM_I2C_IRQ
;
147 if (tx
& aux
->intr
) mask
|= NVKM_I2C_DONE
;
149 struct nvkm_i2c_ntfy_rep rep
= {
152 nvkm_event_send(&i2c
->event
, rep
.mask
, aux
->id
,
159 nvkm_i2c_fini(struct nvkm_subdev
*subdev
, bool suspend
)
161 struct nvkm_i2c
*i2c
= nvkm_i2c(subdev
);
162 struct nvkm_i2c_pad
*pad
;
163 struct nvkm_i2c_bus
*bus
;
164 struct nvkm_i2c_aux
*aux
;
167 list_for_each_entry(aux
, &i2c
->aux
, head
) {
168 nvkm_i2c_aux_fini(aux
);
171 list_for_each_entry(bus
, &i2c
->bus
, head
) {
172 nvkm_i2c_bus_fini(bus
);
175 if ((mask
= (1 << i2c
->func
->aux
) - 1), i2c
->func
->aux_stat
) {
176 i2c
->func
->aux_mask(i2c
, NVKM_I2C_ANY
, mask
, 0);
177 i2c
->func
->aux_stat(i2c
, &mask
, &mask
, &mask
, &mask
);
180 list_for_each_entry(pad
, &i2c
->pad
, head
) {
181 nvkm_i2c_pad_fini(pad
);
188 nvkm_i2c_preinit(struct nvkm_subdev
*subdev
)
190 struct nvkm_i2c
*i2c
= nvkm_i2c(subdev
);
191 struct nvkm_i2c_bus
*bus
;
192 struct nvkm_i2c_pad
*pad
;
195 * We init our i2c busses as early as possible, since they may be
196 * needed by the vbios init scripts on some cards
198 list_for_each_entry(pad
, &i2c
->pad
, head
)
199 nvkm_i2c_pad_init(pad
);
200 list_for_each_entry(bus
, &i2c
->bus
, head
)
201 nvkm_i2c_bus_init(bus
);
207 nvkm_i2c_init(struct nvkm_subdev
*subdev
)
209 struct nvkm_i2c
*i2c
= nvkm_i2c(subdev
);
210 struct nvkm_i2c_bus
*bus
;
211 struct nvkm_i2c_pad
*pad
;
212 struct nvkm_i2c_aux
*aux
;
214 list_for_each_entry(pad
, &i2c
->pad
, head
) {
215 nvkm_i2c_pad_init(pad
);
218 list_for_each_entry(bus
, &i2c
->bus
, head
) {
219 nvkm_i2c_bus_init(bus
);
222 list_for_each_entry(aux
, &i2c
->aux
, head
) {
223 nvkm_i2c_aux_init(aux
);
230 nvkm_i2c_dtor(struct nvkm_subdev
*subdev
)
232 struct nvkm_i2c
*i2c
= nvkm_i2c(subdev
);
234 nvkm_event_fini(&i2c
->event
);
236 while (!list_empty(&i2c
->aux
)) {
237 struct nvkm_i2c_aux
*aux
=
238 list_first_entry(&i2c
->aux
, typeof(*aux
), head
);
239 nvkm_i2c_aux_del(&aux
);
242 while (!list_empty(&i2c
->bus
)) {
243 struct nvkm_i2c_bus
*bus
=
244 list_first_entry(&i2c
->bus
, typeof(*bus
), head
);
245 nvkm_i2c_bus_del(&bus
);
248 while (!list_empty(&i2c
->pad
)) {
249 struct nvkm_i2c_pad
*pad
=
250 list_first_entry(&i2c
->pad
, typeof(*pad
), head
);
251 nvkm_i2c_pad_del(&pad
);
257 static const struct nvkm_subdev_func
259 .dtor
= nvkm_i2c_dtor
,
260 .preinit
= nvkm_i2c_preinit
,
261 .init
= nvkm_i2c_init
,
262 .fini
= nvkm_i2c_fini
,
263 .intr
= nvkm_i2c_intr
,
266 static const struct nvkm_i2c_drv
{
269 int (*pad_new
)(struct nvkm_i2c_bus
*, int id
, u8 addr
,
270 struct nvkm_i2c_pad
**);
273 { 0x0d, 0x39, anx9805_pad_new
},
274 { 0x0e, 0x3b, anx9805_pad_new
},
279 nvkm_i2c_new_(const struct nvkm_i2c_func
*func
, struct nvkm_device
*device
,
280 int index
, struct nvkm_i2c
**pi2c
)
282 struct nvkm_bios
*bios
= device
->bios
;
283 struct nvkm_i2c
*i2c
;
284 struct dcb_i2c_entry ccbE
;
285 struct dcb_output dcbE
;
289 if (!(i2c
= *pi2c
= kzalloc(sizeof(*i2c
), GFP_KERNEL
)))
292 nvkm_subdev_ctor(&nvkm_i2c
, device
, index
, &i2c
->subdev
);
294 INIT_LIST_HEAD(&i2c
->pad
);
295 INIT_LIST_HEAD(&i2c
->bus
);
296 INIT_LIST_HEAD(&i2c
->aux
);
299 while (!dcb_i2c_parse(bios
, ++i
, &ccbE
)) {
300 struct nvkm_i2c_pad
*pad
= NULL
;
301 struct nvkm_i2c_bus
*bus
= NULL
;
302 struct nvkm_i2c_aux
*aux
= NULL
;
304 nvkm_debug(&i2c
->subdev
, "ccb %02x: type %02x drive %02x "
305 "sense %02x share %02x auxch %02x\n", i
, ccbE
.type
,
306 ccbE
.drive
, ccbE
.sense
, ccbE
.share
, ccbE
.auxch
);
308 if (ccbE
.share
!= DCB_I2C_UNUSED
) {
309 const int id
= NVKM_I2C_PAD_HYBRID(ccbE
.share
);
310 if (!(pad
= nvkm_i2c_pad_find(i2c
, id
)))
311 ret
= func
->pad_s_new(i2c
, id
, &pad
);
315 ret
= func
->pad_x_new(i2c
, NVKM_I2C_PAD_CCB(i
), &pad
);
319 nvkm_error(&i2c
->subdev
, "ccb %02x pad, %d\n", i
, ret
);
320 nvkm_i2c_pad_del(&pad
);
324 if (pad
->func
->bus_new_0
&& ccbE
.type
== DCB_I2C_NV04_BIT
) {
325 ret
= pad
->func
->bus_new_0(pad
, NVKM_I2C_BUS_CCB(i
),
329 if (pad
->func
->bus_new_4
&&
330 ( ccbE
.type
== DCB_I2C_NV4E_BIT
||
331 ccbE
.type
== DCB_I2C_NVIO_BIT
||
332 (ccbE
.type
== DCB_I2C_PMGR
&&
333 ccbE
.drive
!= DCB_I2C_UNUSED
))) {
334 ret
= pad
->func
->bus_new_4(pad
, NVKM_I2C_BUS_CCB(i
),
339 nvkm_error(&i2c
->subdev
, "ccb %02x bus, %d\n", i
, ret
);
340 nvkm_i2c_bus_del(&bus
);
343 if (pad
->func
->aux_new_6
&&
344 ( ccbE
.type
== DCB_I2C_NVIO_AUX
||
345 (ccbE
.type
== DCB_I2C_PMGR
&&
346 ccbE
.auxch
!= DCB_I2C_UNUSED
))) {
347 ret
= pad
->func
->aux_new_6(pad
, NVKM_I2C_BUS_CCB(i
),
354 nvkm_error(&i2c
->subdev
, "ccb %02x aux, %d\n", i
, ret
);
355 nvkm_i2c_aux_del(&aux
);
358 if (ccbE
.type
!= DCB_I2C_UNUSED
&& !bus
&& !aux
) {
359 nvkm_warn(&i2c
->subdev
, "ccb %02x was ignored\n", i
);
365 while (dcb_outp_parse(bios
, ++i
, &ver
, &hdr
, &dcbE
)) {
366 const struct nvkm_i2c_drv
*drv
= nvkm_i2c_drv
;
367 struct nvkm_i2c_bus
*bus
;
368 struct nvkm_i2c_pad
*pad
;
370 /* internal outputs handled by native i2c busses (above) */
374 /* we need an i2c bus to talk to the external encoder */
375 bus
= nvkm_i2c_bus_find(i2c
, dcbE
.i2c_index
);
377 nvkm_debug(&i2c
->subdev
, "dcb %02x no bus\n", i
);
381 /* ... and a driver for it */
382 while (drv
->pad_new
) {
383 if (drv
->bios
== dcbE
.extdev
)
389 nvkm_debug(&i2c
->subdev
, "dcb %02x drv %02x unknown\n",
394 /* find/create an instance of the driver */
395 pad
= nvkm_i2c_pad_find(i2c
, NVKM_I2C_PAD_EXT(dcbE
.extdev
));
397 const int id
= NVKM_I2C_PAD_EXT(dcbE
.extdev
);
398 ret
= drv
->pad_new(bus
, id
, drv
->addr
, &pad
);
400 nvkm_error(&i2c
->subdev
, "dcb %02x pad, %d\n",
402 nvkm_i2c_pad_del(&pad
);
407 /* create any i2c bus / aux channel required by the output */
408 if (pad
->func
->aux_new_6
&& dcbE
.type
== DCB_OUTPUT_DP
) {
409 const int id
= NVKM_I2C_AUX_EXT(dcbE
.extdev
);
410 struct nvkm_i2c_aux
*aux
= NULL
;
411 ret
= pad
->func
->aux_new_6(pad
, id
, 0, &aux
);
413 nvkm_error(&i2c
->subdev
, "dcb %02x aux, %d\n",
415 nvkm_i2c_aux_del(&aux
);
418 if (pad
->func
->bus_new_4
) {
419 const int id
= NVKM_I2C_BUS_EXT(dcbE
.extdev
);
420 struct nvkm_i2c_bus
*bus
= NULL
;
421 ret
= pad
->func
->bus_new_4(pad
, id
, 0, &bus
);
423 nvkm_error(&i2c
->subdev
, "dcb %02x bus, %d\n",
425 nvkm_i2c_bus_del(&bus
);
430 return nvkm_event_init(&nvkm_i2c_intr_func
, 4, i
, &i2c
->event
);