diff options
Diffstat (limited to 'drivers/media/usb/msi2500/msi2500.c')
-rw-r--r-- | drivers/media/usb/msi2500/msi2500.c | 655 |
1 files changed, 338 insertions, 317 deletions
diff --git a/drivers/media/usb/msi2500/msi2500.c b/drivers/media/usb/msi2500/msi2500.c index efc761c78f72..3f276d921cca 100644 --- a/drivers/media/usb/msi2500/msi2500.c +++ b/drivers/media/usb/msi2500/msi2500.c | |||
@@ -1,4 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Mirics MSi2500 driver | ||
2 | * Mirics MSi3101 SDR Dongle driver | 3 | * Mirics MSi3101 SDR Dongle driver |
3 | * | 4 | * |
4 | * Copyright (C) 2013 Antti Palosaari <crope@iki.fi> | 5 | * Copyright (C) 2013 Antti Palosaari <crope@iki.fi> |
@@ -13,10 +14,6 @@ | |||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
15 | * | 16 | * |
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||
19 | * | ||
20 | * That driver is somehow based of pwc driver: | 17 | * That driver is somehow based of pwc driver: |
21 | * (C) 1999-2004 Nemosoft Unv. | 18 | * (C) 1999-2004 Nemosoft Unv. |
22 | * (C) 2004-2006 Luc Saillard (luc@saillard.org) | 19 | * (C) 2004-2006 Luc Saillard (luc@saillard.org) |
@@ -119,7 +116,7 @@ struct msi2500_frame_buf { | |||
119 | struct list_head list; | 116 | struct list_head list; |
120 | }; | 117 | }; |
121 | 118 | ||
122 | struct msi2500_state { | 119 | struct msi2500_dev { |
123 | struct device *dev; | 120 | struct device *dev; |
124 | struct video_device vdev; | 121 | struct video_device vdev; |
125 | struct v4l2_device v4l2_dev; | 122 | struct v4l2_device v4l2_dev; |
@@ -158,19 +155,19 @@ struct msi2500_state { | |||
158 | 155 | ||
159 | /* Private functions */ | 156 | /* Private functions */ |
160 | static struct msi2500_frame_buf *msi2500_get_next_fill_buf( | 157 | static struct msi2500_frame_buf *msi2500_get_next_fill_buf( |
161 | struct msi2500_state *s) | 158 | struct msi2500_dev *dev) |
162 | { | 159 | { |
163 | unsigned long flags; | 160 | unsigned long flags; |
164 | struct msi2500_frame_buf *buf = NULL; | 161 | struct msi2500_frame_buf *buf = NULL; |
165 | 162 | ||
166 | spin_lock_irqsave(&s->queued_bufs_lock, flags); | 163 | spin_lock_irqsave(&dev->queued_bufs_lock, flags); |
167 | if (list_empty(&s->queued_bufs)) | 164 | if (list_empty(&dev->queued_bufs)) |
168 | goto leave; | 165 | goto leave; |
169 | 166 | ||
170 | buf = list_entry(s->queued_bufs.next, struct msi2500_frame_buf, list); | 167 | buf = list_entry(dev->queued_bufs.next, struct msi2500_frame_buf, list); |
171 | list_del(&buf->list); | 168 | list_del(&buf->list); |
172 | leave: | 169 | leave: |
173 | spin_unlock_irqrestore(&s->queued_bufs_lock, flags); | 170 | spin_unlock_irqrestore(&dev->queued_bufs_lock, flags); |
174 | return buf; | 171 | return buf; |
175 | } | 172 | } |
176 | 173 | ||
@@ -256,8 +253,8 @@ leave: | |||
256 | * signed 14-bit sample | 253 | * signed 14-bit sample |
257 | */ | 254 | */ |
258 | 255 | ||
259 | static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | 256 | static int msi2500_convert_stream(struct msi2500_dev *dev, u8 *dst, u8 *src, |
260 | unsigned int src_len) | 257 | unsigned int src_len) |
261 | { | 258 | { |
262 | unsigned int i, j, transactions, dst_len = 0; | 259 | unsigned int i, j, transactions, dst_len = 0; |
263 | u32 sample[3]; | 260 | u32 sample[3]; |
@@ -268,26 +265,27 @@ static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | |||
268 | for (i = 0; i < transactions; i++) { | 265 | for (i = 0; i < transactions; i++) { |
269 | sample[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | | 266 | sample[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | |
270 | src[0] << 0; | 267 | src[0] << 0; |
271 | if (i == 0 && s->next_sample != sample[0]) { | 268 | if (i == 0 && dev->next_sample != sample[0]) { |
272 | dev_dbg_ratelimited(s->dev, | 269 | dev_dbg_ratelimited(dev->dev, |
273 | "%d samples lost, %d %08x:%08x\n", | 270 | "%d samples lost, %d %08x:%08x\n", |
274 | sample[0] - s->next_sample, | 271 | sample[0] - dev->next_sample, |
275 | src_len, s->next_sample, sample[0]); | 272 | src_len, dev->next_sample, |
273 | sample[0]); | ||
276 | } | 274 | } |
277 | 275 | ||
278 | /* | 276 | /* |
279 | * Dump all unknown 'garbage' data - maybe we will discover | 277 | * Dump all unknown 'garbage' data - maybe we will discover |
280 | * someday if there is something rational... | 278 | * someday if there is something rational... |
281 | */ | 279 | */ |
282 | dev_dbg_ratelimited(s->dev, "%*ph\n", 12, &src[4]); | 280 | dev_dbg_ratelimited(dev->dev, "%*ph\n", 12, &src[4]); |
283 | 281 | ||
284 | src += 16; /* skip header */ | 282 | src += 16; /* skip header */ |
285 | 283 | ||
286 | switch (s->pixelformat) { | 284 | switch (dev->pixelformat) { |
287 | case V4L2_SDR_FMT_CU8: /* 504 x IQ samples */ | 285 | case V4L2_SDR_FMT_CU8: /* 504 x IQ samples */ |
288 | { | 286 | { |
289 | s8 *s8src = (s8 *) src; | 287 | s8 *s8src = (s8 *)src; |
290 | u8 *u8dst = (u8 *) dst; | 288 | u8 *u8dst = (u8 *)dst; |
291 | 289 | ||
292 | for (j = 0; j < 1008; j++) | 290 | for (j = 0; j < 1008; j++) |
293 | *u8dst++ = *s8src++ + 128; | 291 | *u8dst++ = *s8src++ + 128; |
@@ -295,13 +293,13 @@ static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | |||
295 | src += 1008; | 293 | src += 1008; |
296 | dst += 1008; | 294 | dst += 1008; |
297 | dst_len += 1008; | 295 | dst_len += 1008; |
298 | s->next_sample = sample[i] + 504; | 296 | dev->next_sample = sample[i] + 504; |
299 | break; | 297 | break; |
300 | } | 298 | } |
301 | case V4L2_SDR_FMT_CU16LE: /* 252 x IQ samples */ | 299 | case V4L2_SDR_FMT_CU16LE: /* 252 x IQ samples */ |
302 | { | 300 | { |
303 | s16 *s16src = (s16 *) src; | 301 | s16 *s16src = (s16 *)src; |
304 | u16 *u16dst = (u16 *) dst; | 302 | u16 *u16dst = (u16 *)dst; |
305 | struct {signed int x:14; } se; /* sign extension */ | 303 | struct {signed int x:14; } se; /* sign extension */ |
306 | unsigned int utmp; | 304 | unsigned int utmp; |
307 | 305 | ||
@@ -317,38 +315,38 @@ static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | |||
317 | src += 1008; | 315 | src += 1008; |
318 | dst += 1008; | 316 | dst += 1008; |
319 | dst_len += 1008; | 317 | dst_len += 1008; |
320 | s->next_sample = sample[i] + 252; | 318 | dev->next_sample = sample[i] + 252; |
321 | break; | 319 | break; |
322 | } | 320 | } |
323 | case MSI2500_PIX_FMT_SDR_MSI2500_384: /* 384 x IQ samples */ | 321 | case MSI2500_PIX_FMT_SDR_MSI2500_384: /* 384 x IQ samples */ |
324 | /* Dump unknown 'garbage' data */ | 322 | /* Dump unknown 'garbage' data */ |
325 | dev_dbg_ratelimited(s->dev, "%*ph\n", 24, &src[1000]); | 323 | dev_dbg_ratelimited(dev->dev, "%*ph\n", 24, &src[1000]); |
326 | memcpy(dst, src, 984); | 324 | memcpy(dst, src, 984); |
327 | src += 984 + 24; | 325 | src += 984 + 24; |
328 | dst += 984; | 326 | dst += 984; |
329 | dst_len += 984; | 327 | dst_len += 984; |
330 | s->next_sample = sample[i] + 384; | 328 | dev->next_sample = sample[i] + 384; |
331 | break; | 329 | break; |
332 | case V4L2_SDR_FMT_CS8: /* 504 x IQ samples */ | 330 | case V4L2_SDR_FMT_CS8: /* 504 x IQ samples */ |
333 | memcpy(dst, src, 1008); | 331 | memcpy(dst, src, 1008); |
334 | src += 1008; | 332 | src += 1008; |
335 | dst += 1008; | 333 | dst += 1008; |
336 | dst_len += 1008; | 334 | dst_len += 1008; |
337 | s->next_sample = sample[i] + 504; | 335 | dev->next_sample = sample[i] + 504; |
338 | break; | 336 | break; |
339 | case MSI2500_PIX_FMT_SDR_S12: /* 336 x IQ samples */ | 337 | case MSI2500_PIX_FMT_SDR_S12: /* 336 x IQ samples */ |
340 | memcpy(dst, src, 1008); | 338 | memcpy(dst, src, 1008); |
341 | src += 1008; | 339 | src += 1008; |
342 | dst += 1008; | 340 | dst += 1008; |
343 | dst_len += 1008; | 341 | dst_len += 1008; |
344 | s->next_sample = sample[i] + 336; | 342 | dev->next_sample = sample[i] + 336; |
345 | break; | 343 | break; |
346 | case V4L2_SDR_FMT_CS14LE: /* 252 x IQ samples */ | 344 | case V4L2_SDR_FMT_CS14LE: /* 252 x IQ samples */ |
347 | memcpy(dst, src, 1008); | 345 | memcpy(dst, src, 1008); |
348 | src += 1008; | 346 | src += 1008; |
349 | dst += 1008; | 347 | dst += 1008; |
350 | dst_len += 1008; | 348 | dst_len += 1008; |
351 | s->next_sample = sample[i] + 252; | 349 | dev->next_sample = sample[i] + 252; |
352 | break; | 350 | break; |
353 | default: | 351 | default: |
354 | break; | 352 | break; |
@@ -356,17 +354,17 @@ static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | |||
356 | } | 354 | } |
357 | 355 | ||
358 | /* calculate sample rate and output it in 10 seconds intervals */ | 356 | /* calculate sample rate and output it in 10 seconds intervals */ |
359 | if (unlikely(time_is_before_jiffies(s->jiffies_next))) { | 357 | if (unlikely(time_is_before_jiffies(dev->jiffies_next))) { |
360 | #define MSECS 10000UL | 358 | #define MSECS 10000UL |
361 | unsigned int msecs = jiffies_to_msecs(jiffies - | 359 | unsigned int msecs = jiffies_to_msecs(jiffies - |
362 | s->jiffies_next + msecs_to_jiffies(MSECS)); | 360 | dev->jiffies_next + msecs_to_jiffies(MSECS)); |
363 | unsigned int samples = s->next_sample - s->sample; | 361 | unsigned int samples = dev->next_sample - dev->sample; |
364 | 362 | ||
365 | s->jiffies_next = jiffies + msecs_to_jiffies(MSECS); | 363 | dev->jiffies_next = jiffies + msecs_to_jiffies(MSECS); |
366 | s->sample = s->next_sample; | 364 | dev->sample = dev->next_sample; |
367 | dev_dbg(s->dev, "size=%u samples=%u msecs=%u sample rate=%lu\n", | 365 | dev_dbg(dev->dev, "size=%u samples=%u msecs=%u sample rate=%lu\n", |
368 | src_len, samples, msecs, | 366 | src_len, samples, msecs, |
369 | samples * 1000UL / msecs); | 367 | samples * 1000UL / msecs); |
370 | } | 368 | } |
371 | 369 | ||
372 | return dst_len; | 370 | return dst_len; |
@@ -378,27 +376,28 @@ static int msi2500_convert_stream(struct msi2500_state *s, u8 *dst, u8 *src, | |||
378 | */ | 376 | */ |
379 | static void msi2500_isoc_handler(struct urb *urb) | 377 | static void msi2500_isoc_handler(struct urb *urb) |
380 | { | 378 | { |
381 | struct msi2500_state *s = (struct msi2500_state *)urb->context; | 379 | struct msi2500_dev *dev = (struct msi2500_dev *)urb->context; |
382 | int i, flen, fstatus; | 380 | int i, flen, fstatus; |
383 | unsigned char *iso_buf = NULL; | 381 | unsigned char *iso_buf = NULL; |
384 | struct msi2500_frame_buf *fbuf; | 382 | struct msi2500_frame_buf *fbuf; |
385 | 383 | ||
386 | if (unlikely(urb->status == -ENOENT || urb->status == -ECONNRESET || | 384 | if (unlikely(urb->status == -ENOENT || |
387 | urb->status == -ESHUTDOWN)) { | 385 | urb->status == -ECONNRESET || |
388 | dev_dbg(s->dev, "URB (%p) unlinked %ssynchronuously\n", | 386 | urb->status == -ESHUTDOWN)) { |
389 | urb, urb->status == -ENOENT ? "" : "a"); | 387 | dev_dbg(dev->dev, "URB (%p) unlinked %ssynchronuously\n", |
388 | urb, urb->status == -ENOENT ? "" : "a"); | ||
390 | return; | 389 | return; |
391 | } | 390 | } |
392 | 391 | ||
393 | if (unlikely(urb->status != 0)) { | 392 | if (unlikely(urb->status != 0)) { |
394 | dev_dbg(s->dev, "called with status %d\n", urb->status); | 393 | dev_dbg(dev->dev, "called with status %d\n", urb->status); |
395 | /* Give up after a number of contiguous errors */ | 394 | /* Give up after a number of contiguous errors */ |
396 | if (++s->isoc_errors > MAX_ISOC_ERRORS) | 395 | if (++dev->isoc_errors > MAX_ISOC_ERRORS) |
397 | dev_dbg(s->dev, "Too many ISOC errors, bailing out\n"); | 396 | dev_dbg(dev->dev, "Too many ISOC errors, bailing out\n"); |
398 | goto handler_end; | 397 | goto handler_end; |
399 | } else { | 398 | } else { |
400 | /* Reset ISOC error counter. We did get here, after all. */ | 399 | /* Reset ISOC error counter. We did get here, after all. */ |
401 | s->isoc_errors = 0; | 400 | dev->isoc_errors = 0; |
402 | } | 401 | } |
403 | 402 | ||
404 | /* Compact data */ | 403 | /* Compact data */ |
@@ -408,9 +407,9 @@ static void msi2500_isoc_handler(struct urb *urb) | |||
408 | /* Check frame error */ | 407 | /* Check frame error */ |
409 | fstatus = urb->iso_frame_desc[i].status; | 408 | fstatus = urb->iso_frame_desc[i].status; |
410 | if (unlikely(fstatus)) { | 409 | if (unlikely(fstatus)) { |
411 | dev_dbg_ratelimited(s->dev, | 410 | dev_dbg_ratelimited(dev->dev, |
412 | "frame=%d/%d has error %d skipping\n", | 411 | "frame=%d/%d has error %d skipping\n", |
413 | i, urb->number_of_packets, fstatus); | 412 | i, urb->number_of_packets, fstatus); |
414 | continue; | 413 | continue; |
415 | } | 414 | } |
416 | 415 | ||
@@ -422,18 +421,18 @@ static void msi2500_isoc_handler(struct urb *urb) | |||
422 | iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset; | 421 | iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset; |
423 | 422 | ||
424 | /* Get free framebuffer */ | 423 | /* Get free framebuffer */ |
425 | fbuf = msi2500_get_next_fill_buf(s); | 424 | fbuf = msi2500_get_next_fill_buf(dev); |
426 | if (unlikely(fbuf == NULL)) { | 425 | if (unlikely(fbuf == NULL)) { |
427 | s->vb_full++; | 426 | dev->vb_full++; |
428 | dev_dbg_ratelimited(s->dev, | 427 | dev_dbg_ratelimited(dev->dev, |
429 | "videobuf is full, %d packets dropped\n", | 428 | "videobuf is full, %d packets dropped\n", |
430 | s->vb_full); | 429 | dev->vb_full); |
431 | continue; | 430 | continue; |
432 | } | 431 | } |
433 | 432 | ||
434 | /* fill framebuffer */ | 433 | /* fill framebuffer */ |
435 | ptr = vb2_plane_vaddr(&fbuf->vb, 0); | 434 | ptr = vb2_plane_vaddr(&fbuf->vb, 0); |
436 | flen = msi2500_convert_stream(s, ptr, iso_buf, flen); | 435 | flen = msi2500_convert_stream(dev, ptr, iso_buf, flen); |
437 | vb2_set_plane_payload(&fbuf->vb, 0, flen); | 436 | vb2_set_plane_payload(&fbuf->vb, 0, flen); |
438 | vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE); | 437 | vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE); |
439 | } | 438 | } |
@@ -441,66 +440,66 @@ static void msi2500_isoc_handler(struct urb *urb) | |||
441 | handler_end: | 440 | handler_end: |
442 | i = usb_submit_urb(urb, GFP_ATOMIC); | 441 | i = usb_submit_urb(urb, GFP_ATOMIC); |
443 | if (unlikely(i != 0)) | 442 | if (unlikely(i != 0)) |
444 | dev_dbg(s->dev, "Error (%d) re-submitting urb\n", i); | 443 | dev_dbg(dev->dev, "Error (%d) re-submitting urb\n", i); |
445 | } | 444 | } |
446 | 445 | ||
447 | static void msi2500_iso_stop(struct msi2500_state *s) | 446 | static void msi2500_iso_stop(struct msi2500_dev *dev) |
448 | { | 447 | { |
449 | int i; | 448 | int i; |
450 | 449 | ||
451 | dev_dbg(s->dev, "\n"); | 450 | dev_dbg(dev->dev, "\n"); |
452 | 451 | ||
453 | /* Unlinking ISOC buffers one by one */ | 452 | /* Unlinking ISOC buffers one by one */ |
454 | for (i = 0; i < MAX_ISO_BUFS; i++) { | 453 | for (i = 0; i < MAX_ISO_BUFS; i++) { |
455 | if (s->urbs[i]) { | 454 | if (dev->urbs[i]) { |
456 | dev_dbg(s->dev, "Unlinking URB %p\n", s->urbs[i]); | 455 | dev_dbg(dev->dev, "Unlinking URB %p\n", dev->urbs[i]); |
457 | usb_kill_urb(s->urbs[i]); | 456 | usb_kill_urb(dev->urbs[i]); |
458 | } | 457 | } |
459 | } | 458 | } |
460 | } | 459 | } |
461 | 460 | ||
462 | static void msi2500_iso_free(struct msi2500_state *s) | 461 | static void msi2500_iso_free(struct msi2500_dev *dev) |
463 | { | 462 | { |
464 | int i; | 463 | int i; |
465 | 464 | ||
466 | dev_dbg(s->dev, "\n"); | 465 | dev_dbg(dev->dev, "\n"); |
467 | 466 | ||
468 | /* Freeing ISOC buffers one by one */ | 467 | /* Freeing ISOC buffers one by one */ |
469 | for (i = 0; i < MAX_ISO_BUFS; i++) { | 468 | for (i = 0; i < MAX_ISO_BUFS; i++) { |
470 | if (s->urbs[i]) { | 469 | if (dev->urbs[i]) { |
471 | dev_dbg(s->dev, "Freeing URB\n"); | 470 | dev_dbg(dev->dev, "Freeing URB\n"); |
472 | if (s->urbs[i]->transfer_buffer) { | 471 | if (dev->urbs[i]->transfer_buffer) { |
473 | usb_free_coherent(s->udev, | 472 | usb_free_coherent(dev->udev, |
474 | s->urbs[i]->transfer_buffer_length, | 473 | dev->urbs[i]->transfer_buffer_length, |
475 | s->urbs[i]->transfer_buffer, | 474 | dev->urbs[i]->transfer_buffer, |
476 | s->urbs[i]->transfer_dma); | 475 | dev->urbs[i]->transfer_dma); |
477 | } | 476 | } |
478 | usb_free_urb(s->urbs[i]); | 477 | usb_free_urb(dev->urbs[i]); |
479 | s->urbs[i] = NULL; | 478 | dev->urbs[i] = NULL; |
480 | } | 479 | } |
481 | } | 480 | } |
482 | } | 481 | } |
483 | 482 | ||
484 | /* Both v4l2_lock and vb_queue_lock should be locked when calling this */ | 483 | /* Both v4l2_lock and vb_queue_lock should be locked when calling this */ |
485 | static void msi2500_isoc_cleanup(struct msi2500_state *s) | 484 | static void msi2500_isoc_cleanup(struct msi2500_dev *dev) |
486 | { | 485 | { |
487 | dev_dbg(s->dev, "\n"); | 486 | dev_dbg(dev->dev, "\n"); |
488 | 487 | ||
489 | msi2500_iso_stop(s); | 488 | msi2500_iso_stop(dev); |
490 | msi2500_iso_free(s); | 489 | msi2500_iso_free(dev); |
491 | } | 490 | } |
492 | 491 | ||
493 | /* Both v4l2_lock and vb_queue_lock should be locked when calling this */ | 492 | /* Both v4l2_lock and vb_queue_lock should be locked when calling this */ |
494 | static int msi2500_isoc_init(struct msi2500_state *s) | 493 | static int msi2500_isoc_init(struct msi2500_dev *dev) |
495 | { | 494 | { |
496 | struct urb *urb; | 495 | struct urb *urb; |
497 | int i, j, ret; | 496 | int i, j, ret; |
498 | 497 | ||
499 | dev_dbg(s->dev, "\n"); | 498 | dev_dbg(dev->dev, "\n"); |
500 | 499 | ||
501 | s->isoc_errors = 0; | 500 | dev->isoc_errors = 0; |
502 | 501 | ||
503 | ret = usb_set_interface(s->udev, 0, 1); | 502 | ret = usb_set_interface(dev->udev, 0, 1); |
504 | if (ret) | 503 | if (ret) |
505 | return ret; | 504 | return ret; |
506 | 505 | ||
@@ -508,29 +507,29 @@ static int msi2500_isoc_init(struct msi2500_state *s) | |||
508 | for (i = 0; i < MAX_ISO_BUFS; i++) { | 507 | for (i = 0; i < MAX_ISO_BUFS; i++) { |
509 | urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL); | 508 | urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL); |
510 | if (urb == NULL) { | 509 | if (urb == NULL) { |
511 | dev_err(s->dev, "Failed to allocate urb %d\n", i); | 510 | dev_err(dev->dev, "Failed to allocate urb %d\n", i); |
512 | msi2500_isoc_cleanup(s); | 511 | msi2500_isoc_cleanup(dev); |
513 | return -ENOMEM; | 512 | return -ENOMEM; |
514 | } | 513 | } |
515 | s->urbs[i] = urb; | 514 | dev->urbs[i] = urb; |
516 | dev_dbg(s->dev, "Allocated URB at 0x%p\n", urb); | 515 | dev_dbg(dev->dev, "Allocated URB at 0x%p\n", urb); |
517 | 516 | ||
518 | urb->interval = 1; | 517 | urb->interval = 1; |
519 | urb->dev = s->udev; | 518 | urb->dev = dev->udev; |
520 | urb->pipe = usb_rcvisocpipe(s->udev, 0x81); | 519 | urb->pipe = usb_rcvisocpipe(dev->udev, 0x81); |
521 | urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; | 520 | urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP; |
522 | urb->transfer_buffer = usb_alloc_coherent(s->udev, | 521 | urb->transfer_buffer = usb_alloc_coherent(dev->udev, |
523 | ISO_BUFFER_SIZE, | 522 | ISO_BUFFER_SIZE, |
524 | GFP_KERNEL, &urb->transfer_dma); | 523 | GFP_KERNEL, &urb->transfer_dma); |
525 | if (urb->transfer_buffer == NULL) { | 524 | if (urb->transfer_buffer == NULL) { |
526 | dev_err(s->dev, "Failed to allocate urb buffer %d\n", | 525 | dev_err(dev->dev, |
527 | i); | 526 | "Failed to allocate urb buffer %d\n", i); |
528 | msi2500_isoc_cleanup(s); | 527 | msi2500_isoc_cleanup(dev); |
529 | return -ENOMEM; | 528 | return -ENOMEM; |
530 | } | 529 | } |
531 | urb->transfer_buffer_length = ISO_BUFFER_SIZE; | 530 | urb->transfer_buffer_length = ISO_BUFFER_SIZE; |
532 | urb->complete = msi2500_isoc_handler; | 531 | urb->complete = msi2500_isoc_handler; |
533 | urb->context = s; | 532 | urb->context = dev; |
534 | urb->start_frame = 0; | 533 | urb->start_frame = 0; |
535 | urb->number_of_packets = ISO_FRAMES_PER_DESC; | 534 | urb->number_of_packets = ISO_FRAMES_PER_DESC; |
536 | for (j = 0; j < ISO_FRAMES_PER_DESC; j++) { | 535 | for (j = 0; j < ISO_FRAMES_PER_DESC; j++) { |
@@ -541,14 +540,15 @@ static int msi2500_isoc_init(struct msi2500_state *s) | |||
541 | 540 | ||
542 | /* link */ | 541 | /* link */ |
543 | for (i = 0; i < MAX_ISO_BUFS; i++) { | 542 | for (i = 0; i < MAX_ISO_BUFS; i++) { |
544 | ret = usb_submit_urb(s->urbs[i], GFP_KERNEL); | 543 | ret = usb_submit_urb(dev->urbs[i], GFP_KERNEL); |
545 | if (ret) { | 544 | if (ret) { |
546 | dev_err(s->dev, "usb_submit_urb %d failed with error %d\n", | 545 | dev_err(dev->dev, |
547 | i, ret); | 546 | "usb_submit_urb %d failed with error %d\n", |
548 | msi2500_isoc_cleanup(s); | 547 | i, ret); |
548 | msi2500_isoc_cleanup(dev); | ||
549 | return ret; | 549 | return ret; |
550 | } | 550 | } |
551 | dev_dbg(s->dev, "URB 0x%p submitted.\n", s->urbs[i]); | 551 | dev_dbg(dev->dev, "URB 0x%p submitted.\n", dev->urbs[i]); |
552 | } | 552 | } |
553 | 553 | ||
554 | /* All is done... */ | 554 | /* All is done... */ |
@@ -556,56 +556,56 @@ static int msi2500_isoc_init(struct msi2500_state *s) | |||
556 | } | 556 | } |
557 | 557 | ||
558 | /* Must be called with vb_queue_lock hold */ | 558 | /* Must be called with vb_queue_lock hold */ |
559 | static void msi2500_cleanup_queued_bufs(struct msi2500_state *s) | 559 | static void msi2500_cleanup_queued_bufs(struct msi2500_dev *dev) |
560 | { | 560 | { |
561 | unsigned long flags; | 561 | unsigned long flags; |
562 | 562 | ||
563 | dev_dbg(s->dev, "\n"); | 563 | dev_dbg(dev->dev, "\n"); |
564 | 564 | ||
565 | spin_lock_irqsave(&s->queued_bufs_lock, flags); | 565 | spin_lock_irqsave(&dev->queued_bufs_lock, flags); |
566 | while (!list_empty(&s->queued_bufs)) { | 566 | while (!list_empty(&dev->queued_bufs)) { |
567 | struct msi2500_frame_buf *buf; | 567 | struct msi2500_frame_buf *buf; |
568 | 568 | ||
569 | buf = list_entry(s->queued_bufs.next, struct msi2500_frame_buf, | 569 | buf = list_entry(dev->queued_bufs.next, |
570 | list); | 570 | struct msi2500_frame_buf, list); |
571 | list_del(&buf->list); | 571 | list_del(&buf->list); |
572 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | 572 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); |
573 | } | 573 | } |
574 | spin_unlock_irqrestore(&s->queued_bufs_lock, flags); | 574 | spin_unlock_irqrestore(&dev->queued_bufs_lock, flags); |
575 | } | 575 | } |
576 | 576 | ||
577 | /* The user yanked out the cable... */ | 577 | /* The user yanked out the cable... */ |
578 | static void msi2500_disconnect(struct usb_interface *intf) | 578 | static void msi2500_disconnect(struct usb_interface *intf) |
579 | { | 579 | { |
580 | struct v4l2_device *v = usb_get_intfdata(intf); | 580 | struct v4l2_device *v = usb_get_intfdata(intf); |
581 | struct msi2500_state *s = | 581 | struct msi2500_dev *dev = |
582 | container_of(v, struct msi2500_state, v4l2_dev); | 582 | container_of(v, struct msi2500_dev, v4l2_dev); |
583 | 583 | ||
584 | dev_dbg(s->dev, "\n"); | 584 | dev_dbg(dev->dev, "\n"); |
585 | 585 | ||
586 | mutex_lock(&s->vb_queue_lock); | 586 | mutex_lock(&dev->vb_queue_lock); |
587 | mutex_lock(&s->v4l2_lock); | 587 | mutex_lock(&dev->v4l2_lock); |
588 | /* No need to keep the urbs around after disconnection */ | 588 | /* No need to keep the urbs around after disconnection */ |
589 | s->udev = NULL; | 589 | dev->udev = NULL; |
590 | v4l2_device_disconnect(&s->v4l2_dev); | 590 | v4l2_device_disconnect(&dev->v4l2_dev); |
591 | video_unregister_device(&s->vdev); | 591 | video_unregister_device(&dev->vdev); |
592 | spi_unregister_master(s->master); | 592 | spi_unregister_master(dev->master); |
593 | mutex_unlock(&s->v4l2_lock); | 593 | mutex_unlock(&dev->v4l2_lock); |
594 | mutex_unlock(&s->vb_queue_lock); | 594 | mutex_unlock(&dev->vb_queue_lock); |
595 | 595 | ||
596 | v4l2_device_put(&s->v4l2_dev); | 596 | v4l2_device_put(&dev->v4l2_dev); |
597 | } | 597 | } |
598 | 598 | ||
599 | static int msi2500_querycap(struct file *file, void *fh, | 599 | static int msi2500_querycap(struct file *file, void *fh, |
600 | struct v4l2_capability *cap) | 600 | struct v4l2_capability *cap) |
601 | { | 601 | { |
602 | struct msi2500_state *s = video_drvdata(file); | 602 | struct msi2500_dev *dev = video_drvdata(file); |
603 | 603 | ||
604 | dev_dbg(s->dev, "\n"); | 604 | dev_dbg(dev->dev, "\n"); |
605 | 605 | ||
606 | strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); | 606 | strlcpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver)); |
607 | strlcpy(cap->card, s->vdev.name, sizeof(cap->card)); | 607 | strlcpy(cap->card, dev->vdev.name, sizeof(cap->card)); |
608 | usb_make_path(s->udev, cap->bus_info, sizeof(cap->bus_info)); | 608 | usb_make_path(dev->udev, cap->bus_info, sizeof(cap->bus_info)); |
609 | cap->device_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_STREAMING | | 609 | cap->device_caps = V4L2_CAP_SDR_CAPTURE | V4L2_CAP_STREAMING | |
610 | V4L2_CAP_READWRITE | V4L2_CAP_TUNER; | 610 | V4L2_CAP_READWRITE | V4L2_CAP_TUNER; |
611 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; | 611 | cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS; |
@@ -614,43 +614,46 @@ static int msi2500_querycap(struct file *file, void *fh, | |||
614 | 614 | ||
615 | /* Videobuf2 operations */ | 615 | /* Videobuf2 operations */ |
616 | static int msi2500_queue_setup(struct vb2_queue *vq, | 616 | static int msi2500_queue_setup(struct vb2_queue *vq, |
617 | const struct v4l2_format *fmt, unsigned int *nbuffers, | 617 | const struct v4l2_format *fmt, |
618 | unsigned int *nplanes, unsigned int sizes[], void *alloc_ctxs[]) | 618 | unsigned int *nbuffers, |
619 | unsigned int *nplanes, unsigned int sizes[], | ||
620 | void *alloc_ctxs[]) | ||
619 | { | 621 | { |
620 | struct msi2500_state *s = vb2_get_drv_priv(vq); | 622 | struct msi2500_dev *dev = vb2_get_drv_priv(vq); |
621 | 623 | ||
622 | dev_dbg(s->dev, "nbuffers=%d\n", *nbuffers); | 624 | dev_dbg(dev->dev, "nbuffers=%d\n", *nbuffers); |
623 | 625 | ||
624 | /* Absolute min and max number of buffers available for mmap() */ | 626 | /* Absolute min and max number of buffers available for mmap() */ |
625 | *nbuffers = clamp_t(unsigned int, *nbuffers, 8, 32); | 627 | *nbuffers = clamp_t(unsigned int, *nbuffers, 8, 32); |
626 | *nplanes = 1; | 628 | *nplanes = 1; |
627 | sizes[0] = PAGE_ALIGN(s->buffersize); | 629 | sizes[0] = PAGE_ALIGN(dev->buffersize); |
628 | dev_dbg(s->dev, "nbuffers=%d sizes[0]=%d\n", *nbuffers, sizes[0]); | 630 | dev_dbg(dev->dev, "nbuffers=%d sizes[0]=%d\n", *nbuffers, sizes[0]); |
629 | return 0; | 631 | return 0; |
630 | } | 632 | } |
631 | 633 | ||
632 | static void msi2500_buf_queue(struct vb2_buffer *vb) | 634 | static void msi2500_buf_queue(struct vb2_buffer *vb) |
633 | { | 635 | { |
634 | struct msi2500_state *s = vb2_get_drv_priv(vb->vb2_queue); | 636 | struct msi2500_dev *dev = vb2_get_drv_priv(vb->vb2_queue); |
635 | struct msi2500_frame_buf *buf = | 637 | struct msi2500_frame_buf *buf = container_of(vb, |
636 | container_of(vb, struct msi2500_frame_buf, vb); | 638 | struct msi2500_frame_buf, |
639 | vb); | ||
637 | unsigned long flags; | 640 | unsigned long flags; |
638 | 641 | ||
639 | /* Check the device has not disconnected between prep and queuing */ | 642 | /* Check the device has not disconnected between prep and queuing */ |
640 | if (unlikely(!s->udev)) { | 643 | if (unlikely(!dev->udev)) { |
641 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | 644 | vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); |
642 | return; | 645 | return; |
643 | } | 646 | } |
644 | 647 | ||
645 | spin_lock_irqsave(&s->queued_bufs_lock, flags); | 648 | spin_lock_irqsave(&dev->queued_bufs_lock, flags); |
646 | list_add_tail(&buf->list, &s->queued_bufs); | 649 | list_add_tail(&buf->list, &dev->queued_bufs); |
647 | spin_unlock_irqrestore(&s->queued_bufs_lock, flags); | 650 | spin_unlock_irqrestore(&dev->queued_bufs_lock, flags); |
648 | } | 651 | } |
649 | 652 | ||
650 | #define CMD_WREG 0x41 | 653 | #define CMD_WREG 0x41 |
651 | #define CMD_START_STREAMING 0x43 | 654 | #define CMD_START_STREAMING 0x43 |
652 | #define CMD_STOP_STREAMING 0x45 | 655 | #define CMD_STOP_STREAMING 0x45 |
653 | #define CMD_READ_UNKNOW 0x48 | 656 | #define CMD_READ_UNKNOWN 0x48 |
654 | 657 | ||
655 | #define msi2500_dbg_usb_control_msg(_dev, _r, _t, _v, _i, _b, _l) { \ | 658 | #define msi2500_dbg_usb_control_msg(_dev, _r, _t, _v, _i, _b, _l) { \ |
656 | char *_direction; \ | 659 | char *_direction; \ |
@@ -663,7 +666,7 @@ static void msi2500_buf_queue(struct vb2_buffer *vb) | |||
663 | _l & 0xff, _l >> 8, _direction, _l, _b); \ | 666 | _l & 0xff, _l >> 8, _direction, _l, _b); \ |
664 | } | 667 | } |
665 | 668 | ||
666 | static int msi2500_ctrl_msg(struct msi2500_state *s, u8 cmd, u32 data) | 669 | static int msi2500_ctrl_msg(struct msi2500_dev *dev, u8 cmd, u32 data) |
667 | { | 670 | { |
668 | int ret; | 671 | int ret; |
669 | u8 request = cmd; | 672 | u8 request = cmd; |
@@ -671,39 +674,38 @@ static int msi2500_ctrl_msg(struct msi2500_state *s, u8 cmd, u32 data) | |||
671 | u16 value = (data >> 0) & 0xffff; | 674 | u16 value = (data >> 0) & 0xffff; |
672 | u16 index = (data >> 16) & 0xffff; | 675 | u16 index = (data >> 16) & 0xffff; |
673 | 676 | ||
674 | msi2500_dbg_usb_control_msg(s->dev, | 677 | msi2500_dbg_usb_control_msg(dev->dev, request, requesttype, |
675 | request, requesttype, value, index, NULL, 0); | 678 | value, index, NULL, 0); |
676 | ret = usb_control_msg(s->udev, usb_sndctrlpipe(s->udev, 0), | 679 | ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), request, |
677 | request, requesttype, value, index, NULL, 0, 2000); | 680 | requesttype, value, index, NULL, 0, 2000); |
678 | if (ret) | 681 | if (ret) |
679 | dev_err(s->dev, "failed %d, cmd %02x, data %04x\n", | 682 | dev_err(dev->dev, "failed %d, cmd %02x, data %04x\n", |
680 | ret, cmd, data); | 683 | ret, cmd, data); |
681 | 684 | ||
682 | return ret; | 685 | return ret; |
683 | } | 686 | } |
684 | 687 | ||
685 | #define F_REF 24000000 | 688 | static int msi2500_set_usb_adc(struct msi2500_dev *dev) |
686 | #define DIV_R_IN 2 | ||
687 | static int msi2500_set_usb_adc(struct msi2500_state *s) | ||
688 | { | 689 | { |
689 | int ret, div_n, div_m, div_r_out, f_sr, f_vco, fract; | 690 | int ret; |
691 | unsigned int f_vco, f_sr, div_n, k, k_cw, div_out; | ||
690 | u32 reg3, reg4, reg7; | 692 | u32 reg3, reg4, reg7; |
691 | struct v4l2_ctrl *bandwidth_auto; | 693 | struct v4l2_ctrl *bandwidth_auto; |
692 | struct v4l2_ctrl *bandwidth; | 694 | struct v4l2_ctrl *bandwidth; |
693 | 695 | ||
694 | f_sr = s->f_adc; | 696 | f_sr = dev->f_adc; |
695 | 697 | ||
696 | /* set tuner, subdev, filters according to sampling rate */ | 698 | /* set tuner, subdev, filters according to sampling rate */ |
697 | bandwidth_auto = v4l2_ctrl_find(&s->hdl, | 699 | bandwidth_auto = v4l2_ctrl_find(&dev->hdl, |
698 | V4L2_CID_RF_TUNER_BANDWIDTH_AUTO); | 700 | V4L2_CID_RF_TUNER_BANDWIDTH_AUTO); |
699 | if (v4l2_ctrl_g_ctrl(bandwidth_auto)) { | 701 | if (v4l2_ctrl_g_ctrl(bandwidth_auto)) { |
700 | bandwidth = v4l2_ctrl_find(&s->hdl, | 702 | bandwidth = v4l2_ctrl_find(&dev->hdl, |
701 | V4L2_CID_RF_TUNER_BANDWIDTH); | 703 | V4L2_CID_RF_TUNER_BANDWIDTH); |
702 | v4l2_ctrl_s_ctrl(bandwidth, s->f_adc); | 704 | v4l2_ctrl_s_ctrl(bandwidth, dev->f_adc); |
703 | } | 705 | } |
704 | 706 | ||
705 | /* select stream format */ | 707 | /* select stream format */ |
706 | switch (s->pixelformat) { | 708 | switch (dev->pixelformat) { |
707 | case V4L2_SDR_FMT_CU8: | 709 | case V4L2_SDR_FMT_CU8: |
708 | reg7 = 0x000c9407; /* 504 */ | 710 | reg7 = 0x000c9407; /* 504 */ |
709 | break; | 711 | break; |
@@ -728,6 +730,21 @@ static int msi2500_set_usb_adc(struct msi2500_state *s) | |||
728 | } | 730 | } |
729 | 731 | ||
730 | /* | 732 | /* |
733 | * Fractional-N synthesizer | ||
734 | * | ||
735 | * +----------------------------------------+ | ||
736 | * v | | ||
737 | * Fref +----+ +-------+ +-----+ +------+ +---+ | ||
738 | * ------> | PD | --> | VCO | --> | /2 | ------> | /N.F | <-- | K | | ||
739 | * +----+ +-------+ +-----+ +------+ +---+ | ||
740 | * | | ||
741 | * | | ||
742 | * v | ||
743 | * +-------+ +-----+ Fout | ||
744 | * | /Rout | --> | /12 | ------> | ||
745 | * +-------+ +-----+ | ||
746 | */ | ||
747 | /* | ||
731 | * Synthesizer config is just a educated guess... | 748 | * Synthesizer config is just a educated guess... |
732 | * | 749 | * |
733 | * [7:0] 0x03, register address | 750 | * [7:0] 0x03, register address |
@@ -754,10 +771,14 @@ static int msi2500_set_usb_adc(struct msi2500_state *s) | |||
754 | * | 771 | * |
755 | * VCO 202000000 - 720000000++ | 772 | * VCO 202000000 - 720000000++ |
756 | */ | 773 | */ |
774 | |||
775 | #define F_REF 24000000 | ||
776 | #define DIV_PRE_N 2 | ||
777 | #define DIV_LO_OUT 12 | ||
757 | reg3 = 0x01000303; | 778 | reg3 = 0x01000303; |
758 | reg4 = 0x00000004; | 779 | reg4 = 0x00000004; |
759 | 780 | ||
760 | /* XXX: Filters? AGC? */ | 781 | /* XXX: Filters? AGC? VCO band? */ |
761 | if (f_sr < 6000000) | 782 | if (f_sr < 6000000) |
762 | reg3 |= 0x1 << 20; | 783 | reg3 |= 0x1 << 20; |
763 | else if (f_sr < 7000000) | 784 | else if (f_sr < 7000000) |
@@ -767,54 +788,55 @@ static int msi2500_set_usb_adc(struct msi2500_state *s) | |||
767 | else | 788 | else |
768 | reg3 |= 0xd << 20; | 789 | reg3 |= 0xd << 20; |
769 | 790 | ||
770 | for (div_r_out = 4; div_r_out < 16; div_r_out += 2) { | 791 | for (div_out = 4; div_out < 16; div_out += 2) { |
771 | f_vco = f_sr * div_r_out * 12; | 792 | f_vco = f_sr * div_out * DIV_LO_OUT; |
772 | dev_dbg(s->dev, "div_r_out=%d f_vco=%d\n", div_r_out, f_vco); | 793 | dev_dbg(dev->dev, "div_out=%u f_vco=%u\n", div_out, f_vco); |
773 | if (f_vco >= 202000000) | 794 | if (f_vco >= 202000000) |
774 | break; | 795 | break; |
775 | } | 796 | } |
776 | 797 | ||
777 | div_n = f_vco / (F_REF * DIV_R_IN); | 798 | /* Calculate PLL integer and fractional control word. */ |
778 | div_m = f_vco % (F_REF * DIV_R_IN); | 799 | div_n = div_u64_rem(f_vco, DIV_PRE_N * F_REF, &k); |
779 | fract = 0x200000ul * div_m / (F_REF * DIV_R_IN); | 800 | k_cw = div_u64((u64) k * 0x200000, DIV_PRE_N * F_REF); |
780 | 801 | ||
781 | reg3 |= div_n << 16; | 802 | reg3 |= div_n << 16; |
782 | reg3 |= (div_r_out / 2 - 1) << 10; | 803 | reg3 |= (div_out / 2 - 1) << 10; |
783 | reg3 |= ((fract >> 20) & 0x000001) << 15; /* [20] */ | 804 | reg3 |= ((k_cw >> 20) & 0x000001) << 15; /* [20] */ |
784 | reg4 |= ((fract >> 0) & 0x0fffff) << 8; /* [19:0] */ | 805 | reg4 |= ((k_cw >> 0) & 0x0fffff) << 8; /* [19:0] */ |
785 | 806 | ||
786 | dev_dbg(s->dev, "f_sr=%d f_vco=%d div_n=%d div_m=%d div_r_out=%d reg3=%08x reg4=%08x\n", | 807 | dev_dbg(dev->dev, |
787 | f_sr, f_vco, div_n, div_m, div_r_out, reg3, reg4); | 808 | "f_sr=%u f_vco=%u div_n=%u k=%u div_out=%u reg3=%08x reg4=%08x\n", |
809 | f_sr, f_vco, div_n, k, div_out, reg3, reg4); | ||
788 | 810 | ||
789 | ret = msi2500_ctrl_msg(s, CMD_WREG, 0x00608008); | 811 | ret = msi2500_ctrl_msg(dev, CMD_WREG, 0x00608008); |
790 | if (ret) | 812 | if (ret) |
791 | goto err; | 813 | goto err; |
792 | 814 | ||
793 | ret = msi2500_ctrl_msg(s, CMD_WREG, 0x00000c05); | 815 | ret = msi2500_ctrl_msg(dev, CMD_WREG, 0x00000c05); |
794 | if (ret) | 816 | if (ret) |
795 | goto err; | 817 | goto err; |
796 | 818 | ||
797 | ret = msi2500_ctrl_msg(s, CMD_WREG, 0x00020000); | 819 | ret = msi2500_ctrl_msg(dev, CMD_WREG, 0x00020000); |
798 | if (ret) | 820 | if (ret) |
799 | goto err; | 821 | goto err; |
800 | 822 | ||
801 | ret = msi2500_ctrl_msg(s, CMD_WREG, 0x00480102); | 823 | ret = msi2500_ctrl_msg(dev, CMD_WREG, 0x00480102); |
802 | if (ret) | 824 | if (ret) |
803 | goto err; | 825 | goto err; |
804 | 826 | ||
805 | ret = msi2500_ctrl_msg(s, CMD_WREG, 0x00f38008); | 827 | ret = msi2500_ctrl_msg(dev, CMD_WREG, 0x00f38008); |
806 | if (ret) | 828 | if (ret) |
807 | goto err; | 829 | goto err; |
808 | 830 | ||
809 | ret = msi2500_ctrl_msg(s, CMD_WREG, reg7); | 831 | ret = msi2500_ctrl_msg(dev, CMD_WREG, reg7); |
810 | if (ret) | 832 | if (ret) |
811 | goto err; | 833 | goto err; |
812 | 834 | ||
813 | ret = msi2500_ctrl_msg(s, CMD_WREG, reg4); | 835 | ret = msi2500_ctrl_msg(dev, CMD_WREG, reg4); |
814 | if (ret) | 836 | if (ret) |
815 | goto err; | 837 | goto err; |
816 | 838 | ||
817 | ret = msi2500_ctrl_msg(s, CMD_WREG, reg3); | 839 | ret = msi2500_ctrl_msg(dev, CMD_WREG, reg3); |
818 | if (ret) | 840 | if (ret) |
819 | goto err; | 841 | goto err; |
820 | err: | 842 | err: |
@@ -823,57 +845,57 @@ err: | |||
823 | 845 | ||
824 | static int msi2500_start_streaming(struct vb2_queue *vq, unsigned int count) | 846 | static int msi2500_start_streaming(struct vb2_queue *vq, unsigned int count) |
825 | { | 847 | { |
826 | struct msi2500_state *s = vb2_get_drv_priv(vq); | 848 | struct msi2500_dev *dev = vb2_get_drv_priv(vq); |
827 | int ret; | 849 | int ret; |
828 | 850 | ||
829 | dev_dbg(s->dev, "\n"); | 851 | dev_dbg(dev->dev, "\n"); |
830 | 852 | ||
831 | if (!s->udev) | 853 | if (!dev->udev) |
832 | return -ENODEV; | 854 | return -ENODEV; |
833 | 855 | ||
834 | if (mutex_lock_interruptible(&s->v4l2_lock)) | 856 | if (mutex_lock_interruptible(&dev->v4l2_lock)) |
835 | return -ERESTARTSYS; | 857 | return -ERESTARTSYS; |
836 | 858 | ||
837 | /* wake-up tuner */ | 859 | /* wake-up tuner */ |
838 | v4l2_subdev_call(s->v4l2_subdev, core, s_power, 1); | 860 | v4l2_subdev_call(dev->v4l2_subdev, core, s_power, 1); |
839 | 861 | ||
840 | ret = msi2500_set_usb_adc(s); | 862 | ret = msi2500_set_usb_adc(dev); |
841 | 863 | ||
842 | ret = msi2500_isoc_init(s); | 864 | ret = msi2500_isoc_init(dev); |
843 | if (ret) | 865 | if (ret) |
844 | msi2500_cleanup_queued_bufs(s); | 866 | msi2500_cleanup_queued_bufs(dev); |
845 | 867 | ||
846 | ret = msi2500_ctrl_msg(s, CMD_START_STREAMING, 0); | 868 | ret = msi2500_ctrl_msg(dev, CMD_START_STREAMING, 0); |
847 | 869 | ||
848 | mutex_unlock(&s->v4l2_lock); | 870 | mutex_unlock(&dev->v4l2_lock); |
849 | 871 | ||
850 | return ret; | 872 | return ret; |
851 | } | 873 | } |
852 | 874 | ||
853 | static void msi2500_stop_streaming(struct vb2_queue *vq) | 875 | static void msi2500_stop_streaming(struct vb2_queue *vq) |
854 | { | 876 | { |
855 | struct msi2500_state *s = vb2_get_drv_priv(vq); | 877 | struct msi2500_dev *dev = vb2_get_drv_priv(vq); |
856 | 878 | ||
857 | dev_dbg(s->dev, "\n"); | 879 | dev_dbg(dev->dev, "\n"); |
858 | 880 | ||
859 | mutex_lock(&s->v4l2_lock); | 881 | mutex_lock(&dev->v4l2_lock); |
860 | 882 | ||
861 | if (s->udev) | 883 | if (dev->udev) |
862 | msi2500_isoc_cleanup(s); | 884 | msi2500_isoc_cleanup(dev); |
863 | 885 | ||
864 | msi2500_cleanup_queued_bufs(s); | 886 | msi2500_cleanup_queued_bufs(dev); |
865 | 887 | ||
866 | /* according to tests, at least 700us delay is required */ | 888 | /* according to tests, at least 700us delay is required */ |
867 | msleep(20); | 889 | msleep(20); |
868 | if (!msi2500_ctrl_msg(s, CMD_STOP_STREAMING, 0)) { | 890 | if (!msi2500_ctrl_msg(dev, CMD_STOP_STREAMING, 0)) { |
869 | /* sleep USB IF / ADC */ | 891 | /* sleep USB IF / ADC */ |
870 | msi2500_ctrl_msg(s, CMD_WREG, 0x01000003); | 892 | msi2500_ctrl_msg(dev, CMD_WREG, 0x01000003); |
871 | } | 893 | } |
872 | 894 | ||
873 | /* sleep tuner */ | 895 | /* sleep tuner */ |
874 | v4l2_subdev_call(s->v4l2_subdev, core, s_power, 0); | 896 | v4l2_subdev_call(dev->v4l2_subdev, core, s_power, 0); |
875 | 897 | ||
876 | mutex_unlock(&s->v4l2_lock); | 898 | mutex_unlock(&dev->v4l2_lock); |
877 | } | 899 | } |
878 | 900 | ||
879 | static struct vb2_ops msi2500_vb2_ops = { | 901 | static struct vb2_ops msi2500_vb2_ops = { |
@@ -886,13 +908,13 @@ static struct vb2_ops msi2500_vb2_ops = { | |||
886 | }; | 908 | }; |
887 | 909 | ||
888 | static int msi2500_enum_fmt_sdr_cap(struct file *file, void *priv, | 910 | static int msi2500_enum_fmt_sdr_cap(struct file *file, void *priv, |
889 | struct v4l2_fmtdesc *f) | 911 | struct v4l2_fmtdesc *f) |
890 | { | 912 | { |
891 | struct msi2500_state *s = video_drvdata(file); | 913 | struct msi2500_dev *dev = video_drvdata(file); |
892 | 914 | ||
893 | dev_dbg(s->dev, "index=%d\n", f->index); | 915 | dev_dbg(dev->dev, "index=%d\n", f->index); |
894 | 916 | ||
895 | if (f->index >= s->num_formats) | 917 | if (f->index >= dev->num_formats) |
896 | return -EINVAL; | 918 | return -EINVAL; |
897 | 919 | ||
898 | strlcpy(f->description, formats[f->index].name, sizeof(f->description)); | 920 | strlcpy(f->description, formats[f->index].name, sizeof(f->description)); |
@@ -902,45 +924,45 @@ static int msi2500_enum_fmt_sdr_cap(struct file *file, void *priv, | |||
902 | } | 924 | } |
903 | 925 | ||
904 | static int msi2500_g_fmt_sdr_cap(struct file *file, void *priv, | 926 | static int msi2500_g_fmt_sdr_cap(struct file *file, void *priv, |
905 | struct v4l2_format *f) | 927 | struct v4l2_format *f) |
906 | { | 928 | { |
907 | struct msi2500_state *s = video_drvdata(file); | 929 | struct msi2500_dev *dev = video_drvdata(file); |
908 | 930 | ||
909 | dev_dbg(s->dev, "pixelformat fourcc %4.4s\n", | 931 | dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n", |
910 | (char *)&s->pixelformat); | 932 | (char *)&dev->pixelformat); |
911 | 933 | ||
912 | f->fmt.sdr.pixelformat = s->pixelformat; | 934 | f->fmt.sdr.pixelformat = dev->pixelformat; |
913 | f->fmt.sdr.buffersize = s->buffersize; | 935 | f->fmt.sdr.buffersize = dev->buffersize; |
914 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); | 936 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); |
915 | 937 | ||
916 | return 0; | 938 | return 0; |
917 | } | 939 | } |
918 | 940 | ||
919 | static int msi2500_s_fmt_sdr_cap(struct file *file, void *priv, | 941 | static int msi2500_s_fmt_sdr_cap(struct file *file, void *priv, |
920 | struct v4l2_format *f) | 942 | struct v4l2_format *f) |
921 | { | 943 | { |
922 | struct msi2500_state *s = video_drvdata(file); | 944 | struct msi2500_dev *dev = video_drvdata(file); |
923 | struct vb2_queue *q = &s->vb_queue; | 945 | struct vb2_queue *q = &dev->vb_queue; |
924 | int i; | 946 | int i; |
925 | 947 | ||
926 | dev_dbg(s->dev, "pixelformat fourcc %4.4s\n", | 948 | dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n", |
927 | (char *)&f->fmt.sdr.pixelformat); | 949 | (char *)&f->fmt.sdr.pixelformat); |
928 | 950 | ||
929 | if (vb2_is_busy(q)) | 951 | if (vb2_is_busy(q)) |
930 | return -EBUSY; | 952 | return -EBUSY; |
931 | 953 | ||
932 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); | 954 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); |
933 | for (i = 0; i < s->num_formats; i++) { | 955 | for (i = 0; i < dev->num_formats; i++) { |
934 | if (formats[i].pixelformat == f->fmt.sdr.pixelformat) { | 956 | if (formats[i].pixelformat == f->fmt.sdr.pixelformat) { |
935 | s->pixelformat = formats[i].pixelformat; | 957 | dev->pixelformat = formats[i].pixelformat; |
936 | s->buffersize = formats[i].buffersize; | 958 | dev->buffersize = formats[i].buffersize; |
937 | f->fmt.sdr.buffersize = formats[i].buffersize; | 959 | f->fmt.sdr.buffersize = formats[i].buffersize; |
938 | return 0; | 960 | return 0; |
939 | } | 961 | } |
940 | } | 962 | } |
941 | 963 | ||
942 | s->pixelformat = formats[0].pixelformat; | 964 | dev->pixelformat = formats[0].pixelformat; |
943 | s->buffersize = formats[0].buffersize; | 965 | dev->buffersize = formats[0].buffersize; |
944 | f->fmt.sdr.pixelformat = formats[0].pixelformat; | 966 | f->fmt.sdr.pixelformat = formats[0].pixelformat; |
945 | f->fmt.sdr.buffersize = formats[0].buffersize; | 967 | f->fmt.sdr.buffersize = formats[0].buffersize; |
946 | 968 | ||
@@ -948,16 +970,16 @@ static int msi2500_s_fmt_sdr_cap(struct file *file, void *priv, | |||
948 | } | 970 | } |
949 | 971 | ||
950 | static int msi2500_try_fmt_sdr_cap(struct file *file, void *priv, | 972 | static int msi2500_try_fmt_sdr_cap(struct file *file, void *priv, |
951 | struct v4l2_format *f) | 973 | struct v4l2_format *f) |
952 | { | 974 | { |
953 | struct msi2500_state *s = video_drvdata(file); | 975 | struct msi2500_dev *dev = video_drvdata(file); |
954 | int i; | 976 | int i; |
955 | 977 | ||
956 | dev_dbg(s->dev, "pixelformat fourcc %4.4s\n", | 978 | dev_dbg(dev->dev, "pixelformat fourcc %4.4s\n", |
957 | (char *)&f->fmt.sdr.pixelformat); | 979 | (char *)&f->fmt.sdr.pixelformat); |
958 | 980 | ||
959 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); | 981 | memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); |
960 | for (i = 0; i < s->num_formats; i++) { | 982 | for (i = 0; i < dev->num_formats; i++) { |
961 | if (formats[i].pixelformat == f->fmt.sdr.pixelformat) { | 983 | if (formats[i].pixelformat == f->fmt.sdr.pixelformat) { |
962 | f->fmt.sdr.buffersize = formats[i].buffersize; | 984 | f->fmt.sdr.buffersize = formats[i].buffersize; |
963 | return 0; | 985 | return 0; |
@@ -971,17 +993,17 @@ static int msi2500_try_fmt_sdr_cap(struct file *file, void *priv, | |||
971 | } | 993 | } |
972 | 994 | ||
973 | static int msi2500_s_tuner(struct file *file, void *priv, | 995 | static int msi2500_s_tuner(struct file *file, void *priv, |
974 | const struct v4l2_tuner *v) | 996 | const struct v4l2_tuner *v) |
975 | { | 997 | { |
976 | struct msi2500_state *s = video_drvdata(file); | 998 | struct msi2500_dev *dev = video_drvdata(file); |
977 | int ret; | 999 | int ret; |
978 | 1000 | ||
979 | dev_dbg(s->dev, "index=%d\n", v->index); | 1001 | dev_dbg(dev->dev, "index=%d\n", v->index); |
980 | 1002 | ||
981 | if (v->index == 0) | 1003 | if (v->index == 0) |
982 | ret = 0; | 1004 | ret = 0; |
983 | else if (v->index == 1) | 1005 | else if (v->index == 1) |
984 | ret = v4l2_subdev_call(s->v4l2_subdev, tuner, s_tuner, v); | 1006 | ret = v4l2_subdev_call(dev->v4l2_subdev, tuner, s_tuner, v); |
985 | else | 1007 | else |
986 | ret = -EINVAL; | 1008 | ret = -EINVAL; |
987 | 1009 | ||
@@ -990,10 +1012,10 @@ static int msi2500_s_tuner(struct file *file, void *priv, | |||
990 | 1012 | ||
991 | static int msi2500_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v) | 1013 | static int msi2500_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v) |
992 | { | 1014 | { |
993 | struct msi2500_state *s = video_drvdata(file); | 1015 | struct msi2500_dev *dev = video_drvdata(file); |
994 | int ret; | 1016 | int ret; |
995 | 1017 | ||
996 | dev_dbg(s->dev, "index=%d\n", v->index); | 1018 | dev_dbg(dev->dev, "index=%d\n", v->index); |
997 | 1019 | ||
998 | if (v->index == 0) { | 1020 | if (v->index == 0) { |
999 | strlcpy(v->name, "Mirics MSi2500", sizeof(v->name)); | 1021 | strlcpy(v->name, "Mirics MSi2500", sizeof(v->name)); |
@@ -1003,7 +1025,7 @@ static int msi2500_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v) | |||
1003 | v->rangehigh = 15000000; | 1025 | v->rangehigh = 15000000; |
1004 | ret = 0; | 1026 | ret = 0; |
1005 | } else if (v->index == 1) { | 1027 | } else if (v->index == 1) { |
1006 | ret = v4l2_subdev_call(s->v4l2_subdev, tuner, g_tuner, v); | 1028 | ret = v4l2_subdev_call(dev->v4l2_subdev, tuner, g_tuner, v); |
1007 | } else { | 1029 | } else { |
1008 | ret = -EINVAL; | 1030 | ret = -EINVAL; |
1009 | } | 1031 | } |
@@ -1012,19 +1034,19 @@ static int msi2500_g_tuner(struct file *file, void *priv, struct v4l2_tuner *v) | |||
1012 | } | 1034 | } |
1013 | 1035 | ||
1014 | static int msi2500_g_frequency(struct file *file, void *priv, | 1036 | static int msi2500_g_frequency(struct file *file, void *priv, |
1015 | struct v4l2_frequency *f) | 1037 | struct v4l2_frequency *f) |
1016 | { | 1038 | { |
1017 | struct msi2500_state *s = video_drvdata(file); | 1039 | struct msi2500_dev *dev = video_drvdata(file); |
1018 | int ret = 0; | 1040 | int ret = 0; |
1019 | 1041 | ||
1020 | dev_dbg(s->dev, "tuner=%d type=%d\n", f->tuner, f->type); | 1042 | dev_dbg(dev->dev, "tuner=%d type=%d\n", f->tuner, f->type); |
1021 | 1043 | ||
1022 | if (f->tuner == 0) { | 1044 | if (f->tuner == 0) { |
1023 | f->frequency = s->f_adc; | 1045 | f->frequency = dev->f_adc; |
1024 | ret = 0; | 1046 | ret = 0; |
1025 | } else if (f->tuner == 1) { | 1047 | } else if (f->tuner == 1) { |
1026 | f->type = V4L2_TUNER_RF; | 1048 | f->type = V4L2_TUNER_RF; |
1027 | ret = v4l2_subdev_call(s->v4l2_subdev, tuner, g_frequency, f); | 1049 | ret = v4l2_subdev_call(dev->v4l2_subdev, tuner, g_frequency, f); |
1028 | } else { | 1050 | } else { |
1029 | ret = -EINVAL; | 1051 | ret = -EINVAL; |
1030 | } | 1052 | } |
@@ -1033,22 +1055,22 @@ static int msi2500_g_frequency(struct file *file, void *priv, | |||
1033 | } | 1055 | } |
1034 | 1056 | ||
1035 | static int msi2500_s_frequency(struct file *file, void *priv, | 1057 | static int msi2500_s_frequency(struct file *file, void *priv, |
1036 | const struct v4l2_frequency *f) | 1058 | const struct v4l2_frequency *f) |
1037 | { | 1059 | { |
1038 | struct msi2500_state *s = video_drvdata(file); | 1060 | struct msi2500_dev *dev = video_drvdata(file); |
1039 | int ret; | 1061 | int ret; |
1040 | 1062 | ||
1041 | dev_dbg(s->dev, "tuner=%d type=%d frequency=%u\n", | 1063 | dev_dbg(dev->dev, "tuner=%d type=%d frequency=%u\n", |
1042 | f->tuner, f->type, f->frequency); | 1064 | f->tuner, f->type, f->frequency); |
1043 | 1065 | ||
1044 | if (f->tuner == 0) { | 1066 | if (f->tuner == 0) { |
1045 | s->f_adc = clamp_t(unsigned int, f->frequency, | 1067 | dev->f_adc = clamp_t(unsigned int, f->frequency, |
1046 | bands[0].rangelow, | 1068 | bands[0].rangelow, |
1047 | bands[0].rangehigh); | 1069 | bands[0].rangehigh); |
1048 | dev_dbg(s->dev, "ADC frequency=%u Hz\n", s->f_adc); | 1070 | dev_dbg(dev->dev, "ADC frequency=%u Hz\n", dev->f_adc); |
1049 | ret = msi2500_set_usb_adc(s); | 1071 | ret = msi2500_set_usb_adc(dev); |
1050 | } else if (f->tuner == 1) { | 1072 | } else if (f->tuner == 1) { |
1051 | ret = v4l2_subdev_call(s->v4l2_subdev, tuner, s_frequency, f); | 1073 | ret = v4l2_subdev_call(dev->v4l2_subdev, tuner, s_frequency, f); |
1052 | } else { | 1074 | } else { |
1053 | ret = -EINVAL; | 1075 | ret = -EINVAL; |
1054 | } | 1076 | } |
@@ -1057,13 +1079,13 @@ static int msi2500_s_frequency(struct file *file, void *priv, | |||
1057 | } | 1079 | } |
1058 | 1080 | ||
1059 | static int msi2500_enum_freq_bands(struct file *file, void *priv, | 1081 | static int msi2500_enum_freq_bands(struct file *file, void *priv, |
1060 | struct v4l2_frequency_band *band) | 1082 | struct v4l2_frequency_band *band) |
1061 | { | 1083 | { |
1062 | struct msi2500_state *s = video_drvdata(file); | 1084 | struct msi2500_dev *dev = video_drvdata(file); |
1063 | int ret; | 1085 | int ret; |
1064 | 1086 | ||
1065 | dev_dbg(s->dev, "tuner=%d type=%d index=%d\n", | 1087 | dev_dbg(dev->dev, "tuner=%d type=%d index=%d\n", |
1066 | band->tuner, band->type, band->index); | 1088 | band->tuner, band->type, band->index); |
1067 | 1089 | ||
1068 | if (band->tuner == 0) { | 1090 | if (band->tuner == 0) { |
1069 | if (band->index >= ARRAY_SIZE(bands)) { | 1091 | if (band->index >= ARRAY_SIZE(bands)) { |
@@ -1073,8 +1095,8 @@ static int msi2500_enum_freq_bands(struct file *file, void *priv, | |||
1073 | ret = 0; | 1095 | ret = 0; |
1074 | } | 1096 | } |
1075 | } else if (band->tuner == 1) { | 1097 | } else if (band->tuner == 1) { |
1076 | ret = v4l2_subdev_call(s->v4l2_subdev, tuner, | 1098 | ret = v4l2_subdev_call(dev->v4l2_subdev, tuner, |
1077 | enum_freq_bands, band); | 1099 | enum_freq_bands, band); |
1078 | } else { | 1100 | } else { |
1079 | ret = -EINVAL; | 1101 | ret = -EINVAL; |
1080 | } | 1102 | } |
@@ -1131,29 +1153,28 @@ static struct video_device msi2500_template = { | |||
1131 | 1153 | ||
1132 | static void msi2500_video_release(struct v4l2_device *v) | 1154 | static void msi2500_video_release(struct v4l2_device *v) |
1133 | { | 1155 | { |
1134 | struct msi2500_state *s = | 1156 | struct msi2500_dev *dev = container_of(v, struct msi2500_dev, v4l2_dev); |
1135 | container_of(v, struct msi2500_state, v4l2_dev); | ||
1136 | 1157 | ||
1137 | v4l2_ctrl_handler_free(&s->hdl); | 1158 | v4l2_ctrl_handler_free(&dev->hdl); |
1138 | v4l2_device_unregister(&s->v4l2_dev); | 1159 | v4l2_device_unregister(&dev->v4l2_dev); |
1139 | kfree(s); | 1160 | kfree(dev); |
1140 | } | 1161 | } |
1141 | 1162 | ||
1142 | static int msi2500_transfer_one_message(struct spi_master *master, | 1163 | static int msi2500_transfer_one_message(struct spi_master *master, |
1143 | struct spi_message *m) | 1164 | struct spi_message *m) |
1144 | { | 1165 | { |
1145 | struct msi2500_state *s = spi_master_get_devdata(master); | 1166 | struct msi2500_dev *dev = spi_master_get_devdata(master); |
1146 | struct spi_transfer *t; | 1167 | struct spi_transfer *t; |
1147 | int ret = 0; | 1168 | int ret = 0; |
1148 | u32 data; | 1169 | u32 data; |
1149 | 1170 | ||
1150 | list_for_each_entry(t, &m->transfers, transfer_list) { | 1171 | list_for_each_entry(t, &m->transfers, transfer_list) { |
1151 | dev_dbg(s->dev, "msg=%*ph\n", t->len, t->tx_buf); | 1172 | dev_dbg(dev->dev, "msg=%*ph\n", t->len, t->tx_buf); |
1152 | data = 0x09; /* reg 9 is SPI adapter */ | 1173 | data = 0x09; /* reg 9 is SPI adapter */ |
1153 | data |= ((u8 *)t->tx_buf)[0] << 8; | 1174 | data |= ((u8 *)t->tx_buf)[0] << 8; |
1154 | data |= ((u8 *)t->tx_buf)[1] << 16; | 1175 | data |= ((u8 *)t->tx_buf)[1] << 16; |
1155 | data |= ((u8 *)t->tx_buf)[2] << 24; | 1176 | data |= ((u8 *)t->tx_buf)[2] << 24; |
1156 | ret = msi2500_ctrl_msg(s, CMD_WREG, data); | 1177 | ret = msi2500_ctrl_msg(dev, CMD_WREG, data); |
1157 | } | 1178 | } |
1158 | 1179 | ||
1159 | m->status = ret; | 1180 | m->status = ret; |
@@ -1162,9 +1183,9 @@ static int msi2500_transfer_one_message(struct spi_master *master, | |||
1162 | } | 1183 | } |
1163 | 1184 | ||
1164 | static int msi2500_probe(struct usb_interface *intf, | 1185 | static int msi2500_probe(struct usb_interface *intf, |
1165 | const struct usb_device_id *id) | 1186 | const struct usb_device_id *id) |
1166 | { | 1187 | { |
1167 | struct msi2500_state *s; | 1188 | struct msi2500_dev *dev; |
1168 | struct v4l2_subdev *sd; | 1189 | struct v4l2_subdev *sd; |
1169 | struct spi_master *master; | 1190 | struct spi_master *master; |
1170 | int ret; | 1191 | int ret; |
@@ -1175,65 +1196,65 @@ static int msi2500_probe(struct usb_interface *intf, | |||
1175 | .max_speed_hz = 12000000, | 1196 | .max_speed_hz = 12000000, |
1176 | }; | 1197 | }; |
1177 | 1198 | ||
1178 | s = kzalloc(sizeof(struct msi2500_state), GFP_KERNEL); | 1199 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
1179 | if (s == NULL) { | 1200 | if (!dev) { |
1180 | dev_err(&intf->dev, "Could not allocate memory for state\n"); | 1201 | ret = -ENOMEM; |
1181 | return -ENOMEM; | 1202 | goto err; |
1182 | } | 1203 | } |
1183 | 1204 | ||
1184 | mutex_init(&s->v4l2_lock); | 1205 | mutex_init(&dev->v4l2_lock); |
1185 | mutex_init(&s->vb_queue_lock); | 1206 | mutex_init(&dev->vb_queue_lock); |
1186 | spin_lock_init(&s->queued_bufs_lock); | 1207 | spin_lock_init(&dev->queued_bufs_lock); |
1187 | INIT_LIST_HEAD(&s->queued_bufs); | 1208 | INIT_LIST_HEAD(&dev->queued_bufs); |
1188 | s->dev = &intf->dev; | 1209 | dev->dev = &intf->dev; |
1189 | s->udev = interface_to_usbdev(intf); | 1210 | dev->udev = interface_to_usbdev(intf); |
1190 | s->f_adc = bands[0].rangelow; | 1211 | dev->f_adc = bands[0].rangelow; |
1191 | s->pixelformat = formats[0].pixelformat; | 1212 | dev->pixelformat = formats[0].pixelformat; |
1192 | s->buffersize = formats[0].buffersize; | 1213 | dev->buffersize = formats[0].buffersize; |
1193 | s->num_formats = NUM_FORMATS; | 1214 | dev->num_formats = NUM_FORMATS; |
1194 | if (!msi2500_emulated_fmt) | 1215 | if (!msi2500_emulated_fmt) |
1195 | s->num_formats -= 2; | 1216 | dev->num_formats -= 2; |
1196 | 1217 | ||
1197 | /* Init videobuf2 queue structure */ | 1218 | /* Init videobuf2 queue structure */ |
1198 | s->vb_queue.type = V4L2_BUF_TYPE_SDR_CAPTURE; | 1219 | dev->vb_queue.type = V4L2_BUF_TYPE_SDR_CAPTURE; |
1199 | s->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ; | 1220 | dev->vb_queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ; |
1200 | s->vb_queue.drv_priv = s; | 1221 | dev->vb_queue.drv_priv = dev; |
1201 | s->vb_queue.buf_struct_size = sizeof(struct msi2500_frame_buf); | 1222 | dev->vb_queue.buf_struct_size = sizeof(struct msi2500_frame_buf); |
1202 | s->vb_queue.ops = &msi2500_vb2_ops; | 1223 | dev->vb_queue.ops = &msi2500_vb2_ops; |
1203 | s->vb_queue.mem_ops = &vb2_vmalloc_memops; | 1224 | dev->vb_queue.mem_ops = &vb2_vmalloc_memops; |
1204 | s->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; | 1225 | dev->vb_queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; |
1205 | ret = vb2_queue_init(&s->vb_queue); | 1226 | ret = vb2_queue_init(&dev->vb_queue); |
1206 | if (ret) { | 1227 | if (ret) { |
1207 | dev_err(s->dev, "Could not initialize vb2 queue\n"); | 1228 | dev_err(dev->dev, "Could not initialize vb2 queue\n"); |
1208 | goto err_free_mem; | 1229 | goto err_free_mem; |
1209 | } | 1230 | } |
1210 | 1231 | ||
1211 | /* Init video_device structure */ | 1232 | /* Init video_device structure */ |
1212 | s->vdev = msi2500_template; | 1233 | dev->vdev = msi2500_template; |
1213 | s->vdev.queue = &s->vb_queue; | 1234 | dev->vdev.queue = &dev->vb_queue; |
1214 | s->vdev.queue->lock = &s->vb_queue_lock; | 1235 | dev->vdev.queue->lock = &dev->vb_queue_lock; |
1215 | video_set_drvdata(&s->vdev, s); | 1236 | video_set_drvdata(&dev->vdev, dev); |
1216 | 1237 | ||
1217 | /* Register the v4l2_device structure */ | 1238 | /* Register the v4l2_device structure */ |
1218 | s->v4l2_dev.release = msi2500_video_release; | 1239 | dev->v4l2_dev.release = msi2500_video_release; |
1219 | ret = v4l2_device_register(&intf->dev, &s->v4l2_dev); | 1240 | ret = v4l2_device_register(&intf->dev, &dev->v4l2_dev); |
1220 | if (ret) { | 1241 | if (ret) { |
1221 | dev_err(s->dev, "Failed to register v4l2-device (%d)\n", ret); | 1242 | dev_err(dev->dev, "Failed to register v4l2-device (%d)\n", ret); |
1222 | goto err_free_mem; | 1243 | goto err_free_mem; |
1223 | } | 1244 | } |
1224 | 1245 | ||
1225 | /* SPI master adapter */ | 1246 | /* SPI master adapter */ |
1226 | master = spi_alloc_master(s->dev, 0); | 1247 | master = spi_alloc_master(dev->dev, 0); |
1227 | if (master == NULL) { | 1248 | if (master == NULL) { |
1228 | ret = -ENOMEM; | 1249 | ret = -ENOMEM; |
1229 | goto err_unregister_v4l2_dev; | 1250 | goto err_unregister_v4l2_dev; |
1230 | } | 1251 | } |
1231 | 1252 | ||
1232 | s->master = master; | 1253 | dev->master = master; |
1233 | master->bus_num = 0; | 1254 | master->bus_num = 0; |
1234 | master->num_chipselect = 1; | 1255 | master->num_chipselect = 1; |
1235 | master->transfer_one_message = msi2500_transfer_one_message; | 1256 | master->transfer_one_message = msi2500_transfer_one_message; |
1236 | spi_master_set_devdata(master, s); | 1257 | spi_master_set_devdata(master, dev); |
1237 | ret = spi_register_master(master); | 1258 | ret = spi_register_master(master); |
1238 | if (ret) { | 1259 | if (ret) { |
1239 | spi_master_put(master); | 1260 | spi_master_put(master); |
@@ -1241,57 +1262,57 @@ static int msi2500_probe(struct usb_interface *intf, | |||
1241 | } | 1262 | } |
1242 | 1263 | ||
1243 | /* load v4l2 subdevice */ | 1264 | /* load v4l2 subdevice */ |
1244 | sd = v4l2_spi_new_subdev(&s->v4l2_dev, master, &board_info); | 1265 | sd = v4l2_spi_new_subdev(&dev->v4l2_dev, master, &board_info); |
1245 | s->v4l2_subdev = sd; | 1266 | dev->v4l2_subdev = sd; |
1246 | if (sd == NULL) { | 1267 | if (sd == NULL) { |
1247 | dev_err(s->dev, "cannot get v4l2 subdevice\n"); | 1268 | dev_err(dev->dev, "cannot get v4l2 subdevice\n"); |
1248 | ret = -ENODEV; | 1269 | ret = -ENODEV; |
1249 | goto err_unregister_master; | 1270 | goto err_unregister_master; |
1250 | } | 1271 | } |
1251 | 1272 | ||
1252 | /* Register controls */ | 1273 | /* Register controls */ |
1253 | v4l2_ctrl_handler_init(&s->hdl, 0); | 1274 | v4l2_ctrl_handler_init(&dev->hdl, 0); |
1254 | if (s->hdl.error) { | 1275 | if (dev->hdl.error) { |
1255 | ret = s->hdl.error; | 1276 | ret = dev->hdl.error; |
1256 | dev_err(s->dev, "Could not initialize controls\n"); | 1277 | dev_err(dev->dev, "Could not initialize controls\n"); |
1257 | goto err_free_controls; | 1278 | goto err_free_controls; |
1258 | } | 1279 | } |
1259 | 1280 | ||
1260 | /* currently all controls are from subdev */ | 1281 | /* currently all controls are from subdev */ |
1261 | v4l2_ctrl_add_handler(&s->hdl, sd->ctrl_handler, NULL); | 1282 | v4l2_ctrl_add_handler(&dev->hdl, sd->ctrl_handler, NULL); |
1262 | 1283 | ||
1263 | s->v4l2_dev.ctrl_handler = &s->hdl; | 1284 | dev->v4l2_dev.ctrl_handler = &dev->hdl; |
1264 | s->vdev.v4l2_dev = &s->v4l2_dev; | 1285 | dev->vdev.v4l2_dev = &dev->v4l2_dev; |
1265 | s->vdev.lock = &s->v4l2_lock; | 1286 | dev->vdev.lock = &dev->v4l2_lock; |
1266 | 1287 | ||
1267 | ret = video_register_device(&s->vdev, VFL_TYPE_SDR, -1); | 1288 | ret = video_register_device(&dev->vdev, VFL_TYPE_SDR, -1); |
1268 | if (ret) { | 1289 | if (ret) { |
1269 | dev_err(s->dev, "Failed to register as video device (%d)\n", | 1290 | dev_err(dev->dev, |
1270 | ret); | 1291 | "Failed to register as video device (%d)\n", ret); |
1271 | goto err_unregister_v4l2_dev; | 1292 | goto err_unregister_v4l2_dev; |
1272 | } | 1293 | } |
1273 | dev_info(s->dev, "Registered as %s\n", | 1294 | dev_info(dev->dev, "Registered as %s\n", |
1274 | video_device_node_name(&s->vdev)); | 1295 | video_device_node_name(&dev->vdev)); |
1275 | dev_notice(s->dev, "SDR API is still slightly experimental and functionality changes may follow\n"); | 1296 | dev_notice(dev->dev, |
1276 | 1297 | "SDR API is still slightly experimental and functionality changes may follow\n"); | |
1277 | return 0; | 1298 | return 0; |
1278 | |||
1279 | err_free_controls: | 1299 | err_free_controls: |
1280 | v4l2_ctrl_handler_free(&s->hdl); | 1300 | v4l2_ctrl_handler_free(&dev->hdl); |
1281 | err_unregister_master: | 1301 | err_unregister_master: |
1282 | spi_unregister_master(s->master); | 1302 | spi_unregister_master(dev->master); |
1283 | err_unregister_v4l2_dev: | 1303 | err_unregister_v4l2_dev: |
1284 | v4l2_device_unregister(&s->v4l2_dev); | 1304 | v4l2_device_unregister(&dev->v4l2_dev); |
1285 | err_free_mem: | 1305 | err_free_mem: |
1286 | kfree(s); | 1306 | kfree(dev); |
1307 | err: | ||
1287 | return ret; | 1308 | return ret; |
1288 | } | 1309 | } |
1289 | 1310 | ||
1290 | /* USB device ID list */ | 1311 | /* USB device ID list */ |
1291 | static struct usb_device_id msi2500_id_table[] = { | 1312 | static struct usb_device_id msi2500_id_table[] = { |
1292 | { USB_DEVICE(0x1df7, 0x2500) }, /* Mirics MSi3101 SDR Dongle */ | 1313 | {USB_DEVICE(0x1df7, 0x2500)}, /* Mirics MSi3101 SDR Dongle */ |
1293 | { USB_DEVICE(0x2040, 0xd300) }, /* Hauppauge WinTV 133559 LF */ | 1314 | {USB_DEVICE(0x2040, 0xd300)}, /* Hauppauge WinTV 133559 LF */ |
1294 | { } | 1315 | {} |
1295 | }; | 1316 | }; |
1296 | MODULE_DEVICE_TABLE(usb, msi2500_id_table); | 1317 | MODULE_DEVICE_TABLE(usb, msi2500_id_table); |
1297 | 1318 | ||