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:
Bartosz Golaszewski 2015-04-07 16:55:24 +02:00 committed by Uwe Hermann
parent 1fe04eb8d6
commit 7c91c22a31
3 changed files with 41 additions and 0 deletions

View File

@ -250,6 +250,7 @@ static int config_set(uint32_t key, GVariant *data,
break;
}
devc->samplerate = samplerate;
bl_acme_maybe_set_update_interval(sdi, samplerate);
break;
case SR_CONF_PROBE_FACTOR:
if (!cg)

View File

@ -295,6 +295,43 @@ static int get_shunt_path(const struct sr_channel_group *cg, GString *path)
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,
uint64_t *shunt)
{

View File

@ -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_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,
uint64_t *shunt);
SR_PRIV int bl_acme_set_shunt(const struct sr_channel_group *cg,