svn commit: r289456 - head/sys/dev/drm2/i915

Jean-Sébastien Pédron dumbbell at FreeBSD.org
Sat Oct 17 14:48:40 UTC 2015


Author: dumbbell
Date: Sat Oct 17 14:48:39 2015
New Revision: 289456
URL: https://svnweb.freebsd.org/changeset/base/289456

Log:
  drm/i915: Reduce diff with Linux 3.8
  
  There is no functional change. The goal is to ease the future update to
  Linux 3.8's i915 driver.
  
  MFC after:	2 months

Modified:
  head/sys/dev/drm2/i915/intel_dp.c
  head/sys/dev/drm2/i915/intel_iic.c

Modified: head/sys/dev/drm2/i915/intel_dp.c
==============================================================================
--- head/sys/dev/drm2/i915/intel_dp.c	Sat Oct 17 14:07:47 2015	(r289455)
+++ head/sys/dev/drm2/i915/intel_dp.c	Sat Oct 17 14:48:39 2015	(r289456)
@@ -555,12 +555,12 @@ intel_dp_aux_native_read(struct intel_dp
 }
 
 static int
-intel_dp_i2c_aux_ch(device_t idev, int mode, uint8_t write_byte,
-    uint8_t *read_byte)
+intel_dp_i2c_aux_ch(device_t adapter, int mode,
+		    uint8_t write_byte, uint8_t *read_byte)
 {
-	struct iic_dp_aux_data *data;
-	struct intel_dp *intel_dp;
-	uint16_t address;
+	struct iic_dp_aux_data *data = device_get_softc(adapter);
+	struct intel_dp *intel_dp = data->priv;
+	uint16_t address = data->address;
 	uint8_t msg[5];
 	uint8_t reply[2];
 	unsigned retry;
@@ -568,10 +568,6 @@ intel_dp_i2c_aux_ch(device_t idev, int m
 	int reply_bytes;
 	int ret;
 
-	data = device_get_softc(idev);
-	intel_dp = data->priv;
-	address = data->address;
-
 	intel_dp_check_edp(intel_dp);
 	/* Set up the command byte */
 	if (mode & MODE_I2C_READ)
@@ -609,7 +605,7 @@ intel_dp_i2c_aux_ch(device_t idev, int m
 				      reply, reply_bytes);
 		if (ret < 0) {
 			DRM_DEBUG_KMS("aux_ch failed %d\n", ret);
-			return (ret);
+			return ret;
 		}
 
 		switch (reply[0] & AUX_NATIVE_REPLY_MASK) {
@@ -620,14 +616,14 @@ intel_dp_i2c_aux_ch(device_t idev, int m
 			break;
 		case AUX_NATIVE_REPLY_NACK:
 			DRM_DEBUG_KMS("aux_ch native nack\n");
-			return (-EREMOTEIO);
+			return -EREMOTEIO;
 		case AUX_NATIVE_REPLY_DEFER:
 			DELAY(100);
 			continue;
 		default:
 			DRM_ERROR("aux_ch invalid native reply 0x%02x\n",
 				  reply[0]);
-			return (-EREMOTEIO);
+			return -EREMOTEIO;
 		}
 
 		switch (reply[0] & AUX_I2C_REPLY_MASK) {
@@ -638,19 +634,19 @@ intel_dp_i2c_aux_ch(device_t idev, int m
 			return (0/*reply_bytes - 1*/);
 		case AUX_I2C_REPLY_NACK:
 			DRM_DEBUG_KMS("aux_i2c nack\n");
-			return (-EREMOTEIO);
+			return -EREMOTEIO;
 		case AUX_I2C_REPLY_DEFER:
 			DRM_DEBUG_KMS("aux_i2c defer\n");
 			DELAY(100);
 			break;
 		default:
 			DRM_ERROR("aux_i2c invalid reply 0x%02x\n", reply[0]);
-			return (-EREMOTEIO);
+			return -EREMOTEIO;
 		}
 	}
 
 	DRM_ERROR("too many retries, giving up\n");
-	return (-EREMOTEIO);
+	return -EREMOTEIO;
 }
 
 static void ironlake_edp_panel_vdd_on(struct intel_dp *intel_dp);
@@ -660,7 +656,7 @@ static int
 intel_dp_i2c_init(struct intel_dp *intel_dp,
 		  struct intel_connector *intel_connector, const char *name)
 {
-	int ret;
+	int	ret;
 
 	DRM_DEBUG_KMS("i2c_init %s\n", name);
 
@@ -669,7 +665,7 @@ intel_dp_i2c_init(struct intel_dp *intel
 	    intel_dp_i2c_aux_ch, intel_dp, &intel_dp->dp_iic_bus,
 	    &intel_dp->adapter);
 	ironlake_edp_panel_vdd_off(intel_dp, false);
-	return (ret);
+	return ret;
 }
 
 static bool
@@ -956,8 +952,7 @@ static void ironlake_wait_panel_status(s
 		      I915_READ(PCH_PP_STATUS),
 		      I915_READ(PCH_PP_CONTROL));
 
-	if (_intel_wait_for(dev,
-	    (I915_READ(PCH_PP_STATUS) & mask) == value, 5000, 10, "915iwp")) {
+	if (_intel_wait_for(dev, (I915_READ(PCH_PP_STATUS) & mask) == value, 5000, 10, "915iwp")) {
 		DRM_ERROR("Panel status timeout: status %08x control %08x\n",
 			  I915_READ(PCH_PP_STATUS),
 			  I915_READ(PCH_PP_CONTROL));

Modified: head/sys/dev/drm2/i915/intel_iic.c
==============================================================================
--- head/sys/dev/drm2/i915/intel_iic.c	Sat Oct 17 14:07:47 2015	(r289455)
+++ head/sys/dev/drm2/i915/intel_iic.c	Sat Oct 17 14:48:39 2015	(r289456)
@@ -96,8 +96,27 @@ struct intel_iic_softc {
 	uint32_t reg0;
 };
 
-static void
-intel_iic_quirk_set(struct drm_i915_private *dev_priv, bool enable)
+void
+intel_iic_reset(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	I915_WRITE(dev_priv->gpio_mmio_base + GMBUS0, 0);
+}
+
+static int
+intel_iicbus_reset(device_t idev, u_char speed, u_char addr, u_char *oldaddr)
+{
+	struct intel_iic_softc *sc;
+	struct drm_device *dev;
+
+	sc = device_get_softc(idev);
+	dev = sc->drm_dev;
+
+	intel_iic_reset(dev);
+	return (0);
+}
+
+static void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
 {
 	u32 val;
 
@@ -113,130 +132,103 @@ intel_iic_quirk_set(struct drm_i915_priv
 	I915_WRITE(DSPCLK_GATE_D, val);
 }
 
-static u32
-intel_iic_get_reserved(device_t idev)
+static u32 get_reserved(device_t idev)
 {
-	struct intel_iic_softc *sc;
-	struct drm_device *dev;
-	struct drm_i915_private *dev_priv;
-	u32 reserved;
+	struct intel_iic_softc *sc = device_get_softc(idev);
+	struct drm_device *dev = sc->drm_dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	u32 reserved = 0;
 
-	sc = device_get_softc(idev);
-	dev = sc->drm_dev;
-	dev_priv = dev->dev_private;
-
-	if (!IS_I830(dev) && !IS_845G(dev)) {
+	if (!IS_I830(dev) && !IS_845G(dev))
 		reserved = I915_READ_NOTRACE(sc->reg) &
-		    (GPIO_DATA_PULLUP_DISABLE | GPIO_CLOCK_PULLUP_DISABLE);
-	} else {
-		reserved = 0;
-	}
+					     (GPIO_DATA_PULLUP_DISABLE |
+					      GPIO_CLOCK_PULLUP_DISABLE);
 
-	return (reserved);
+	return reserved;
 }
 
-void
-intel_iic_reset(struct drm_device *dev)
+static int get_clock(device_t adapter)
 {
-	struct drm_i915_private *dev_priv;
-
-	dev_priv = dev->dev_private;
-	I915_WRITE(dev_priv->gpio_mmio_base + GMBUS0, 0);
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
+	u32 reserved = get_reserved(adapter);
+	I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_CLOCK_DIR_MASK);
+	I915_WRITE_NOTRACE(sc->reg, reserved);
+	return ((I915_READ_NOTRACE(sc->reg) & GPIO_CLOCK_VAL_IN) != 0);
 }
 
-static int
-intel_iicbus_reset(device_t idev, u_char speed, u_char addr, u_char *oldaddr)
+static int get_data(device_t adapter)
 {
-	struct intel_iic_softc *sc;
-	struct drm_device *dev;
-
-	sc = device_get_softc(idev);
-	dev = sc->drm_dev;
-
-	intel_iic_reset(dev);
-	return (0);
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
+	u32 reserved = get_reserved(adapter);
+	I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_DATA_DIR_MASK);
+	I915_WRITE_NOTRACE(sc->reg, reserved);
+	return ((I915_READ_NOTRACE(sc->reg) & GPIO_DATA_VAL_IN) != 0);
 }
 
-static void
-intel_iicbb_setsda(device_t idev, int val)
+static void set_clock(device_t adapter, int state_high)
 {
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-	u32 reserved;
-	u32 data_bits;
-
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
+	u32 reserved = get_reserved(adapter);
+	u32 clock_bits;
 
-	reserved = intel_iic_get_reserved(idev);
-	if (val)
-		data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
+	if (state_high)
+		clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
 	else
-		data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
-		    GPIO_DATA_VAL_MASK;
+		clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
+			GPIO_CLOCK_VAL_MASK;
 
-	I915_WRITE_NOTRACE(sc->reg, reserved | data_bits);
+	I915_WRITE_NOTRACE(sc->reg, reserved | clock_bits);
 	POSTING_READ(sc->reg);
 }
 
-static void
-intel_iicbb_setscl(device_t idev, int val)
+static void set_data(device_t adapter, int state_high)
 {
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-	u32 clock_bits, reserved;
-
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
+	u32 reserved = get_reserved(adapter);
+	u32 data_bits;
 
-	reserved = intel_iic_get_reserved(idev);
-	if (val)
-		clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
+	if (state_high)
+		data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
 	else
-		clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
-		    GPIO_CLOCK_VAL_MASK;
+		data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
+			GPIO_DATA_VAL_MASK;
 
-	I915_WRITE_NOTRACE(sc->reg, reserved | clock_bits);
+	I915_WRITE_NOTRACE(sc->reg, reserved | data_bits);
 	POSTING_READ(sc->reg);
 }
 
 static int
-intel_iicbb_getsda(device_t idev)
+intel_gpio_pre_xfer(device_t adapter)
 {
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-	u32 reserved;
-
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
-
-	reserved = intel_iic_get_reserved(idev);
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
 
-	I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_DATA_DIR_MASK);
-	I915_WRITE_NOTRACE(sc->reg, reserved);
-	return ((I915_READ_NOTRACE(sc->reg) & GPIO_DATA_VAL_IN) != 0);
+	intel_iic_reset(sc->drm_dev);
+	intel_i2c_quirk_set(dev_priv, true);
+	IICBB_SETSDA(adapter, 1);
+	IICBB_SETSCL(adapter, 1);
+	DELAY(I2C_RISEFALL_TIME);
+	return 0;
 }
 
-static int
-intel_iicbb_getscl(device_t idev)
+static void
+intel_gpio_post_xfer(device_t adapter)
 {
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-	u32 reserved;
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
 
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
-
-	reserved = intel_iic_get_reserved(idev);
-
-	I915_WRITE_NOTRACE(sc->reg, reserved | GPIO_CLOCK_DIR_MASK);
-	I915_WRITE_NOTRACE(sc->reg, reserved);
-	return ((I915_READ_NOTRACE(sc->reg) & GPIO_CLOCK_VAL_IN) != 0);
+	IICBB_SETSDA(adapter, 1);
+	IICBB_SETSCL(adapter, 1);
+	intel_i2c_quirk_set(dev_priv, false);
 }
 
 static int
 gmbus_xfer_read(struct drm_i915_private *dev_priv, struct iic_msg *msg,
-    u32 gmbus1_index)
+		u32 gmbus1_index)
 {
 	int reg_offset = dev_priv->gpio_mmio_base;
 	u16 len = msg->len;
@@ -254,19 +246,19 @@ gmbus_xfer_read(struct drm_i915_private 
 		u32 gmbus2;
 
 		ret = _intel_wait_for(sc->drm_dev,
-		    ((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
-		    (GMBUS_SATOER | GMBUS_HW_RDY)),
-		    50, 1, "915gbr");
+			       ((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
+			       (GMBUS_SATOER | GMBUS_HW_RDY)),
+			       50, 1, "915gbr");
 		if (ret)
-			return (-ETIMEDOUT);
+			return -ETIMEDOUT;
 		if (gmbus2 & GMBUS_SATOER)
-			return (-ENXIO);
+			return -ENXIO;
 
 		val = I915_READ(GMBUS3 + reg_offset);
 		do {
 			*buf++ = val & 0xff;
 			val >>= 8;
-		} while (--len != 0 && ++loop < 4);
+		} while (--len && ++loop < 4);
 	}
 
 	return 0;
@@ -299,18 +291,18 @@ gmbus_xfer_write(struct drm_i915_private
 		val = loop = 0;
 		do {
 			val |= *buf++ << (8 * loop);
-		} while (--len != 0 && ++loop < 4);
+		} while (--len && ++loop < 4);
 
 		I915_WRITE(GMBUS3 + reg_offset, val);
 
 		ret = _intel_wait_for(sc->drm_dev,
-		    ((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
-		    (GMBUS_SATOER | GMBUS_HW_RDY)),
-		    50, 1, "915gbw");
+			       ((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
+			       (GMBUS_SATOER | GMBUS_HW_RDY)),
+			       50, 1, "915gbw");
 		if (ret)
-			return (-ETIMEDOUT);
+			return -ETIMEDOUT;
 		if (gmbus2 & GMBUS_SATOER)
-			return (-ENXIO);
+			return -ENXIO;
 	}
 	return 0;
 }
@@ -356,20 +348,20 @@ gmbus_xfer_index_read(struct drm_i915_pr
 }
 
 static int
-intel_gmbus_transfer(device_t idev, struct iic_msg *msgs, uint32_t nmsgs)
+gmbus_xfer(device_t adapter,
+	   struct iic_msg *msgs,
+	   uint32_t num)
 {
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
+	struct intel_iic_softc *sc = device_get_softc(adapter);
+	struct drm_i915_private *dev_priv = sc->drm_dev->dev_private;
 	int error, i, ret, reg_offset, unit;
 
 	error = 0;
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
-	unit = device_get_unit(idev);
+	unit = device_get_unit(adapter);
 
 	sx_xlock(&dev_priv->gmbus_sx);
 	if (sc->force_bit_dev) {
-		error = -IICBUS_TRANSFER(dev_priv->bbbus[unit], msgs, nmsgs);
+		error = -IICBUS_TRANSFER(dev_priv->bbbus[unit], msgs, num);
 		goto out;
 	}
 
@@ -377,10 +369,10 @@ intel_gmbus_transfer(device_t idev, stru
 
 	I915_WRITE(GMBUS0 + reg_offset, sc->reg0);
 
-	for (i = 0; i < nmsgs; i++) {
+	for (i = 0; i < num; i++) {
 		u32 gmbus2;
 
-		if (gmbus_is_index_read(msgs, i, nmsgs)) {
+		if (gmbus_is_index_read(msgs, i, num)) {
 			error = gmbus_xfer_index_read(dev_priv, &msgs[i]);
 			i += 1;  /* set i to the index of the read xfer */
 		} else if (msgs[i].flags & IIC_M_RD) {
@@ -413,12 +405,12 @@ intel_gmbus_transfer(device_t idev, stru
 	/* Mark the GMBUS interface as disabled after waiting for idle.
 	 * We will re-enable it at the start of the next xfer,
 	 * till then let it sleep.
- 	 */
+	 */
 	if (_intel_wait_for(dev,
 	    (I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0,
 	    10, 1, "915gbu")) {
 		DRM_DEBUG_KMS("GMBUS [%s] timed out waiting for idle\n",
-		    sc->name);
+			 sc->name);
 		error = -ETIMEDOUT;
 	}
 	I915_WRITE(GMBUS0 + reg_offset, 0);
@@ -459,81 +451,16 @@ clear_err:
 
 timeout:
 	DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
-	    sc->name, sc->reg0 & 0xff);
+		 sc->name, sc->reg0 & 0xff);
 	I915_WRITE(GMBUS0 + reg_offset, 0);
 
-	/*
-	 * Hardware may not support GMBUS over these pins?
-	 * Try GPIO bitbanging instead.
-	 */
+	/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
 	sc->force_bit_dev = true;
-	error = -IICBUS_TRANSFER(idev, msgs, nmsgs);
-	goto out;
+	error = -IICBUS_TRANSFER(adapter, msgs, num);
 
 out:
 	sx_xunlock(&dev_priv->gmbus_sx);
-	return (-error);
-}
-
-device_t 
-intel_gmbus_get_adapter(struct drm_i915_private *dev_priv,
-    unsigned port)
-{
-
-	if (!intel_gmbus_is_port_valid(port))
-		DRM_ERROR("GMBUS get adapter %d: invalid port\n", port);
-	return (intel_gmbus_is_port_valid(port) ? dev_priv->gmbus[port - 1] :
-	    NULL);
-}
-
-void
-intel_gmbus_set_speed(device_t idev, int speed)
-{
-	struct intel_iic_softc *sc;
-
-	sc = device_get_softc(device_get_parent(idev));
-
-	sc->reg0 = (sc->reg0 & ~(0x3 << 8)) | speed;
-}
-
-void
-intel_gmbus_force_bit(device_t idev, bool force_bit)
-{
-	struct intel_iic_softc *sc;
-
-	sc = device_get_softc(device_get_parent(idev));
-	sc->force_bit_dev = force_bit;
-}
-
-static int
-intel_iicbb_pre_xfer(device_t idev)
-{
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
-
-	intel_iic_reset(sc->drm_dev);
-	intel_iic_quirk_set(dev_priv, true);
-	IICBB_SETSDA(idev, 1);
-	IICBB_SETSCL(idev, 1);
-	DELAY(I2C_RISEFALL_TIME);
-	return (0);
-}
-
-static void
-intel_iicbb_post_xfer(device_t idev)
-{
-	struct intel_iic_softc *sc;
-	struct drm_i915_private *dev_priv;
-
-	sc = device_get_softc(idev);
-	dev_priv = sc->drm_dev->dev_private;
-
-	IICBB_SETSDA(idev, 1);
-	IICBB_SETSCL(idev, 1);
-	intel_iic_quirk_set(dev_priv, false);
+	return -error;
 }
 
 static int
@@ -663,7 +590,7 @@ static device_method_t intel_gmbus_metho
 	DEVMETHOD(device_attach,	intel_gmbus_attach),
 	DEVMETHOD(device_detach,	intel_gmbus_detach),
 	DEVMETHOD(iicbus_reset,		intel_iicbus_reset),
-	DEVMETHOD(iicbus_transfer,	intel_gmbus_transfer),
+	DEVMETHOD(iicbus_transfer,	gmbus_xfer),
 	DEVMETHOD_END
 };
 static driver_t intel_gmbus_driver = {
@@ -686,12 +613,12 @@ static device_method_t intel_iicbb_metho
 
 	DEVMETHOD(iicbb_callback,	iicbus_null_callback),
 	DEVMETHOD(iicbb_reset,		intel_iicbus_reset),
-	DEVMETHOD(iicbb_setsda,		intel_iicbb_setsda),
-	DEVMETHOD(iicbb_setscl,		intel_iicbb_setscl),
-	DEVMETHOD(iicbb_getsda,		intel_iicbb_getsda),
-	DEVMETHOD(iicbb_getscl,		intel_iicbb_getscl),
-	DEVMETHOD(iicbb_pre_xfer,	intel_iicbb_pre_xfer),
-	DEVMETHOD(iicbb_post_xfer,	intel_iicbb_post_xfer),
+	DEVMETHOD(iicbb_setsda,		set_data),
+	DEVMETHOD(iicbb_setscl,		set_clock),
+	DEVMETHOD(iicbb_getsda,		get_data),
+	DEVMETHOD(iicbb_getscl,		get_clock),
+	DEVMETHOD(iicbb_pre_xfer,	intel_gpio_pre_xfer),
+	DEVMETHOD(iicbb_post_xfer,	intel_gpio_post_xfer),
 	DEVMETHOD_END
 };
 static driver_t intel_iicbb_driver = {
@@ -704,20 +631,19 @@ DRIVER_MODULE_ORDERED(intel_iicbb, drmn,
     intel_iicbb_devclass, 0, 0, SI_ORDER_FIRST);
 DRIVER_MODULE(iicbb, intel_iicbb, iicbb_driver, iicbb_devclass, 0, 0);
 
-int
-intel_setup_gmbus(struct drm_device *dev)
+int intel_setup_gmbus(struct drm_device *dev)
 {
-	struct drm_i915_private *dev_priv;
+	struct drm_i915_private *dev_priv = dev->dev_private;
 	device_t iic_dev;
-	int i, ret;
+	int ret, i;
 
-	dev_priv = dev->dev_private;
-	sx_init(&dev_priv->gmbus_sx, "gmbus");
 	if (HAS_PCH_SPLIT(dev))
 		dev_priv->gpio_mmio_base = PCH_GPIOA - GPIOA;
 	else
 		dev_priv->gpio_mmio_base = 0;
 
+	sx_init(&dev_priv->gmbus_sx, "gmbus");
+
 	/*
 	 * The Giant there is recursed, most likely.  Normally, the
 	 * intel_setup_gmbus() is called from the attach method of the
@@ -786,14 +712,41 @@ intel_setup_gmbus(struct drm_device *dev
 
 		intel_iic_reset(dev);
 	}
-
 	mtx_unlock(&Giant);
-	return (0);
+
+	return 0;
 
 err:
 	intel_teardown_gmbus_m(dev, i);
 	mtx_unlock(&Giant);
-	return (ret);
+	return ret;
+}
+
+device_t intel_gmbus_get_adapter(struct drm_i915_private *dev_priv,
+					    unsigned port)
+{
+
+	if (!intel_gmbus_is_port_valid(port))
+		DRM_ERROR("GMBUS get adapter %d: invalid port\n", port);
+	return (intel_gmbus_is_port_valid(port) ? dev_priv->gmbus[port - 1] :
+	    NULL);
+}
+
+void intel_gmbus_set_speed(device_t adapter, int speed)
+{
+	struct intel_iic_softc *sc;
+
+	sc = device_get_softc(device_get_parent(adapter));
+
+	sc->reg0 = (sc->reg0 & ~(0x3 << 8)) | speed;
+}
+
+void intel_gmbus_force_bit(device_t adapter, bool force_bit)
+{
+	struct intel_iic_softc *sc;
+
+	sc = device_get_softc(device_get_parent(adapter));
+	sc->force_bit_dev = force_bit;
 }
 
 static void
@@ -806,8 +759,7 @@ intel_teardown_gmbus_m(struct drm_device
 	sx_destroy(&dev_priv->gmbus_sx);
 }
 
-void
-intel_teardown_gmbus(struct drm_device *dev)
+void intel_teardown_gmbus(struct drm_device *dev)
 {
 
 	mtx_lock(&Giant);


More information about the svn-src-all mailing list