diff options
| author | Aapo Tahkola <aet@rasterburn.org> | 2007-05-08 11:03:55 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2007-07-18 13:23:38 -0400 |
| commit | 47f8df0fc0a5bd2e7e46ca438715ffa290051f72 (patch) | |
| tree | 9c562ae684d36abe4839913763b88e483c4dcd4d /drivers | |
| parent | 7cb47a14609eed6db2041fd1fe888027b2a3c3e0 (diff) | |
V4L/DVB (5692): M920x: attempt to fix hw pid filters on second endpoint
Signed-off-by: Aapo Tahkola <aet@rasterburn.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/media/dvb/dvb-usb/m920x.c | 57 | ||||
| -rw-r--r-- | drivers/media/dvb/dvb-usb/m920x.h | 5 |
2 files changed, 41 insertions, 21 deletions
diff --git a/drivers/media/dvb/dvb-usb/m920x.c b/drivers/media/dvb/dvb-usb/m920x.c index c546ddeda5d4..37e7f5881a82 100644 --- a/drivers/media/dvb/dvb-usb/m920x.c +++ b/drivers/media/dvb/dvb-usb/m920x.c | |||
| @@ -22,6 +22,8 @@ static int dvb_usb_m920x_debug; | |||
| 22 | module_param_named(debug,dvb_usb_m920x_debug, int, 0644); | 22 | module_param_named(debug,dvb_usb_m920x_debug, int, 0644); |
| 23 | MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS); | 23 | MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS); |
| 24 | 24 | ||
| 25 | static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid); | ||
| 26 | |||
| 25 | static inline int m920x_read(struct usb_device *udev, u8 request, u16 value, | 27 | static inline int m920x_read(struct usb_device *udev, u8 request, u16 value, |
| 26 | u16 index, void *data, int size) | 28 | u16 index, void *data, int size) |
| 27 | { | 29 | { |
| @@ -57,7 +59,8 @@ static inline int m920x_write(struct usb_device *udev, u8 request, | |||
| 57 | 59 | ||
| 58 | static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq) | 60 | static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq) |
| 59 | { | 61 | { |
| 60 | int ret = 0; | 62 | int ret = 0, i, epi; |
| 63 | int adap_enabled[M9206_MAX_ADAPTERS] = { 0 }; | ||
| 61 | 64 | ||
| 62 | /* Remote controller init. */ | 65 | /* Remote controller init. */ |
| 63 | if (d->props.rc_query) { | 66 | if (d->props.rc_query) { |
| @@ -76,6 +79,28 @@ static int m920x_init(struct dvb_usb_device *d, struct m920x_inits *rc_seq) | |||
| 76 | deb("Initialising remote control success\n"); | 79 | deb("Initialising remote control success\n"); |
| 77 | } | 80 | } |
| 78 | 81 | ||
| 82 | for (i = 0; i < d->props.num_adapters; i++) { | ||
| 83 | epi = d->adapter[i].props.stream.endpoint - 0x81; | ||
| 84 | |||
| 85 | if (epi < 0 || epi >= M9206_MAX_ADAPTERS) { | ||
| 86 | printk(KERN_INFO "m920x: Unexpected adapter endpoint!\n"); | ||
| 87 | return -EINVAL; | ||
| 88 | } | ||
| 89 | |||
| 90 | adap_enabled[epi] = 1; | ||
| 91 | } | ||
| 92 | |||
| 93 | for (i = 0; i < M9206_MAX_ADAPTERS; i++) { | ||
| 94 | if (adap_enabled[i]) | ||
| 95 | continue; | ||
| 96 | |||
| 97 | if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x0)) != 0) | ||
| 98 | return ret; | ||
| 99 | |||
| 100 | if ((ret = m920x_set_filter(d, 0x81 + i, 0, 0x02f5)) != 0) | ||
| 101 | return ret; | ||
| 102 | } | ||
| 103 | |||
| 79 | return ret; | 104 | return ret; |
| 80 | } | 105 | } |
| 81 | 106 | ||
| @@ -211,8 +236,7 @@ static struct i2c_algorithm m920x_i2c_algo = { | |||
| 211 | }; | 236 | }; |
| 212 | 237 | ||
| 213 | /* pid filter */ | 238 | /* pid filter */ |
| 214 | static int m920x_set_filter(struct dvb_usb_adapter *adap, | 239 | static int m920x_set_filter(struct dvb_usb_device *d, int type, int idx, int pid) |
| 215 | int type, int idx, int pid) | ||
| 216 | { | 240 | { |
| 217 | int ret = 0; | 241 | int ret = 0; |
| 218 | 242 | ||
| @@ -221,10 +245,10 @@ static int m920x_set_filter(struct dvb_usb_adapter *adap, | |||
| 221 | 245 | ||
| 222 | pid |= 0x8000; | 246 | pid |= 0x8000; |
| 223 | 247 | ||
| 224 | if ((ret = m920x_write(adap->dev->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0) | 248 | if ((ret = m920x_write(d->udev, M9206_FILTER, pid, (type << 8) | (idx * 4) )) != 0) |
| 225 | return ret; | 249 | return ret; |
| 226 | 250 | ||
| 227 | if ((ret = m920x_write(adap->dev->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0) | 251 | if ((ret = m920x_write(d->udev, M9206_FILTER, 0, (type << 8) | (idx * 4) )) != 0) |
| 228 | return ret; | 252 | return ret; |
| 229 | 253 | ||
| 230 | return ret; | 254 | return ret; |
| @@ -233,40 +257,35 @@ static int m920x_set_filter(struct dvb_usb_adapter *adap, | |||
| 233 | static int m920x_update_filters(struct dvb_usb_adapter *adap) | 257 | static int m920x_update_filters(struct dvb_usb_adapter *adap) |
| 234 | { | 258 | { |
| 235 | struct m920x_state *m = adap->dev->priv; | 259 | struct m920x_state *m = adap->dev->priv; |
| 236 | int enabled = m->filtering_enabled; | 260 | int enabled = m->filtering_enabled[adap->id]; |
| 237 | int i, ret = 0, filter = 0; | 261 | int i, ret = 0, filter = 0; |
| 262 | int ep = adap->props.stream.endpoint; | ||
| 238 | 263 | ||
| 239 | for (i = 0; i < M9206_MAX_FILTERS; i++) | 264 | for (i = 0; i < M9206_MAX_FILTERS; i++) |
| 240 | if (m->filters[i] == 8192) | 265 | if (m->filters[adap->id][i] == 8192) |
| 241 | enabled = 0; | 266 | enabled = 0; |
| 242 | 267 | ||
| 243 | /* Disable all filters */ | 268 | /* Disable all filters */ |
| 244 | if ((ret = m920x_set_filter(adap, 0x81, 1, enabled)) != 0) | 269 | if ((ret = m920x_set_filter(adap->dev, ep, 1, enabled)) != 0) |
| 245 | return ret; | 270 | return ret; |
| 246 | 271 | ||
| 247 | for (i = 0; i < M9206_MAX_FILTERS; i++) | 272 | for (i = 0; i < M9206_MAX_FILTERS; i++) |
| 248 | if ((ret = m920x_set_filter(adap, 0x81, i + 2, 0)) != 0) | 273 | if ((ret = m920x_set_filter(adap->dev, ep, i + 2, 0)) != 0) |
| 249 | return ret; | 274 | return ret; |
| 250 | 275 | ||
| 251 | if ((ret = m920x_set_filter(adap, 0x82, 0, 0x0)) != 0) | ||
| 252 | return ret; | ||
| 253 | |||
| 254 | /* Set */ | 276 | /* Set */ |
| 255 | if (enabled) { | 277 | if (enabled) { |
| 256 | for (i = 0; i < M9206_MAX_FILTERS; i++) { | 278 | for (i = 0; i < M9206_MAX_FILTERS; i++) { |
| 257 | if (m->filters[i] == 0) | 279 | if (m->filters[adap->id][i] == 0) |
| 258 | continue; | 280 | continue; |
| 259 | 281 | ||
| 260 | if ((ret = m920x_set_filter(adap, 0x81, filter + 2, m->filters[i])) != 0) | 282 | if ((ret = m920x_set_filter(adap->dev, ep, filter + 2, m->filters[adap->id][i])) != 0) |
| 261 | return ret; | 283 | return ret; |
| 262 | 284 | ||
| 263 | filter++; | 285 | filter++; |
| 264 | } | 286 | } |
| 265 | } | 287 | } |
| 266 | 288 | ||
| 267 | if ((ret = m920x_set_filter(adap, 0x82, 0, 0x02f5)) != 0) | ||
| 268 | return ret; | ||
| 269 | |||
| 270 | return ret; | 289 | return ret; |
| 271 | } | 290 | } |
| 272 | 291 | ||
| @@ -274,7 +293,7 @@ static int m920x_pid_filter_ctrl(struct dvb_usb_adapter *adap, int onoff) | |||
| 274 | { | 293 | { |
| 275 | struct m920x_state *m = adap->dev->priv; | 294 | struct m920x_state *m = adap->dev->priv; |
| 276 | 295 | ||
| 277 | m->filtering_enabled = onoff ? 1 : 0; | 296 | m->filtering_enabled[adap->id] = onoff ? 1 : 0; |
| 278 | 297 | ||
| 279 | return m920x_update_filters(adap); | 298 | return m920x_update_filters(adap); |
| 280 | } | 299 | } |
| @@ -283,7 +302,7 @@ static int m920x_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, in | |||
| 283 | { | 302 | { |
| 284 | struct m920x_state *m = adap->dev->priv; | 303 | struct m920x_state *m = adap->dev->priv; |
| 285 | 304 | ||
| 286 | m->filters[index] = onoff ? pid : 0; | 305 | m->filters[adap->id][index] = onoff ? pid : 0; |
| 287 | 306 | ||
| 288 | return m920x_update_filters(adap); | 307 | return m920x_update_filters(adap); |
| 289 | } | 308 | } |
diff --git a/drivers/media/dvb/dvb-usb/m920x.h b/drivers/media/dvb/dvb-usb/m920x.h index 2c8942d04222..37532890accd 100644 --- a/drivers/media/dvb/dvb-usb/m920x.h +++ b/drivers/media/dvb/dvb-usb/m920x.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #define M9206_FW 0x30 | 18 | #define M9206_FW 0x30 |
| 19 | 19 | ||
| 20 | #define M9206_MAX_FILTERS 8 | 20 | #define M9206_MAX_FILTERS 8 |
| 21 | #define M9206_MAX_ADAPTERS 2 | ||
| 21 | 22 | ||
| 22 | /* | 23 | /* |
| 23 | sequences found in logs: | 24 | sequences found in logs: |
| @@ -60,8 +61,8 @@ response to a write, is unknown. | |||
| 60 | */ | 61 | */ |
| 61 | 62 | ||
| 62 | struct m920x_state { | 63 | struct m920x_state { |
| 63 | u16 filters[M9206_MAX_FILTERS]; | 64 | u16 filters[M9206_MAX_ADAPTERS][M9206_MAX_FILTERS]; |
| 64 | int filtering_enabled; | 65 | int filtering_enabled[M9206_MAX_ADAPTERS]; |
| 65 | int rep_count; | 66 | int rep_count; |
| 66 | }; | 67 | }; |
| 67 | 68 | ||
