Commit 4158c9c2 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Ben Skeggs
Browse files

drm/nouveau/volt/gk20a: split constructor



Split the constructor function so we can reuse the same logic in other
chips.

Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 0f952093
Loading
Loading
Loading
Loading
+21 −12
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014, NVIDIA CORPORATION. All rights reserved.
 * Copyright (c) 2014-2016, NVIDIA CORPORATION. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -143,30 +143,25 @@ gk20a_volt = {
};

int
gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
_gk20a_volt_ctor(struct nvkm_device *device, int index,
		 const struct cvb_coef *coefs, int nb_coefs,
		 struct gk20a_volt *volt)
{
	struct nvkm_device_tegra *tdev = device->func->tegra(device);
	struct gk20a_volt *volt;
	int i, uv;

	if (!(volt = kzalloc(sizeof(*volt), GFP_KERNEL)))
		return -ENOMEM;

	nvkm_volt_ctor(&gk20a_volt, device, index, &volt->base);
	*pvolt = &volt->base;

	uv = regulator_get_voltage(tdev->vdd);
	nvkm_info(&volt->base.subdev, "The default voltage is %duV\n", uv);
	nvkm_debug(&volt->base.subdev, "the default voltage is %duV\n", uv);

	volt->vdd = tdev->vdd;

	volt->base.vid_nr = ARRAY_SIZE(gk20a_cvb_coef);
	nvkm_debug(&volt->base.subdev, "%s - vid_nr = %d\n", __func__,
		   volt->base.vid_nr);
	volt->base.vid_nr = nb_coefs;
	for (i = 0; i < volt->base.vid_nr; i++) {
		volt->base.vid[i].vid = i;
		volt->base.vid[i].uv =
			gk20a_volt_calc_voltage(&gk20a_cvb_coef[i],
			gk20a_volt_calc_voltage(&coefs[i],
						tdev->gpu_speedo);
		nvkm_debug(&volt->base.subdev, "%2d: vid=%d, uv=%d\n", i,
			   volt->base.vid[i].vid, volt->base.vid[i].uv);
@@ -174,3 +169,17 @@ gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)

	return 0;
}

int
gk20a_volt_new(struct nvkm_device *device, int index, struct nvkm_volt **pvolt)
{
	struct gk20a_volt *volt;

	volt = kzalloc(sizeof(*volt), GFP_KERNEL);
	if (!volt)
		return -ENOMEM;
	*pvolt = &volt->base;

	return _gk20a_volt_ctor(device, index, gk20a_cvb_coef,
				ARRAY_SIZE(gk20a_cvb_coef), volt);
}
+4 −0
Original line number Diff line number Diff line
@@ -37,6 +37,10 @@ struct gk20a_volt {
	struct regulator *vdd;
};

int _gk20a_volt_ctor(struct nvkm_device *device, int index,
		     const struct cvb_coef *coefs, int nb_coefs,
		     struct gk20a_volt *volt);

int gk20a_volt_calc_voltage(const struct cvb_coef *coef, int speedo);
int gk20a_volt_vid_get(struct nvkm_volt *volt);
int gk20a_volt_vid_set(struct nvkm_volt *volt, u8 vid);