Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent d2edab4a
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -262,7 +262,10 @@ nouveau_display_create(struct drm_device *dev)
	if (ret)
		return ret;

	return 0;
	ret = disp->init(dev);
	if (ret)
		disp->destroy(dev);
	return ret;
}

void
@@ -271,6 +274,7 @@ nouveau_display_destroy(struct drm_device *dev)
	struct drm_nouveau_private *dev_priv = dev->dev_private;
	struct nouveau_display_engine *disp = &dev_priv->engine.display;

	disp->fini(dev);
	disp->destroy(dev);
	drm_mode_config_cleanup(dev);
}
+6 −3
Original line number Diff line number Diff line
@@ -396,8 +396,9 @@ struct nouveau_display_engine {
	int (*early_init)(struct drm_device *);
	void (*late_takedown)(struct drm_device *);
	int (*create)(struct drm_device *);
	int (*init)(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_depth;
@@ -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 void nv04_display_late_takedown(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 int nv04_display_init(struct drm_device *);
extern void nv04_display_fini(struct drm_device *);

/* nvd0_display.c */
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 int nvd0_display_init(struct drm_device *);
extern void nvd0_display_fini(struct drm_device *);

/* nv04_crtc.c */
extern int nv04_crtc_create(struct drm_device *, int index);
+16 −8
Original line number Diff line number Diff line
@@ -80,8 +80,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv04_display_early_init;
		engine->display.late_takedown	= nv04_display_late_takedown;
		engine->display.create		= nv04_display_create;
		engine->display.init		= nv04_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= NULL;
@@ -129,8 +130,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv04_display_early_init;
		engine->display.late_takedown	= nv04_display_late_takedown;
		engine->display.create		= nv04_display_create;
		engine->display.init		= nv04_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nv10_gpio_get;
@@ -178,8 +180,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv04_display_early_init;
		engine->display.late_takedown	= nv04_display_late_takedown;
		engine->display.create		= nv04_display_create;
		engine->display.init		= nv04_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nv10_gpio_get;
@@ -227,8 +230,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv04_display_early_init;
		engine->display.late_takedown	= nv04_display_late_takedown;
		engine->display.create		= nv04_display_create;
		engine->display.init		= nv04_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nv10_gpio_get;
@@ -279,8 +283,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv04_display_early_init;
		engine->display.late_takedown	= nv04_display_late_takedown;
		engine->display.create		= nv04_display_create;
		engine->display.init		= nv04_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nv10_gpio_get;
@@ -336,8 +341,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv50_display_early_init;
		engine->display.late_takedown	= nv50_display_late_takedown;
		engine->display.create		= nv50_display_create;
		engine->display.init		= nv50_display_init;
		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.takedown		= nv50_gpio_fini;
		engine->gpio.get		= nv50_gpio_get;
@@ -411,8 +417,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nv50_display_early_init;
		engine->display.late_takedown	= nv50_display_late_takedown;
		engine->display.create		= nv50_display_create;
		engine->display.init		= nv50_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nv50_gpio_get;
@@ -463,8 +470,9 @@ static int nouveau_init_engine_ptrs(struct drm_device *dev)
		engine->display.early_init	= nouveau_stub_init;
		engine->display.late_takedown	= nouveau_stub_takedown;
		engine->display.create		= nvd0_display_create;
		engine->display.init		= nvd0_display_init;
		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.takedown		= nouveau_stub_takedown;
		engine->gpio.get		= nvd0_gpio_get;
+5 −0
Original line number Diff line number Diff line
@@ -243,6 +243,11 @@ nv04_display_init(struct drm_device *dev)
	return 0;
}

void
nv04_display_fini(struct drm_device *dev)
{
}

static void
nv04_vblank_crtc0_isr(struct drm_device *dev)
{
+5 −12
Original line number Diff line number Diff line
@@ -264,7 +264,8 @@ nv50_display_init(struct drm_device *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 nv50_display *disp = nv50_display(dev);
@@ -337,16 +338,16 @@ static int nv50_display_disable(struct drm_device *dev)
		nv_wr32(dev, 0xe074, 0xffffffff);
		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 dcb_table *dcb = &dev_priv->vbios.dcb;
	struct drm_connector *connector, *ct;
	struct nv50_display *priv;
	int ret, i;
	int i;

	NV_DEBUG_KMS(dev, "\n");

@@ -399,13 +400,6 @@ int nv50_display_create(struct drm_device *dev)

	tasklet_init(&priv->tasklet, nv50_display_bh, (unsigned long)dev);
	nouveau_irq_register(dev, 26, nv50_display_isr);

	ret = nv50_display_init(dev);
	if (ret) {
		nv50_display_destroy(dev);
		return ret;
	}

	return 0;
}

@@ -416,7 +410,6 @@ nv50_display_destroy(struct drm_device *dev)

	NV_DEBUG_KMS(dev, "\n");

	nv50_display_disable(dev);
	nouveau_irq_unregister(dev, 26);
	kfree(disp);
}
Loading