baylibre-acme: Set update_interval when modifing samplerate.
Both ina2xx and tmp401 linux drivers used by baylibre-acme expose the standard hwmon update_interval attribute, which affects the internal update interval of the chip. When setting samplerate for data acquisition try to modify this attribute accordingly. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This commit is contained in:
parent
1fe04eb8d6
commit
7c91c22a31
|
@ -250,6 +250,7 @@ static int config_set(uint32_t key, GVariant *data,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
devc->samplerate = samplerate;
|
devc->samplerate = samplerate;
|
||||||
|
bl_acme_maybe_set_update_interval(sdi, samplerate);
|
||||||
break;
|
break;
|
||||||
case SR_CONF_PROBE_FACTOR:
|
case SR_CONF_PROBE_FACTOR:
|
||||||
if (!cg)
|
if (!cg)
|
||||||
|
|
|
@ -295,6 +295,43 @@ static int get_shunt_path(const struct sr_channel_group *cg, GString *path)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try setting the update_interval sysfs attribute for each probe according
|
||||||
|
* to samplerate.
|
||||||
|
*/
|
||||||
|
SR_PRIV void bl_acme_maybe_set_update_interval(const struct sr_dev_inst *sdi,
|
||||||
|
uint64_t samplerate)
|
||||||
|
{
|
||||||
|
struct sr_channel_group *cg;
|
||||||
|
struct channel_group_priv *cgp;
|
||||||
|
GString *hwmon;
|
||||||
|
GSList *l;
|
||||||
|
FILE *fd;
|
||||||
|
|
||||||
|
for (l = sdi->channel_groups; l != NULL; l = l->next) {
|
||||||
|
cg = l->data;
|
||||||
|
cgp = cg->priv;
|
||||||
|
|
||||||
|
hwmon = g_string_sized_new(64);
|
||||||
|
g_string_append_printf(hwmon,
|
||||||
|
"/sys/class/hwmon/hwmon%d/update_interval",
|
||||||
|
cgp->hwmon_num);
|
||||||
|
|
||||||
|
if (g_file_test(hwmon->str, G_FILE_TEST_EXISTS)) {
|
||||||
|
fd = g_fopen(hwmon->str, "w");
|
||||||
|
if (!fd) {
|
||||||
|
g_string_free(hwmon, TRUE);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_fprintf(fd, "%" PRIu64 "\n", 1000 / samplerate);
|
||||||
|
fclose(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_free(hwmon, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
|
SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
|
||||||
uint64_t *shunt)
|
uint64_t *shunt)
|
||||||
{
|
{
|
||||||
|
|
|
@ -84,6 +84,9 @@ SR_PRIV gboolean bl_acme_register_probe(struct sr_dev_inst *sdi, int type,
|
||||||
SR_PRIV int bl_acme_get_probe_type(const struct sr_channel_group *cg);
|
SR_PRIV int bl_acme_get_probe_type(const struct sr_channel_group *cg);
|
||||||
SR_PRIV int bl_acme_probe_has_pws(const struct sr_channel_group *cg);
|
SR_PRIV int bl_acme_probe_has_pws(const struct sr_channel_group *cg);
|
||||||
|
|
||||||
|
SR_PRIV void bl_acme_maybe_set_update_interval(const struct sr_dev_inst *sdi,
|
||||||
|
uint64_t samplerate);
|
||||||
|
|
||||||
SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
|
SR_PRIV int bl_acme_get_shunt(const struct sr_channel_group *cg,
|
||||||
uint64_t *shunt);
|
uint64_t *shunt);
|
||||||
SR_PRIV int bl_acme_set_shunt(const struct sr_channel_group *cg,
|
SR_PRIV int bl_acme_set_shunt(const struct sr_channel_group *cg,
|
||||||
|
|
Loading…
Reference in New Issue