Hi Tomi, [FYI, it's a private test report for your RFC patch.] [auto build test ERROR on linuxtv-media/master] [also build test ERROR on v5.12-rc8 next-20210423] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/Tomi-Valkeinen/RFC-media-v4l2-subdev-add-subdev-wide-config-struct/20210423-183133 base: git://linuxtv.org/media_tree.git master config: riscv-randconfig-r003-20210424 (attached as .config) compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 06234f758e1945084582cf80450b396f75a9c06e) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install riscv cross compiling tool for clang build # apt-get install binutils-riscv64-linux-gnu # https://github.com/0day-ci/linux/commit/09a6489d3b108d037f87df5fcf5d2c1fa6f70248 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review Tomi-Valkeinen/RFC-media-v4l2-subdev-add-subdev-wide-config-struct/20210423-183133 git checkout 09a6489d3b108d037f87df5fcf5d2c1fa6f70248 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=riscv If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All errors (new ones prefixed by >>): In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:564:9: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] return inw(addr); ^~~~~~~~~ arch/riscv/include/asm/io.h:56:76: note: expanded from macro 'inw' #define inw(c) ({ u16 __v; __io_pbr(); __v = readw_cpu((void*)(PCI_IOBASE + (c))); __io_par(__v); __v; }) ~~~~~~~~~~ ^ arch/riscv/include/asm/mmio.h:88:76: note: expanded from macro 'readw_cpu' #define readw_cpu(c) ({ u16 __r = le16_to_cpu((__force __le16)__raw_readw(c)); __r; }) ^ include/uapi/linux/byteorder/little_endian.h:36:51: note: expanded from macro '__le16_to_cpu' #define __le16_to_cpu(x) ((__force __u16)(__le16)(x)) ^ In file included from drivers/media/i2c/tda1997x.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:572:9: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] return inl(addr); ^~~~~~~~~ arch/riscv/include/asm/io.h:57:76: note: expanded from macro 'inl' #define inl(c) ({ u32 __v; __io_pbr(); __v = readl_cpu((void*)(PCI_IOBASE + (c))); __io_par(__v); __v; }) ~~~~~~~~~~ ^ arch/riscv/include/asm/mmio.h:89:76: note: expanded from macro 'readl_cpu' #define readl_cpu(c) ({ u32 __r = le32_to_cpu((__force __le32)__raw_readl(c)); __r; }) ^ include/uapi/linux/byteorder/little_endian.h:34:51: note: expanded from macro '__le32_to_cpu' #define __le32_to_cpu(x) ((__force __u32)(__le32)(x)) ^ In file included from drivers/media/i2c/tda1997x.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:580:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] outb(value, addr); ^~~~~~~~~~~~~~~~~ arch/riscv/include/asm/io.h:59:68: note: expanded from macro 'outb' #define outb(v,c) ({ __io_pbw(); writeb_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); }) ~~~~~~~~~~ ^ arch/riscv/include/asm/mmio.h:91:52: note: expanded from macro 'writeb_cpu' #define writeb_cpu(v, c) ((void)__raw_writeb((v), (c))) ^ In file included from drivers/media/i2c/tda1997x.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:588:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] outw(value, addr); ^~~~~~~~~~~~~~~~~ arch/riscv/include/asm/io.h:60:68: note: expanded from macro 'outw' #define outw(v,c) ({ __io_pbw(); writew_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); }) ~~~~~~~~~~ ^ arch/riscv/include/asm/mmio.h:92:76: note: expanded from macro 'writew_cpu' #define writew_cpu(v, c) ((void)__raw_writew((__force u16)cpu_to_le16(v), (c))) ^ In file included from drivers/media/i2c/tda1997x.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:596:2: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] outl(value, addr); ^~~~~~~~~~~~~~~~~ arch/riscv/include/asm/io.h:61:68: note: expanded from macro 'outl' #define outl(v,c) ({ __io_pbw(); writel_cpu((v),(void*)(PCI_IOBASE + (c))); __io_paw(); }) ~~~~~~~~~~ ^ arch/riscv/include/asm/mmio.h:93:76: note: expanded from macro 'writel_cpu' #define writel_cpu(v, c) ((void)__raw_writel((__force u32)cpu_to_le32(v), (c))) ^ In file included from drivers/media/i2c/tda1997x.c:9: In file included from include/linux/interrupt.h:11: In file included from include/linux/hardirq.h:10: In file included from ./arch/riscv/include/generated/asm/hardirq.h:1: In file included from include/asm-generic/hardirq.h:17: In file included from include/linux/irq.h:20: In file included from include/linux/io.h:13: In file included from arch/riscv/include/asm/io.h:149: include/asm-generic/io.h:1005:55: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port; ~~~~~~~~~~ ^ >> drivers/media/i2c/tda1997x.c:1726:38: error: incompatible pointer types passing 'struct v4l2_subdev_pad_config *' to parameter of type 'struct v4l2_subdev_state *' [-Werror,-Wincompatible-pointer-types] mf = v4l2_subdev_get_try_format(sd, cfg, 0); ^~~ include/media/v4l2-subdev.h:966:33: note: passing argument to parameter 'state' here struct v4l2_subdev_state *state, ^ drivers/media/i2c/tda1997x.c:1778:40: error: incompatible pointer types passing 'struct v4l2_subdev_pad_config *' to parameter of type 'struct v4l2_subdev_state *' [-Werror,-Wincompatible-pointer-types] fmt = v4l2_subdev_get_try_format(sd, cfg, format->pad); ^~~ include/media/v4l2-subdev.h:966:33: note: passing argument to parameter 'state' here struct v4l2_subdev_state *state, ^ drivers/media/i2c/tda1997x.c:1812:40: error: incompatible pointer types passing 'struct v4l2_subdev_pad_config *' to parameter of type 'struct v4l2_subdev_state *' [-Werror,-Wincompatible-pointer-types] fmt = v4l2_subdev_get_try_format(sd, cfg, format->pad); ^~~ include/media/v4l2-subdev.h:966:33: note: passing argument to parameter 'state' here struct v4l2_subdev_state *state, ^ >> drivers/media/i2c/tda1997x.c:1911:14: error: incompatible function pointer types initializing 'int (*)(struct v4l2_subdev *, struct v4l2_subdev_state *)' with an expression of type 'int (struct v4l2_subdev *, struct v4l2_subdev_pad_config *)' [-Werror,-Wincompatible-function-pointer-types] .init_cfg = tda1997x_init_cfg, ^~~~~~~~~~~~~~~~~ >> drivers/media/i2c/tda1997x.c:1912:20: error: incompatible function pointer types initializing 'int (*)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_mbus_code_enum *)' with an expression of type 'int (struct v4l2_subdev *, struct v4l2_subdev_pad_config *, struct v4l2_subdev_mbus_code_enum *)' [-Werror,-Wincompatible-function-pointer-types] .enum_mbus_code = tda1997x_enum_mbus_code, ^~~~~~~~~~~~~~~~~~~~~~~ >> drivers/media/i2c/tda1997x.c:1913:13: error: incompatible function pointer types initializing 'int (*)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format *)' with an expression of type 'int (struct v4l2_subdev *, struct v4l2_subdev_pad_config *, struct v4l2_subdev_format *)' [-Werror,-Wincompatible-function-pointer-types] .get_fmt = tda1997x_get_format, ^~~~~~~~~~~~~~~~~~~ drivers/media/i2c/tda1997x.c:1914:13: error: incompatible function pointer types initializing 'int (*)(struct v4l2_subdev *, struct v4l2_subdev_state *, struct v4l2_subdev_format *)' with an expression of type 'int (struct v4l2_subdev *, struct v4l2_subdev_pad_config *, struct v4l2_subdev_format *)' [-Werror,-Wincompatible-function-pointer-types] .set_fmt = tda1997x_set_format, ^~~~~~~~~~~~~~~~~~~ 7 warnings and 7 errors generated. vim +1726 drivers/media/i2c/tda1997x.c 9ac0038db9a7e1 Tim Harvey 2018-02-15 1714 9ac0038db9a7e1 Tim Harvey 2018-02-15 1715 9ac0038db9a7e1 Tim Harvey 2018-02-15 1716 /* ----------------------------------------------------------------------------- 9ac0038db9a7e1 Tim Harvey 2018-02-15 1717 * v4l2_subdev_pad_ops 9ac0038db9a7e1 Tim Harvey 2018-02-15 1718 */ 9ac0038db9a7e1 Tim Harvey 2018-02-15 1719 9ac0038db9a7e1 Tim Harvey 2018-02-15 1720 static int tda1997x_init_cfg(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1721 struct v4l2_subdev_pad_config *cfg) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1722 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1723 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1724 struct v4l2_mbus_framefmt *mf; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1725 9ac0038db9a7e1 Tim Harvey 2018-02-15 @1726 mf = v4l2_subdev_get_try_format(sd, cfg, 0); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1727 mf->code = state->mbus_codes[0]; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1728 9ac0038db9a7e1 Tim Harvey 2018-02-15 1729 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1730 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1731 9ac0038db9a7e1 Tim Harvey 2018-02-15 1732 static int tda1997x_enum_mbus_code(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1733 struct v4l2_subdev_pad_config *cfg, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1734 struct v4l2_subdev_mbus_code_enum *code) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1735 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1736 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1737 9ac0038db9a7e1 Tim Harvey 2018-02-15 1738 v4l_dbg(1, debug, state->client, "%s %d\n", __func__, code->index); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1739 if (code->index >= ARRAY_SIZE(state->mbus_codes)) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1740 return -EINVAL; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1741 9ac0038db9a7e1 Tim Harvey 2018-02-15 1742 if (!state->mbus_codes[code->index]) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1743 return -EINVAL; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1744 9ac0038db9a7e1 Tim Harvey 2018-02-15 1745 code->code = state->mbus_codes[code->index]; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1746 9ac0038db9a7e1 Tim Harvey 2018-02-15 1747 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1748 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1749 9ac0038db9a7e1 Tim Harvey 2018-02-15 1750 static void tda1997x_fill_format(struct tda1997x_state *state, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1751 struct v4l2_mbus_framefmt *format) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1752 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1753 const struct v4l2_bt_timings *bt; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1754 9ac0038db9a7e1 Tim Harvey 2018-02-15 1755 memset(format, 0, sizeof(*format)); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1756 bt = &state->timings.bt; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1757 format->width = bt->width; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1758 format->height = bt->height; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1759 format->colorspace = state->colorimetry.colorspace; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1760 format->field = (bt->interlaced) ? 9ac0038db9a7e1 Tim Harvey 2018-02-15 1761 V4L2_FIELD_SEQ_TB : V4L2_FIELD_NONE; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1762 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1763 9ac0038db9a7e1 Tim Harvey 2018-02-15 1764 static int tda1997x_get_format(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1765 struct v4l2_subdev_pad_config *cfg, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1766 struct v4l2_subdev_format *format) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1767 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1768 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1769 9ac0038db9a7e1 Tim Harvey 2018-02-15 1770 v4l_dbg(1, debug, state->client, "%s pad=%d which=%d\n", 9ac0038db9a7e1 Tim Harvey 2018-02-15 1771 __func__, format->pad, format->which); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1772 9ac0038db9a7e1 Tim Harvey 2018-02-15 1773 tda1997x_fill_format(state, &format->format); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1774 9ac0038db9a7e1 Tim Harvey 2018-02-15 1775 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1776 struct v4l2_mbus_framefmt *fmt; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1777 9ac0038db9a7e1 Tim Harvey 2018-02-15 1778 fmt = v4l2_subdev_get_try_format(sd, cfg, format->pad); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1779 format->format.code = fmt->code; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1780 } else 9ac0038db9a7e1 Tim Harvey 2018-02-15 1781 format->format.code = state->mbus_code; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1782 9ac0038db9a7e1 Tim Harvey 2018-02-15 1783 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1784 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1785 9ac0038db9a7e1 Tim Harvey 2018-02-15 1786 static int tda1997x_set_format(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1787 struct v4l2_subdev_pad_config *cfg, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1788 struct v4l2_subdev_format *format) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1789 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1790 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1791 u32 code = 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1792 int i; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1793 9ac0038db9a7e1 Tim Harvey 2018-02-15 1794 v4l_dbg(1, debug, state->client, "%s pad=%d which=%d fmt=0x%x\n", 9ac0038db9a7e1 Tim Harvey 2018-02-15 1795 __func__, format->pad, format->which, format->format.code); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1796 9ac0038db9a7e1 Tim Harvey 2018-02-15 1797 for (i = 0; i < ARRAY_SIZE(state->mbus_codes); i++) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1798 if (format->format.code == state->mbus_codes[i]) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1799 code = state->mbus_codes[i]; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1800 break; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1801 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1802 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1803 if (!code) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1804 code = state->mbus_codes[0]; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1805 9ac0038db9a7e1 Tim Harvey 2018-02-15 1806 tda1997x_fill_format(state, &format->format); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1807 format->format.code = code; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1808 9ac0038db9a7e1 Tim Harvey 2018-02-15 1809 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1810 struct v4l2_mbus_framefmt *fmt; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1811 9ac0038db9a7e1 Tim Harvey 2018-02-15 1812 fmt = v4l2_subdev_get_try_format(sd, cfg, format->pad); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1813 *fmt = format->format; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1814 } else { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1815 int ret = tda1997x_setup_format(state, format->format.code); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1816 9ac0038db9a7e1 Tim Harvey 2018-02-15 1817 if (ret) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1818 return ret; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1819 /* mbus_code has changed - re-configure csc/vidout */ 9ac0038db9a7e1 Tim Harvey 2018-02-15 1820 tda1997x_configure_csc(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1821 tda1997x_configure_vidout(state); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1822 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1823 9ac0038db9a7e1 Tim Harvey 2018-02-15 1824 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1825 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1826 9ac0038db9a7e1 Tim Harvey 2018-02-15 1827 static int tda1997x_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1828 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1829 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1830 9ac0038db9a7e1 Tim Harvey 2018-02-15 1831 v4l_dbg(1, debug, state->client, "%s pad=%d\n", __func__, edid->pad); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1832 memset(edid->reserved, 0, sizeof(edid->reserved)); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1833 9ac0038db9a7e1 Tim Harvey 2018-02-15 1834 if (edid->start_block == 0 && edid->blocks == 0) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1835 edid->blocks = state->edid.blocks; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1836 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1837 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1838 9ac0038db9a7e1 Tim Harvey 2018-02-15 1839 if (!state->edid.present) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1840 return -ENODATA; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1841 9ac0038db9a7e1 Tim Harvey 2018-02-15 1842 if (edid->start_block >= state->edid.blocks) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1843 return -EINVAL; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1844 9ac0038db9a7e1 Tim Harvey 2018-02-15 1845 if (edid->start_block + edid->blocks > state->edid.blocks) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1846 edid->blocks = state->edid.blocks - edid->start_block; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1847 9ac0038db9a7e1 Tim Harvey 2018-02-15 1848 memcpy(edid->edid, state->edid.edid + edid->start_block * 128, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1849 edid->blocks * 128); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1850 9ac0038db9a7e1 Tim Harvey 2018-02-15 1851 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1852 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1853 9ac0038db9a7e1 Tim Harvey 2018-02-15 1854 static int tda1997x_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1855 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1856 struct tda1997x_state *state = to_state(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1857 int i; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1858 9ac0038db9a7e1 Tim Harvey 2018-02-15 1859 v4l_dbg(1, debug, state->client, "%s pad=%d\n", __func__, edid->pad); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1860 memset(edid->reserved, 0, sizeof(edid->reserved)); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1861 9ac0038db9a7e1 Tim Harvey 2018-02-15 1862 if (edid->start_block != 0) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1863 return -EINVAL; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1864 9ac0038db9a7e1 Tim Harvey 2018-02-15 1865 if (edid->blocks == 0) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1866 state->edid.blocks = 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1867 state->edid.present = 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1868 tda1997x_disable_edid(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1869 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1870 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1871 9ac0038db9a7e1 Tim Harvey 2018-02-15 1872 if (edid->blocks > 2) { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1873 edid->blocks = 2; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1874 return -E2BIG; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1875 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1876 9ac0038db9a7e1 Tim Harvey 2018-02-15 1877 tda1997x_disable_edid(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1878 9ac0038db9a7e1 Tim Harvey 2018-02-15 1879 /* write base EDID */ 9ac0038db9a7e1 Tim Harvey 2018-02-15 1880 for (i = 0; i < 128; i++) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1881 io_write(sd, REG_EDID_IN_BYTE0 + i, edid->edid[i]); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1882 9ac0038db9a7e1 Tim Harvey 2018-02-15 1883 /* write CEA Extension */ 9ac0038db9a7e1 Tim Harvey 2018-02-15 1884 for (i = 0; i < 128; i++) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1885 io_write(sd, REG_EDID_IN_BYTE128 + i, edid->edid[i+128]); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1886 0806bc0afbb415 Tim Harvey 2019-02-05 1887 /* store state */ 0806bc0afbb415 Tim Harvey 2019-02-05 1888 memcpy(state->edid.edid, edid->edid, 256); 0806bc0afbb415 Tim Harvey 2019-02-05 1889 state->edid.blocks = edid->blocks; 0806bc0afbb415 Tim Harvey 2019-02-05 1890 9ac0038db9a7e1 Tim Harvey 2018-02-15 1891 tda1997x_enable_edid(sd); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1892 9ac0038db9a7e1 Tim Harvey 2018-02-15 1893 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1894 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1895 9ac0038db9a7e1 Tim Harvey 2018-02-15 1896 static int tda1997x_get_dv_timings_cap(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1897 struct v4l2_dv_timings_cap *cap) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1898 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1899 *cap = tda1997x_dv_timings_cap; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1900 return 0; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1901 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1902 9ac0038db9a7e1 Tim Harvey 2018-02-15 1903 static int tda1997x_enum_dv_timings(struct v4l2_subdev *sd, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1904 struct v4l2_enum_dv_timings *timings) 9ac0038db9a7e1 Tim Harvey 2018-02-15 1905 { 9ac0038db9a7e1 Tim Harvey 2018-02-15 1906 return v4l2_enum_dv_timings_cap(timings, &tda1997x_dv_timings_cap, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1907 NULL, NULL); 9ac0038db9a7e1 Tim Harvey 2018-02-15 1908 } 9ac0038db9a7e1 Tim Harvey 2018-02-15 1909 9ac0038db9a7e1 Tim Harvey 2018-02-15 1910 static const struct v4l2_subdev_pad_ops tda1997x_pad_ops = { 9ac0038db9a7e1 Tim Harvey 2018-02-15 @1911 .init_cfg = tda1997x_init_cfg, 9ac0038db9a7e1 Tim Harvey 2018-02-15 @1912 .enum_mbus_code = tda1997x_enum_mbus_code, 9ac0038db9a7e1 Tim Harvey 2018-02-15 @1913 .get_fmt = tda1997x_get_format, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1914 .set_fmt = tda1997x_set_format, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1915 .get_edid = tda1997x_get_edid, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1916 .set_edid = tda1997x_set_edid, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1917 .dv_timings_cap = tda1997x_get_dv_timings_cap, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1918 .enum_dv_timings = tda1997x_enum_dv_timings, 9ac0038db9a7e1 Tim Harvey 2018-02-15 1919 }; 9ac0038db9a7e1 Tim Harvey 2018-02-15 1920 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org