1d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/*
2d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
3d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
4d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
5d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
6d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  This program is free software; you can redistribute it and/or modify
7d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  it under the terms of the GNU General Public License as published by
8d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  the Free Software Foundation; either version 2 of the License
9d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
10d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  This program is distributed in the hope that it will be useful,
11d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  GNU General Public License for more details.
14d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
15d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  You should have received a copy of the GNU General Public License
16d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  along with this program; if not, write to the Free Software
17d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely *
19d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely */
20d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
21d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include <linux/string.h>
22d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-debugifc.h"
23d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-hdw.h"
24d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely#include "pvrusb2-debug.h"
25d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
26d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystruct debugifc_mask_item {
27d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	const char *name;
28d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned long msk;
29d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely};
30d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
31d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
32d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic unsigned int debugifc_count_whitespace(const char *buf,
33d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely					      unsigned int count)
34d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
35d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int scnt;
36d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	char ch;
37d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
38d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	for (scnt = 0; scnt < count; scnt++) {
39d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		ch = buf[scnt];
40d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == ' ') continue;
41d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == '\t') continue;
42d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == '\n') continue;
43d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		break;
44d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
45d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return scnt;
46d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
47d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
48d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
49d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic unsigned int debugifc_count_nonwhitespace(const char *buf,
50d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely						 unsigned int count)
51d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
52d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int scnt;
53d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	char ch;
54d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
55d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	for (scnt = 0; scnt < count; scnt++) {
56d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		ch = buf[scnt];
57d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == ' ') break;
58d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == '\t') break;
59d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ch == '\n') break;
60d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
61d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return scnt;
62d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
63d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
64d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
65d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic unsigned int debugifc_isolate_word(const char *buf,unsigned int count,
66d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely					  const char **wstrPtr,
67d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely					  unsigned int *wlenPtr)
68d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
69d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	const char *wptr;
70d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int consume_cnt = 0;
71d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int wlen;
72d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int scnt;
73d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
74a0fd1cb171e8b17339a9a18ae7cf09c50022010fMike Isely	wptr = NULL;
75d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	wlen = 0;
76d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	scnt = debugifc_count_whitespace(buf,count);
77d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	consume_cnt += scnt; count -= scnt; buf += scnt;
78d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (!count) goto done;
79d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
80d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	scnt = debugifc_count_nonwhitespace(buf,count);
81d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (!scnt) goto done;
82d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	wptr = buf;
83d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	wlen = scnt;
84d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	consume_cnt += scnt; count -= scnt; buf += scnt;
85d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
86d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely done:
87d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	*wstrPtr = wptr;
88d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	*wlenPtr = wlen;
89d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return consume_cnt;
90d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
91d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
92d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
93d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic int debugifc_parse_unsigned_number(const char *buf,unsigned int count,
94d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely					  u32 *num_ptr)
95d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
96d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	u32 result = 0;
97d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int radix = 10;
98d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if ((count >= 2) && (buf[0] == '0') &&
99d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	    ((buf[1] == 'x') || (buf[1] == 'X'))) {
100d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		radix = 16;
101d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= 2;
102d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		buf += 2;
103d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	} else if ((count >= 1) && (buf[0] == '0')) {
104d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		radix = 8;
105d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
106d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
107d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	while (count--) {
108e03b9843dc30ba44dedffdfa4180f0723f04e3abAndy Shevchenko		int val = hex_to_bin(*buf++);
109e03b9843dc30ba44dedffdfa4180f0723f04e3abAndy Shevchenko		if (val < 0 || val >= radix)
110d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return -EINVAL;
111d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		result *= radix;
112d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		result += val;
113d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
114d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	*num_ptr = result;
115d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return 0;
116d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
117d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
118d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
119d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselystatic int debugifc_match_keyword(const char *buf,unsigned int count,
120d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely				  const char *keyword)
121d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
122d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int kl;
123d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (!keyword) return 0;
124d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	kl = strlen(keyword);
125d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (kl != count) return 0;
126d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return !memcmp(buf,keyword,kl);
127d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
128d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
129d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
130d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_debugifc_print_info(struct pvr2_hdw *hdw,char *buf,unsigned int acnt)
131d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
132d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int bcnt = 0;
133d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int ccnt;
134aa976ca1dfb2e5b3fb67eeaf1ca44182ef3efcdbMike Isely	ccnt = scnprintf(buf, acnt, "Driver hardware description: %s\n",
135aa976ca1dfb2e5b3fb67eeaf1ca44182ef3efcdbMike Isely			 pvr2_hdw_get_desc(hdw));
136aa976ca1dfb2e5b3fb67eeaf1ca44182ef3efcdbMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
137681c739944018d80dbcf7f19997eba97676c7116Mike Isely	ccnt = scnprintf(buf,acnt,"Driver state info:\n");
138d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
139681c739944018d80dbcf7f19997eba97676c7116Mike Isely	ccnt = pvr2_hdw_state_report(hdw,buf,acnt);
140d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
141d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
142d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return bcnt;
143d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
144d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
145d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
146d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_debugifc_print_status(struct pvr2_hdw *hdw,
147d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			       char *buf,unsigned int acnt)
148d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
149d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int bcnt = 0;
150d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int ccnt;
151d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int ret;
152d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	u32 gpio_dir,gpio_in,gpio_out;
153ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	struct pvr2_stream_stats stats;
154ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	struct pvr2_stream *sp;
155d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
156d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	ret = pvr2_hdw_is_hsm(hdw);
157d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	ccnt = scnprintf(buf,acnt,"USB link speed: %s\n",
158d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			 (ret < 0 ? "FAIL" : (ret ? "high" : "full")));
159d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
160d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
161d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	gpio_dir = 0; gpio_in = 0; gpio_out = 0;
162d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_hdw_gpio_get_dir(hdw,&gpio_dir);
163d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_hdw_gpio_get_out(hdw,&gpio_out);
164d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_hdw_gpio_get_in(hdw,&gpio_in);
165d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	ccnt = scnprintf(buf,acnt,"GPIO state: dir=0x%x in=0x%x out=0x%x\n",
166d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			 gpio_dir,gpio_in,gpio_out);
167d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
168d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
169d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	ccnt = scnprintf(buf,acnt,"Streaming is %s\n",
170d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			 pvr2_hdw_get_streaming(hdw) ? "on" : "off");
171d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	bcnt += ccnt; acnt -= ccnt; buf += ccnt;
172d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
173ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely
174ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	sp = pvr2_hdw_get_video_stream(hdw);
175ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	if (sp) {
176ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely		pvr2_stream_get_stats(sp, &stats, 0);
177ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely		ccnt = scnprintf(
178ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			buf,acnt,
179ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			"Bytes streamed=%u"
180ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			" URBs: queued=%u idle=%u ready=%u"
181ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			" processed=%u failed=%u\n",
182ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.bytes_processed,
183ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.buffers_in_queue,
184ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.buffers_in_idle,
185ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.buffers_in_ready,
186ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.buffers_processed,
187ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			stats.buffers_failed);
188ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely		bcnt += ccnt; acnt -= ccnt; buf += ccnt;
189ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely	}
190ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely
191d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return bcnt;
192d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
193d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
194d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
19507e337eeab3660559cbe1fee6907d1092037aea7Adrian Bunkstatic int pvr2_debugifc_do1cmd(struct pvr2_hdw *hdw,const char *buf,
19607e337eeab3660559cbe1fee6907d1092037aea7Adrian Bunk				unsigned int count)
197d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
198d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	const char *wptr;
199d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int wlen;
200d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int scnt;
201d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
202d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
203d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (!scnt) return 0;
204d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	count -= scnt; buf += scnt;
205d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (!wptr) return 0;
206d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
207d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_trace(PVR2_TRACE_DEBUGIFC,"debugifc cmd: \"%.*s\"",wlen,wptr);
208d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	if (debugifc_match_keyword(wptr,wlen,"reset")) {
209d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
210d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!scnt) return -EINVAL;
211d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= scnt; buf += scnt;
212d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!wptr) return -EINVAL;
213d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (debugifc_match_keyword(wptr,wlen,"cpu")) {
214d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			pvr2_hdw_cpureset_assert(hdw,!0);
215d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			pvr2_hdw_cpureset_assert(hdw,0);
216d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return 0;
217d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"bus")) {
218d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			pvr2_hdw_device_reset(hdw);
219d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"soft")) {
220d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return pvr2_hdw_cmd_powerup(hdw);
221d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"deep")) {
222d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return pvr2_hdw_cmd_deep_reset(hdw);
223d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"firmware")) {
224d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return pvr2_upload_firmware2(hdw);
225d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"decoder")) {
226d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return pvr2_hdw_cmd_decoder_reset(hdw);
227681c739944018d80dbcf7f19997eba97676c7116Mike Isely		} else if (debugifc_match_keyword(wptr,wlen,"worker")) {
228681c739944018d80dbcf7f19997eba97676c7116Mike Isely			return pvr2_hdw_untrip(hdw);
229ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely		} else if (debugifc_match_keyword(wptr,wlen,"usbstats")) {
230ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			pvr2_stream_get_stats(pvr2_hdw_get_video_stream(hdw),
231ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely					      NULL, !0);
232ad0992e97c5416e431e19dcfd4f6c84448dc1bc2Mike Isely			return 0;
233d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
234d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		return -EINVAL;
235d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	} else if (debugifc_match_keyword(wptr,wlen,"cpufw")) {
236d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
237d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!scnt) return -EINVAL;
238d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= scnt; buf += scnt;
239d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!wptr) return -EINVAL;
240d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (debugifc_match_keyword(wptr,wlen,"fetch")) {
2414db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely			scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
2424db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely			if (scnt && wptr) {
2434db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely				count -= scnt; buf += scnt;
244568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely				if (debugifc_match_keyword(wptr, wlen,
245568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely							   "prom")) {
246568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely					pvr2_hdw_cpufw_set_enabled(hdw, 2, !0);
247568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely				} else if (debugifc_match_keyword(wptr, wlen,
248568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely								  "ram8k")) {
249568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely					pvr2_hdw_cpufw_set_enabled(hdw, 0, !0);
250568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely				} else if (debugifc_match_keyword(wptr, wlen,
251568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely								  "ram16k")) {
252568efaa2f704f72eef9b70ac0f895e9b961f15a6Mike Isely					pvr2_hdw_cpufw_set_enabled(hdw, 1, !0);
2534db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely				} else {
2544db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely					return -EINVAL;
2554db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely				}
2564db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely			}
2574db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely			pvr2_hdw_cpufw_set_enabled(hdw,0,!0);
258d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return 0;
259d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (debugifc_match_keyword(wptr,wlen,"done")) {
2604db666cc3d199a8b837174bb0ad00d6b8f6115d6Mike Isely			pvr2_hdw_cpufw_set_enabled(hdw,0,0);
261d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return 0;
262d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else {
263d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return -EINVAL;
264d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
265d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	} else if (debugifc_match_keyword(wptr,wlen,"gpio")) {
266d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		int dir_fl = 0;
267d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		int ret;
268d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		u32 msk,val;
269d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
270d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!scnt) return -EINVAL;
271d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= scnt; buf += scnt;
272d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!wptr) return -EINVAL;
273d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (debugifc_match_keyword(wptr,wlen,"dir")) {
274d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			dir_fl = !0;
275d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else if (!debugifc_match_keyword(wptr,wlen,"out")) {
276d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			return -EINVAL;
277d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
278d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
279d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!scnt) return -EINVAL;
280d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= scnt; buf += scnt;
281d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (!wptr) return -EINVAL;
282d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		ret = debugifc_parse_unsigned_number(wptr,wlen,&msk);
283d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ret) return ret;
284d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		scnt = debugifc_isolate_word(buf,count,&wptr,&wlen);
285d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (wptr) {
286d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			ret = debugifc_parse_unsigned_number(wptr,wlen,&val);
287d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			if (ret) return ret;
288d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else {
289d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			val = msk;
290d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			msk = 0xffffffff;
291d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
292d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (dir_fl) {
293d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			ret = pvr2_hdw_gpio_chg_dir(hdw,msk,val);
294d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		} else {
295d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			ret = pvr2_hdw_gpio_chg_out(hdw,msk,val);
296d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
297d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		return ret;
298d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
299d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	pvr2_trace(PVR2_TRACE_DEBUGIFC,
300d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		   "debugifc failed to recognize cmd: \"%.*s\"",wlen,wptr);
301d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return -EINVAL;
302d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
303d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
304d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
305d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Iselyint pvr2_debugifc_docmd(struct pvr2_hdw *hdw,const char *buf,
306d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			unsigned int count)
307d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely{
308d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	unsigned int bcnt = 0;
309d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	int ret;
310d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
311d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	while (count) {
312d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		for (bcnt = 0; bcnt < count; bcnt++) {
313d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely			if (buf[bcnt] == '\n') break;
314d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		}
315d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
316d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		ret = pvr2_debugifc_do1cmd(hdw,buf,bcnt);
317d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (ret < 0) return ret;
318d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		if (bcnt < count) bcnt++;
319d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		buf += bcnt;
320d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely		count -= bcnt;
321d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	}
322d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
323d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely	return 0;
324d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely}
325d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
326d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely
327d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely/*
328d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  Stuff for Emacs to see, in order to encourage consistent editing style:
329d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** Local Variables: ***
330d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** mode: c ***
331d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** fill-column: 75 ***
332d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** tab-width: 8 ***
333d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** c-basic-offset: 8 ***
334d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  *** End: ***
335d855497edbfbf9e19a17f4a1154bca69cb4bd9baMike Isely  */
336