drm/nv50: parse/use some more de-magiced parts of gpio table entries
authorBen Skeggs <bskeggs@redhat.com>
Wed, 7 Apr 2010 02:05:32 +0000 (12:05 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 9 Apr 2010 00:15:45 +0000 (10:15 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_bios.h

index 84b03e0a386507d70188c37c534bf1f22e967eca..70a51fc2323e6f7527a2e7da5858a7f0c57179b1 100644 (file)
@@ -2595,10 +2595,7 @@ init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
                r = nv50_gpio_reg[gpio->line >> 3];
                s = (gpio->line & 0x07) << 2;
                v = bios_rd32(bios, r) & ~(0x00000003 << s);
-               if (gpio->entry & 0x01000000)
-                       v |= (((gpio->entry & 0x60000000) >> 29) ^ 2) << s;
-               else
-                       v |= (((gpio->entry & 0x18000000) >> 27) ^ 2) << s;
+               v |= (gpio->state[gpio->state_default] ^ 2) << s;
                bios_wr32(bios, r, v);
 
                r = nv50_gpio_ctl[gpio->line >> 4];
@@ -5078,21 +5075,19 @@ parse_dcb30_gpio_entry(struct nvbios *bios, uint16_t offset)
 static void
 parse_dcb40_gpio_entry(struct nvbios *bios, uint16_t offset)
 {
+       uint32_t entry = ROM32(bios->data[offset]);
        struct dcb_gpio_entry *gpio;
-       uint32_t ent = ROM32(bios->data[offset]);
-       uint8_t line = ent & 0x1f,
-               tag = ent >> 8 & 0xff;
 
-       if (tag == 0xff)
+       if ((entry & 0x0000ff00) == 0x0000ff00)
                return;
 
        gpio = new_gpio_entry(bios);
-
-       /* Currently unused, we may need more fields parsed at some
-        * point. */
-       gpio->tag = tag;
-       gpio->line = line;
-       gpio->entry = ent;
+       gpio->tag = (entry & 0x0000ff00) >> 8;
+       gpio->line = (entry & 0x0000001f) >> 0;
+       gpio->state_default = (entry & 0x01000000) >> 24;
+       gpio->state[0] = (entry & 0x18000000) >> 27;
+       gpio->state[1] = (entry & 0x60000000) >> 29;
+       gpio->entry = entry;
 }
 
 static void
index 3706493c014d2e2ca5d273976fb81c3f131076a6..c0d7b0a3ece0a35929c3c0f07b7183136f0cd607 100644 (file)
@@ -50,6 +50,8 @@ struct dcb_gpio_entry {
        int line;
        bool invert;
        uint32_t entry;
+       uint8_t state_default;
+       uint8_t state[2];
 };
 
 struct dcb_gpio_table {