Re: [PATCH v9 07/11] media: i2c: ov772x: Support frame interval handling

From: kbuild test robot
Date: Mon Feb 19 2018 - 23:26:30 EST


Hi Jacopo,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linuxtv-media/master]
[also build test WARNING on v4.16-rc2 next-20180220]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/Jacopo-Mondi/Renesas-Capture-Engine-Unit-CEU-V4L2-driver/20180220-101027
base: git://linuxtv.org/media_tree.git master
config: i386-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386

Note: it may well be a FALSE warning. FWIW you are at least aware of it now.
http://gcc.gnu.org/wiki/Better_Uninitialized_Warnings

All warnings (new ones prefixed by >>):

drivers/media/i2c/ov772x.c: In function 'ov772x_set_frame_rate.isra.2':
>> drivers/media/i2c/ov772x.c:643:7: warning: 'fsize' may be used uninitialized in this function [-Wmaybe-uninitialized]
pclk = fps * fsize;
~~~~~^~~~~~~~~~~~~

vim +/fsize +643 drivers/media/i2c/ov772x.c

604
605 static int ov772x_set_frame_rate(struct ov772x_priv *priv,
606 struct v4l2_fract *tpf,
607 const struct ov772x_color_format *cfmt,
608 const struct ov772x_win_size *win)
609 {
610 struct i2c_client *client = v4l2_get_subdevdata(&priv->subdev);
611 unsigned long fin = clk_get_rate(priv->clk);
612 unsigned int fps = tpf->numerator ?
613 tpf->denominator / tpf->numerator :
614 tpf->denominator;
615 unsigned int best_diff;
616 unsigned int fsize;
617 unsigned int pclk;
618 unsigned int diff;
619 unsigned int idx;
620 unsigned int i;
621 u8 clkrc = 0;
622 u8 com4 = 0;
623 int ret;
624
625 /* Approximate to the closest supported frame interval. */
626 best_diff = ~0L;
627 for (i = 0, idx = 0; i < OV772X_N_FRAME_INTERVALS; i++) {
628 diff = abs(fps - ov772x_frame_intervals[i]);
629 if (diff < best_diff) {
630 idx = i;
631 best_diff = diff;
632 }
633 }
634 fps = ov772x_frame_intervals[idx];
635
636 /* Use image size (with blankings) to calculate desired pixel clock. */
637 if ((cfmt->com7 & OFMT_MASK) == OFMT_RGB ||
638 (cfmt->com7 & OFMT_MASK) == OFMT_YUV)
639 fsize = win->sizeimage * 2;
640 else if ((cfmt->com7 & OFMT_MASK) == OFMT_BRAW)
641 fsize = win->sizeimage;
642
> 643 pclk = fps * fsize;
644
645 /*
646 * Pixel clock generation circuit is pretty simple:
647 *
648 * Fin -> [ / CLKRC_div] -> [ * PLL_mult] -> pclk
649 *
650 * Try to approximate the desired pixel clock testing all available
651 * PLL multipliers (1x, 4x, 6x, 8x) and calculate corresponding
652 * divisor with:
653 *
654 * div = PLL_mult * Fin / pclk
655 *
656 * and re-calculate the pixel clock using it:
657 *
658 * pclk = Fin * PLL_mult / CLKRC_div
659 *
660 * Choose the PLL_mult and CLKRC_div pair that gives a pixel clock
661 * closer to the desired one.
662 *
663 * The desired pixel clock is calculated using a known frame size
664 * (blanking included) and FPS.
665 */
666 best_diff = ~0L;
667 for (i = 0; i < ARRAY_SIZE(ov772x_pll); i++) {
668 unsigned int pll_mult = ov772x_pll[i].mult;
669 unsigned int pll_out = pll_mult * fin;
670 unsigned int t_pclk;
671 unsigned int div;
672
673 if (pll_out < pclk)
674 continue;
675
676 div = DIV_ROUND_CLOSEST(pll_out, pclk);
677 t_pclk = DIV_ROUND_CLOSEST(fin * pll_mult, div);
678 diff = abs(pclk - t_pclk);
679 if (diff < best_diff) {
680 best_diff = diff;
681 clkrc = CLKRC_DIV(div);
682 com4 = ov772x_pll[i].com4;
683 }
684 }
685
686 ret = ov772x_write(client, COM4, com4 | COM4_RESERVED);
687 if (ret < 0)
688 return ret;
689
690 ret = ov772x_write(client, CLKRC, clkrc | CLKRC_RESERVED);
691 if (ret < 0)
692 return ret;
693
694 tpf->numerator = 1;
695 tpf->denominator = fps;
696 priv->fps = tpf->denominator;
697
698 return 0;
699 }
700

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

Attachment: .config.gz
Description: application/gzip