1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2018 BayLibre, SAS 4 * Author: Neil Armstrong <narmstrong@baylibre.com> 5 */ 6 #include <common.h> 7 #include <command.h> 8 #include <dm.h> 9 #include <adc.h> 10 11 static int do_adc_list(cmd_tbl_t *cmdtp, int flag, int argc, 12 char *const argv[]) 13 { 14 struct udevice *dev; 15 int ret; 16 17 ret = uclass_first_device_err(UCLASS_ADC, &dev); 18 if (ret) { 19 printf("No available ADC device\n"); 20 return CMD_RET_FAILURE; 21 } 22 23 do { 24 printf("- %s\n", dev->name); 25 26 ret = uclass_next_device(&dev); 27 if (ret) 28 return CMD_RET_FAILURE; 29 } while (dev); 30 31 return CMD_RET_SUCCESS; 32 } 33 34 static int do_adc_info(cmd_tbl_t *cmdtp, int flag, int argc, 35 char *const argv[]) 36 { 37 struct udevice *dev; 38 unsigned int data_mask; 39 int ret, vss, vdd; 40 41 if (argc < 2) 42 return CMD_RET_USAGE; 43 44 ret = uclass_get_device_by_name(UCLASS_ADC, argv[1], &dev); 45 if (ret) { 46 printf("Unknown ADC device %s\n", argv[1]); 47 return CMD_RET_FAILURE; 48 } 49 50 printf("ADC Device '%s' :\n", argv[1]); 51 52 ret = adc_data_mask(dev, &data_mask); 53 if (!ret) 54 printf("data mask: %x\n", data_mask); 55 56 ret = adc_vdd_value(dev, &vdd); 57 if (!ret) 58 printf("vdd: %duV\n", vdd); 59 60 ret = adc_vss_value(dev, &vss); 61 if (!ret) 62 printf("vss: %duV\n", vss); 63 64 return CMD_RET_SUCCESS; 65 } 66 67 static int do_adc_single(cmd_tbl_t *cmdtp, int flag, int argc, 68 char *const argv[]) 69 { 70 unsigned int data; 71 int ret; 72 73 if (argc < 3) 74 return CMD_RET_USAGE; 75 76 ret = adc_channel_single_shot(argv[1], simple_strtol(argv[2], NULL, 0), 77 &data); 78 if (ret) { 79 printf("Error getting single shot for device %s channel %s\n", 80 argv[1], argv[2]); 81 return CMD_RET_FAILURE; 82 } 83 84 printf("%u\n", data); 85 86 return CMD_RET_SUCCESS; 87 } 88 89 static cmd_tbl_t cmd_adc_sub[] = { 90 U_BOOT_CMD_MKENT(list, 1, 1, do_adc_list, "", ""), 91 U_BOOT_CMD_MKENT(info, 2, 1, do_adc_info, "", ""), 92 U_BOOT_CMD_MKENT(single, 3, 1, do_adc_single, "", ""), 93 }; 94 95 static int do_adc(cmd_tbl_t *cmdtp, int flag, int argc, 96 char *const argv[]) 97 { 98 cmd_tbl_t *c; 99 100 if (argc < 2) 101 return CMD_RET_USAGE; 102 103 /* Strip off leading 'adc' command argument */ 104 argc--; 105 argv++; 106 107 c = find_cmd_tbl(argv[0], &cmd_adc_sub[0], ARRAY_SIZE(cmd_adc_sub)); 108 109 if (c) 110 return c->cmd(cmdtp, flag, argc, argv); 111 else 112 return CMD_RET_USAGE; 113 } 114 115 static char adc_help_text[] = 116 "list - list ADC devices\n" 117 "adc info <name> - Get ADC device info\n" 118 "adc single <name> <channel> - Get Single data of ADC device channel"; 119 120 U_BOOT_CMD(adc, 4, 1, do_adc, "ADC sub-system", adc_help_text); 121