diff options
Diffstat (limited to 'sys/dev/pci/drm/drm_linux.c')
| -rw-r--r-- | sys/dev/pci/drm/drm_linux.c | 45 |
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__) /* |
