xref: /OK3568_Linux_fs/u-boot/cmd/demo.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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