[Nouveau] [PATCH 4/4] iccsense: configure sensors like nvidia does
Martin Peres
martin.peres at free.fr
Mon Mar 28 10:40:39 UTC 2016
On 25/03/16 13:19, Karol Herbst wrote:
> Signed-off-by: Karol Herbst <nouveau at karolherbst.de>
> ---
> drm/nouveau/nvkm/subdev/iccsense/base.c | 68 +++++++++++++++++++++++++++++++++
> 1 file changed, 68 insertions(+)
>
> diff --git a/drm/nouveau/nvkm/subdev/iccsense/base.c b/drm/nouveau/nvkm/subdev/iccsense/base.c
> index b6f6222..6f3709e 100644
> --- a/drm/nouveau/nvkm/subdev/iccsense/base.c
> +++ b/drm/nouveau/nvkm/subdev/iccsense/base.c
> @@ -95,6 +95,63 @@ nvkm_iccsense_ina3221_read(struct nvkm_iccsense *iccsense,
> 40 * 8);
> }
>
> +static void
> +nvkm_iccsense_ina2x9_config(struct nvkm_iccsense *iccsense,
> + struct nvkm_iccsense_sensor *sensor)
Maybe calling the sensor ina209 and using it also for 219 would be less
confusing, especially if a 229 is later released by TI.
> +{
> + struct nvkm_subdev *subdev = &iccsense->subdev;
> + /* configuration:
> + * 0x0007: 0x0007 shunt and bus continous
> + * 0x0078: 0x0078 128 samples shunt
> + * 0x0780: 0x0780 128 samples bus
> + * 0x1800: 0x0000 +-40 mV shunt range
> + * 0x2000: 0x0000 16V FSR
> + */
> + u16 value = 0x07ff;
> + nvkm_debug(subdev, "config for sensor id %i: 0x%x\n", sensor->id, value);
> + nv_wr16i2cr(sensor->i2c, sensor->addr, 0x00, value);
> +}
> +
> +static void
> +nvkm_iccsense_ina3221_config(struct nvkm_iccsense *iccsense,
> + struct nvkm_iccsense_sensor *sensor)
> +{
> + struct nvkm_subdev *subdev = &iccsense->subdev;
> + /* configuration:
> + * 0x0007: 0x0007 shunt and bus continous
> + * 0x0031: 0x0000 140 us conversion time shunt
> + * 0x01c0: 0x0000 140 us conversion time bus
> + * 0x0f00: 0x0f00 1024 samples
> + * 0x7000: 0x?000 channels
> + */
> + u16 value = 0x0e07;
> + if (sensor->rail_mask & 0x1)
> + value |= 0x1 << 14;
> + if (sensor->rail_mask & 0x2)
> + value |= 0x1 << 13;
> + if (sensor->rail_mask & 0x4)
> + value |= 0x1 << 12;
> + nvkm_debug(subdev, "config for sensor id %i: 0x%x\n", sensor->id, value);
> + nv_wr16i2cr(sensor->i2c, sensor->addr, 0x00, value);
> +}
> +
> +static void
> +nvkm_iccsense_sensor_config(struct nvkm_iccsense *iccsense,
> + struct nvkm_iccsense_sensor *sensor)
> +{
> + switch (sensor->type) {
> + case NVBIOS_EXTDEV_INA209:
> + case NVBIOS_EXTDEV_INA219:
> + nvkm_iccsense_ina2x9_config(iccsense, sensor);
> + break;
> + case NVBIOS_EXTDEV_INA3221:
> + nvkm_iccsense_ina3221_config(iccsense, sensor);
> + break;
> + default:
> + break;
> + }
> +}
> +
> int
> nvkm_iccsense_read_all(struct nvkm_iccsense *iccsense)
> {
> @@ -257,8 +314,19 @@ nvkm_iccsense_oneinit(struct nvkm_subdev *subdev)
> return 0;
> }
>
> +static int
> +nvkm_iccsense_init(struct nvkm_subdev *subdev)
> +{
> + struct nvkm_iccsense *iccsense = nvkm_iccsense(subdev);
> + struct nvkm_iccsense_sensor *sensor;
> + list_for_each_entry(sensor, &iccsense->sensors, head)
> + nvkm_iccsense_sensor_config(iccsense, sensor);
> + return 0;
> +}
> +
> struct nvkm_subdev_func iccsense_func = {
> .oneinit = nvkm_iccsense_oneinit,
> + .init = nvkm_iccsense_init,
> .dtor = nvkm_iccsense_dtor,
> };
>
Looks like a good cleanup and improvement to me!
With the free-ing the lists fixed and maybe the change in name for the
ina2x9, this is:
Martin Peres <martin.peres at free.fr>
More information about the Nouveau
mailing list