Commit 2eb563b7 authored by Mike Isely's avatar Mike Isely Committed by Mauro Carvalho Chehab

V4L/DVB (11203): pvrusb2: Implement better reporting on attached sub-devices

Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent fd28aeaf
...@@ -4876,17 +4876,57 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which, ...@@ -4876,17 +4876,57 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
stats.buffers_processed, stats.buffers_processed,
stats.buffers_failed); stats.buffers_failed);
} }
case 6: { default: break;
}
return 0;
}
/* Generate report containing info about attached sub-devices and attached
i2c clients, including an indication of which attached i2c clients are
actually sub-devices. */
static unsigned int pvr2_hdw_report_clients(struct pvr2_hdw *hdw,
char *buf, unsigned int acnt)
{
struct v4l2_subdev *sd; struct v4l2_subdev *sd;
unsigned int tcnt = 0; unsigned int tcnt = 0;
unsigned int ccnt; unsigned int ccnt;
struct i2c_client *client;
struct list_head *item;
void *cd;
const char *p; const char *p;
unsigned int id; unsigned int id;
ccnt = scnprintf(buf,
acnt, ccnt = scnprintf(buf, acnt, "Associated v4l2-subdev drivers:");
"Associated v4l2_subdev drivers:");
tcnt += ccnt; tcnt += ccnt;
v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) { v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
id = sd->grp_id;
p = NULL;
if (id < ARRAY_SIZE(module_names)) p = module_names[id];
if (p) {
ccnt = scnprintf(buf + tcnt, acnt - tcnt, " %s", p);
tcnt += ccnt;
} else {
ccnt = scnprintf(buf + tcnt, acnt - tcnt,
" (unknown id=%u)", id);
tcnt += ccnt;
}
}
ccnt = scnprintf(buf + tcnt, acnt - tcnt, "\n");
tcnt += ccnt;
ccnt = scnprintf(buf + tcnt, acnt - tcnt, "I2C clients:\n");
tcnt += ccnt;
mutex_lock(&hdw->i2c_adap.clist_lock);
list_for_each(item, &hdw->i2c_adap.clients) {
client = list_entry(item, struct i2c_client, list);
ccnt = scnprintf(buf + tcnt, acnt - tcnt,
" %s: i2c=%02x", client->name, client->addr);
tcnt += ccnt;
cd = i2c_get_clientdata(client);
v4l2_device_for_each_subdev(sd, &hdw->v4l2_dev) {
if (cd == sd) {
id = sd->grp_id; id = sd->grp_id;
p = NULL; p = NULL;
if (id < ARRAY_SIZE(module_names)) { if (id < ARRAY_SIZE(module_names)) {
...@@ -4895,19 +4935,23 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which, ...@@ -4895,19 +4935,23 @@ static unsigned int pvr2_hdw_report_unlocked(struct pvr2_hdw *hdw,int which,
if (p) { if (p) {
ccnt = scnprintf(buf + tcnt, ccnt = scnprintf(buf + tcnt,
acnt - tcnt, acnt - tcnt,
" %s", p); " subdev=%s", p);
tcnt += ccnt;
} else { } else {
ccnt = scnprintf(buf + tcnt, ccnt = scnprintf(buf + tcnt,
acnt - tcnt, acnt - tcnt,
" (unknown id=%u)", id); " subdev= id %u)",
} id);
tcnt += ccnt; tcnt += ccnt;
} }
return tcnt; break;
} }
default: break;
} }
return 0; ccnt = scnprintf(buf + tcnt, acnt - tcnt, "\n");
tcnt += ccnt;
}
mutex_unlock(&hdw->i2c_adap.clist_lock);
return tcnt;
} }
...@@ -4925,6 +4969,8 @@ unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw, ...@@ -4925,6 +4969,8 @@ unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
buf[0] = '\n'; ccnt = 1; buf[0] = '\n'; ccnt = 1;
bcnt += ccnt; acnt -= ccnt; buf += ccnt; bcnt += ccnt; acnt -= ccnt; buf += ccnt;
} }
ccnt = pvr2_hdw_report_clients(hdw, buf, acnt);
bcnt += ccnt; acnt -= ccnt; buf += ccnt;
LOCK_GIVE(hdw->big_lock); LOCK_GIVE(hdw->big_lock);
return bcnt; return bcnt;
} }
...@@ -4932,14 +4978,25 @@ unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw, ...@@ -4932,14 +4978,25 @@ unsigned int pvr2_hdw_state_report(struct pvr2_hdw *hdw,
static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw) static void pvr2_hdw_state_log_state(struct pvr2_hdw *hdw)
{ {
char buf[128]; char buf[256];
unsigned int idx,ccnt; unsigned int idx, ccnt;
unsigned int lcnt, ucnt;
for (idx = 0; ; idx++) { for (idx = 0; ; idx++) {
ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf)); ccnt = pvr2_hdw_report_unlocked(hdw,idx,buf,sizeof(buf));
if (!ccnt) break; if (!ccnt) break;
printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf); printk(KERN_INFO "%s %.*s\n",hdw->name,ccnt,buf);
} }
ccnt = pvr2_hdw_report_clients(hdw, buf, sizeof(buf));
ucnt = 0;
while (ucnt < ccnt) {
lcnt = 0;
while ((lcnt + ucnt < ccnt) && (buf[lcnt + ucnt] != '\n')) {
lcnt++;
}
printk(KERN_INFO "%s %.*s\n", hdw->name, lcnt, buf + ucnt);
ucnt += lcnt + 1;
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment