summaryrefslogtreecommitdiff
path: root/nvkm/subdev/i2c/bit.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-02-16 15:21:58 +1000
committerBen Skeggs <bskeggs@redhat.com>2013-02-20 15:55:28 +1000
commit541af781bd992c23eeb6362721cdd0fc84b074bf (patch)
tree5566b783020aeb0080abab7d1b8d377d45cb2908 /nvkm/subdev/i2c/bit.c
parent3b8f09423c5792febe7c5b475aa926b5fce1769a (diff)
downloadnouveau-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.c18
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;