diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-02-16 15:21:58 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2013-02-20 15:55:28 +1000 |
commit | 541af781bd992c23eeb6362721cdd0fc84b074bf (patch) | |
tree | 5566b783020aeb0080abab7d1b8d377d45cb2908 /nvkm/subdev/i2c/bit.c | |
parent | 3b8f09423c5792febe7c5b475aa926b5fce1769a (diff) | |
download | nouveau-541af781bd992c23eeb6362721cdd0fc84b074bf.tar.gz |
i2c: create proper chipset-specific class implementations
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm/subdev/i2c/bit.c')
-rw-r--r-- | nvkm/subdev/i2c/bit.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/nvkm/subdev/i2c/bit.c b/nvkm/subdev/i2c/bit.c index 1c4c9a5c8..a6e72d3b0 100644 --- a/nvkm/subdev/i2c/bit.c +++ b/nvkm/subdev/i2c/bit.c @@ -32,25 +32,25 @@ static inline void i2c_drive_scl(struct nouveau_i2c_port *port, int state) { - nouveau_i2c_drive_scl(port, state); + port->func->drive_scl(port, state); } static inline void i2c_drive_sda(struct nouveau_i2c_port *port, int state) { - nouveau_i2c_drive_sda(port, state); + port->func->drive_sda(port, state); } static inline int i2c_sense_scl(struct nouveau_i2c_port *port) { - return nouveau_i2c_sense_scl(port); + return port->func->sense_scl(port); } static inline int i2c_sense_sda(struct nouveau_i2c_port *port) { - return nouveau_i2c_sense_sda(port); + return port->func->sense_sda(port); } static void @@ -77,9 +77,8 @@ i2c_start(struct nouveau_i2c_port *port) { int ret = 0; - port->state = i2c_sense_scl(port); - port->state |= i2c_sense_sda(port) << 1; - if (port->state != 3) { + if (!i2c_sense_scl(port) || + !i2c_sense_sda(port)) { i2c_drive_scl(port, 0); i2c_drive_sda(port, 1); if (!i2c_raise_scl(port)) @@ -184,10 +183,13 @@ i2c_addr(struct nouveau_i2c_port *port, struct i2c_msg *msg) static int i2c_bit_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { - struct nouveau_i2c_port *port = (struct nouveau_i2c_port *)adap; + struct nouveau_i2c_port *port = adap->algo_data; struct i2c_msg *msg = msgs; int ret = 0, mcnt = num; + if (port->func->acquire) + port->func->acquire(port); + while (!ret && mcnt--) { u8 remaining = msg->len; u8 *ptr = msg->buf; |