1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (c) 2013 Google, Inc
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * (C) Copyright 2012
5*4882a593Smuzhiyun * Pavel Herrmann <morpheus.ibis@gmail.com>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include <common.h>
11*4882a593Smuzhiyun #include <dm-demo.h>
12*4882a593Smuzhiyun #include <mapmem.h>
13*4882a593Smuzhiyun #include <asm/io.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun struct udevice *demo_dev;
16*4882a593Smuzhiyun
do_demo_hello(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])17*4882a593Smuzhiyun static int do_demo_hello(cmd_tbl_t *cmdtp, int flag, int argc,
18*4882a593Smuzhiyun char * const argv[])
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun int ch = 0;
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun if (argc)
23*4882a593Smuzhiyun ch = *argv[0];
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun return demo_hello(demo_dev, ch);
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun
do_demo_status(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])28*4882a593Smuzhiyun static int do_demo_status(cmd_tbl_t *cmdtp, int flag, int argc,
29*4882a593Smuzhiyun char * const argv[])
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun int status;
32*4882a593Smuzhiyun int ret;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun ret = demo_status(demo_dev, &status);
35*4882a593Smuzhiyun if (ret)
36*4882a593Smuzhiyun return ret;
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun printf("Status: %d\n", status);
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun return 0;
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun
do_demo_light(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])43*4882a593Smuzhiyun static int do_demo_light(cmd_tbl_t *cmdtp, int flag, int argc,
44*4882a593Smuzhiyun char * const argv[])
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun int light;
47*4882a593Smuzhiyun int ret;
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun if (argc) {
50*4882a593Smuzhiyun light = simple_strtoul(argv[0], NULL, 16);
51*4882a593Smuzhiyun ret = demo_set_light(demo_dev, light);
52*4882a593Smuzhiyun } else {
53*4882a593Smuzhiyun ret = demo_get_light(demo_dev);
54*4882a593Smuzhiyun if (ret >= 0) {
55*4882a593Smuzhiyun printf("Light: %x\n", ret);
56*4882a593Smuzhiyun ret = 0;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun return ret;
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun
do_demo_list(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])63*4882a593Smuzhiyun int do_demo_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun struct udevice *dev;
66*4882a593Smuzhiyun int i, ret;
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun puts("Demo uclass entries:\n");
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun for (i = 0, ret = uclass_first_device(UCLASS_DEMO, &dev);
71*4882a593Smuzhiyun dev;
72*4882a593Smuzhiyun ret = uclass_next_device(&dev)) {
73*4882a593Smuzhiyun printf("entry %d - instance %08x, ops %08x, platdata %08x\n",
74*4882a593Smuzhiyun i++, map_to_sysmem(dev),
75*4882a593Smuzhiyun map_to_sysmem(dev->driver->ops),
76*4882a593Smuzhiyun map_to_sysmem(dev_get_platdata(dev)));
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun return cmd_process_error(cmdtp, ret);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun static cmd_tbl_t demo_commands[] = {
83*4882a593Smuzhiyun U_BOOT_CMD_MKENT(list, 0, 1, do_demo_list, "", ""),
84*4882a593Smuzhiyun U_BOOT_CMD_MKENT(hello, 2, 1, do_demo_hello, "", ""),
85*4882a593Smuzhiyun U_BOOT_CMD_MKENT(light, 2, 1, do_demo_light, "", ""),
86*4882a593Smuzhiyun U_BOOT_CMD_MKENT(status, 1, 1, do_demo_status, "", ""),
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun
do_demo(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])89*4882a593Smuzhiyun static int do_demo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun cmd_tbl_t *demo_cmd;
92*4882a593Smuzhiyun int devnum = 0;
93*4882a593Smuzhiyun int ret;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun if (argc < 2)
96*4882a593Smuzhiyun return CMD_RET_USAGE;
97*4882a593Smuzhiyun demo_cmd = find_cmd_tbl(argv[1], demo_commands,
98*4882a593Smuzhiyun ARRAY_SIZE(demo_commands));
99*4882a593Smuzhiyun argc -= 2;
100*4882a593Smuzhiyun argv += 2;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun if ((!demo_cmd || argc > demo_cmd->maxargs) ||
103*4882a593Smuzhiyun ((demo_cmd->name[0] != 'l') && (argc < 1)))
104*4882a593Smuzhiyun return CMD_RET_USAGE;
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun if (argc) {
107*4882a593Smuzhiyun devnum = simple_strtoul(argv[0], NULL, 10);
108*4882a593Smuzhiyun ret = uclass_get_device(UCLASS_DEMO, devnum, &demo_dev);
109*4882a593Smuzhiyun if (ret)
110*4882a593Smuzhiyun return cmd_process_error(cmdtp, ret);
111*4882a593Smuzhiyun argc--;
112*4882a593Smuzhiyun argv++;
113*4882a593Smuzhiyun } else {
114*4882a593Smuzhiyun demo_dev = NULL;
115*4882a593Smuzhiyun if (demo_cmd->cmd != do_demo_list)
116*4882a593Smuzhiyun return CMD_RET_USAGE;
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun ret = demo_cmd->cmd(demo_cmd, flag, argc, argv);
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun return cmd_process_error(demo_cmd, ret);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun U_BOOT_CMD(
125*4882a593Smuzhiyun demo, 4, 1, do_demo,
126*4882a593Smuzhiyun "Driver model (dm) demo operations",
127*4882a593Smuzhiyun "list List available demo devices\n"
128*4882a593Smuzhiyun "demo hello <num> [<char>] Say hello\n"
129*4882a593Smuzhiyun "demo light [<num>] Set or get the lights\n"
130*4882a593Smuzhiyun "demo status <num> Get demo device status\n"
131*4882a593Smuzhiyun "demo list List available demo devices"
132*4882a593Smuzhiyun );
133