Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] msi2500: refactor USB stream copying

There was a lot of duplicated functionality between different
stream format handling. Refactor functionality in order to get
rid of duplicated code.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
8591f708 c08de62f

+109 -340
+109 -340
drivers/media/usb/msi2500/msi2500.c
··· 146 146 unsigned int vb_full; /* vb is full and packets dropped */ 147 147 148 148 struct urb *urbs[MAX_ISO_BUFS]; 149 - int (*convert_stream)(struct msi3101_state *s, u8 *dst, u8 *src, 150 - unsigned int src_len); 151 149 152 150 /* Controls */ 153 151 struct v4l2_ctrl_handler hdl; ··· 186 188 * +--------------------------------------------------------------------------- 187 189 * signed 8-bit sample 188 190 * 504 * 2 = 1008 samples 189 - */ 190 - static int msi3101_convert_stream_504(struct msi3101_state *s, u8 *dst, 191 - u8 *src, unsigned int src_len) 192 - { 193 - int i, i_max, dst_len = 0; 194 - u32 sample_num[3]; 195 - 196 - /* There could be 1-3 1024 bytes URB frames */ 197 - i_max = src_len / 1024; 198 - 199 - for (i = 0; i < i_max; i++) { 200 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 201 - if (i == 0 && s->next_sample != sample_num[0]) { 202 - dev_dbg_ratelimited(&s->udev->dev, 203 - "%d samples lost, %d %08x:%08x\n", 204 - sample_num[0] - s->next_sample, 205 - src_len, s->next_sample, sample_num[0]); 206 - } 207 - 208 - /* 209 - * Dump all unknown 'garbage' data - maybe we will discover 210 - * someday if there is something rational... 211 - */ 212 - dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]); 213 - 214 - /* 504 x I+Q samples */ 215 - src += 16; 216 - memcpy(dst, src, 1008); 217 - src += 1008; 218 - dst += 1008; 219 - dst_len += 1008; 220 - } 221 - 222 - /* calculate samping rate and output it in 10 seconds intervals */ 223 - if ((s->jiffies_next + msecs_to_jiffies(10000)) <= jiffies) { 224 - unsigned long jiffies_now = jiffies; 225 - unsigned long msecs = jiffies_to_msecs(jiffies_now) - jiffies_to_msecs(s->jiffies_next); 226 - unsigned int samples = sample_num[i_max - 1] - s->sample; 227 - 228 - s->jiffies_next = jiffies_now; 229 - s->sample = sample_num[i_max - 1]; 230 - dev_dbg(&s->udev->dev, 231 - "slen=%d samples=%u msecs=%lu sampling rate=%lu\n", 232 - src_len, samples, msecs, 233 - samples * 1000UL / msecs); 234 - } 235 - 236 - /* next sample (sample = sample + i * 504) */ 237 - s->next_sample = sample_num[i_max - 1] + 504; 238 - 239 - return dst_len; 240 - } 241 - 242 - static int msi3101_convert_stream_504_u8(struct msi3101_state *s, u8 *dst, 243 - u8 *src, unsigned int src_len) 244 - { 245 - int i, j, i_max, dst_len = 0; 246 - u32 sample_num[3]; 247 - s8 *s8src; 248 - u8 *u8dst; 249 - 250 - /* There could be 1-3 1024 bytes URB frames */ 251 - i_max = src_len / 1024; 252 - u8dst = (u8 *) dst; 253 - 254 - for (i = 0; i < i_max; i++) { 255 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 256 - if (i == 0 && s->next_sample != sample_num[0]) { 257 - dev_dbg_ratelimited(&s->udev->dev, 258 - "%d samples lost, %d %08x:%08x\n", 259 - sample_num[0] - s->next_sample, 260 - src_len, s->next_sample, sample_num[0]); 261 - } 262 - 263 - /* 264 - * Dump all unknown 'garbage' data - maybe we will discover 265 - * someday if there is something rational... 266 - */ 267 - dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]); 268 - 269 - /* 504 x I+Q samples */ 270 - src += 16; 271 - 272 - s8src = (s8 *) src; 273 - for (j = 0; j < 1008; j++) 274 - *u8dst++ = *s8src++ + 128; 275 - 276 - src += 1008; 277 - dst += 1008; 278 - dst_len += 1008; 279 - } 280 - 281 - /* calculate samping rate and output it in 10 seconds intervals */ 282 - if (unlikely(time_is_before_jiffies(s->jiffies_next))) { 283 - #define MSECS 10000UL 284 - unsigned int samples = sample_num[i_max - 1] - s->sample; 285 - 286 - s->jiffies_next = jiffies + msecs_to_jiffies(MSECS); 287 - s->sample = sample_num[i_max - 1]; 288 - dev_dbg(&s->udev->dev, 289 - "slen=%d samples=%u msecs=%lu sampling rate=%lu\n", 290 - src_len, samples, MSECS, 291 - samples * 1000UL / MSECS); 292 - } 293 - 294 - /* next sample (sample = sample + i * 504) */ 295 - s->next_sample = sample_num[i_max - 1] + 504; 296 - 297 - return dst_len; 298 - } 299 - 300 - /* 191 + * 192 + * 301 193 * +=========================================================================== 302 194 * | 00-1023 | USB packet type '384' 303 195 * +=========================================================================== ··· 230 342 * Number 2 (0b10) was never seen. 231 343 * 232 344 * 6 * 16 * 2 * 4 = 768 samples. 768 * 4 = 3072 bytes 233 - */ 234 - static int msi3101_convert_stream_384(struct msi3101_state *s, u8 *dst, 235 - u8 *src, unsigned int src_len) 236 - { 237 - int i, i_max, dst_len = 0; 238 - u32 sample_num[3]; 239 - 240 - /* There could be 1-3 1024 bytes URB frames */ 241 - i_max = src_len / 1024; 242 - for (i = 0; i < i_max; i++) { 243 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 244 - if (i == 0 && s->next_sample != sample_num[0]) { 245 - dev_dbg_ratelimited(&s->udev->dev, 246 - "%d samples lost, %d %08x:%08x\n", 247 - sample_num[0] - s->next_sample, 248 - src_len, s->next_sample, sample_num[0]); 249 - } 250 - 251 - /* 252 - * Dump all unknown 'garbage' data - maybe we will discover 253 - * someday if there is something rational... 254 - */ 255 - dev_dbg_ratelimited(&s->udev->dev, 256 - "%*ph %*ph\n", 12, &src[4], 24, &src[1000]); 257 - 258 - /* 384 x I+Q samples */ 259 - src += 16; 260 - memcpy(dst, src, 984); 261 - src += 984 + 24; 262 - dst += 984; 263 - dst_len += 984; 264 - } 265 - 266 - /* calculate samping rate and output it in 10 seconds intervals */ 267 - if ((s->jiffies_next + msecs_to_jiffies(10000)) <= jiffies) { 268 - unsigned long jiffies_now = jiffies; 269 - unsigned long msecs = jiffies_to_msecs(jiffies_now) - jiffies_to_msecs(s->jiffies_next); 270 - unsigned int samples = sample_num[i_max - 1] - s->sample; 271 - 272 - s->jiffies_next = jiffies_now; 273 - s->sample = sample_num[i_max - 1]; 274 - dev_dbg(&s->udev->dev, 275 - "slen=%d samples=%u msecs=%lu sampling rate=%lu bits=%d.%d.%d.%d\n", 276 - src_len, samples, msecs, 277 - samples * 1000UL / msecs, 278 - s->sample_ctrl_bit[0], s->sample_ctrl_bit[1], 279 - s->sample_ctrl_bit[2], s->sample_ctrl_bit[3]); 280 - } 281 - 282 - /* next sample (sample = sample + i * 384) */ 283 - s->next_sample = sample_num[i_max - 1] + 384; 284 - 285 - return dst_len; 286 - } 287 - 288 - /* 345 + * 346 + * 289 347 * +=========================================================================== 290 348 * | 00-1023 | USB packet type '336' 291 349 * +=========================================================================== ··· 242 408 * | 16-1023 | samples 243 409 * +--------------------------------------------------------------------------- 244 410 * signed 12-bit sample 245 - */ 246 - static int msi3101_convert_stream_336(struct msi3101_state *s, u8 *dst, 247 - u8 *src, unsigned int src_len) 248 - { 249 - int i, i_max, dst_len = 0; 250 - u32 sample_num[3]; 251 - 252 - /* There could be 1-3 1024 bytes URB frames */ 253 - i_max = src_len / 1024; 254 - 255 - for (i = 0; i < i_max; i++) { 256 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 257 - if (i == 0 && s->next_sample != sample_num[0]) { 258 - dev_dbg_ratelimited(&s->udev->dev, 259 - "%d samples lost, %d %08x:%08x\n", 260 - sample_num[0] - s->next_sample, 261 - src_len, s->next_sample, sample_num[0]); 262 - } 263 - 264 - /* 265 - * Dump all unknown 'garbage' data - maybe we will discover 266 - * someday if there is something rational... 267 - */ 268 - dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]); 269 - 270 - /* 336 x I+Q samples */ 271 - src += 16; 272 - memcpy(dst, src, 1008); 273 - src += 1008; 274 - dst += 1008; 275 - dst_len += 1008; 276 - } 277 - 278 - /* calculate samping rate and output it in 10 seconds intervals */ 279 - if ((s->jiffies_next + msecs_to_jiffies(10000)) <= jiffies) { 280 - unsigned long jiffies_now = jiffies; 281 - unsigned long msecs = jiffies_to_msecs(jiffies_now) - jiffies_to_msecs(s->jiffies_next); 282 - unsigned int samples = sample_num[i_max - 1] - s->sample; 283 - 284 - s->jiffies_next = jiffies_now; 285 - s->sample = sample_num[i_max - 1]; 286 - dev_dbg(&s->udev->dev, 287 - "slen=%d samples=%u msecs=%lu sampling rate=%lu\n", 288 - src_len, samples, msecs, 289 - samples * 1000UL / msecs); 290 - } 291 - 292 - /* next sample (sample = sample + i * 336) */ 293 - s->next_sample = sample_num[i_max - 1] + 336; 294 - 295 - return dst_len; 296 - } 297 - 298 - /* 411 + * 412 + * 299 413 * +=========================================================================== 300 414 * | 00-1023 | USB packet type '252' 301 415 * +=========================================================================== ··· 255 473 * +--------------------------------------------------------------------------- 256 474 * signed 14-bit sample 257 475 */ 258 - static int msi3101_convert_stream_252(struct msi3101_state *s, u8 *dst, 259 - u8 *src, unsigned int src_len) 476 + 477 + static int msi3101_convert_stream(struct msi3101_state *s, u8 *dst, u8 *src, 478 + unsigned int src_len) 260 479 { 261 - int i, i_max, dst_len = 0; 262 - u32 sample_num[3]; 480 + unsigned int i, j, transactions, dst_len = 0; 481 + u32 sample[3]; 263 482 264 - /* There could be 1-3 1024 bytes URB frames */ 265 - i_max = src_len / 1024; 483 + /* There could be 1-3 1024 byte transactions per packet */ 484 + transactions = src_len / 1024; 266 485 267 - for (i = 0; i < i_max; i++) { 268 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 269 - if (i == 0 && s->next_sample != sample_num[0]) { 486 + for (i = 0; i < transactions; i++) { 487 + sample[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | 488 + src[0] << 0; 489 + if (i == 0 && s->next_sample != sample[0]) { 270 490 dev_dbg_ratelimited(&s->udev->dev, 271 491 "%d samples lost, %d %08x:%08x\n", 272 - sample_num[0] - s->next_sample, 273 - src_len, s->next_sample, sample_num[0]); 492 + sample[0] - s->next_sample, 493 + src_len, s->next_sample, sample[0]); 274 494 } 275 495 276 496 /* ··· 281 497 */ 282 498 dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]); 283 499 284 - /* 252 x I+Q samples */ 285 - src += 16; 286 - memcpy(dst, src, 1008); 287 - src += 1008; 288 - dst += 1008; 289 - dst_len += 1008; 500 + src += 16; /* skip header */ 501 + 502 + switch (s->pixelformat) { 503 + case V4L2_SDR_FMT_CU8: /* 504 x IQ samples */ 504 + { 505 + s8 *s8src = (s8 *) src; 506 + u8 *u8dst = (u8 *) dst; 507 + 508 + for (j = 0; j < 1008; j++) 509 + *u8dst++ = *s8src++ + 128; 510 + 511 + src += 1008; 512 + dst += 1008; 513 + dst_len += 1008; 514 + s->next_sample = sample[i] + 504; 515 + break; 516 + } 517 + case V4L2_SDR_FMT_CU16LE: /* 252 x IQ samples */ 518 + { 519 + s16 *s16src = (s16 *) src; 520 + u16 *u16dst = (u16 *) dst; 521 + struct {signed int x:14; } se; /* sign extension */ 522 + unsigned int utmp; 523 + 524 + for (j = 0; j < 1008; j += 2) { 525 + /* sign extension from 14-bit to signed int */ 526 + se.x = *s16src++; 527 + /* from signed int to unsigned int */ 528 + utmp = se.x + 8192; 529 + /* from 14-bit to 16-bit */ 530 + *u16dst++ = utmp << 2 | utmp >> 12; 531 + } 532 + 533 + src += 1008; 534 + dst += 1008; 535 + dst_len += 1008; 536 + s->next_sample = sample[i] + 252; 537 + break; 538 + } 539 + case MSI2500_PIX_FMT_SDR_MSI2500_384: /* 384 x IQ samples */ 540 + /* Dump unknown 'garbage' data */ 541 + dev_dbg_ratelimited(&s->udev->dev, 542 + "%*ph\n", 24, &src[1000]); 543 + memcpy(dst, src, 984); 544 + src += 984 + 24; 545 + dst += 984; 546 + dst_len += 984; 547 + s->next_sample = sample[i] + 384; 548 + break; 549 + case V4L2_SDR_FMT_CS8: /* 504 x IQ samples */ 550 + memcpy(dst, src, 1008); 551 + src += 1008; 552 + dst += 1008; 553 + dst_len += 1008; 554 + s->next_sample = sample[i] + 504; 555 + break; 556 + case MSI2500_PIX_FMT_SDR_S12: /* 336 x IQ samples */ 557 + memcpy(dst, src, 1008); 558 + src += 1008; 559 + dst += 1008; 560 + dst_len += 1008; 561 + s->next_sample = sample[i] + 336; 562 + break; 563 + case V4L2_SDR_FMT_CS14LE: /* 252 x IQ samples */ 564 + memcpy(dst, src, 1008); 565 + src += 1008; 566 + dst += 1008; 567 + dst_len += 1008; 568 + s->next_sample = sample[i] + 252; 569 + break; 570 + default: 571 + break; 572 + } 290 573 } 291 574 292 - /* calculate samping rate and output it in 10 seconds intervals */ 293 - if ((s->jiffies_next + msecs_to_jiffies(10000)) <= jiffies) { 294 - unsigned long jiffies_now = jiffies; 295 - unsigned long msecs = jiffies_to_msecs(jiffies_now) - jiffies_to_msecs(s->jiffies_next); 296 - unsigned int samples = sample_num[i_max - 1] - s->sample; 575 + /* calculate sample rate and output it in 10 seconds intervals */ 576 + if (unlikely(time_is_before_jiffies(s->jiffies_next))) { 577 + #define MSECS 10000UL 578 + unsigned int msecs = jiffies_to_msecs(jiffies - 579 + s->jiffies_next + msecs_to_jiffies(MSECS)); 580 + unsigned int samples = s->next_sample - s->sample; 297 581 298 - s->jiffies_next = jiffies_now; 299 - s->sample = sample_num[i_max - 1]; 582 + s->jiffies_next = jiffies + msecs_to_jiffies(MSECS); 583 + s->sample = s->next_sample; 300 584 dev_dbg(&s->udev->dev, 301 - "slen=%d samples=%u msecs=%lu sampling rate=%lu\n", 585 + "size=%u samples=%u msecs=%u sample rate=%lu\n", 302 586 src_len, samples, msecs, 303 587 samples * 1000UL / msecs); 304 588 } 305 - 306 - /* next sample (sample = sample + i * 252) */ 307 - s->next_sample = sample_num[i_max - 1] + 252; 308 - 309 - return dst_len; 310 - } 311 - 312 - static int msi3101_convert_stream_252_u16(struct msi3101_state *s, u8 *dst, 313 - u8 *src, unsigned int src_len) 314 - { 315 - int i, j, i_max, dst_len = 0; 316 - u32 sample_num[3]; 317 - u16 *u16dst = (u16 *) dst; 318 - struct {signed int x:14; } se; 319 - 320 - /* There could be 1-3 1024 bytes URB frames */ 321 - i_max = src_len / 1024; 322 - 323 - for (i = 0; i < i_max; i++) { 324 - sample_num[i] = src[3] << 24 | src[2] << 16 | src[1] << 8 | src[0] << 0; 325 - if (i == 0 && s->next_sample != sample_num[0]) { 326 - dev_dbg_ratelimited(&s->udev->dev, 327 - "%d samples lost, %d %08x:%08x\n", 328 - sample_num[0] - s->next_sample, 329 - src_len, s->next_sample, sample_num[0]); 330 - } 331 - 332 - /* 333 - * Dump all unknown 'garbage' data - maybe we will discover 334 - * someday if there is something rational... 335 - */ 336 - dev_dbg_ratelimited(&s->udev->dev, "%*ph\n", 12, &src[4]); 337 - 338 - /* 252 x I+Q samples */ 339 - src += 16; 340 - 341 - for (j = 0; j < 1008; j += 4) { 342 - unsigned int usample[2]; 343 - int ssample[2]; 344 - 345 - usample[0] = src[j + 0] >> 0 | src[j + 1] << 8; 346 - usample[1] = src[j + 2] >> 0 | src[j + 3] << 8; 347 - 348 - /* sign extension from 14-bit to signed int */ 349 - ssample[0] = se.x = usample[0]; 350 - ssample[1] = se.x = usample[1]; 351 - 352 - /* from signed to unsigned */ 353 - usample[0] = ssample[0] + 8192; 354 - usample[1] = ssample[1] + 8192; 355 - 356 - /* from 14-bit to 16-bit */ 357 - *u16dst++ = (usample[0] << 2) | (usample[0] >> 12); 358 - *u16dst++ = (usample[1] << 2) | (usample[1] >> 12); 359 - } 360 - 361 - src += 1008; 362 - dst += 1008; 363 - dst_len += 1008; 364 - } 365 - 366 - /* calculate samping rate and output it in 10 seconds intervals */ 367 - if (unlikely(time_is_before_jiffies(s->jiffies_next))) { 368 - #define MSECS 10000UL 369 - unsigned int samples = sample_num[i_max - 1] - s->sample; 370 - 371 - s->jiffies_next = jiffies + msecs_to_jiffies(MSECS); 372 - s->sample = sample_num[i_max - 1]; 373 - dev_dbg(&s->udev->dev, 374 - "slen=%d samples=%u msecs=%lu sampling rate=%lu\n", 375 - src_len, samples, MSECS, 376 - samples * 1000UL / MSECS); 377 - } 378 - 379 - /* next sample (sample = sample + i * 252) */ 380 - s->next_sample = sample_num[i_max - 1] + 252; 381 589 382 590 return dst_len; 383 591 } ··· 438 662 439 663 /* fill framebuffer */ 440 664 ptr = vb2_plane_vaddr(&fbuf->vb, 0); 441 - flen = s->convert_stream(s, ptr, iso_buf, flen); 665 + flen = msi3101_convert_stream(s, ptr, iso_buf, flen); 442 666 vb2_set_plane_payload(&fbuf->vb, 0, flen); 443 667 vb2_buffer_done(&fbuf->vb, VB2_BUF_STATE_DONE); 444 668 } ··· 721 945 /* select stream format */ 722 946 switch (s->pixelformat) { 723 947 case V4L2_SDR_FMT_CU8: 724 - s->convert_stream = msi3101_convert_stream_504_u8; 725 - reg7 = 0x000c9407; 948 + reg7 = 0x000c9407; /* 504 */ 726 949 break; 727 950 case V4L2_SDR_FMT_CU16LE: 728 - s->convert_stream = msi3101_convert_stream_252_u16; 729 - reg7 = 0x00009407; 951 + reg7 = 0x00009407; /* 252 */ 730 952 break; 731 953 case V4L2_SDR_FMT_CS8: 732 - s->convert_stream = msi3101_convert_stream_504; 733 - reg7 = 0x000c9407; 954 + reg7 = 0x000c9407; /* 504 */ 734 955 break; 735 956 case MSI2500_PIX_FMT_SDR_MSI2500_384: 736 - s->convert_stream = msi3101_convert_stream_384; 737 - reg7 = 0x0000a507; 957 + reg7 = 0x0000a507; /* 384 */ 738 958 break; 739 959 case MSI2500_PIX_FMT_SDR_S12: 740 - s->convert_stream = msi3101_convert_stream_336; 741 - reg7 = 0x00008507; 960 + reg7 = 0x00008507; /* 336 */ 742 961 break; 743 962 case V4L2_SDR_FMT_CS14LE: 744 - s->convert_stream = msi3101_convert_stream_252; 745 - reg7 = 0x00009407; 963 + reg7 = 0x00009407; /* 252 */ 746 964 break; 747 965 default: 748 - s->convert_stream = msi3101_convert_stream_504_u8; 749 - reg7 = 0x000c9407; 966 + reg7 = 0x000c9407; /* 504 */ 750 967 break; 751 968 } 752 969