1450N/A/*
1450N/A * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved.
1450N/A */
1450N/A
1450N/A/*
1450N/A * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
1450N/A * Copyright (c) 2006-2008, 2013, Intel Corporation
1450N/A * Jesse Barnes <jesse.barnes@intel.com>
1450N/A *
1450N/A * Permission is hereby granted, free of charge, to any person obtaining a
1450N/A * copy of this software and associated documentation files (the "Software"),
1450N/A * to deal in the Software without restriction, including without limitation
1450N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
1450N/A * and/or sell copies of the Software, and to permit persons to whom the
1450N/A * Software is furnished to do so, subject to the following conditions:
1450N/A *
1450N/A * The above copyright notice and this permission notice (including the next
1450N/A * paragraph) shall be included in all copies or substantial portions of the
1450N/A * Software.
1450N/A *
1450N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1450N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1450N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
1450N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1450N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1450N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1450N/A * DEALINGS IN THE SOFTWARE.
1450N/A *
1450N/A * Authors:
1450N/A * Eric Anholt <eric@anholt.net>
1450N/A */
1450N/A#include <sys/types.h>
1450N/A#include <sys/ddi.h>
1450N/A#include "drmP.h"
1450N/A#include "drm.h"
1450N/A#include "intel_drv.h"
1450N/A#include "i915_drm.h"
1450N/A#include "i915_drv.h"
1450N/A#include "drm_sun_i2c.h"
1450N/A
1450N/Astruct gmbus_port {
1450N/A const char *name;
1450N/A int reg;
1450N/A};
1450N/A
1450N/Astatic const struct gmbus_port gmbus_ports[] = {
1450N/A { "ssc", GPIOB },
1450N/A { "vga", GPIOA },
1450N/A { "panel", GPIOC },
1450N/A { "dpc", GPIOD },
1450N/A { "dpb", GPIOE },
1450N/A { "dpd", GPIOF },
1450N/A};
1450N/A
1450N/A/* Intel GPIO access functions */
1450N/A
1450N/A#define I2C_RISEFALL_TIME 10
1450N/A
1450N/Astatic inline struct intel_gmbus *
1450N/Ato_intel_gmbus(struct i2c_adapter *i2c)
1450N/A{
1450N/A return container_of(i2c, struct intel_gmbus, adapter);
1450N/A}
1450N/A
1450N/Avoid
1450N/Aintel_i2c_reset(struct drm_device *dev)
1450N/A{
1450N/A struct drm_i915_private *dev_priv = dev->dev_private;
1450N/A I915_WRITE(dev_priv->gpio_mmio_base + GMBUS0, 0);
1450N/A}
1450N/A
1450N/Astatic void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
1450N/A{
1450N/A u32 val;
1450N/A
1450N/A /* When using bit bashing for I2C, this bit needs to be set to 1 */
1450N/A if (!IS_PINEVIEW(dev_priv->dev))
1450N/A return;
1450N/A
1450N/A val = I915_READ(DSPCLK_GATE_D);
1450N/A if (enable)
1450N/A val |= DPCUNIT_CLOCK_GATE_DISABLE;
1450N/A else
1450N/A val &= ~DPCUNIT_CLOCK_GATE_DISABLE;
1450N/A I915_WRITE(DSPCLK_GATE_D, val);
1450N/A}
1450N/A
1450N/Astatic u32 get_reserved(struct intel_gmbus *bus)
1450N/A{
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A struct drm_device *dev = dev_priv->dev;
1450N/A u32 reserved = 0;
1450N/A
1450N/A /* On most chips, these bits must be preserved in software. */
1450N/A if (!IS_I830(dev) && !IS_845G(dev))
1450N/A reserved = I915_READ_NOTRACE(bus->gpio_reg) &
1450N/A (GPIO_DATA_PULLUP_DISABLE |
1450N/A GPIO_CLOCK_PULLUP_DISABLE);
1450N/A
1450N/A return reserved;
1450N/A}
1450N/A
1450N/Astatic int vga_get_clock(void *data)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_CLOCK_VAL_IN) != 0;
1450N/A}
1450N/A
1450N/Astatic int vga_get_data(void *data)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_DATA_VAL_IN) != 0;
1450N/A}
1450N/A
1450N/Astatic int get_clock(void *data)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A u32 reserved = get_reserved(bus);
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved | GPIO_CLOCK_DIR_MASK);
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved);
1450N/A return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_CLOCK_VAL_IN) != 0;
1450N/A}
1450N/A
1450N/Astatic int get_data(void *data)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A u32 reserved = get_reserved(bus);
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved | GPIO_DATA_DIR_MASK);
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved);
1450N/A return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_DATA_VAL_IN) != 0;
1450N/A}
1450N/A
1450N/Astatic void set_clock(void *data, int state_high)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A u32 reserved = get_reserved(bus);
1450N/A u32 clock_bits;
1450N/A
1450N/A if (state_high)
1450N/A clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
1450N/A else
1450N/A clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
1450N/A GPIO_CLOCK_VAL_MASK;
1450N/A
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved | clock_bits);
1450N/A POSTING_READ(bus->gpio_reg);
1450N/A}
1450N/A
1450N/Astatic void set_data(void *data, int state_high)
1450N/A{
1450N/A struct intel_gmbus *bus = data;
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A u32 reserved = get_reserved(bus);
1450N/A u32 data_bits;
1450N/A
1450N/A if (state_high)
1450N/A data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
1450N/A else
1450N/A data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
1450N/A GPIO_DATA_VAL_MASK;
1450N/A
1450N/A I915_WRITE_NOTRACE(bus->gpio_reg, reserved | data_bits);
1450N/A POSTING_READ(bus->gpio_reg);
1450N/A}
1450N/A
1450N/Astatic int
1450N/Aintel_gpio_pre_xfer(struct i2c_adapter *adapter)
1450N/A{
1450N/A struct intel_gmbus *bus = container_of(adapter,
1450N/A struct intel_gmbus,
1450N/A adapter);
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A
1450N/A intel_i2c_reset(dev_priv->dev);
1450N/A intel_i2c_quirk_set(dev_priv, true);
1450N/A set_data(bus, 1);
1450N/A set_clock(bus, 1);
1450N/A udelay(I2C_RISEFALL_TIME);
1450N/A return 0;
1450N/A}
1450N/A
1450N/Astatic void
1450N/Aintel_gpio_post_xfer(struct i2c_adapter *adapter)
1450N/A{
1450N/A struct intel_gmbus *bus = container_of(adapter,
1450N/A struct intel_gmbus,
1450N/A adapter);
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A
1450N/A set_data(bus, 1);
1450N/A set_clock(bus, 1);
1450N/A intel_i2c_quirk_set(dev_priv, false);
1450N/A}
1450N/A
1450N/Astatic void
1450N/Aintel_gpio_setup(struct intel_gmbus *bus, u32 pin)
1450N/A{
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A struct i2c_adapter *algo;
1450N/A
1450N/A algo = &bus->adapter;
1450N/A
1450N/A /* -1 to map pin pair to gmbus index */
1450N/A bus->gpio_reg = dev_priv->gpio_mmio_base + gmbus_ports[pin - 1].reg;
1450N/A
1450N/A bus->adapter.algo_data = algo;
1450N/A /* OSOL_i915 Begin */
1450N/A algo->setsda = set_data;
1450N/A algo->setscl = set_clock;
1450N/A if (pin == 2) {
1450N/A algo->getsda = vga_get_data;
1450N/A algo->getscl = vga_get_clock;
1450N/A } else {
1450N/A algo->getsda = get_data;
1450N/A algo->getscl = get_clock;
1450N/A }
1450N/A algo->udelay = I2C_RISEFALL_TIME;
1450N/A algo->timeout = drv_usectohz(2200);
1450N/A /* OSOL End */
1450N/A algo->data = bus;
1450N/A}
1450N/A
1450N/A/*
1450N/A * gmbus on gen4 seems to be able to generate legacy interrupts even when in MSI
1450N/A * mode. This results in spurious interrupt warnings if the legacy irq no. is
1450N/A * shared with another device. The kernel then disables that interrupt source
1450N/A * and so prevents the other device from working properly.
1450N/A */
1450N/A#define HAS_GMBUS_IRQ(dev) (INTEL_INFO(dev)->gen >= 5)
1450N/Astatic int
1450N/Agmbus_wait_hw_status(struct drm_i915_private *dev_priv,
1450N/A u32 gmbus2_status,
1450N/A u32 gmbus4_irq_en)
1450N/A{
1450N/A int reg_offset = dev_priv->gpio_mmio_base;
1450N/A u32 gmbus2 = 0;
1450N/A int ret;
1450N/A if (!HAS_GMBUS_IRQ(dev_priv->dev))
1450N/A gmbus4_irq_en = 0;
1450N/A
1450N/A /* Important: The hw handles only the first bit, so set only one! Since
1450N/A * we also need to check for NAKs besides the hw ready/idle signal, we
1450N/A * need to wake up periodically and check that ourselves. */
1450N/A I915_WRITE(GMBUS4 + reg_offset, gmbus4_irq_en);
1450N/A
1450N/A ret = wait_for((gmbus2 = I915_READ(GMBUS2 + reg_offset))
1450N/A & (GMBUS_SATOER | gmbus2_status), 50);
1450N/A
1450N/A I915_WRITE(GMBUS4 + reg_offset, 0);
1450N/A
1450N/A if (ret)
1450N/A return -ETIMEDOUT;
1450N/A
1450N/A if (gmbus2 & GMBUS_SATOER)
1450N/A return -ENXIO;
1450N/A if (gmbus2 & gmbus2_status)
1450N/A return 0;
1450N/A
1450N/A return -ETIMEDOUT;
1450N/A}
1450N/A
1450N/Astatic int
1450N/Agmbus_wait_idle(struct drm_i915_private *dev_priv)
1450N/A{
1450N/A int ret;
1450N/A int reg_offset = dev_priv->gpio_mmio_base;
1450N/A
1450N/A#define C ((I915_READ_NOTRACE(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0)
1450N/A
1450N/A if (!HAS_GMBUS_IRQ(dev_priv->dev))
1450N/A return wait_for(C, 10);
1450N/A
1450N/A /* Important: The hw handles only the first bit, so set only one! */
1450N/A I915_WRITE(GMBUS4 + reg_offset, GMBUS_IDLE_EN);
1450N/A
1450N/A ret = wait_for(C, 10);
1450N/A
1450N/A I915_WRITE(GMBUS4 + reg_offset, 0);
1450N/A
1450N/A if (!ret)
1450N/A return 0;
1450N/A else
1450N/A return -ETIMEDOUT;
1450N/A#undef C
1450N/A}
1450N/A
1450N/Astatic int
1450N/Agmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
1450N/A u32 gmbus1_index)
1450N/A{
1450N/A int reg_offset = dev_priv->gpio_mmio_base;
1450N/A u16 len = msg->len;
1450N/A u8 *buf = msg->buf;
1450N/A
1450N/A I915_WRITE(GMBUS1 + reg_offset,
1450N/A gmbus1_index |
1450N/A GMBUS_CYCLE_WAIT |
1450N/A (len << GMBUS_BYTE_COUNT_SHIFT) |
1450N/A (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
1450N/A GMBUS_SLAVE_READ | GMBUS_SW_RDY);
1450N/A while (len) {
1450N/A int ret;
1450N/A u32 val, loop = 0;
1450N/A
1450N/A ret = gmbus_wait_hw_status(dev_priv, GMBUS_HW_RDY,
1450N/A GMBUS_HW_RDY_EN);
1450N/A if (ret)
1450N/A return ret;
1450N/A
1450N/A val = I915_READ(GMBUS3 + reg_offset);
1450N/A do {
1450N/A *buf++ = val & 0xff;
1450N/A val >>= 8;
1450N/A } while (--len && ++loop < 4);
1450N/A }
1450N/A
1450N/A return 0;
1450N/A}
1450N/A
1450N/Astatic int
1450N/Agmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg)
1450N/A{
1450N/A int reg_offset = dev_priv->gpio_mmio_base;
1450N/A u16 len = msg->len;
1450N/A u8 *buf = msg->buf;
1450N/A u32 val, loop;
1450N/A
1450N/A val = loop = 0;
1450N/A while (len && loop < 4) {
1450N/A val |= *buf++ << (8 * loop++);
1450N/A len -= 1;
1450N/A }
1450N/A
1450N/A I915_WRITE(GMBUS3 + reg_offset, val);
1450N/A I915_WRITE(GMBUS1 + reg_offset,
1450N/A GMBUS_CYCLE_WAIT |
1450N/A (msg->len << GMBUS_BYTE_COUNT_SHIFT) |
1450N/A (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
1450N/A GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
1450N/A while (len) {
1450N/A int ret;
1450N/A
1450N/A val = loop = 0;
1450N/A do {
1450N/A val |= *buf++ << (8 * loop);
1450N/A } while (--len && ++loop < 4);
1450N/A
1450N/A I915_WRITE(GMBUS3 + reg_offset, val);
1450N/A
1450N/A ret = gmbus_wait_hw_status(dev_priv, GMBUS_HW_RDY,
1450N/A GMBUS_HW_RDY_EN);
1450N/A if (ret)
1450N/A return ret;
1450N/A }
1450N/A return 0;
1450N/A}
1450N/A
1450N/A/*
1450N/A * The gmbus controller can combine a 1 or 2 byte write with a read that
1450N/A * immediately follows it by using an "INDEX" cycle.
1450N/A */
1450N/Astatic bool
1450N/Agmbus_is_index_read(struct i2c_msg *msgs, int i, int num)
1450N/A{
1450N/A return (i + 1 < num &&
1450N/A !(msgs[i].flags & I2C_M_RD) && msgs[i].len <= 2 &&
1450N/A (msgs[i + 1].flags & I2C_M_RD));
1450N/A}
1450N/A
1450N/Astatic int
1450N/Agmbus_xfer_index_read(struct drm_i915_private *dev_priv, struct i2c_msg *msgs)
1450N/A{
1450N/A int reg_offset = dev_priv->gpio_mmio_base;
1450N/A u32 gmbus1_index = 0;
1450N/A u32 gmbus5 = 0;
1450N/A int ret;
1450N/A
1450N/A if (msgs[0].len == 2)
1450N/A gmbus5 = GMBUS_2BYTE_INDEX_EN |
1450N/A msgs[0].buf[1] | (msgs[0].buf[0] << 8);
1450N/A if (msgs[0].len == 1)
1450N/A gmbus1_index = GMBUS_CYCLE_INDEX |
1450N/A (msgs[0].buf[0] << GMBUS_SLAVE_INDEX_SHIFT);
1450N/A
1450N/A /* GMBUS5 holds 16-bit index */
1450N/A if (gmbus5)
1450N/A I915_WRITE(GMBUS5 + reg_offset, gmbus5);
1450N/A
1450N/A ret = gmbus_xfer_read(dev_priv, &msgs[1], gmbus1_index);
1450N/A
1450N/A /* Clear GMBUS5 after each index transfer */
1450N/A if (gmbus5)
1450N/A I915_WRITE(GMBUS5 + reg_offset, 0);
1450N/A
1450N/A return ret;
1450N/A}
1450N/A
1450N/Astatic int
1450N/Agmbus_xfer(struct i2c_adapter *adapter,
1450N/A struct i2c_msg *msgs,
1450N/A int num)
1450N/A{
1450N/A struct intel_gmbus *bus = container_of(adapter,
1450N/A struct intel_gmbus,
1450N/A adapter);
1450N/A struct drm_i915_private *dev_priv = bus->dev_priv;
1450N/A int i, reg_offset;
1450N/A int ret = 0;
1450N/A
1450N/A mutex_lock(&dev_priv->gmbus_mutex);
1450N/A
1450N/A if (bus->force_bit) {
1450N/A ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
1450N/A goto out;
1450N/A }
1450N/A
1450N/A reg_offset = dev_priv->gpio_mmio_base;
1450N/A
1450N/A I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
1450N/A
1450N/A for (i = 0; i < num; i++) {
1450N/A if (gmbus_is_index_read(msgs, i, num)) {
1450N/A ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
1450N/A i += 1; /* set i to the index of the read xfer */
1450N/A } else if (msgs[i].flags & I2C_M_RD) {
1450N/A ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
1450N/A } else {
1450N/A ret = gmbus_xfer_write(dev_priv, &msgs[i]);
1450N/A }
1450N/A
1450N/A if (ret == -ETIMEDOUT)
1450N/A goto timeout;
1450N/A if (ret == -ENXIO)
1450N/A goto clear_err;
1450N/A
1450N/A ret = gmbus_wait_hw_status(dev_priv, GMBUS_HW_WAIT_PHASE,
1450N/A GMBUS_HW_WAIT_EN);
1450N/A if (ret == -ENXIO)
1450N/A goto clear_err;
1450N/A if (ret)
1450N/A goto timeout;
1450N/A }
1450N/A
1450N/A /* Generate a STOP condition on the bus. Note that gmbus can't generata
1450N/A * a STOP on the very first cycle. To simplify the code we
1450N/A * unconditionally generate the STOP condition with an additional gmbus
1450N/A * cycle. */
1450N/A I915_WRITE(GMBUS1 + reg_offset, GMBUS_CYCLE_STOP | GMBUS_SW_RDY);
1450N/A
1450N/A /* Mark the GMBUS interface as disabled after waiting for idle.
1450N/A * We will re-enable it at the start of the next xfer,
1450N/A * till then let it sleep.
1450N/A */
1450N/A if (gmbus_wait_idle(dev_priv)) {
1450N/A DRM_DEBUG_KMS("GMBUS [%s] timed out waiting for idle\n",
1450N/A adapter->name);
1450N/A ret = -ETIMEDOUT;
1450N/A }
1450N/A I915_WRITE(GMBUS0 + reg_offset, 0);
1450N/A ret = ret ?: i;
1450N/A goto out;
1450N/A
1450N/Aclear_err:
1450N/A /*
1450N/A * Wait for bus to IDLE before clearing NAK.
1450N/A * If we clear the NAK while bus is still active, then it will stay
1450N/A * active and the next transaction may fail.
1450N/A *
1450N/A * If no ACK is received during the address phase of a transaction, the
1450N/A * adapter must report -ENXIO. It is not clear what to return if no ACK
1450N/A * is received at other times. But we have to be careful to not return
1450N/A * spurious -ENXIO because that will prevent i2c and drm edid functions
1450N/A * from retrying. So return -ENXIO only when gmbus properly quiescents -
1450N/A * timing out seems to happen when there _is_ a ddc chip present, but
1450N/A * it's slow responding and only answers on the 2nd retry.
1450N/A */
1450N/A ret = -ENXIO;
1450N/A if (gmbus_wait_idle(dev_priv)) {
1450N/A DRM_DEBUG_KMS("GMBUS [%s] timed out after NAK\n",
1450N/A adapter->name);
1450N/A ret = -ETIMEDOUT;
1450N/A }
1450N/A
1450N/A /* Toggle the Software Clear Interrupt bit. This has the effect
1450N/A * of resetting the GMBUS controller and so clearing the
1450N/A * BUS_ERROR raised by the slave's NAK.
1450N/A */
1450N/A I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT);
1450N/A I915_WRITE(GMBUS1 + reg_offset, 0);
1450N/A I915_WRITE(GMBUS0 + reg_offset, 0);
1450N/A
1450N/A DRM_DEBUG_KMS("GMBUS [%s] NAK for addr: %04x %c(%d)\n",
1450N/A adapter->name, msgs[i].addr,
1450N/A (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
1450N/A
1450N/A goto out;
1450N/A
1450N/Atimeout:
1450N/A DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
1450N/A bus->adapter.name, bus->reg0 & 0xff);
1450N/A I915_WRITE(GMBUS0 + reg_offset, 0);
1450N/A
1450N/A /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
1450N/A bus->force_bit = 1;
1450N/A ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
1450N/A
1450N/Aout:
1450N/A mutex_unlock(&dev_priv->gmbus_mutex);
1450N/A return ret;
1450N/A}
1450N/A
1450N/Astatic u32 gmbus_func(struct i2c_adapter *adapter)
1450N/A{
1450N/A return adapter->algo->functionality(adapter);
1450N/A}
1450N/A
1450N/Astatic struct i2c_algorithm gmbus_algorithm = {
1450N/A .master_xfer = gmbus_xfer,
1450N/A .functionality = gmbus_func
1450N/A};
1450N/A
1450N/A/**
1450N/A * intel_gmbus_setup - instantiate all Intel i2c GMBuses
1450N/A * @dev: DRM device
1450N/A */
1450N/Aint intel_setup_gmbus(struct drm_device *dev)
1450N/A{
1450N/A struct drm_i915_private *dev_priv = dev->dev_private;
1450N/A int i;
1450N/A
1450N/A if (HAS_PCH_NOP(dev))
1450N/A return 0;
1450N/A else if (HAS_PCH_SPLIT(dev))
1450N/A dev_priv->gpio_mmio_base = PCH_GPIOA - GPIOA;
1450N/A else if (IS_VALLEYVIEW(dev))
1450N/A dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE;
1450N/A else
1450N/A dev_priv->gpio_mmio_base = 0;
1450N/A
1450N/A mutex_init(&dev_priv->gmbus_mutex, NULL, MUTEX_DRIVER, NULL);
1450N/A DRM_INIT_WAITQUEUE(&dev_priv->gmbus_wait_queue, DRM_INTR_PRI(dev));
1450N/A
1450N/A for (i = 0; i < GMBUS_NUM_PORTS; i++) {
1450N/A struct intel_gmbus *bus = &dev_priv->gmbus[i];
1450N/A u32 port = i + 1; /* +1 to map gmbus index to pin pair */
1450N/A
1450N/A snprintf(bus->adapter.name,
1450N/A sizeof(bus->adapter.name),
1450N/A "i915 gmbus %s",
1450N/A gmbus_ports[i].name);
1450N/A
1450N/A// bus->adapter.dev.parent = &dev->pdev->dev;
1450N/A bus->dev_priv = dev_priv;
1450N/A
1450N/A bus->adapter.algo = &gmbus_algorithm;
1450N/A
1450N/A /* By default use a conservative clock rate */
1450N/A bus->reg0 = port | GMBUS_RATE_100KHZ;
1450N/A
1450N/A /* gmbus seems to be broken on i830 */
1450N/A if (IS_I830(dev))
1450N/A bus->force_bit = 1;
1450N/A
1450N/A intel_gpio_setup(bus, port);
1450N/A }
1450N/A
1450N/A intel_i2c_reset(dev_priv->dev);
1450N/A
1450N/A return 0;
1450N/A}
1450N/A
1450N/Astruct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *dev_priv,
1450N/A unsigned port)
1450N/A{
1450N/A WARN_ON(!intel_gmbus_is_port_valid(port));
1450N/A /* -1 to map pin pair to gmbus index */
1450N/A return (intel_gmbus_is_port_valid(port)) ?
1450N/A &dev_priv->gmbus[port - 1].adapter : NULL;
1450N/A}
1450N/A
1450N/Avoid intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed)
1450N/A{
1450N/A struct intel_gmbus *bus = to_intel_gmbus(adapter);
1450N/A
1450N/A bus->reg0 = (bus->reg0 & ~(0x3 << 8)) | speed;
1450N/A}
1450N/A
1450N/Avoid intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
1450N/A{
1450N/A struct intel_gmbus *bus = to_intel_gmbus(adapter);
1450N/A
1450N/A bus->force_bit += force_bit ? 1 : -1;
1450N/A DRM_DEBUG_KMS("%sabling bit-banging on %s. force bit now %d\n",
1450N/A force_bit ? "en" : "dis", adapter->name,
1450N/A bus->force_bit);
1450N/A}
1450N/A
1450N/Avoid intel_teardown_gmbus(struct drm_device *dev)
1450N/A{
1450N/A/*
1450N/A for (i = 0; i < GMBUS_NUM_PORTS; i++) {
1450N/A struct intel_gmbus *bus = &dev_priv->gmbus[i];
1450N/A// i2c_del_adapter(&bus->adapter);
1450N/A }
1450N/A*/
1450N/A}
1450N/A
1450N/A/* workaround for fixing hdmi issue */
1450N/Avoid intel_gmbus_hdmi_set_adapter(struct i2c_adapter *adapter)
1450N/A{
1450N/A adapter->getsda = vga_get_data;
1450N/A adapter->getscl = vga_get_clock;
1450N/A}