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