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