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