aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2010-04-06 22:05:32 -0400
committerBen Skeggs <bskeggs@redhat.com>2010-04-08 20:15:45 -0400
commit02faec09b2814b6ad3fd202e2f28b3c4b712a3f1 (patch)
tree90feb8737a8d9d95a52ef964f6b3fa4406e20797
parent2535d71c80b3d79090c9d44ec6d35342e2d258f0 (diff)
drm/nv50: parse/use some more de-magiced parts of gpio table entries
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.c23
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_bios.h2
2 files changed, 11 insertions, 14 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.c b/drivers/gpu/drm/nouveau/nouveau_bios.c
index 84b03e0a3865..70a51fc2323e 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.c
@@ -2595,10 +2595,7 @@ init_gpio(struct nvbios *bios, uint16_t offset, struct init_exec *iexec)
2595 r = nv50_gpio_reg[gpio->line >> 3]; 2595 r = nv50_gpio_reg[gpio->line >> 3];
2596 s = (gpio->line & 0x07) << 2; 2596 s = (gpio->line & 0x07) << 2;
2597 v = bios_rd32(bios, r) & ~(0x00000003 << s); 2597 v = bios_rd32(bios, r) & ~(0x00000003 << s);
2598 if (gpio->entry & 0x01000000) 2598 v |= (gpio->state[gpio->state_default] ^ 2) << s;
2599 v |= (((gpio->entry & 0x60000000) >> 29) ^ 2) << s;
2600 else
2601 v |= (((gpio->entry & 0x18000000) >> 27) ^ 2) << s;
2602 bios_wr32(bios, r, v); 2599 bios_wr32(bios, r, v);
2603 2600
2604 r = nv50_gpio_ctl[gpio->line >> 4]; 2601 r = nv50_gpio_ctl[gpio->line >> 4];
@@ -5078,21 +5075,19 @@ parse_dcb30_gpio_entry(struct nvbios *bios, uint16_t offset)
5078static void 5075static void
5079parse_dcb40_gpio_entry(struct nvbios *bios, uint16_t offset) 5076parse_dcb40_gpio_entry(struct nvbios *bios, uint16_t offset)
5080{ 5077{
5078 uint32_t entry = ROM32(bios->data[offset]);
5081 struct dcb_gpio_entry *gpio; 5079 struct dcb_gpio_entry *gpio;
5082 uint32_t ent = ROM32(bios->data[offset]);
5083 uint8_t line = ent & 0x1f,
5084 tag = ent >> 8 & 0xff;
5085 5080
5086 if (tag == 0xff) 5081 if ((entry & 0x0000ff00) == 0x0000ff00)
5087 return; 5082 return;
5088 5083
5089 gpio = new_gpio_entry(bios); 5084 gpio = new_gpio_entry(bios);
5090 5085 gpio->tag = (entry & 0x0000ff00) >> 8;
5091 /* Currently unused, we may need more fields parsed at some 5086 gpio->line = (entry & 0x0000001f) >> 0;
5092 * point. */ 5087 gpio->state_default = (entry & 0x01000000) >> 24;
5093 gpio->tag = tag; 5088 gpio->state[0] = (entry & 0x18000000) >> 27;
5094 gpio->line = line; 5089 gpio->state[1] = (entry & 0x60000000) >> 29;
5095 gpio->entry = ent; 5090 gpio->entry = entry;
5096} 5091}
5097 5092
5098static void 5093static void
diff --git a/drivers/gpu/drm/nouveau/nouveau_bios.h b/drivers/gpu/drm/nouveau/nouveau_bios.h
index 3706493c014d..c0d7b0a3ece0 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bios.h
+++ b/drivers/gpu/drm/nouveau/nouveau_bios.h
@@ -50,6 +50,8 @@ struct dcb_gpio_entry {
50 int line; 50 int line;
51 bool invert; 51 bool invert;
52 uint32_t entry; 52 uint32_t entry;
53 uint8_t state_default;
54 uint8_t state[2];
53}; 55};
54 56
55struct dcb_gpio_table { 57struct dcb_gpio_table {