u-boot/cmd/adc.c
Tom Rini d678a59d2d Revert "Merge patch series "arm: dts: am62-beagleplay: Fix Beagleplay Ethernet""
When bringing in the series 'arm: dts: am62-beagleplay: Fix Beagleplay
Ethernet"' I failed to notice that b4 noticed it was based on next and
so took that as the base commit and merged that part of next to master.

This reverts commit c8ffd1356d, reversing
changes made to 2ee6f3a5f7.

Reported-by: Jonas Karlman <jonas@kwiboo.se>
Signed-off-by: Tom Rini <trini@konsulko.com>
2024-05-19 08:16:36 -06:00

166 lines
3.8 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2018 BayLibre, SAS
* Author: Neil Armstrong <narmstrong@baylibre.com>
*/
#include <common.h>
#include <command.h>
#include <dm.h>
#include <adc.h>
#include <linux/printk.h>
static int do_adc_list(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
int ret, err;
ret = err = uclass_first_device_check(UCLASS_ADC, &dev);
while (dev) {
printf("- %s status: %i\n", dev->name, ret);
ret = uclass_next_device_check(&dev);
if (ret)
err = ret;
}
return err ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}
static int do_adc_info(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct udevice *dev;
unsigned int data_mask, ch_mask;
int ret, vss, vdd;
if (argc < 2)
return CMD_RET_USAGE;
ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev);
if (ret) {
printf("Unknown ADC device %s\n", argv[1]);
return CMD_RET_FAILURE;
}
printf("ADC Device '%s' :\n", argv[1]);
ret = adc_channel_mask(dev, &ch_mask);
if (!ret)
printf("channel mask: %x\n", ch_mask);
ret = adc_data_mask(dev, &data_mask);
if (!ret)
printf("data mask: %x\n", data_mask);
ret = adc_vdd_value(dev, &vdd);
if (!ret)
printf("vdd: %duV\n", vdd);
ret = adc_vss_value(dev, &vss);
if (!ret)
printf("vss: %duV\n", vss);
return CMD_RET_SUCCESS;
}
static int do_adc_single(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
char *varname = NULL;
struct udevice *dev;
unsigned int data;
int ret, uV, val;
if (argc < 3)
return CMD_RET_USAGE;
if (argc >= 4)
varname = argv[3];
ret = adc_channel_single_shot(argv[1], simple_strtol(argv[2], NULL, 0),
&data);
if (ret) {
printf("Error getting single shot for device %s channel %s (ret=%d)\n",
argv[1], argv[2], ret);
return CMD_RET_FAILURE;
}
ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev);
if (!ret && !adc_raw_to_uV(dev, data, &uV)) {
val = uV;
printf("%u, %d uV\n", data, uV);
} else {
val = data;
printf("%u\n", data);
}
if (varname)
env_set_ulong(varname, val);
return CMD_RET_SUCCESS;
}
static int do_adc_scan(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
struct adc_channel ch[ADC_MAX_CHANNEL];
struct udevice *dev;
unsigned int ch_mask;
int i, chan, ret, uV;
if (argc < 2)
return CMD_RET_USAGE;
ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev);
if (ret) {
pr_err("Can't get the ADC %s: %d\n", argv[1], ret);
return CMD_RET_FAILURE;
}
switch (argc) {
case 3:
ch_mask = simple_strtoul(argv[2], NULL, 0);
if (ch_mask)
break;
case 2:
ret = adc_channel_mask(dev, &ch_mask);
if (ret) {
pr_err("Can't get mask for %s: %d\n", dev->name, ret);
return CMD_RET_FAILURE;
}
break;
}
ret = adc_channels_single_shot(dev->name, ch_mask, ch);
if (ret) {
pr_err("Can't get single shot for %s (chans mask: 0x%x): %d\n",
dev->name, ch_mask, ret);
return CMD_RET_FAILURE;
}
for (chan = 0, i = 0; chan < ADC_MAX_CHANNEL; chan++) {
if (!(ch_mask & ADC_CHANNEL(chan)))
continue;
if (!adc_raw_to_uV(dev, ch[i].data, &uV))
printf("[%02d]: %u, %d uV\n", ch[i].id, ch[i].data, uV);
else
printf("[%02d]: %u\n", ch[i].id, ch[i].data);
i++;
}
return CMD_RET_SUCCESS;
}
static char adc_help_text[] =
"list - list ADC devices\n"
"adc info <name> - Get ADC device info\n"
"adc single <name> <channel> [varname] - Get Single data of ADC device channel\n"
"adc scan <name> [channel mask] - Scan all [or masked] ADC channels";
U_BOOT_CMD_WITH_SUBCMDS(adc, "ADC sub-system", adc_help_text,
U_BOOT_SUBCMD_MKENT(list, 1, 1, do_adc_list),
U_BOOT_SUBCMD_MKENT(info, 2, 1, do_adc_info),
U_BOOT_SUBCMD_MKENT(single, 4, 1, do_adc_single),
U_BOOT_SUBCMD_MKENT(scan, 3, 1, do_adc_scan));