1*ade283d8Sryan_chen #include <common.h>
2*ade283d8Sryan_chen #include <command.h>
3*ade283d8Sryan_chen #include <aspeed_fsi.h>
4*ade283d8Sryan_chen #include <dm/device.h>
5*ade283d8Sryan_chen #include <dm/uclass.h>
6*ade283d8Sryan_chen
7*ade283d8Sryan_chen struct fsi_master_aspeed *fsi;
8*ade283d8Sryan_chen
do_break(void)9*ade283d8Sryan_chen static void do_break(void)
10*ade283d8Sryan_chen {
11*ade283d8Sryan_chen debug("%s\n", __func__);
12*ade283d8Sryan_chen aspeed_fsi_break(fsi, 0);
13*ade283d8Sryan_chen }
14*ade283d8Sryan_chen
do_status(void)15*ade283d8Sryan_chen static void do_status(void)
16*ade283d8Sryan_chen {
17*ade283d8Sryan_chen debug("%s\n", __func__);
18*ade283d8Sryan_chen aspeed_fsi_status(fsi);
19*ade283d8Sryan_chen }
20*ade283d8Sryan_chen
do_getcfam(int argc,char * const argv[])21*ade283d8Sryan_chen static void do_getcfam(int argc, char *const argv[])
22*ade283d8Sryan_chen {
23*ade283d8Sryan_chen int rc;
24*ade283d8Sryan_chen uint32_t addr, val;
25*ade283d8Sryan_chen
26*ade283d8Sryan_chen if (argc != 3) {
27*ade283d8Sryan_chen printf("invalid arguments to getcfam\n");
28*ade283d8Sryan_chen return;
29*ade283d8Sryan_chen }
30*ade283d8Sryan_chen
31*ade283d8Sryan_chen addr = simple_strtoul(argv[2], NULL, 16);
32*ade283d8Sryan_chen
33*ade283d8Sryan_chen debug("%s %08x\n", __func__, addr);
34*ade283d8Sryan_chen rc = aspeed_fsi_read(fsi, 0, addr, &val, 4);
35*ade283d8Sryan_chen if (rc) {
36*ade283d8Sryan_chen printf("error reading: %d\n", rc);
37*ade283d8Sryan_chen return;
38*ade283d8Sryan_chen }
39*ade283d8Sryan_chen
40*ade283d8Sryan_chen printf("0x%08x\n", be32_to_cpu(val));
41*ade283d8Sryan_chen }
42*ade283d8Sryan_chen
do_putcfam(int argc,char * const argv[])43*ade283d8Sryan_chen static void do_putcfam(int argc, char *const argv[])
44*ade283d8Sryan_chen {
45*ade283d8Sryan_chen int rc;
46*ade283d8Sryan_chen uint32_t addr, val;
47*ade283d8Sryan_chen
48*ade283d8Sryan_chen if (argc != 4) {
49*ade283d8Sryan_chen printf("invalid arguments to putcfam\n");
50*ade283d8Sryan_chen return;
51*ade283d8Sryan_chen }
52*ade283d8Sryan_chen
53*ade283d8Sryan_chen addr = simple_strtoul(argv[2], NULL, 16);
54*ade283d8Sryan_chen val = simple_strtoul(argv[3], NULL, 16);
55*ade283d8Sryan_chen
56*ade283d8Sryan_chen debug("%s %08x %08x\n", __func__, addr, val);
57*ade283d8Sryan_chen rc = aspeed_fsi_write(fsi, 0, addr, &val, 4);
58*ade283d8Sryan_chen if (rc)
59*ade283d8Sryan_chen printf("error writing: %d\n", rc);
60*ade283d8Sryan_chen }
61*ade283d8Sryan_chen
do_divisor(int argc,char * const argv[])62*ade283d8Sryan_chen static void do_divisor(int argc, char *const argv[])
63*ade283d8Sryan_chen {
64*ade283d8Sryan_chen int rc;
65*ade283d8Sryan_chen uint32_t val;
66*ade283d8Sryan_chen
67*ade283d8Sryan_chen if (argc == 2) {
68*ade283d8Sryan_chen rc = aspeed_fsi_divisor(fsi, 0);
69*ade283d8Sryan_chen if (rc > 0)
70*ade283d8Sryan_chen printf("divsior: %d\n", rc);
71*ade283d8Sryan_chen } else if (argc == 3) {
72*ade283d8Sryan_chen val = simple_strtoul(argv[2], NULL, 0);
73*ade283d8Sryan_chen rc = aspeed_fsi_divisor(fsi, val);
74*ade283d8Sryan_chen } else {
75*ade283d8Sryan_chen printf("invalid arguments to divisor\n");
76*ade283d8Sryan_chen return;
77*ade283d8Sryan_chen }
78*ade283d8Sryan_chen
79*ade283d8Sryan_chen if (rc < 0)
80*ade283d8Sryan_chen printf("divisor error: %d\n", rc);
81*ade283d8Sryan_chen }
82*ade283d8Sryan_chen
do_probe(int argc,char * const argv[])83*ade283d8Sryan_chen static struct fsi_master_aspeed *do_probe(int argc, char *const argv[])
84*ade283d8Sryan_chen {
85*ade283d8Sryan_chen struct udevice *dev;
86*ade283d8Sryan_chen const char *devices[] = {"fsi@1e79b000", "fsi@1e79b100"};
87*ade283d8Sryan_chen int rc, id;
88*ade283d8Sryan_chen
89*ade283d8Sryan_chen if (argc > 3) {
90*ade283d8Sryan_chen printf("invalid arguments to probe\n");
91*ade283d8Sryan_chen return NULL;
92*ade283d8Sryan_chen }
93*ade283d8Sryan_chen
94*ade283d8Sryan_chen if (argc == 2)
95*ade283d8Sryan_chen id = 0;
96*ade283d8Sryan_chen else
97*ade283d8Sryan_chen id = simple_strtoul(argv[2], NULL, 10);
98*ade283d8Sryan_chen
99*ade283d8Sryan_chen if (id > 1) {
100*ade283d8Sryan_chen printf("valid devices: 0, 1\n");
101*ade283d8Sryan_chen return NULL;
102*ade283d8Sryan_chen }
103*ade283d8Sryan_chen
104*ade283d8Sryan_chen rc = uclass_get_device_by_name(UCLASS_MISC, devices[id], &dev);
105*ade283d8Sryan_chen if (rc) {
106*ade283d8Sryan_chen printf("fsi device %s not found\n", devices[id]);
107*ade283d8Sryan_chen return NULL;
108*ade283d8Sryan_chen }
109*ade283d8Sryan_chen return dev_get_priv(dev);
110*ade283d8Sryan_chen }
111*ade283d8Sryan_chen
112*ade283d8Sryan_chen
do_fsi(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])113*ade283d8Sryan_chen static int do_fsi(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
114*ade283d8Sryan_chen {
115*ade283d8Sryan_chen
116*ade283d8Sryan_chen if (!strcmp(argv[1], "probe")) {
117*ade283d8Sryan_chen fsi = do_probe(argc, argv);
118*ade283d8Sryan_chen return 0;
119*ade283d8Sryan_chen }
120*ade283d8Sryan_chen
121*ade283d8Sryan_chen if (fsi == NULL) {
122*ade283d8Sryan_chen printf("Run probe first\n");
123*ade283d8Sryan_chen return -EINVAL;
124*ade283d8Sryan_chen }
125*ade283d8Sryan_chen
126*ade283d8Sryan_chen if (!strcmp(argv[1], "break"))
127*ade283d8Sryan_chen do_break();
128*ade283d8Sryan_chen else if (!strcmp(argv[1], "status"))
129*ade283d8Sryan_chen do_status();
130*ade283d8Sryan_chen else if (!strncmp(argv[1], "put", 3))
131*ade283d8Sryan_chen do_putcfam(argc, argv);
132*ade283d8Sryan_chen else if (!strncmp(argv[1], "get", 3))
133*ade283d8Sryan_chen do_getcfam(argc, argv);
134*ade283d8Sryan_chen else if (!strncmp(argv[1], "div", 3))
135*ade283d8Sryan_chen do_divisor(argc, argv);
136*ade283d8Sryan_chen
137*ade283d8Sryan_chen return 0;
138*ade283d8Sryan_chen }
139*ade283d8Sryan_chen
140*ade283d8Sryan_chen static char fsi_help_text[] =
141*ade283d8Sryan_chen "fsi probe [<n>]\n"
142*ade283d8Sryan_chen "fsi break\n"
143*ade283d8Sryan_chen "fsi getcfam <addr>\n"
144*ade283d8Sryan_chen "fsi putcfam <addr> <value>\n"
145*ade283d8Sryan_chen "fsi divisor [<divisor>]\n"
146*ade283d8Sryan_chen "fsi status\n";
147*ade283d8Sryan_chen
148*ade283d8Sryan_chen U_BOOT_CMD(
149*ade283d8Sryan_chen fsi, 4, 1, do_fsi,
150*ade283d8Sryan_chen "IBM FSI commands",
151*ade283d8Sryan_chen fsi_help_text
152*ade283d8Sryan_chen );
153*ade283d8Sryan_chen
154