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

media: qcom: camss: Decompose register and link operations

Split link and register operations.
Add dedicated link callback according to SoC identifier.

Signed-off-by: Atanas Filipov <quic_afilipov@quicinc.com>
Signed-off-by: Gjorgji Rosikopulos <quic_grosikop@quicinc.com>
Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # sc8280xp/sm8250/sdm845/apq8016
Acked-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

authored by

Atanas Filipov and committed by
Hans Verkuil
73ac545c 729fc005

+107 -87
+106 -87
drivers/media/platform/qcom/camss/camss.c
··· 1756 1756 } 1757 1757 1758 1758 /* 1759 + * camss_link_entities - Register subdev nodes and create links 1760 + * @camss: CAMSS device 1761 + * 1762 + * Return 0 on success or a negative error code on failure 1763 + */ 1764 + static int camss_link_entities(struct camss *camss) 1765 + { 1766 + int i, j, k; 1767 + int ret; 1768 + 1769 + for (i = 0; i < camss->res->csiphy_num; i++) { 1770 + for (j = 0; j < camss->res->csid_num; j++) { 1771 + ret = media_create_pad_link(&camss->csiphy[i].subdev.entity, 1772 + MSM_CSIPHY_PAD_SRC, 1773 + &camss->csid[j].subdev.entity, 1774 + MSM_CSID_PAD_SINK, 1775 + 0); 1776 + if (ret < 0) { 1777 + dev_err(camss->dev, 1778 + "Failed to link %s->%s entities: %d\n", 1779 + camss->csiphy[i].subdev.entity.name, 1780 + camss->csid[j].subdev.entity.name, 1781 + ret); 1782 + return ret; 1783 + } 1784 + } 1785 + } 1786 + 1787 + if (camss->ispif) { 1788 + for (i = 0; i < camss->res->csid_num; i++) { 1789 + for (j = 0; j < camss->ispif->line_num; j++) { 1790 + ret = media_create_pad_link(&camss->csid[i].subdev.entity, 1791 + MSM_CSID_PAD_SRC, 1792 + &camss->ispif->line[j].subdev.entity, 1793 + MSM_ISPIF_PAD_SINK, 1794 + 0); 1795 + if (ret < 0) { 1796 + dev_err(camss->dev, 1797 + "Failed to link %s->%s entities: %d\n", 1798 + camss->csid[i].subdev.entity.name, 1799 + camss->ispif->line[j].subdev.entity.name, 1800 + ret); 1801 + return ret; 1802 + } 1803 + } 1804 + } 1805 + 1806 + for (i = 0; i < camss->ispif->line_num; i++) 1807 + for (k = 0; k < camss->res->vfe_num; k++) 1808 + for (j = 0; j < camss->vfe[k].res->line_num; j++) { 1809 + struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; 1810 + struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 1811 + 1812 + ret = media_create_pad_link(&ispif->entity, 1813 + MSM_ISPIF_PAD_SRC, 1814 + &vfe->entity, 1815 + MSM_VFE_PAD_SINK, 1816 + 0); 1817 + if (ret < 0) { 1818 + dev_err(camss->dev, 1819 + "Failed to link %s->%s entities: %d\n", 1820 + ispif->entity.name, 1821 + vfe->entity.name, 1822 + ret); 1823 + return ret; 1824 + } 1825 + } 1826 + } else { 1827 + for (i = 0; i < camss->res->csid_num; i++) 1828 + for (k = 0; k < camss->res->vfe_num; k++) 1829 + for (j = 0; j < camss->vfe[k].res->line_num; j++) { 1830 + struct v4l2_subdev *csid = &camss->csid[i].subdev; 1831 + struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 1832 + 1833 + ret = media_create_pad_link(&csid->entity, 1834 + MSM_CSID_PAD_FIRST_SRC + j, 1835 + &vfe->entity, 1836 + MSM_VFE_PAD_SINK, 1837 + 0); 1838 + if (ret < 0) { 1839 + dev_err(camss->dev, 1840 + "Failed to link %s->%s entities: %d\n", 1841 + csid->entity.name, 1842 + vfe->entity.name, 1843 + ret); 1844 + return ret; 1845 + } 1846 + } 1847 + } 1848 + 1849 + return 0; 1850 + } 1851 + 1852 + /* 1759 1853 * camss_register_entities - Register subdev nodes and create links 1760 1854 * @camss: CAMSS device 1761 1855 * ··· 1857 1763 */ 1858 1764 static int camss_register_entities(struct camss *camss) 1859 1765 { 1860 - int i, j, k; 1766 + int i; 1861 1767 int ret; 1862 1768 1863 1769 for (i = 0; i < camss->res->csiphy_num; i++) { ··· 1885 1791 ret = msm_ispif_register_entities(camss->ispif, 1886 1792 &camss->v4l2_dev); 1887 1793 if (ret < 0) { 1888 - dev_err(camss->dev, "Failed to register ispif entities: %d\n", 1889 - ret); 1794 + dev_err(camss->dev, "Failed to register ispif entities: %d\n", ret); 1890 1795 goto err_reg_ispif; 1891 1796 } 1892 1797 ··· 1900 1807 } 1901 1808 } 1902 1809 1903 - for (i = 0; i < camss->res->csiphy_num; i++) { 1904 - for (j = 0; j < camss->res->csid_num; j++) { 1905 - ret = media_create_pad_link( 1906 - &camss->csiphy[i].subdev.entity, 1907 - MSM_CSIPHY_PAD_SRC, 1908 - &camss->csid[j].subdev.entity, 1909 - MSM_CSID_PAD_SINK, 1910 - 0); 1911 - if (ret < 0) { 1912 - dev_err(camss->dev, 1913 - "Failed to link %s->%s entities: %d\n", 1914 - camss->csiphy[i].subdev.entity.name, 1915 - camss->csid[j].subdev.entity.name, 1916 - ret); 1917 - goto err_link; 1918 - } 1919 - } 1920 - } 1921 - 1922 - if (camss->ispif) { 1923 - for (i = 0; i < camss->res->csid_num; i++) { 1924 - for (j = 0; j < camss->ispif->line_num; j++) { 1925 - ret = media_create_pad_link( 1926 - &camss->csid[i].subdev.entity, 1927 - MSM_CSID_PAD_SRC, 1928 - &camss->ispif->line[j].subdev.entity, 1929 - MSM_ISPIF_PAD_SINK, 1930 - 0); 1931 - if (ret < 0) { 1932 - dev_err(camss->dev, 1933 - "Failed to link %s->%s entities: %d\n", 1934 - camss->csid[i].subdev.entity.name, 1935 - camss->ispif->line[j].subdev.entity.name, 1936 - ret); 1937 - goto err_link; 1938 - } 1939 - } 1940 - } 1941 - 1942 - for (i = 0; i < camss->ispif->line_num; i++) 1943 - for (k = 0; k < camss->res->vfe_num; k++) 1944 - for (j = 0; j < camss->vfe[k].res->line_num; j++) { 1945 - struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev; 1946 - struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 1947 - 1948 - ret = media_create_pad_link(&ispif->entity, 1949 - MSM_ISPIF_PAD_SRC, 1950 - &vfe->entity, 1951 - MSM_VFE_PAD_SINK, 1952 - 0); 1953 - if (ret < 0) { 1954 - dev_err(camss->dev, 1955 - "Failed to link %s->%s entities: %d\n", 1956 - ispif->entity.name, 1957 - vfe->entity.name, 1958 - ret); 1959 - goto err_link; 1960 - } 1961 - } 1962 - } else { 1963 - for (i = 0; i < camss->res->csid_num; i++) 1964 - for (k = 0; k < camss->res->vfe_num; k++) 1965 - for (j = 0; j < camss->vfe[k].res->line_num; j++) { 1966 - struct v4l2_subdev *csid = &camss->csid[i].subdev; 1967 - struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev; 1968 - 1969 - ret = media_create_pad_link(&csid->entity, 1970 - MSM_CSID_PAD_FIRST_SRC + j, 1971 - &vfe->entity, 1972 - MSM_VFE_PAD_SINK, 1973 - 0); 1974 - if (ret < 0) { 1975 - dev_err(camss->dev, 1976 - "Failed to link %s->%s entities: %d\n", 1977 - csid->entity.name, 1978 - vfe->entity.name, 1979 - ret); 1980 - goto err_link; 1981 - } 1982 - } 1983 - } 1984 - 1985 1810 return 0; 1986 1811 1987 - err_link: 1988 - i = camss->res->vfe_num; 1989 1812 err_reg_vfe: 1990 1813 for (i--; i >= 0; i--) 1991 1814 msm_vfe_unregister_entities(&camss->vfe[i]); ··· 2221 2212 if (ret < 0) 2222 2213 goto err_v4l2_device_unregister; 2223 2214 2215 + ret = camss->res->link_entities(camss); 2216 + if (ret < 0) 2217 + goto err_register_subdevs; 2218 + 2224 2219 if (num_subdevs) { 2225 2220 camss->notifier.ops = &camss_subdev_notifier_ops; 2226 2221 ··· 2304 2291 .csiphy_num = ARRAY_SIZE(csiphy_res_8x16), 2305 2292 .csid_num = ARRAY_SIZE(csid_res_8x16), 2306 2293 .vfe_num = ARRAY_SIZE(vfe_res_8x16), 2294 + .link_entities = camss_link_entities 2307 2295 }; 2308 2296 2309 2297 static const struct camss_resources msm8996_resources = { ··· 2316 2302 .csiphy_num = ARRAY_SIZE(csiphy_res_8x96), 2317 2303 .csid_num = ARRAY_SIZE(csid_res_8x96), 2318 2304 .vfe_num = ARRAY_SIZE(vfe_res_8x96), 2305 + .link_entities = camss_link_entities 2319 2306 }; 2320 2307 2321 2308 static const struct camss_resources sdm660_resources = { ··· 2328 2313 .csiphy_num = ARRAY_SIZE(csiphy_res_660), 2329 2314 .csid_num = ARRAY_SIZE(csid_res_660), 2330 2315 .vfe_num = ARRAY_SIZE(vfe_res_660), 2316 + .link_entities = camss_link_entities 2331 2317 }; 2332 2318 2333 2319 static const struct camss_resources sdm845_resources = { ··· 2339 2323 .csiphy_num = ARRAY_SIZE(csiphy_res_845), 2340 2324 .csid_num = ARRAY_SIZE(csid_res_845), 2341 2325 .vfe_num = ARRAY_SIZE(vfe_res_845), 2326 + .link_entities = camss_link_entities 2342 2327 }; 2343 2328 2344 2329 static const struct camss_resources sm8250_resources = { ··· 2353 2336 .csiphy_num = ARRAY_SIZE(csiphy_res_8250), 2354 2337 .csid_num = ARRAY_SIZE(csid_res_8250), 2355 2338 .vfe_num = ARRAY_SIZE(vfe_res_8250), 2339 + .link_entities = camss_link_entities 2356 2340 }; 2357 2341 2358 2342 static const struct camss_resources sc8280xp_resources = { ··· 2368 2350 .csiphy_num = ARRAY_SIZE(csiphy_res_sc8280xp), 2369 2351 .csid_num = ARRAY_SIZE(csid_res_sc8280xp), 2370 2352 .vfe_num = ARRAY_SIZE(vfe_res_sc8280xp), 2353 + .link_entities = camss_link_entities 2371 2354 }; 2372 2355 2373 2356 static const struct of_device_id camss_dt_match[] = {
+1
drivers/media/platform/qcom/camss/camss.h
··· 98 98 const unsigned int csiphy_num; 99 99 const unsigned int csid_num; 100 100 const unsigned int vfe_num; 101 + int (*link_entities)(struct camss *camss); 101 102 }; 102 103 103 104 struct camss {