2 * (C) Copyright 2017 Lothar Waßmann <LW@KARO-electronics.de>
4 * SPDX-License-Identifier: GPL-2.0+
8 * Sergey Kubushyn, himself, ksi@koi8.net
11 * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
19 #include <environment.h>
22 #include <asm/byteorder.h>
23 #include <linux/compiler.h>
24 #include <spmi/spmi.h>
26 DECLARE_GLOBAL_DATA_PTR;
33 static int spmi_report_err(int ret, enum spmi_err_op op)
35 printf("Error %s the chip: %d\n",
36 op == SPMI_ERR_READ ? "reading" : "writing", ret);
38 return CMD_RET_FAILURE;
42 * do_spmi_read() - Handle the "spmi read" command-line command
43 * @cmdtp: Command data struct pointer
45 * @argc: Command-line argument count
46 * @argv: Array of command-line arguments
48 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
52 * spmi read {spmi_chip} {devaddr}{.0, .1, .2} {len} {memaddr}
54 static int do_spmi_read(cmd_tbl_t *cmdtp, int flag, int argc,
62 return cmd_usage(cmdtp);
64 ret = uclass_get_device_by_name(UCLASS_SPMI, "spmi", &dev);
66 printf("Failed to get SPMI bus: %d\n", ret);
67 return CMD_RET_FAILURE;
73 sid = simple_strtoul(argv[1], NULL, 16);
76 * SPMI data address within the chip. This can be 1 or
77 * 2 bytes long. Some day it might be 3 bytes long :-).
79 pid = simple_strtoul(argv[2], NULL, 16);
80 reg = simple_strtoul(argv[3], NULL, 16);
82 ret = spmi_reg_read(dev, sid, pid, reg);
84 return spmi_report_err(ret, SPMI_ERR_READ);
86 printf("%02x\n", ret);
87 return CMD_RET_SUCCESS;
90 static int do_spmi_write(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
98 return cmd_usage(cmdtp);
100 ret = uclass_get_device_by_name(UCLASS_SPMI, "spmi", &dev);
102 printf("Failed to get SPMI bus: %d\n", ret);
103 return CMD_RET_FAILURE;
109 sid = simple_strtoul(argv[1], NULL, 16);
110 pid = simple_strtoul(argv[2], NULL, 16);
111 reg = simple_strtoul(argv[3], NULL, 16);
112 val = simple_strtoul(argv[4], NULL, 16);
114 printf("Value %08x out of range [0..255]\n", val);
115 return CMD_RET_FAILURE;
118 ret = spmi_reg_write(dev, sid, pid, reg, val);
120 return spmi_report_err(ret, SPMI_ERR_WRITE);
122 return CMD_RET_SUCCESS;
125 static cmd_tbl_t cmd_spmi_sub[] = {
126 U_BOOT_CMD_MKENT(read, 4, 1, do_spmi_read, "", ""),
127 U_BOOT_CMD_MKENT(write, 5, 0, do_spmi_write, "", ""),
130 static __maybe_unused void spmi_reloc(void)
132 static int relocated;
135 fixup_cmdtable(cmd_spmi_sub, ARRAY_SIZE(cmd_spmi_sub));
141 * do_spmi() - Handle the "spmi" command-line command
142 * @cmdtp: Command data struct pointer
143 * @flag: Command flag
144 * @argc: Command-line argument count
145 * @argv: Array of command-line arguments
147 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
150 static int do_spmi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
154 #ifdef CONFIG_NEEDS_MANUAL_RELOC
159 return CMD_RET_USAGE;
161 /* Strip off leading 'spmi' command argument */
165 c = find_cmd_tbl(argv[0], cmd_spmi_sub, ARRAY_SIZE(cmd_spmi_sub));
168 return c->cmd(cmdtp, flag, argc, argv);
170 printf("subcommand '%s' not found\n", argv[0]);
171 return CMD_RET_USAGE;
174 #ifdef CONFIG_SYS_LONGHELP
175 static char spmi_help_text[] =
176 "\tspmi read <sid> <pid> <reg> - read register <reg> of peripheral <pid> on slave <sid>\n"
177 "\tspmi write <sid> <pid> <reg> <val> - write <val> to register <reg> of peripheral <pid> on slave <sid>\n"