Commit bc3b0c41 authored by Ben Skeggs's avatar Ben Skeggs
Browse files

drm/nouveau/gpio: use base constructor for all implementations



Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f4277a0e
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -13,12 +13,7 @@ struct nouveau_gpio {

	struct nouveau_event *events;

	/* hardware interfaces */
	void (*reset)(struct nouveau_gpio *, u8 func);
	int  (*drive)(struct nouveau_gpio *, int line, int dir, int out);
	int  (*sense)(struct nouveau_gpio *, int line);

	/* software interfaces */
	int  (*find)(struct nouveau_gpio *, int idx, u8 tag, u8 line,
		     struct dcb_gpio_func *);
	int  (*set)(struct nouveau_gpio *, int idx, u8 tag, u8 line, int state);
+5 −2
Original line number Diff line number Diff line
@@ -31,13 +31,15 @@ static int
nouveau_gpio_drive(struct nouveau_gpio *gpio,
		   int idx, int line, int dir, int out)
{
	return gpio->drive ? gpio->drive(gpio, line, dir, out) : -ENODEV;
	const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
	return impl->drive ? impl->drive(gpio, line, dir, out) : -ENODEV;
}

static int
nouveau_gpio_sense(struct nouveau_gpio *gpio, int idx, int line)
{
	return gpio->sense ? gpio->sense(gpio, line) : -ENODEV;
	const struct nouveau_gpio_impl *impl = (void *)nv_object(gpio)->oclass;
	return impl->sense ? impl->sense(gpio, line) : -ENODEV;
}

static int
@@ -201,6 +203,7 @@ nouveau_gpio_create_(struct nouveau_object *parent,
	gpio->find = nouveau_gpio_find;
	gpio->set  = nouveau_gpio_set;
	gpio->get  = nouveau_gpio_get;
	gpio->reset = impl->reset;

	ret = nouveau_event_create(1, impl->lines, &gpio->events);
	if (ret)
+3 −23
Original line number Diff line number Diff line
@@ -26,10 +26,6 @@

#include "priv.h"

struct nv10_gpio_priv {
	struct nouveau_gpio base;
};

static int
nv10_gpio_sense(struct nouveau_gpio *gpio, int line)
{
@@ -103,29 +99,11 @@ nv10_gpio_intr_mask(struct nouveau_gpio *gpio, u32 type, u32 mask, u32 data)
	nv_wr32(gpio, 0x001144, inte);
}

static int
nv10_gpio_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	       struct nouveau_oclass *oclass, void *data, u32 size,
	       struct nouveau_object **pobject)
{
	struct nv10_gpio_priv *priv;
	int ret;

	ret = nouveau_gpio_create(parent, engine, oclass, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;

	priv->base.drive = nv10_gpio_drive;
	priv->base.sense = nv10_gpio_sense;
	return 0;
}

struct nouveau_oclass *
nv10_gpio_oclass = &(struct nouveau_gpio_impl) {
	.base.handle = NV_SUBDEV(GPIO, 0x10),
	.base.ofuncs = &(struct nouveau_ofuncs) {
		.ctor = nv10_gpio_ctor,
		.ctor = _nouveau_gpio_ctor,
		.dtor = _nouveau_gpio_dtor,
		.init = _nouveau_gpio_init,
		.fini = _nouveau_gpio_fini,
@@ -133,4 +111,6 @@ nv10_gpio_oclass = &(struct nouveau_gpio_impl) {
	.lines = 16,
	.intr_stat = nv10_gpio_intr_stat,
	.intr_mask = nv10_gpio_intr_mask,
	.drive = nv10_gpio_drive,
	.sense = nv10_gpio_sense,
}.base;
+8 −29
Original line number Diff line number Diff line
@@ -24,15 +24,10 @@

#include "priv.h"

struct nv50_gpio_priv {
	struct nouveau_gpio base;
};

static void
void
nv50_gpio_reset(struct nouveau_gpio *gpio, u8 match)
{
	struct nouveau_bios *bios = nouveau_bios(gpio);
	struct nv50_gpio_priv *priv = (void *)gpio;
	u8 ver, len;
	u16 entry;
	int ent = -1;
@@ -55,7 +50,7 @@ nv50_gpio_reset(struct nouveau_gpio *gpio, u8 match)

		gpio->set(gpio, 0, func, line, defs);

		nv_mask(priv, reg, 0x00010001 << lsh, val << lsh);
		nv_mask(gpio, reg, 0x00010001 << lsh, val << lsh);
	}
}

@@ -72,7 +67,7 @@ nv50_gpio_location(int line, u32 *reg, u32 *shift)
	return 0;
}

static int
int
nv50_gpio_drive(struct nouveau_gpio *gpio, int line, int dir, int out)
{
	u32 reg, shift;
@@ -84,7 +79,7 @@ nv50_gpio_drive(struct nouveau_gpio *gpio, int line, int dir, int out)
	return 0;
}

static int
int
nv50_gpio_sense(struct nouveau_gpio *gpio, int line)
{
	u32 reg, shift;
@@ -116,30 +111,11 @@ nv50_gpio_intr_mask(struct nouveau_gpio *gpio, u32 type, u32 mask, u32 data)
	nv_wr32(gpio, 0x00e050, inte);
}

int
nv50_gpio_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
	       struct nouveau_oclass *oclass, void *data, u32 size,
	       struct nouveau_object **pobject)
{
	struct nv50_gpio_priv *priv;
	int ret;

	ret = nouveau_gpio_create(parent, engine, oclass, &priv);
	*pobject = nv_object(priv);
	if (ret)
		return ret;

	priv->base.reset = nv50_gpio_reset;
	priv->base.drive = nv50_gpio_drive;
	priv->base.sense = nv50_gpio_sense;
	return 0;
}

struct nouveau_oclass *
nv50_gpio_oclass = &(struct nouveau_gpio_impl) {
	.base.handle = NV_SUBDEV(GPIO, 0x50),
	.base.ofuncs = &(struct nouveau_ofuncs) {
		.ctor = nv50_gpio_ctor,
		.ctor = _nouveau_gpio_ctor,
		.dtor = _nouveau_gpio_dtor,
		.init = _nouveau_gpio_init,
		.fini = _nouveau_gpio_fini,
@@ -147,4 +123,7 @@ nv50_gpio_oclass = &(struct nouveau_gpio_impl) {
	.lines = 16,
	.intr_stat = nv50_gpio_intr_stat,
	.intr_mask = nv50_gpio_intr_mask,
	.drive = nv50_gpio_drive,
	.sense = nv50_gpio_sense,
	.reset = nv50_gpio_reset,
}.base;
+4 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ struct nouveau_oclass *
nv92_gpio_oclass = &(struct nouveau_gpio_impl) {
	.base.handle = NV_SUBDEV(GPIO, 0x92),
	.base.ofuncs = &(struct nouveau_ofuncs) {
		.ctor = nv50_gpio_ctor,
		.ctor = _nouveau_gpio_ctor,
		.dtor = _nouveau_gpio_dtor,
		.init = _nouveau_gpio_init,
		.fini = _nouveau_gpio_fini,
@@ -68,4 +68,7 @@ nv92_gpio_oclass = &(struct nouveau_gpio_impl) {
	.lines = 32,
	.intr_stat = nv92_gpio_intr_stat,
	.intr_mask = nv92_gpio_intr_mask,
	.drive = nv50_gpio_drive,
	.sense = nv50_gpio_sense,
	.reset = nv50_gpio_reset,
}.base;
Loading