xref: /openbmc/u-boot/cmd/demo.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass  * Copyright (c) 2013 Google, Inc
42e192b24SSimon Glass  *
52e192b24SSimon Glass  * (C) Copyright 2012
62e192b24SSimon Glass  * Pavel Herrmann <morpheus.ibis@gmail.com>
72e192b24SSimon Glass  */
82e192b24SSimon Glass 
92e192b24SSimon Glass #include <common.h>
102e192b24SSimon Glass #include <dm-demo.h>
112e192b24SSimon Glass #include <mapmem.h>
122e192b24SSimon Glass #include <asm/io.h>
132e192b24SSimon Glass 
142e192b24SSimon Glass struct udevice *demo_dev;
152e192b24SSimon Glass 
do_demo_hello(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])162e192b24SSimon Glass static int do_demo_hello(cmd_tbl_t *cmdtp, int flag, int argc,
172e192b24SSimon Glass 			 char * const argv[])
182e192b24SSimon Glass {
192e192b24SSimon Glass 	int ch = 0;
202e192b24SSimon Glass 
212e192b24SSimon Glass 	if (argc)
222e192b24SSimon Glass 		ch = *argv[0];
232e192b24SSimon Glass 
242e192b24SSimon Glass 	return demo_hello(demo_dev, ch);
252e192b24SSimon Glass }
262e192b24SSimon Glass 
do_demo_status(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])272e192b24SSimon Glass static int do_demo_status(cmd_tbl_t *cmdtp, int flag, int argc,
282e192b24SSimon Glass 			  char * const argv[])
292e192b24SSimon Glass {
302e192b24SSimon Glass 	int status;
312e192b24SSimon Glass 	int ret;
322e192b24SSimon Glass 
332e192b24SSimon Glass 	ret = demo_status(demo_dev, &status);
342e192b24SSimon Glass 	if (ret)
352e192b24SSimon Glass 		return ret;
362e192b24SSimon Glass 
372e192b24SSimon Glass 	printf("Status: %d\n", status);
382e192b24SSimon Glass 
392e192b24SSimon Glass 	return 0;
402e192b24SSimon Glass }
412e192b24SSimon Glass 
do_demo_light(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])422e192b24SSimon Glass static int do_demo_light(cmd_tbl_t *cmdtp, int flag, int argc,
432e192b24SSimon Glass 			 char * const argv[])
442e192b24SSimon Glass {
452e192b24SSimon Glass 	int light;
462e192b24SSimon Glass 	int ret;
472e192b24SSimon Glass 
482e192b24SSimon Glass 	if (argc) {
492e192b24SSimon Glass 		light = simple_strtoul(argv[0], NULL, 16);
502e192b24SSimon Glass 		ret = demo_set_light(demo_dev, light);
512e192b24SSimon Glass 	} else {
522e192b24SSimon Glass 		ret = demo_get_light(demo_dev);
532e192b24SSimon Glass 		if (ret >= 0) {
542e192b24SSimon Glass 			printf("Light: %x\n", ret);
552e192b24SSimon Glass 			ret = 0;
562e192b24SSimon Glass 		}
572e192b24SSimon Glass 	}
582e192b24SSimon Glass 
592e192b24SSimon Glass 	return ret;
602e192b24SSimon Glass }
612e192b24SSimon Glass 
do_demo_list(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])622e192b24SSimon Glass int do_demo_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
632e192b24SSimon Glass {
642e192b24SSimon Glass 	struct udevice *dev;
652e192b24SSimon Glass 	int i, ret;
662e192b24SSimon Glass 
672e192b24SSimon Glass 	puts("Demo uclass entries:\n");
682e192b24SSimon Glass 
692e192b24SSimon Glass 	for (i = 0, ret = uclass_first_device(UCLASS_DEMO, &dev);
702e192b24SSimon Glass 	     dev;
712e192b24SSimon Glass 	     ret = uclass_next_device(&dev)) {
722e192b24SSimon Glass 		printf("entry %d - instance %08x, ops %08x, platdata %08x\n",
73c6b89f31SMario Six 		       i++, (uint)map_to_sysmem(dev),
74c6b89f31SMario Six 		       (uint)map_to_sysmem(dev->driver->ops),
75c6b89f31SMario Six 		       (uint)map_to_sysmem(dev_get_platdata(dev)));
762e192b24SSimon Glass 	}
772e192b24SSimon Glass 
782e192b24SSimon Glass 	return cmd_process_error(cmdtp, ret);
792e192b24SSimon Glass }
802e192b24SSimon Glass 
812e192b24SSimon Glass static cmd_tbl_t demo_commands[] = {
822e192b24SSimon Glass 	U_BOOT_CMD_MKENT(list, 0, 1, do_demo_list, "", ""),
832e192b24SSimon Glass 	U_BOOT_CMD_MKENT(hello, 2, 1, do_demo_hello, "", ""),
842e192b24SSimon Glass 	U_BOOT_CMD_MKENT(light, 2, 1, do_demo_light, "", ""),
852e192b24SSimon Glass 	U_BOOT_CMD_MKENT(status, 1, 1, do_demo_status, "", ""),
862e192b24SSimon Glass };
872e192b24SSimon Glass 
do_demo(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])882e192b24SSimon Glass static int do_demo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
892e192b24SSimon Glass {
902e192b24SSimon Glass 	cmd_tbl_t *demo_cmd;
912e192b24SSimon Glass 	int devnum = 0;
922e192b24SSimon Glass 	int ret;
932e192b24SSimon Glass 
942e192b24SSimon Glass 	if (argc < 2)
952e192b24SSimon Glass 		return CMD_RET_USAGE;
962e192b24SSimon Glass 	demo_cmd = find_cmd_tbl(argv[1], demo_commands,
972e192b24SSimon Glass 				ARRAY_SIZE(demo_commands));
982e192b24SSimon Glass 	argc -= 2;
992e192b24SSimon Glass 	argv += 2;
1002e192b24SSimon Glass 
1012e192b24SSimon Glass 	if ((!demo_cmd || argc > demo_cmd->maxargs) ||
1022e192b24SSimon Glass 	    ((demo_cmd->name[0] != 'l') && (argc < 1)))
1032e192b24SSimon Glass 		return CMD_RET_USAGE;
1042e192b24SSimon Glass 
1052e192b24SSimon Glass 	if (argc) {
1062e192b24SSimon Glass 		devnum = simple_strtoul(argv[0], NULL, 10);
1072e192b24SSimon Glass 		ret = uclass_get_device(UCLASS_DEMO, devnum, &demo_dev);
1082e192b24SSimon Glass 		if (ret)
1092e192b24SSimon Glass 			return cmd_process_error(cmdtp, ret);
1102e192b24SSimon Glass 		argc--;
1112e192b24SSimon Glass 		argv++;
1122e192b24SSimon Glass 	} else {
1132e192b24SSimon Glass 		demo_dev = NULL;
1142e192b24SSimon Glass 		if (demo_cmd->cmd != do_demo_list)
1152e192b24SSimon Glass 			return CMD_RET_USAGE;
1162e192b24SSimon Glass 	}
1172e192b24SSimon Glass 
1182e192b24SSimon Glass 	ret = demo_cmd->cmd(demo_cmd, flag, argc, argv);
1192e192b24SSimon Glass 
1202e192b24SSimon Glass 	return cmd_process_error(demo_cmd, ret);
1212e192b24SSimon Glass }
1222e192b24SSimon Glass 
1232e192b24SSimon Glass U_BOOT_CMD(
1242e192b24SSimon Glass 	demo,   4,      1,      do_demo,
1252e192b24SSimon Glass 	"Driver model (dm) demo operations",
1262e192b24SSimon Glass 	"list                     List available demo devices\n"
1272e192b24SSimon Glass 	"demo hello <num> [<char>]     Say hello\n"
1282e192b24SSimon Glass 	"demo light [<num>]            Set or get the lights\n"
1292e192b24SSimon Glass 	"demo status <num>             Get demo device status\n"
1302e192b24SSimon Glass 	"demo list                     List available demo devices"
1312e192b24SSimon Glass );
132