1051ebe32SNeil Armstrong // SPDX-License-Identifier: GPL-2.0+ 2051ebe32SNeil Armstrong /* 3051ebe32SNeil Armstrong * Copyright (C) 2018 BayLibre, SAS 4051ebe32SNeil Armstrong * Author: Neil Armstrong <narmstrong@baylibre.com> 5051ebe32SNeil Armstrong */ 6051ebe32SNeil Armstrong #include <common.h> 7051ebe32SNeil Armstrong #include <command.h> 8051ebe32SNeil Armstrong #include <dm.h> 9051ebe32SNeil Armstrong #include <adc.h> 10051ebe32SNeil Armstrong 11051ebe32SNeil Armstrong static int do_adc_list(cmd_tbl_t *cmdtp, int flag, int argc, 12051ebe32SNeil Armstrong char *const argv[]) 13051ebe32SNeil Armstrong { 14051ebe32SNeil Armstrong struct udevice *dev; 15051ebe32SNeil Armstrong int ret; 16051ebe32SNeil Armstrong 17051ebe32SNeil Armstrong ret = uclass_first_device_err(UCLASS_ADC, &dev); 18051ebe32SNeil Armstrong if (ret) { 19051ebe32SNeil Armstrong printf("No available ADC device\n"); 20051ebe32SNeil Armstrong return CMD_RET_FAILURE; 21051ebe32SNeil Armstrong } 22051ebe32SNeil Armstrong 23051ebe32SNeil Armstrong do { 24051ebe32SNeil Armstrong printf("- %s\n", dev->name); 25051ebe32SNeil Armstrong 26051ebe32SNeil Armstrong ret = uclass_next_device(&dev); 27051ebe32SNeil Armstrong if (ret) 28051ebe32SNeil Armstrong return CMD_RET_FAILURE; 29051ebe32SNeil Armstrong } while (dev); 30051ebe32SNeil Armstrong 31051ebe32SNeil Armstrong return CMD_RET_SUCCESS; 32051ebe32SNeil Armstrong } 33051ebe32SNeil Armstrong 34051ebe32SNeil Armstrong static int do_adc_info(cmd_tbl_t *cmdtp, int flag, int argc, 35051ebe32SNeil Armstrong char *const argv[]) 36051ebe32SNeil Armstrong { 37051ebe32SNeil Armstrong struct udevice *dev; 381c84d904SFabrice Gasnier unsigned int data_mask, ch_mask; 39051ebe32SNeil Armstrong int ret, vss, vdd; 40051ebe32SNeil Armstrong 41051ebe32SNeil Armstrong if (argc < 2) 42051ebe32SNeil Armstrong return CMD_RET_USAGE; 43051ebe32SNeil Armstrong 44051ebe32SNeil Armstrong ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev); 45051ebe32SNeil Armstrong if (ret) { 46051ebe32SNeil Armstrong printf("Unknown ADC device %s\n", argv[1]); 47051ebe32SNeil Armstrong return CMD_RET_FAILURE; 48051ebe32SNeil Armstrong } 49051ebe32SNeil Armstrong 50051ebe32SNeil Armstrong printf("ADC Device '%s' :\n", argv[1]); 51051ebe32SNeil Armstrong 521c84d904SFabrice Gasnier ret = adc_channel_mask(dev, &ch_mask); 531c84d904SFabrice Gasnier if (!ret) 541c84d904SFabrice Gasnier printf("channel mask: %x\n", ch_mask); 551c84d904SFabrice Gasnier 56051ebe32SNeil Armstrong ret = adc_data_mask(dev, &data_mask); 57051ebe32SNeil Armstrong if (!ret) 58051ebe32SNeil Armstrong printf("data mask: %x\n", data_mask); 59051ebe32SNeil Armstrong 60051ebe32SNeil Armstrong ret = adc_vdd_value(dev, &vdd); 61051ebe32SNeil Armstrong if (!ret) 62051ebe32SNeil Armstrong printf("vdd: %duV\n", vdd); 63051ebe32SNeil Armstrong 64051ebe32SNeil Armstrong ret = adc_vss_value(dev, &vss); 65051ebe32SNeil Armstrong if (!ret) 66051ebe32SNeil Armstrong printf("vss: %duV\n", vss); 67051ebe32SNeil Armstrong 68051ebe32SNeil Armstrong return CMD_RET_SUCCESS; 69051ebe32SNeil Armstrong } 70051ebe32SNeil Armstrong 71051ebe32SNeil Armstrong static int do_adc_single(cmd_tbl_t *cmdtp, int flag, int argc, 72051ebe32SNeil Armstrong char *const argv[]) 73051ebe32SNeil Armstrong { 74*c56fc49aSFabrice Gasnier struct udevice *dev; 75051ebe32SNeil Armstrong unsigned int data; 76*c56fc49aSFabrice Gasnier int ret, uV; 77051ebe32SNeil Armstrong 78051ebe32SNeil Armstrong if (argc < 3) 79051ebe32SNeil Armstrong return CMD_RET_USAGE; 80051ebe32SNeil Armstrong 81051ebe32SNeil Armstrong ret = adc_channel_single_shot(argv[1], simple_strtol(argv[2], NULL, 0), 82051ebe32SNeil Armstrong &data); 83051ebe32SNeil Armstrong if (ret) { 84051ebe32SNeil Armstrong printf("Error getting single shot for device %s channel %s\n", 85051ebe32SNeil Armstrong argv[1], argv[2]); 86051ebe32SNeil Armstrong return CMD_RET_FAILURE; 87051ebe32SNeil Armstrong } 88051ebe32SNeil Armstrong 89*c56fc49aSFabrice Gasnier ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev); 90*c56fc49aSFabrice Gasnier if (!ret && !adc_raw_to_uV(dev, data, &uV)) 91*c56fc49aSFabrice Gasnier printf("%u, %d uV\n", data, uV); 92*c56fc49aSFabrice Gasnier else 93051ebe32SNeil Armstrong printf("%u\n", data); 94051ebe32SNeil Armstrong 95051ebe32SNeil Armstrong return CMD_RET_SUCCESS; 96051ebe32SNeil Armstrong } 97051ebe32SNeil Armstrong 98051ebe32SNeil Armstrong static cmd_tbl_t cmd_adc_sub[] = { 99051ebe32SNeil Armstrong U_BOOT_CMD_MKENT(list, 1, 1, do_adc_list, "", ""), 100051ebe32SNeil Armstrong U_BOOT_CMD_MKENT(info, 2, 1, do_adc_info, "", ""), 101051ebe32SNeil Armstrong U_BOOT_CMD_MKENT(single, 3, 1, do_adc_single, "", ""), 102051ebe32SNeil Armstrong }; 103051ebe32SNeil Armstrong 104051ebe32SNeil Armstrong static int do_adc(cmd_tbl_t *cmdtp, int flag, int argc, 105051ebe32SNeil Armstrong char *const argv[]) 106051ebe32SNeil Armstrong { 107051ebe32SNeil Armstrong cmd_tbl_t *c; 108051ebe32SNeil Armstrong 109051ebe32SNeil Armstrong if (argc < 2) 110051ebe32SNeil Armstrong return CMD_RET_USAGE; 111051ebe32SNeil Armstrong 112051ebe32SNeil Armstrong /* Strip off leading 'adc' command argument */ 113051ebe32SNeil Armstrong argc--; 114051ebe32SNeil Armstrong argv++; 115051ebe32SNeil Armstrong 116051ebe32SNeil Armstrong c = find_cmd_tbl(argv[0], &cmd_adc_sub[0], ARRAY_SIZE(cmd_adc_sub)); 117051ebe32SNeil Armstrong 118051ebe32SNeil Armstrong if (c) 119051ebe32SNeil Armstrong return c->cmd(cmdtp, flag, argc, argv); 120051ebe32SNeil Armstrong else 121051ebe32SNeil Armstrong return CMD_RET_USAGE; 122051ebe32SNeil Armstrong } 123051ebe32SNeil Armstrong 124051ebe32SNeil Armstrong static char adc_help_text[] = 125051ebe32SNeil Armstrong "list - list ADC devices\n" 126051ebe32SNeil Armstrong "adc info <name> - Get ADC device info\n" 127051ebe32SNeil Armstrong "adc single <name> <channel> - Get Single data of ADC device channel"; 128051ebe32SNeil Armstrong 129051ebe32SNeil Armstrong U_BOOT_CMD(adc, 4, 1, do_adc, "ADC sub-system", adc_help_text); 130