Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 138267
b: refs/heads/master
c: a932f50
h: refs/heads/master
i:
  138265: c033d3f
  138263: c9176cc
v: v3
  • Loading branch information
Mike Isely authored and Mauro Carvalho Chehab committed Mar 30, 2009
1 parent 96e5c15 commit c0b7736
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e9c64a78dbd7c4f6c4a31c4040f340f732bf4ec5
refs/heads/master: a932f507463d996b6ec1647ee7d4e2fa1e6aeda6
6 changes: 6 additions & 0 deletions trunk/drivers/media/video/pvrusb2/pvrusb2-hdw.c
Original file line number Diff line number Diff line change
Expand Up @@ -2020,6 +2020,12 @@ static void pvr2_hdw_load_subdev(struct pvr2_hdw *hdw,
i2caddr);
}

/* If we have both old and new i2c layers enabled, make sure that
old layer isn't also tracking this module. This is a debugging
aid, in normal situations there's no reason for both mechanisms
to be enabled. */
pvr2_i2c_untrack_subdev(hdw, sd);

// ?????
/* Based on module ID, we should remember subdev pointers
so that we can send certain custom commands where
Expand Down
76 changes: 53 additions & 23 deletions trunk/drivers/media/video/pvrusb2/pvrusb2-i2c-track.c
Original file line number Diff line number Diff line change
Expand Up @@ -421,41 +421,71 @@ void pvr2_i2c_track_attach_inform(struct i2c_client *client)
if (fl) queue_work(hdw->workqueue,&hdw->worki2csync);
}

static void pvr2_i2c_client_disconnect(struct pvr2_i2c_client *cp)
{
if (cp->handler && cp->handler->func_table->detach) {
cp->handler->func_table->detach(cp->handler->func_data);
}
list_del(&cp->list);
kfree(cp);
}

void pvr2_i2c_track_detach_inform(struct i2c_client *client)
{
struct pvr2_hdw *hdw = (struct pvr2_hdw *)(client->adapter->algo_data);
struct pvr2_i2c_client *cp, *ncp;
unsigned long amask = 0;
int foundfl = 0;
mutex_lock(&hdw->i2c_list_lock); do {
hdw->cropcap_stale = !0;
list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) {
if (cp->client == client) {
trace_i2c("pvr2_i2c_detach"
" [client=%s @ 0x%x ctxt=%p]",
client->name,
client->addr,cp);
if (cp->handler &&
cp->handler->func_table->detach) {
cp->handler->func_table->detach(
cp->handler->func_data);
}
list_del(&cp->list);
kfree(cp);
foundfl = !0;
continue;
}
amask |= cp->ctl_mask;
mutex_lock(&hdw->i2c_list_lock);
hdw->cropcap_stale = !0;
list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) {
if (cp->client == client) {
trace_i2c("pvr2_i2c_detach"
" [client=%s @ 0x%x ctxt=%p]",
client->name,
client->addr, cp);
pvr2_i2c_client_disconnect(cp);
foundfl = !0;
continue;
}
hdw->i2c_active_mask = amask;
} while (0); mutex_unlock(&hdw->i2c_list_lock);
amask |= cp->ctl_mask;
}
hdw->i2c_active_mask = amask;
mutex_unlock(&hdw->i2c_list_lock);
if (!foundfl) {
trace_i2c("pvr2_i2c_detach [client=%s @ 0x%x ctxt=<unknown>]",
client->name,
client->addr);
client->name, client->addr);
}
}

/* This function is used to remove an i2c client from our tracking
structure if the client happens to be the specified v4l2 sub-device.
The idea here is to ensure that sub-devices are not also tracked with
the old tracking mechanism - it's one or the other not both. This is
only for debugging. In a "real" environment, only one of these two
mechanisms should even be compiled in. But by enabling both we can
incrementally test control of each sub-device. */
void pvr2_i2c_untrack_subdev(struct pvr2_hdw *hdw, struct v4l2_subdev *sd)
{
struct i2c_client *client;
struct pvr2_i2c_client *cp, *ncp;
unsigned long amask = 0;
mutex_lock(&hdw->i2c_list_lock);
list_for_each_entry_safe(cp, ncp, &hdw->i2c_clients, list) {
client = cp->client;
if (i2c_get_clientdata(client) == sd) {
trace_i2c("pvr2_i2c_detach (subdev active)"
" [client=%s @ 0x%x ctxt=%p]",
client->name, client->addr, cp);
pvr2_i2c_client_disconnect(cp);
continue;
}
amask |= cp->ctl_mask;
}
hdw->i2c_active_mask = amask;
mutex_unlock(&hdw->i2c_list_lock);
}

void pvr2_i2c_track_init(struct pvr2_hdw *hdw)
{
hdw->i2c_pend_mask = 0;
Expand Down
5 changes: 5 additions & 0 deletions trunk/drivers/media/video/pvrusb2/pvrusb2-i2c-track.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

#include <linux/list.h>
#include <linux/i2c.h>
#include <media/v4l2-device.h>


struct pvr2_hdw;
struct pvr2_i2c_client;
Expand Down Expand Up @@ -83,6 +85,9 @@ unsigned int pvr2_i2c_report(struct pvr2_hdw *,char *buf,unsigned int maxlen);
void pvr2_i2c_probe(struct pvr2_hdw *,struct pvr2_i2c_client *);
const struct pvr2_i2c_op *pvr2_i2c_get_op(unsigned int idx);

void pvr2_i2c_untrack_subdev(struct pvr2_hdw *, struct v4l2_subdev *sd);


#endif /* __PVRUSB2_I2C_CORE_H */


Expand Down

0 comments on commit c0b7736

Please sign in to comment.