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

V4L/DVB (6220): TCM825x: Add support for vidioc_int_g_ifparm call, small cleanups

vidioc_int_g_ifparm returns platform-specific information about the
interface settings used by the sensor. Support for [gs]_ext_clk has
been removed.

Fix indentation and remove useless & characters.

Remove experiment for typechecking slave callback function arguments.

Signed-off-by: Sakari Ailus <sakari.ailus@nokia.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by

Sakari Ailus and committed by
Mauro Carvalho Chehab
20609557 768f4bd3

+61 -71
+57 -71
drivers/media/video/tcm825x.c
··· 470 470 return 0; 471 471 } 472 472 473 - /* 474 - * Given the image capture format in pix, the nominal frame period in 475 - * timeperframe, calculate the required xclk frequency. 476 - * 477 - * TCM825X input frequency characteristics are: 478 - * Minimum 11.9 MHz, Typical 24.57 MHz and maximum 25/27 MHz 479 - */ 480 - #define XCLK_MIN 11900000 481 - #define XCLK_MAX 25000000 482 - 483 - static int ioctl_g_ext_clk(struct v4l2_int_device *s, u32 *xclk) 484 - { 485 - struct tcm825x_sensor *sensor = s->priv; 486 - struct v4l2_fract *timeperframe = &sensor->timeperframe; 487 - u32 tgt_xclk; /* target xclk */ 488 - u32 tgt_fps; /* target frames per secound */ 489 - 490 - tgt_fps = timeperframe->denominator / timeperframe->numerator; 491 - 492 - tgt_xclk = (tgt_fps <= HIGH_FPS_MODE_LOWER_LIMIT) ? 493 - (2457 * tgt_fps) / MAX_HALF_FPS : 494 - (2457 * tgt_fps) / MAX_FPS; 495 - tgt_xclk *= 10000; 496 - 497 - tgt_xclk = min(tgt_xclk, (u32)XCLK_MAX); 498 - tgt_xclk = max(tgt_xclk, (u32)XCLK_MIN); 499 - 500 - *xclk = tgt_xclk; 501 - 502 - return 0; 503 - } 504 - 505 - static int ioctl_s_ext_clk(struct v4l2_int_device *s, u32 xclk) 506 - { 507 - if (xclk > XCLK_MAX || xclk < XCLK_MIN) 508 - return -EINVAL; 509 - 510 - return 0; 511 - } 512 - 513 473 static int ioctl_queryctrl(struct v4l2_int_device *s, 514 474 struct v4l2_queryctrl *qc) 515 475 { ··· 716 756 return sensor->platform_data->power_set(on); 717 757 } 718 758 759 + /* 760 + * Given the image capture format in pix, the nominal frame period in 761 + * timeperframe, calculate the required xclk frequency. 762 + * 763 + * TCM825X input frequency characteristics are: 764 + * Minimum 11.9 MHz, Typical 24.57 MHz and maximum 25/27 MHz 765 + */ 766 + 767 + static int ioctl_g_ifparm(struct v4l2_int_device *s, struct v4l2_ifparm *p) 768 + { 769 + struct tcm825x_sensor *sensor = s->priv; 770 + struct v4l2_fract *timeperframe = &sensor->timeperframe; 771 + u32 tgt_xclk; /* target xclk */ 772 + u32 tgt_fps; /* target frames per secound */ 773 + int rval; 774 + 775 + rval = sensor->platform_data->ifparm(p); 776 + if (rval) 777 + return rval; 778 + 779 + tgt_fps = timeperframe->denominator / timeperframe->numerator; 780 + 781 + tgt_xclk = (tgt_fps <= HIGH_FPS_MODE_LOWER_LIMIT) ? 782 + (2457 * tgt_fps) / MAX_HALF_FPS : 783 + (2457 * tgt_fps) / MAX_FPS; 784 + tgt_xclk *= 10000; 785 + 786 + tgt_xclk = min(tgt_xclk, (u32)TCM825X_XCLK_MAX); 787 + tgt_xclk = max(tgt_xclk, (u32)TCM825X_XCLK_MIN); 788 + 789 + p->u.bt656.clock_curr = tgt_xclk; 790 + 791 + return 0; 792 + } 793 + 719 794 static int ioctl_g_needs_reset(struct v4l2_int_device *s, void *buf) 720 795 { 721 796 struct tcm825x_sensor *sensor = s->priv; ··· 788 793 return 0; 789 794 } 790 795 791 - #define NUM_IOCTLS 17 792 - 793 - static struct v4l2_int_ioctl_desc tcm825x_ioctl_desc[NUM_IOCTLS] = { 796 + static struct v4l2_int_ioctl_desc tcm825x_ioctl_desc[] = { 794 797 { vidioc_int_dev_init_num, 795 - (v4l2_int_ioctl_func *)&ioctl_dev_init }, 798 + (v4l2_int_ioctl_func *)ioctl_dev_init }, 796 799 { vidioc_int_dev_exit_num, 797 - (v4l2_int_ioctl_func *)&ioctl_dev_exit }, 800 + (v4l2_int_ioctl_func *)ioctl_dev_exit }, 798 801 { vidioc_int_s_power_num, 799 - (v4l2_int_ioctl_func *)&ioctl_s_power }, 800 - { vidioc_int_g_ext_clk_num, 801 - (v4l2_int_ioctl_func *)&ioctl_g_ext_clk }, 802 - { vidioc_int_s_ext_clk_num, 803 - (v4l2_int_ioctl_func *)&ioctl_s_ext_clk }, 802 + (v4l2_int_ioctl_func *)ioctl_s_power }, 803 + { vidioc_int_g_ifparm_num, 804 + (v4l2_int_ioctl_func *)ioctl_g_ifparm }, 804 805 { vidioc_int_g_needs_reset_num, 805 - (v4l2_int_ioctl_func *)&ioctl_g_needs_reset }, 806 + (v4l2_int_ioctl_func *)ioctl_g_needs_reset }, 806 807 { vidioc_int_reset_num, 807 - (v4l2_int_ioctl_func *)&ioctl_reset }, 808 + (v4l2_int_ioctl_func *)ioctl_reset }, 808 809 { vidioc_int_init_num, 809 - (v4l2_int_ioctl_func *)&ioctl_init }, 810 + (v4l2_int_ioctl_func *)ioctl_init }, 810 811 { vidioc_int_enum_fmt_cap_num, 811 - (v4l2_int_ioctl_func *)&ioctl_enum_fmt_cap }, 812 + (v4l2_int_ioctl_func *)ioctl_enum_fmt_cap }, 812 813 { vidioc_int_try_fmt_cap_num, 813 - (v4l2_int_ioctl_func *)&ioctl_try_fmt_cap }, 814 + (v4l2_int_ioctl_func *)ioctl_try_fmt_cap }, 814 815 { vidioc_int_g_fmt_cap_num, 815 - (v4l2_int_ioctl_func *)&ioctl_g_fmt_cap }, 816 + (v4l2_int_ioctl_func *)ioctl_g_fmt_cap }, 816 817 { vidioc_int_s_fmt_cap_num, 817 - (v4l2_int_ioctl_func *)&ioctl_s_fmt_cap }, 818 + (v4l2_int_ioctl_func *)ioctl_s_fmt_cap }, 818 819 { vidioc_int_g_parm_num, 819 - (v4l2_int_ioctl_func *)&ioctl_g_parm }, 820 + (v4l2_int_ioctl_func *)ioctl_g_parm }, 820 821 { vidioc_int_s_parm_num, 821 - (v4l2_int_ioctl_func *)&ioctl_s_parm }, 822 + (v4l2_int_ioctl_func *)ioctl_s_parm }, 822 823 { vidioc_int_queryctrl_num, 823 - (v4l2_int_ioctl_func *)&ioctl_queryctrl }, 824 + (v4l2_int_ioctl_func *)ioctl_queryctrl }, 824 825 { vidioc_int_g_ctrl_num, 825 - (v4l2_int_ioctl_func *)&ioctl_g_ctrl }, 826 + (v4l2_int_ioctl_func *)ioctl_g_ctrl }, 826 827 { vidioc_int_s_ctrl_num, 827 - (v4l2_int_ioctl_func *)&ioctl_s_ctrl }, 828 + (v4l2_int_ioctl_func *)ioctl_s_ctrl }, 828 829 }; 829 830 830 831 static struct v4l2_int_slave tcm825x_slave = { ··· 885 894 } 886 895 887 896 static struct i2c_driver tcm825x_i2c_driver = { 888 - .driver = { 897 + .driver = { 889 898 .name = TCM825X_NAME, 890 899 }, 891 - .probe = &tcm825x_probe, 892 - .remove = __exit_p(&tcm825x_remove), 900 + .probe = tcm825x_probe, 901 + .remove = __exit_p(tcm825x_remove), 893 902 }; 894 903 895 904 static struct tcm825x_sensor tcm825x = { 896 905 .timeperframe = { 897 - .numerator = 1, 906 + .numerator = 1, 898 907 .denominator = DEFAULT_FPS, 899 908 }, 900 909 }; ··· 902 911 static int __init tcm825x_init(void) 903 912 { 904 913 int rval; 905 - int i = 0; 906 - 907 - /* Just an experiment --- don't use *_cb functions yet. */ 908 - tcm825x_ioctl_desc[i++] = vidioc_int_dev_init_cb(&ioctl_dev_init); 909 - BUG_ON(i >= NUM_IOCTLS); 910 914 911 915 rval = i2c_add_driver(&tcm825x_i2c_driver); 912 916 if (rval)
+4
drivers/media/video/tcm825x.h
··· 163 163 #define NUM_IMAGE_SIZES 6 164 164 #define NUM_PIXEL_FORMATS 2 165 165 166 + #define TCM825X_XCLK_MIN 11900000 167 + #define TCM825X_XCLK_MAX 25000000 168 + 166 169 struct capture_size { 167 170 unsigned long width; 168 171 unsigned long height; ··· 181 178 const struct tcm825x_reg *(*default_regs)(void); 182 179 int (*needs_reset)(struct v4l2_int_device *s, void *buf, 183 180 struct v4l2_pix_format *fmt); 181 + int (*ifparm)(struct v4l2_ifparm *p); 184 182 }; 185 183 186 184 /* Array of image sizes supported by TCM825X. These must be ordered from