Commit 2a44e499 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/disp: introduce proper init/fini, separate from create/destroy

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d2edab4a
...@@ -262,7 +262,10 @@ nouveau_display_create(struct drm_device *dev) ...@@ -262,7 +262,10 @@ nouveau_display_create(struct drm_device *dev)
if (ret) if (ret)
return ret; return ret;
return 0; ret = disp->init(dev);
if (ret)
disp->destroy(dev);
return ret;
} }
void void
...@@ -271,6 +274,7 @@ nouveau_display_destroy(struct drm_device *dev) ...@@ -271,6 +274,7 @@ nouveau_display_destroy(struct drm_device *dev)
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nouveau_display_engine *disp = &dev_priv->engine.display; struct nouveau_display_engine *disp = &dev_priv->engine.display;
disp->fini(dev);
disp->destroy(dev); disp->destroy(dev);
drm_mode_config_cleanup(dev); drm_mode_config_cleanup(dev);
} }
......
...@@ -396,8 +396,9 @@ struct nouveau_display_engine { ...@@ -396,8 +396,9 @@ struct nouveau_display_engine {
int (*early_init)(struct drm_device *); int (*early_init)(struct drm_device *);
void (*late_takedown)(struct drm_device *); void (*late_takedown)(struct drm_device *);
int (*create)(struct drm_device *); int (*create)(struct drm_device *);
int (*init)(struct drm_device *);
void (*destroy)(struct drm_device *); void (*destroy)(struct drm_device *);
int (*init)(struct drm_device *);
void (*fini)(struct drm_device *);
struct drm_property *dithering_mode; struct drm_property *dithering_mode;
struct drm_property *dithering_depth; struct drm_property *dithering_depth;
...@@ -1343,13 +1344,15 @@ extern int nv17_tv_create(struct drm_connector *, struct dcb_entry *); ...@@ -1343,13 +1344,15 @@ extern int nv17_tv_create(struct drm_connector *, struct dcb_entry *);
extern int nv04_display_early_init(struct drm_device *); extern int nv04_display_early_init(struct drm_device *);
extern void nv04_display_late_takedown(struct drm_device *); extern void nv04_display_late_takedown(struct drm_device *);
extern int nv04_display_create(struct drm_device *); extern int nv04_display_create(struct drm_device *);
extern int nv04_display_init(struct drm_device *);
extern void nv04_display_destroy(struct drm_device *); extern void nv04_display_destroy(struct drm_device *);
extern int nv04_display_init(struct drm_device *);
extern void nv04_display_fini(struct drm_device *);
/* nvd0_display.c */ /* nvd0_display.c */
extern int nvd0_display_create(struct drm_device *); extern int nvd0_display_create(struct drm_device *);
extern int nvd0_display_init(struct drm_device *);
extern void nvd0_display_destroy(struct drm_device *); extern void nvd0_display_destroy(struct drm_device *);
extern int nvd0_display_init(struct drm_device *);
extern void nvd0_display_fini(struct drm_device *);
/* nv04_crtc.c */ /* nv04_crtc.c */
extern int nv04_crtc_create(struct drm_device *, int index); extern int nv04_crtc_create(struct drm_device *, int index);
......
...@@ -80,8 +80,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -80,8 +80,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv04_display_early_init; engine->display.early_init = nv04_display_early_init;
engine->display.late_takedown = nv04_display_late_takedown; engine->display.late_takedown = nv04_display_late_takedown;
engine->display.create = nv04_display_create; engine->display.create = nv04_display_create;
engine->display.init = nv04_display_init;
engine->display.destroy = nv04_display_destroy; engine->display.destroy = nv04_display_destroy;
engine->display.init = nv04_display_init;
engine->display.fini = nv04_display_fini;
engine->gpio.init = nouveau_stub_init; engine->gpio.init = nouveau_stub_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = NULL; engine->gpio.get = NULL;
...@@ -129,8 +130,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -129,8 +130,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv04_display_early_init; engine->display.early_init = nv04_display_early_init;
engine->display.late_takedown = nv04_display_late_takedown; engine->display.late_takedown = nv04_display_late_takedown;
engine->display.create = nv04_display_create; engine->display.create = nv04_display_create;
engine->display.init = nv04_display_init;
engine->display.destroy = nv04_display_destroy; engine->display.destroy = nv04_display_destroy;
engine->display.init = nv04_display_init;
engine->display.fini = nv04_display_fini;
engine->gpio.init = nouveau_stub_init; engine->gpio.init = nouveau_stub_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = nv10_gpio_get; engine->gpio.get = nv10_gpio_get;
...@@ -178,8 +180,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -178,8 +180,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv04_display_early_init; engine->display.early_init = nv04_display_early_init;
engine->display.late_takedown = nv04_display_late_takedown; engine->display.late_takedown = nv04_display_late_takedown;
engine->display.create = nv04_display_create; engine->display.create = nv04_display_create;
engine->display.init = nv04_display_init;
engine->display.destroy = nv04_display_destroy; engine->display.destroy = nv04_display_destroy;
engine->display.init = nv04_display_init;
engine->display.fini = nv04_display_fini;
engine->gpio.init = nouveau_stub_init; engine->gpio.init = nouveau_stub_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = nv10_gpio_get; engine->gpio.get = nv10_gpio_get;
...@@ -227,8 +230,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -227,8 +230,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv04_display_early_init; engine->display.early_init = nv04_display_early_init;
engine->display.late_takedown = nv04_display_late_takedown; engine->display.late_takedown = nv04_display_late_takedown;
engine->display.create = nv04_display_create; engine->display.create = nv04_display_create;
engine->display.init = nv04_display_init;
engine->display.destroy = nv04_display_destroy; engine->display.destroy = nv04_display_destroy;
engine->display.init = nv04_display_init;
engine->display.fini = nv04_display_fini;
engine->gpio.init = nouveau_stub_init; engine->gpio.init = nouveau_stub_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = nv10_gpio_get; engine->gpio.get = nv10_gpio_get;
...@@ -279,8 +283,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -279,8 +283,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv04_display_early_init; engine->display.early_init = nv04_display_early_init;
engine->display.late_takedown = nv04_display_late_takedown; engine->display.late_takedown = nv04_display_late_takedown;
engine->display.create = nv04_display_create; engine->display.create = nv04_display_create;
engine->display.init = nv04_display_init;
engine->display.destroy = nv04_display_destroy; engine->display.destroy = nv04_display_destroy;
engine->display.init = nv04_display_init;
engine->display.fini = nv04_display_fini;
engine->gpio.init = nouveau_stub_init; engine->gpio.init = nouveau_stub_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = nv10_gpio_get; engine->gpio.get = nv10_gpio_get;
...@@ -336,8 +341,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -336,8 +341,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv50_display_early_init; engine->display.early_init = nv50_display_early_init;
engine->display.late_takedown = nv50_display_late_takedown; engine->display.late_takedown = nv50_display_late_takedown;
engine->display.create = nv50_display_create; engine->display.create = nv50_display_create;
engine->display.init = nv50_display_init;
engine->display.destroy = nv50_display_destroy; engine->display.destroy = nv50_display_destroy;
engine->display.init = nv50_display_init;
engine->display.fini = nv50_display_fini;
engine->gpio.init = nv50_gpio_init; engine->gpio.init = nv50_gpio_init;
engine->gpio.takedown = nv50_gpio_fini; engine->gpio.takedown = nv50_gpio_fini;
engine->gpio.get = nv50_gpio_get; engine->gpio.get = nv50_gpio_get;
...@@ -411,8 +417,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -411,8 +417,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nv50_display_early_init; engine->display.early_init = nv50_display_early_init;
engine->display.late_takedown = nv50_display_late_takedown; engine->display.late_takedown = nv50_display_late_takedown;
engine->display.create = nv50_display_create; engine->display.create = nv50_display_create;
engine->display.init = nv50_display_init;
engine->display.destroy = nv50_display_destroy; engine->display.destroy = nv50_display_destroy;
engine->display.init = nv50_display_init;
engine->display.fini = nv50_display_fini;
engine->gpio.init = nv50_gpio_init; engine->gpio.init = nv50_gpio_init;
engine->gpio.takedown = nouveau_stub_takedown; engine->gpio.takedown = nouveau_stub_takedown;
engine->gpio.get = nv50_gpio_get; engine->gpio.get = nv50_gpio_get;
...@@ -463,8 +470,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev) ...@@ -463,8 +470,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
engine->display.early_init = nouveau_stub_init; engine->display.early_init = nouveau_stub_init;
engine->display.late_takedown = nouveau_stub_takedown; engine->display.late_takedown = nouveau_stub_takedown;
engine->display.create = nvd0_display_create; engine->display.create = nvd0_display_create;
engine->display.init = nvd0_display_init;
engine->display.destroy = nvd0_display_destroy; engine->display.destroy = nvd0_display_destroy;
engine->display.init = nvd0_display_init;
engine->display.fini = nvd0_display_fini;
engine->gpio.init = nv50_gpio_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.get = nvd0_gpio_get;
......
...@@ -243,6 +243,11 @@ nv04_display_init(struct drm_device *dev) ...@@ -243,6 +243,11 @@ nv04_display_init(struct drm_device *dev)
return 0; return 0;
} }
void
nv04_display_fini(struct drm_device *dev)
{
}
static void static void
nv04_vblank_crtc0_isr(struct drm_device *dev) nv04_vblank_crtc0_isr(struct drm_device *dev)
{ {
......
...@@ -264,7 +264,8 @@ nv50_display_init(struct drm_device *dev) ...@@ -264,7 +264,8 @@ nv50_display_init(struct drm_device *dev)
return nv50_display_sync(dev); return nv50_display_sync(dev);
} }
static int nv50_display_disable(struct drm_device *dev) void
nv50_display_fini(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct nv50_display *disp = nv50_display(dev); struct nv50_display *disp = nv50_display(dev);
...@@ -337,16 +338,16 @@ static int nv50_display_disable(struct drm_device *dev) ...@@ -337,16 +338,16 @@ static int nv50_display_disable(struct drm_device *dev)
nv_wr32(dev, 0xe074, 0xffffffff); nv_wr32(dev, 0xe074, 0xffffffff);
nv_wr32(dev, 0xe070, 0x00000000); nv_wr32(dev, 0xe070, 0x00000000);
} }
return 0;
} }
int nv50_display_create(struct drm_device *dev) int
nv50_display_create(struct drm_device *dev)
{ {
struct drm_nouveau_private *dev_priv = dev->dev_private; struct drm_nouveau_private *dev_priv = dev->dev_private;
struct dcb_table *dcb = &dev_priv->vbios.dcb; struct dcb_table *dcb = &dev_priv->vbios.dcb;
struct drm_connector *connector, *ct; struct drm_connector *connector, *ct;
struct nv50_display *priv; struct nv50_display *priv;
int ret, i; int i;
NV_DEBUG_KMS(dev, "\n"); NV_DEBUG_KMS(dev, "\n");
...@@ -399,13 +400,6 @@ int nv50_display_create(struct drm_device *dev) ...@@ -399,13 +400,6 @@ int nv50_display_create(struct drm_device *dev)
tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev); tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev);
nouveau_irq_register(dev, 26, nv50_display_isr); nouveau_irq_register(dev, 26, nv50_display_isr);
ret = nv50_display_init(dev);
if (ret) {
nv50_display_destroy(dev);
return ret;
}
return 0; return 0;
} }
...@@ -416,7 +410,6 @@ nv50_display_destroy(struct drm_device *dev) ...@@ -416,7 +410,6 @@ nv50_display_destroy(struct drm_device *dev)
NV_DEBUG_KMS(dev, "\n"); NV_DEBUG_KMS(dev, "\n");
nv50_display_disable(dev);
nouveau_irq_unregister(dev, 26); nouveau_irq_unregister(dev, 26);
kfree(disp); kfree(disp);
} }
......
...@@ -69,6 +69,7 @@ int nv50_display_early_init(struct drm_device *dev); ...@@ -69,6 +69,7 @@ int nv50_display_early_init(struct drm_device *dev);
void nv50_display_late_takedown(struct drm_device *dev); void nv50_display_late_takedown(struct drm_device *dev);
int nv50_display_create(struct drm_device *dev); int nv50_display_create(struct drm_device *dev);
int nv50_display_init(struct drm_device *dev); int nv50_display_init(struct drm_device *dev);
void nv50_display_fini(struct drm_device *dev);
void nv50_display_destroy(struct drm_device *dev); void nv50_display_destroy(struct drm_device *dev);
int nv50_crtc_blank(struct nouveau_crtc *, bool blank); int nv50_crtc_blank(struct nouveau_crtc *, bool blank);
int nv50_crtc_set_clock(struct drm_device *, int head, int pclk); int nv50_crtc_set_clock(struct drm_device *, int head, int pclk);
......
...@@ -1341,7 +1341,7 @@ nvd0_display_intr(struct drm_device *dev) ...@@ -1341,7 +1341,7 @@ nvd0_display_intr(struct drm_device *dev)
/****************************************************************************** /******************************************************************************
* Init * Init
*****************************************************************************/ *****************************************************************************/
static void void
nvd0_display_fini(struct drm_device *dev) nvd0_display_fini(struct drm_device *dev)
{ {
int i; int i;
...@@ -1461,8 +1461,6 @@ nvd0_display_destroy(struct drm_device *dev) ...@@ -1461,8 +1461,6 @@ nvd0_display_destroy(struct drm_device *dev)
struct nvd0_display *disp = nvd0_display(dev); struct nvd0_display *disp = nvd0_display(dev);
struct pci_dev *pdev = dev->pdev; struct pci_dev *pdev = dev->pdev;
nvd0_display_fini(dev);
pci_free_consistent(pdev, PAGE_SIZE, disp->evo[0].ptr, disp->evo[0].handle); pci_free_consistent(pdev, PAGE_SIZE, disp->evo[0].ptr, disp->evo[0].handle);
nouveau_gpuobj_ref(NULL, &disp->mem); nouveau_gpuobj_ref(NULL, &disp->mem);
nouveau_irq_unregister(dev, 26); nouveau_irq_unregister(dev, 26);
...@@ -1588,10 +1586,6 @@ nvd0_display_create(struct drm_device *dev) ...@@ -1588,10 +1586,6 @@ nvd0_display_create(struct drm_device *dev)
goto out; goto out;
} }
ret = nvd0_display_init(dev);
if (ret)
goto out;
out: out:
if (ret) if (ret)
nvd0_display_destroy(dev); nvd0_display_destroy(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment