diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2007-02-23 18:55:14 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-03-01 10:09:44 -0500 |
commit | f3d092b84a855c44914fea0648695bef7d751266 (patch) | |
tree | 3ae7a87e18e83be2a39e00a2ae29f26299d1c272 /drivers/media/video/pvrusb2 | |
parent | d55c7aec666658495e5b57a6b194c8c2a1ac255f (diff) |
V4L/DVB (5304): Improve chip matching in v4l2_register
The chip matching in struct v4l2_register for VIDIOC_DBG_G/S_REGISTER
was rather primitive. It could not be extended to other busses besides
i2c and it lacked a way to.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/pvrusb2')
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.c | 11 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-hdw.h | 7 | ||||
-rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-v4l2.c | 4 |
3 files changed, 13 insertions, 9 deletions
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index a1ca0f5007e0..1cd4bb3ae260 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -3256,8 +3256,8 @@ static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw) | |||
3256 | 3256 | ||
3257 | 3257 | ||
3258 | int pvr2_hdw_register_access(struct pvr2_hdw *hdw, | 3258 | int pvr2_hdw_register_access(struct pvr2_hdw *hdw, |
3259 | u32 chip_id, u64 reg_id, | 3259 | u32 match_type, u32 match_chip, u64 reg_id, |
3260 | int setFl,u32 *val_ptr) | 3260 | int setFl,u64 *val_ptr) |
3261 | { | 3261 | { |
3262 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 3262 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
3263 | struct list_head *item; | 3263 | struct list_head *item; |
@@ -3268,13 +3268,16 @@ int pvr2_hdw_register_access(struct pvr2_hdw *hdw, | |||
3268 | 3268 | ||
3269 | if (!capable(CAP_SYS_ADMIN)) return -EPERM; | 3269 | if (!capable(CAP_SYS_ADMIN)) return -EPERM; |
3270 | 3270 | ||
3271 | req.i2c_id = chip_id; | 3271 | req.match_type = match_type; |
3272 | req.match_chip = match_chip; | ||
3272 | req.reg = reg_id; | 3273 | req.reg = reg_id; |
3273 | if (setFl) req.val = *val_ptr; | 3274 | if (setFl) req.val = *val_ptr; |
3274 | mutex_lock(&hdw->i2c_list_lock); do { | 3275 | mutex_lock(&hdw->i2c_list_lock); do { |
3275 | list_for_each(item,&hdw->i2c_clients) { | 3276 | list_for_each(item,&hdw->i2c_clients) { |
3276 | cp = list_entry(item,struct pvr2_i2c_client,list); | 3277 | cp = list_entry(item,struct pvr2_i2c_client,list); |
3277 | if (cp->client->driver->id != chip_id) continue; | 3278 | if (!v4l2_chip_match_i2c_client(cp->client, req.match_type, req.match_chip)) { |
3279 | continue; | ||
3280 | } | ||
3278 | stat = pvr2_i2c_client_cmd( | 3281 | stat = pvr2_i2c_client_cmd( |
3279 | cp,(setFl ? VIDIOC_DBG_S_REGISTER : | 3282 | cp,(setFl ? VIDIOC_DBG_S_REGISTER : |
3280 | VIDIOC_DBG_G_REGISTER),&req); | 3283 | VIDIOC_DBG_G_REGISTER),&req); |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.h b/drivers/media/video/pvrusb2/pvrusb2-hdw.h index 566a8ef7e121..0c9cca43ff85 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.h +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.h | |||
@@ -217,13 +217,14 @@ void pvr2_hdw_v4l_store_minor_number(struct pvr2_hdw *, | |||
217 | enum pvr2_v4l_type index,int); | 217 | enum pvr2_v4l_type index,int); |
218 | 218 | ||
219 | /* Direct read/write access to chip's registers: | 219 | /* Direct read/write access to chip's registers: |
220 | chip_id - unique id of chip (e.g. I2C_DRIVERD_xxxx) | 220 | match_type - how to interpret match_chip (e.g. driver ID, i2c address) |
221 | match_chip - chip match value (e.g. I2C_DRIVERD_xxxx) | ||
221 | reg_id - register number to access | 222 | reg_id - register number to access |
222 | setFl - true to set the register, false to read it | 223 | setFl - true to set the register, false to read it |
223 | val_ptr - storage location for source / result. */ | 224 | val_ptr - storage location for source / result. */ |
224 | int pvr2_hdw_register_access(struct pvr2_hdw *, | 225 | int pvr2_hdw_register_access(struct pvr2_hdw *, |
225 | u32 chip_id,u64 reg_id, | 226 | u32 match_type, u32 match_chip,u64 reg_id, |
226 | int setFl,u32 *val_ptr); | 227 | int setFl,u64 *val_ptr); |
227 | 228 | ||
228 | /* The following entry points are all lower level things you normally don't | 229 | /* The following entry points are all lower level things you normally don't |
229 | want to worry about. */ | 230 | want to worry about. */ |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 4fe4136204c7..5313d342666e 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -740,11 +740,11 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, | |||
740 | case VIDIOC_DBG_S_REGISTER: | 740 | case VIDIOC_DBG_S_REGISTER: |
741 | case VIDIOC_DBG_G_REGISTER: | 741 | case VIDIOC_DBG_G_REGISTER: |
742 | { | 742 | { |
743 | u32 val; | 743 | u64 val; |
744 | struct v4l2_register *req = (struct v4l2_register *)arg; | 744 | struct v4l2_register *req = (struct v4l2_register *)arg; |
745 | if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val; | 745 | if (cmd == VIDIOC_DBG_S_REGISTER) val = req->val; |
746 | ret = pvr2_hdw_register_access( | 746 | ret = pvr2_hdw_register_access( |
747 | hdw,req->i2c_id,req->reg, | 747 | hdw,req->match_type,req->match_chip,req->reg, |
748 | cmd == VIDIOC_DBG_S_REGISTER,&val); | 748 | cmd == VIDIOC_DBG_S_REGISTER,&val); |
749 | if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val; | 749 | if (cmd == VIDIOC_DBG_G_REGISTER) req->val = val; |
750 | break; | 750 | break; |