summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci/drm/drm_linux.c
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2018-01-15 22:24:17 +0000
committerkettenis <kettenis@openbsd.org>2018-01-15 22:24:17 +0000
commit142c034f02183f3519040a3e39a69a51b83676b4 (patch)
treea7cd51f85cae9791bc1afb5a839a3a971ed996f1 /sys/dev/pci/drm/drm_linux.c
parentmask out (ie. ignore) the bit which will be MAP_STACK in the future, (diff)
downloadwireguard-openbsd-142c034f02183f3519040a3e39a69a51b83676b4.tar.xz
wireguard-openbsd-142c034f02183f3519040a3e39a69a51b83676b4.zip
Switch the inteldrm(4) i2c code over to the Linux code base. This gives us
several quirks that wre absent in the old OpenBSD-specific reimplementation. Fixes several issues with external connectors on several generations of hardware. ok deraadt@, benno@
Diffstat (limited to 'sys/dev/pci/drm/drm_linux.c')
-rw-r--r--sys/dev/pci/drm/drm_linux.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/sys/dev/pci/drm/drm_linux.c b/sys/dev/pci/drm/drm_linux.c
index 40141b85b98..7cabeac05c5 100644
--- a/sys/dev/pci/drm/drm_linux.c
+++ b/sys/dev/pci/drm/drm_linux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: drm_linux.c,v 1.17 2018/01/13 13:03:42 robert Exp $ */
+/* $OpenBSD: drm_linux.c,v 1.18 2018/01/15 22:24:17 kettenis Exp $ */
/*
* Copyright (c) 2013 Jonathan Gray <jsg@openbsd.org>
* Copyright (c) 2015, 2016 Mark Kettenis <kettenis@openbsd.org>
@@ -552,16 +552,13 @@ sg_copy_from_buffer(struct scatterlist *sgl, unsigned int nents,
}
int
-i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
void *cmd = NULL;
int cmdlen = 0;
int err, ret = 0;
int op;
- if (adap->algo)
- return adap->algo->master_xfer(adap, msgs, num);
-
iic_acquire_bus(&adap->ic, 0);
while (num > 2) {
@@ -585,8 +582,10 @@ i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
ret++;
}
- op = (msgs->flags & I2C_M_RD) ? I2C_OP_READ_WITH_STOP : I2C_OP_WRITE_WITH_STOP;
- err = iic_exec(&adap->ic, op, msgs->addr, cmd, cmdlen, msgs->buf, msgs->len, 0);
+ op = (msgs->flags & I2C_M_RD) ?
+ I2C_OP_READ_WITH_STOP : I2C_OP_WRITE_WITH_STOP;
+ err = iic_exec(&adap->ic, op, msgs->addr, cmd, cmdlen,
+ msgs->buf, msgs->len, 0);
if (err) {
ret = -err;
goto fail;
@@ -600,6 +599,38 @@ fail:
return ret;
}
+int
+i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+{
+ if (adap->algo)
+ return adap->algo->master_xfer(adap, msgs, num);
+
+ return i2c_master_xfer(adap, msgs, num);
+}
+
+int
+i2c_bb_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
+{
+ struct i2c_algo_bit_data *algo = adap->algo_data;
+ struct i2c_adapter bb;
+
+ memset(&bb, 0, sizeof(bb));
+ bb.ic = algo->ic;
+ bb.retries = adap->retries;
+ return i2c_master_xfer(&bb, msgs, num);
+}
+
+uint32_t
+i2c_bb_functionality(struct i2c_adapter *adap)
+{
+ return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
+}
+
+struct i2c_algorithm i2c_bit_algo = {
+ .master_xfer = i2c_bb_master_xfer,
+ .functionality = i2c_bb_functionality
+};
+
#if defined(__amd64__) || defined(__i386__)
/*