drm/nouveau/i2c: extend type to 16-bits, add lookup-by-type function
authorBen Skeggs <bskeggs@redhat.com>
Sat, 16 Feb 2013 03:19:18 +0000 (13:19 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 20 Feb 2013 06:00:59 +0000 (16:00 +1000)
For off-chip transmitters we won't necessarily have an i2c table entry
to lookup, but we can do it instead by encoding the type to include
the extdev type and looking that up instead.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/core/include/subdev/i2c.h
drivers/gpu/drm/nouveau/core/subdev/i2c/base.c

index d2c067a794aa5533a2df3998828000959fe7f4a8..a8043178f92660e9f1f306a6ae5acbe1ceaf53b4 100644 (file)
@@ -16,7 +16,7 @@ struct nouveau_i2c_port {
        struct i2c_algo_bit_data bit;
        struct list_head head;
        u8  index;
-       u type;
+       u16 type;
        u32 dcb;
        u32 drive;
        u32 sense;
@@ -29,6 +29,7 @@ struct nouveau_i2c {
        struct nouveau_subdev base;
 
        struct nouveau_i2c_port *(*find)(struct nouveau_i2c *, u8 index);
+       struct nouveau_i2c_port *(*find_type)(struct nouveau_i2c *, u16 type);
        int (*identify)(struct nouveau_i2c *, int index,
                        const char *what, struct i2c_board_info *,
                        bool (*match)(struct nouveau_i2c_port *,
index bc8ec7ace9d10aecf04573a2e9e457e580ab23f9..6ab51d3b3016e0c8921530a24d5ec2af69edbd7a 100644 (file)
@@ -109,6 +109,19 @@ nouveau_i2c_find(struct nouveau_i2c *i2c, u8 index)
        return NULL;
 }
 
+static struct nouveau_i2c_port *
+nouveau_i2c_find_type(struct nouveau_i2c *i2c, u16 type)
+{
+       struct nouveau_i2c_port *port;
+
+       list_for_each_entry(port, &i2c->ports, head) {
+               if (port->type == type)
+                       return port;
+       }
+
+       return NULL;
+}
+
 static int
 nouveau_i2c_identify(struct nouveau_i2c *i2c, int index, const char *what,
                     struct i2c_board_info *info,
@@ -264,6 +277,7 @@ nouveau_i2c_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
                return ret;
 
        i2c->find = nouveau_i2c_find;
+       i2c->find_type = nouveau_i2c_find_type;
        i2c->identify = nouveau_i2c_identify;
        INIT_LIST_HEAD(&i2c->ports);