10ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs/*
20ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * Copyright 2012 Red Hat Inc.
30ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs *
40ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
50ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * copy of this software and associated documentation files (the "Software"),
60ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * to deal in the Software without restriction, including without limitation
70ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
80ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the
90ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * Software is furnished to do so, subject to the following conditions:
100ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs *
110ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * The above copyright notice and this permission notice shall be included in
120ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * all copies or substantial portions of the Software.
130ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs *
140ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
150ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
160ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
170ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
180ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
190ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
200ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE.
210ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs *
220ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs * Authors: Ben Skeggs
230ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs */
240ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs
250ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs#include "nv50.h"
260ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs
270ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsstatic void
280ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsnve0_aux_stat(struct nouveau_i2c *i2c, u32 *hi, u32 *lo, u32 *rq, u32 *tx)
290ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs{
300ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	u32 intr = nv_rd32(i2c, 0x00dc60);
310ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	u32 stat = nv_rd32(i2c, 0x00dc68) & intr, i;
320ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	for (i = 0, *hi = *lo = *rq = *tx = 0; i < 8; i++) {
330ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		if ((stat & (1 << (i * 4)))) *hi |= 1 << i;
340ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		if ((stat & (2 << (i * 4)))) *lo |= 1 << i;
350ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		if ((stat & (4 << (i * 4)))) *rq |= 1 << i;
360ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		if ((stat & (8 << (i * 4)))) *tx |= 1 << i;
370ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	}
380ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	nv_wr32(i2c, 0x00dc60, intr);
390ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs}
400ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs
410ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsstatic void
420ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsnve0_aux_mask(struct nouveau_i2c *i2c, u32 type, u32 mask, u32 data)
430ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs{
440ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	u32 temp = nv_rd32(i2c, 0x00dc68), i;
450ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	for (i = 0; i < 8; i++) {
460ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		if (mask & (1 << i)) {
470ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs			if (!(data & (1 << i))) {
480ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs				temp &= ~(type << (i * 4));
490ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs				continue;
500ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs			}
510ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs			temp |= type << (i * 4);
520ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		}
530ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	}
540ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	nv_wr32(i2c, 0x00dc68, temp);
550ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs}
560ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs
570ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsstruct nouveau_oclass *
580ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggsnve0_i2c_oclass = &(struct nouveau_i2c_impl) {
590ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.base.handle = NV_SUBDEV(I2C, 0xe0),
600ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.base.ofuncs = &(struct nouveau_ofuncs) {
610ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		.ctor = _nouveau_i2c_ctor,
620ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		.dtor = _nouveau_i2c_dtor,
630ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		.init = _nouveau_i2c_init,
640ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs		.fini = _nouveau_i2c_fini,
650ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	},
660ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.sclass = nvd0_i2c_sclass,
679efc583ea9a474a8d89421da8aad4a2265f2ac5aBen Skeggs	.pad_x = &nv04_i2c_pad_oclass,
689efc583ea9a474a8d89421da8aad4a2265f2ac5aBen Skeggs	.pad_s = &nv94_i2c_pad_oclass,
690ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.aux = 4,
700ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.aux_stat = nve0_aux_stat,
710ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs	.aux_mask = nve0_aux_mask,
720ff32977eae68852cc65b90fea89f6bbefc53a55Ben Skeggs}.base;
73