Loading drivers/gpu/drm/nouveau/nouveau_bios.c +9 −3 Original line number Original line Diff line number Diff line Loading @@ -5884,9 +5884,15 @@ parse_dcb_gpio_table(struct nvbios *bios) } } e->line = (e->entry & 0x0000001f) >> 0; e->line = (e->entry & 0x0000001f) >> 0; if (gpio[0] == 0x40) { e->state_default = (e->entry & 0x01000000) >> 24; e->state_default = (e->entry & 0x01000000) >> 24; e->state[0] = (e->entry & 0x18000000) >> 27; e->state[0] = (e->entry & 0x18000000) >> 27; e->state[1] = (e->entry & 0x60000000) >> 29; e->state[1] = (e->entry & 0x60000000) >> 29; } else { e->state_default = (e->entry & 0x00000080) >> 7; e->state[0] = (entry[4] >> 4) & 3; e->state[1] = (entry[4] >> 6) & 3; } } } } } Loading drivers/gpu/drm/nouveau/nouveau_drv.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -1391,6 +1391,8 @@ int nv50_gpio_init(struct drm_device *dev); void nv50_gpio_fini(struct drm_device *dev); void nv50_gpio_fini(struct drm_device *dev); int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag, int nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag, void (*)(void *, int), void *); void (*)(void *, int), void *); void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag, void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag, Loading drivers/gpu/drm/nouveau/nouveau_state.c +6 −1 Original line number Original line Diff line number Diff line Loading @@ -459,8 +459,13 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) engine->display.create = nouveau_stub_init; engine->display.create = nouveau_stub_init; engine->display.init = nouveau_stub_init; engine->display.init = nouveau_stub_init; engine->display.destroy = nouveau_stub_takedown; engine->display.destroy = nouveau_stub_takedown; engine->gpio.init = nouveau_stub_init; engine->gpio.init = nv50_gpio_init; engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.get = nvd0_gpio_get; engine->gpio.set = nvd0_gpio_set; engine->gpio.irq_register = nv50_gpio_irq_register; engine->gpio.irq_unregister = nv50_gpio_irq_unregister; engine->gpio.irq_enable = nv50_gpio_irq_enable; engine->vram.init = nvc0_vram_init; engine->vram.init = nvc0_vram_init; engine->vram.takedown = nv50_vram_fini; engine->vram.takedown = nv50_vram_fini; engine->vram.get = nvc0_vram_new; engine->vram.get = nvc0_vram_new; Loading drivers/gpu/drm/nouveau/nv50_gpio.c +31 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,37 @@ nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state) return 0; return 0; } } int nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag) { struct dcb_gpio_entry *gpio; u32 v; gpio = nouveau_bios_gpio_entry(dev, tag); if (!gpio) return -ENOENT; v = nv_rd32(dev, 0x00d610 + (gpio->line * 4)); v &= 0x00004000; return (!!v == (gpio->state[1] & 1)); } int nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state) { struct dcb_gpio_entry *gpio; u32 v; gpio = nouveau_bios_gpio_entry(dev, tag); if (!gpio) return -ENOENT; v = gpio->state[state] ^ 2; nv_mask(dev, 0x00d610 + (gpio->line * 4), 0x00003000, v << 12); return 0; } int int nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag, nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag, void (*handler)(void *, int), void *data) void (*handler)(void *, int), void *data) Loading Loading
drivers/gpu/drm/nouveau/nouveau_bios.c +9 −3 Original line number Original line Diff line number Diff line Loading @@ -5884,9 +5884,15 @@ parse_dcb_gpio_table(struct nvbios *bios) } } e->line = (e->entry & 0x0000001f) >> 0; e->line = (e->entry & 0x0000001f) >> 0; if (gpio[0] == 0x40) { e->state_default = (e->entry & 0x01000000) >> 24; e->state_default = (e->entry & 0x01000000) >> 24; e->state[0] = (e->entry & 0x18000000) >> 27; e->state[0] = (e->entry & 0x18000000) >> 27; e->state[1] = (e->entry & 0x60000000) >> 29; e->state[1] = (e->entry & 0x60000000) >> 29; } else { e->state_default = (e->entry & 0x00000080) >> 7; e->state[0] = (entry[4] >> 4) & 3; e->state[1] = (entry[4] >> 6) & 3; } } } } } Loading
drivers/gpu/drm/nouveau/nouveau_drv.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -1391,6 +1391,8 @@ int nv50_gpio_init(struct drm_device *dev); void nv50_gpio_fini(struct drm_device *dev); void nv50_gpio_fini(struct drm_device *dev); int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nv50_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag); int nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state); int nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag, int nv50_gpio_irq_register(struct drm_device *, enum dcb_gpio_tag, void (*)(void *, int), void *); void (*)(void *, int), void *); void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag, void nv50_gpio_irq_unregister(struct drm_device *, enum dcb_gpio_tag, Loading
drivers/gpu/drm/nouveau/nouveau_state.c +6 −1 Original line number Original line Diff line number Diff line Loading @@ -459,8 +459,13 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) engine->display.create = nouveau_stub_init; engine->display.create = nouveau_stub_init; engine->display.init = nouveau_stub_init; engine->display.init = nouveau_stub_init; engine->display.destroy = nouveau_stub_takedown; engine->display.destroy = nouveau_stub_takedown; engine->gpio.init = nouveau_stub_init; engine->gpio.init = nv50_gpio_init; engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.get = nvd0_gpio_get; engine->gpio.set = nvd0_gpio_set; engine->gpio.irq_register = nv50_gpio_irq_register; engine->gpio.irq_unregister = nv50_gpio_irq_unregister; engine->gpio.irq_enable = nv50_gpio_irq_enable; engine->vram.init = nvc0_vram_init; engine->vram.init = nvc0_vram_init; engine->vram.takedown = nv50_vram_fini; engine->vram.takedown = nv50_vram_fini; engine->vram.get = nvc0_vram_new; engine->vram.get = nvc0_vram_new; Loading
drivers/gpu/drm/nouveau/nv50_gpio.c +31 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,37 @@ nv50_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state) return 0; return 0; } } int nvd0_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag) { struct dcb_gpio_entry *gpio; u32 v; gpio = nouveau_bios_gpio_entry(dev, tag); if (!gpio) return -ENOENT; v = nv_rd32(dev, 0x00d610 + (gpio->line * 4)); v &= 0x00004000; return (!!v == (gpio->state[1] & 1)); } int nvd0_gpio_set(struct drm_device *dev, enum dcb_gpio_tag tag, int state) { struct dcb_gpio_entry *gpio; u32 v; gpio = nouveau_bios_gpio_entry(dev, tag); if (!gpio) return -ENOENT; v = gpio->state[state] ^ 2; nv_mask(dev, 0x00d610 + (gpio->line * 4), 0x00003000, v << 12); return 0; } int int nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag, nv50_gpio_irq_register(struct drm_device *dev, enum dcb_gpio_tag tag, void (*handler)(void *, int), void *data) void (*handler)(void *, int), void *data) Loading