aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c115
1 files changed, 111 insertions, 4 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 83aa39dfe07c..336ed2dd607c 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -629,7 +629,8 @@ static void v4l_print_dbg_chip_ident(const void *arg, bool write_only)
629 const struct v4l2_dbg_chip_ident *p = arg; 629 const struct v4l2_dbg_chip_ident *p = arg;
630 630
631 pr_cont("type=%u, ", p->match.type); 631 pr_cont("type=%u, ", p->match.type);
632 if (p->match.type == V4L2_CHIP_MATCH_I2C_DRIVER) 632 if (p->match.type == V4L2_CHIP_MATCH_I2C_DRIVER ||
633 p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME)
633 pr_cont("name=%.*s, ", 634 pr_cont("name=%.*s, ",
634 (int)sizeof(p->match.name), p->match.name); 635 (int)sizeof(p->match.name), p->match.name);
635 else 636 else
@@ -638,12 +639,27 @@ static void v4l_print_dbg_chip_ident(const void *arg, bool write_only)
638 p->ident, p->revision); 639 p->ident, p->revision);
639} 640}
640 641
642static void v4l_print_dbg_chip_name(const void *arg, bool write_only)
643{
644 const struct v4l2_dbg_chip_name *p = arg;
645
646 pr_cont("type=%u, ", p->match.type);
647 if (p->match.type == V4L2_CHIP_MATCH_I2C_DRIVER ||
648 p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME)
649 pr_cont("name=%.*s, ",
650 (int)sizeof(p->match.name), p->match.name);
651 else
652 pr_cont("addr=%u, ", p->match.addr);
653 pr_cont("name=%.*s\n", (int)sizeof(p->name), p->name);
654}
655
641static void v4l_print_dbg_register(const void *arg, bool write_only) 656static void v4l_print_dbg_register(const void *arg, bool write_only)
642{ 657{
643 const struct v4l2_dbg_register *p = arg; 658 const struct v4l2_dbg_register *p = arg;
644 659
645 pr_cont("type=%u, ", p->match.type); 660 pr_cont("type=%u, ", p->match.type);
646 if (p->match.type == V4L2_CHIP_MATCH_I2C_DRIVER) 661 if (p->match.type == V4L2_CHIP_MATCH_I2C_DRIVER ||
662 p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME)
647 pr_cont("name=%.*s, ", 663 pr_cont("name=%.*s, ",
648 (int)sizeof(p->match.name), p->match.name); 664 (int)sizeof(p->match.name), p->match.name);
649 else 665 else
@@ -1775,15 +1791,38 @@ static int v4l_log_status(const struct v4l2_ioctl_ops *ops,
1775 return ret; 1791 return ret;
1776} 1792}
1777 1793
1794static bool v4l_dbg_found_match(const struct v4l2_dbg_match *match,
1795 struct v4l2_subdev *sd, int idx)
1796{
1797 if (match->type == V4L2_CHIP_MATCH_SUBDEV_IDX)
1798 return match->addr == idx;
1799 return !strcmp(match->name, sd->name);
1800}
1801
1778static int v4l_dbg_g_register(const struct v4l2_ioctl_ops *ops, 1802static int v4l_dbg_g_register(const struct v4l2_ioctl_ops *ops,
1779 struct file *file, void *fh, void *arg) 1803 struct file *file, void *fh, void *arg)
1780{ 1804{
1781#ifdef CONFIG_VIDEO_ADV_DEBUG 1805#ifdef CONFIG_VIDEO_ADV_DEBUG
1782 struct v4l2_dbg_register *p = arg; 1806 struct v4l2_dbg_register *p = arg;
1807 struct video_device *vfd = video_devdata(file);
1808 struct v4l2_subdev *sd;
1809 int idx = 0;
1783 1810
1784 if (!capable(CAP_SYS_ADMIN)) 1811 if (!capable(CAP_SYS_ADMIN))
1785 return -EPERM; 1812 return -EPERM;
1786 return ops->vidioc_g_register(file, fh, p); 1813 if (p->match.type == V4L2_CHIP_MATCH_SUBDEV_IDX ||
1814 p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME) {
1815 if (vfd->v4l2_dev == NULL)
1816 return -EINVAL;
1817 v4l2_device_for_each_subdev(sd, vfd->v4l2_dev) {
1818 if (v4l_dbg_found_match(&p->match, sd, idx++))
1819 return v4l2_subdev_call(sd, core, g_register, p);
1820 }
1821 return -EINVAL;
1822 }
1823 if (ops->vidioc_g_register)
1824 return ops->vidioc_g_register(file, fh, p);
1825 return -EINVAL;
1787#else 1826#else
1788 return -ENOTTY; 1827 return -ENOTTY;
1789#endif 1828#endif
@@ -1794,10 +1833,25 @@ static int v4l_dbg_s_register(const struct v4l2_ioctl_ops *ops,
1794{ 1833{
1795#ifdef CONFIG_VIDEO_ADV_DEBUG 1834#ifdef CONFIG_VIDEO_ADV_DEBUG
1796 const struct v4l2_dbg_register *p = arg; 1835 const struct v4l2_dbg_register *p = arg;
1836 struct video_device *vfd = video_devdata(file);
1837 struct v4l2_subdev *sd;
1838 int idx = 0;
1797 1839
1798 if (!capable(CAP_SYS_ADMIN)) 1840 if (!capable(CAP_SYS_ADMIN))
1799 return -EPERM; 1841 return -EPERM;
1800 return ops->vidioc_s_register(file, fh, p); 1842 if (p->match.type == V4L2_CHIP_MATCH_SUBDEV_IDX ||
1843 p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME) {
1844 if (vfd->v4l2_dev == NULL)
1845 return -EINVAL;
1846 v4l2_device_for_each_subdev(sd, vfd->v4l2_dev) {
1847 if (v4l_dbg_found_match(&p->match, sd, idx++))
1848 return v4l2_subdev_call(sd, core, s_register, p);
1849 }
1850 return -EINVAL;
1851 }
1852 if (ops->vidioc_s_register)
1853 return ops->vidioc_s_register(file, fh, p);
1854 return -EINVAL;
1801#else 1855#else
1802 return -ENOTTY; 1856 return -ENOTTY;
1803#endif 1857#endif
@@ -1810,9 +1864,61 @@ static int v4l_dbg_g_chip_ident(const struct v4l2_ioctl_ops *ops,
1810 1864
1811 p->ident = V4L2_IDENT_NONE; 1865 p->ident = V4L2_IDENT_NONE;
1812 p->revision = 0; 1866 p->revision = 0;
1867 if (p->match.type == V4L2_CHIP_MATCH_SUBDEV_NAME ||
1868 p->match.type == V4L2_CHIP_MATCH_SUBDEV_IDX)
1869 return -EINVAL;
1813 return ops->vidioc_g_chip_ident(file, fh, p); 1870 return ops->vidioc_g_chip_ident(file, fh, p);
1814} 1871}
1815 1872
1873static int v4l_dbg_g_chip_name(const struct v4l2_ioctl_ops *ops,
1874 struct file *file, void *fh, void *arg)
1875{
1876 struct video_device *vfd = video_devdata(file);
1877 struct v4l2_dbg_chip_name *p = arg;
1878 struct v4l2_subdev *sd;
1879 int idx = 0;
1880
1881 switch (p->match.type) {
1882 case V4L2_CHIP_MATCH_BRIDGE:
1883#ifdef CONFIG_VIDEO_ADV_DEBUG
1884 if (ops->vidioc_s_register)
1885 p->flags |= V4L2_CHIP_FL_WRITABLE;
1886 if (ops->vidioc_g_register)
1887 p->flags |= V4L2_CHIP_FL_READABLE;
1888#endif
1889 if (ops->vidioc_g_chip_name)
1890 return ops->vidioc_g_chip_name(file, fh, arg);
1891 if (p->match.addr)
1892 return -EINVAL;
1893 if (vfd->v4l2_dev)
1894 strlcpy(p->name, vfd->v4l2_dev->name, sizeof(p->name));
1895 else if (vfd->parent)
1896 strlcpy(p->name, vfd->parent->driver->name, sizeof(p->name));
1897 else
1898 strlcpy(p->name, "bridge", sizeof(p->name));
1899 return 0;
1900
1901 case V4L2_CHIP_MATCH_SUBDEV_IDX:
1902 case V4L2_CHIP_MATCH_SUBDEV_NAME:
1903 if (vfd->v4l2_dev == NULL)
1904 break;
1905 v4l2_device_for_each_subdev(sd, vfd->v4l2_dev) {
1906 if (v4l_dbg_found_match(&p->match, sd, idx++)) {
1907#ifdef CONFIG_VIDEO_ADV_DEBUG
1908 if (sd->ops->core && sd->ops->core->s_register)
1909 p->flags |= V4L2_CHIP_FL_WRITABLE;
1910 if (sd->ops->core && sd->ops->core->g_register)
1911 p->flags |= V4L2_CHIP_FL_READABLE;
1912#endif
1913 strlcpy(p->name, sd->name, sizeof(p->name));
1914 return 0;
1915 }
1916 }
1917 break;
1918 }
1919 return -EINVAL;
1920}
1921
1816static int v4l_dqevent(const struct v4l2_ioctl_ops *ops, 1922static int v4l_dqevent(const struct v4l2_ioctl_ops *ops,
1817 struct file *file, void *fh, void *arg) 1923 struct file *file, void *fh, void *arg)
1818{ 1924{
@@ -2027,6 +2133,7 @@ static struct v4l2_ioctl_info v4l2_ioctls[] = {
2027 IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, 0), 2133 IOCTL_INFO_STD(VIDIOC_QUERY_DV_TIMINGS, vidioc_query_dv_timings, v4l_print_dv_timings, 0),
2028 IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, INFO_FL_CLEAR(v4l2_dv_timings_cap, type)), 2134 IOCTL_INFO_STD(VIDIOC_DV_TIMINGS_CAP, vidioc_dv_timings_cap, v4l_print_dv_timings_cap, INFO_FL_CLEAR(v4l2_dv_timings_cap, type)),
2029 IOCTL_INFO_FNC(VIDIOC_ENUM_FREQ_BANDS, v4l_enum_freq_bands, v4l_print_freq_band, 0), 2135 IOCTL_INFO_FNC(VIDIOC_ENUM_FREQ_BANDS, v4l_enum_freq_bands, v4l_print_freq_band, 0),
2136 IOCTL_INFO_FNC(VIDIOC_DBG_G_CHIP_NAME, v4l_dbg_g_chip_name, v4l_print_dbg_chip_name, INFO_FL_CLEAR(v4l2_dbg_chip_name, match)),
2030}; 2137};
2031#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls) 2138#define V4L2_IOCTLS ARRAY_SIZE(v4l2_ioctls)
2032 2139