tc358767.c (1681956cb79c99371024cec0b9536fbdd73d04c3) | tc358767.c (d688f6b5525d5bc1b88c198959274d53a1a24204) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * TC358767/TC358867/TC9595 DSI/DPI-to-DPI/(e)DP bridge driver 4 * 5 * The TC358767/TC358867/TC9595 can operate in multiple modes. 6 * All modes are supported -- DPI->(e)DP / DSI->DPI / DSI->(e)DP . 7 * 8 * Copyright (C) 2016 CogentEmbedded Inc --- 875 unchanged lines hidden (view full) --- 884 885 int left_margin = mode->htotal - mode->hsync_end; 886 int hsync_len = mode->hsync_end - mode->hsync_start; 887 int upper_margin = mode->vtotal - mode->vsync_end; 888 int vsync_len = mode->vsync_end - mode->vsync_start; 889 u32 dp0_syncval; 890 u32 bits_per_pixel = 24; 891 u32 in_bw, out_bw; | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * TC358767/TC358867/TC9595 DSI/DPI-to-DPI/(e)DP bridge driver 4 * 5 * The TC358767/TC358867/TC9595 can operate in multiple modes. 6 * All modes are supported -- DPI->(e)DP / DSI->DPI / DSI->(e)DP . 7 * 8 * Copyright (C) 2016 CogentEmbedded Inc --- 875 unchanged lines hidden (view full) --- 884 885 int left_margin = mode->htotal - mode->hsync_end; 886 int hsync_len = mode->hsync_end - mode->hsync_start; 887 int upper_margin = mode->vtotal - mode->vsync_end; 888 int vsync_len = mode->vsync_end - mode->vsync_start; 889 u32 dp0_syncval; 890 u32 bits_per_pixel = 24; 891 u32 in_bw, out_bw; |
892 u32 dpipxlfmt; |
|
892 893 /* 894 * Recommended maximum number of symbols transferred in a transfer unit: 895 * DIV_ROUND_UP((input active video bandwidth in bytes) * tu_size, 896 * (output active video bandwidth in bytes)) 897 * Must be less than tu_size. 898 */ 899 --- 33 unchanged lines hidden (view full) --- 933 934 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 935 dp0_syncval |= SYNCVAL_HS_POL_ACTIVE_LOW; 936 937 ret = regmap_write(tc->regmap, DP0_SYNCVAL, dp0_syncval); 938 if (ret) 939 return ret; 940 | 893 894 /* 895 * Recommended maximum number of symbols transferred in a transfer unit: 896 * DIV_ROUND_UP((input active video bandwidth in bytes) * tu_size, 897 * (output active video bandwidth in bytes)) 898 * Must be less than tu_size. 899 */ 900 --- 33 unchanged lines hidden (view full) --- 934 935 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 936 dp0_syncval |= SYNCVAL_HS_POL_ACTIVE_LOW; 937 938 ret = regmap_write(tc->regmap, DP0_SYNCVAL, dp0_syncval); 939 if (ret) 940 return ret; 941 |
941 ret = regmap_write(tc->regmap, DPIPXLFMT, 942 VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW | 943 DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | 944 DPI_BPP_RGB888); | 942 dpipxlfmt = DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888; 943 944 if (mode->flags & DRM_MODE_FLAG_NVSYNC) 945 dpipxlfmt |= VS_POL_ACTIVE_LOW; 946 947 if (mode->flags & DRM_MODE_FLAG_NHSYNC) 948 dpipxlfmt |= HS_POL_ACTIVE_LOW; 949 950 ret = regmap_write(tc->regmap, DPIPXLFMT, dpipxlfmt); |
945 if (ret) 946 return ret; 947 948 ret = regmap_write(tc->regmap, DP0_MISC, 949 FIELD_PREP(MAX_TU_SYMBOL, max_tu_symbol) | 950 FIELD_PREP(TU_SIZE, TU_SIZE_RECOMMENDED) | 951 BPC_8); 952 return ret; --- 286 unchanged lines hidden (view full) --- 1239 int ret; 1240 1241 dev_dbg(tc->dev, "link disable\n"); 1242 1243 ret = regmap_write(tc->regmap, DP0_SRCCTRL, 0); 1244 if (ret) 1245 return ret; 1246 | 951 if (ret) 952 return ret; 953 954 ret = regmap_write(tc->regmap, DP0_MISC, 955 FIELD_PREP(MAX_TU_SYMBOL, max_tu_symbol) | 956 FIELD_PREP(TU_SIZE, TU_SIZE_RECOMMENDED) | 957 BPC_8); 958 return ret; --- 286 unchanged lines hidden (view full) --- 1245 int ret; 1246 1247 dev_dbg(tc->dev, "link disable\n"); 1248 1249 ret = regmap_write(tc->regmap, DP0_SRCCTRL, 0); 1250 if (ret) 1251 return ret; 1252 |
1247 return regmap_write(tc->regmap, DP0CTL, 0); | 1253 ret = regmap_write(tc->regmap, DP0CTL, 0); 1254 if (ret) 1255 return ret; 1256 1257 return regmap_update_bits(tc->regmap, DP_PHY_CTRL, 1258 PHY_M0_RST | PHY_M1_RST | PHY_M0_EN, 1259 PHY_M0_RST | PHY_M1_RST); |
1248} 1249 1250static int tc_dsi_rx_enable(struct tc_data *tc) 1251{ 1252 u32 value; 1253 int ret; 1254 | 1260} 1261 1262static int tc_dsi_rx_enable(struct tc_data *tc) 1263{ 1264 u32 value; 1265 int ret; 1266 |
1255 regmap_write(tc->regmap, PPI_D0S_CLRSIPOCOUNT, 3); 1256 regmap_write(tc->regmap, PPI_D1S_CLRSIPOCOUNT, 3); 1257 regmap_write(tc->regmap, PPI_D2S_CLRSIPOCOUNT, 3); 1258 regmap_write(tc->regmap, PPI_D3S_CLRSIPOCOUNT, 3); | 1267 regmap_write(tc->regmap, PPI_D0S_CLRSIPOCOUNT, 5); 1268 regmap_write(tc->regmap, PPI_D1S_CLRSIPOCOUNT, 5); 1269 regmap_write(tc->regmap, PPI_D2S_CLRSIPOCOUNT, 5); 1270 regmap_write(tc->regmap, PPI_D3S_CLRSIPOCOUNT, 5); |
1259 regmap_write(tc->regmap, PPI_D0S_ATMR, 0); 1260 regmap_write(tc->regmap, PPI_D1S_ATMR, 0); 1261 regmap_write(tc->regmap, PPI_TX_RX_TA, TTA_GET | TTA_SURE); 1262 regmap_write(tc->regmap, PPI_LPTXTIMECNT, LPX_PERIOD); 1263 1264 value = ((LANEENABLE_L0EN << tc->dsi->lanes) - LANEENABLE_L0EN) | 1265 LANEENABLE_CLEN; 1266 regmap_write(tc->regmap, PPI_LANEENABLE, value); --- 224 unchanged lines hidden (view full) --- 1491 if (ret < 0) 1492 dev_err(tc->dev, "main link stream stop error: %d\n", ret); 1493 1494 ret = tc_main_link_disable(tc); 1495 if (ret < 0) 1496 dev_err(tc->dev, "main link disable error: %d\n", ret); 1497} 1498 | 1271 regmap_write(tc->regmap, PPI_D0S_ATMR, 0); 1272 regmap_write(tc->regmap, PPI_D1S_ATMR, 0); 1273 regmap_write(tc->regmap, PPI_TX_RX_TA, TTA_GET | TTA_SURE); 1274 regmap_write(tc->regmap, PPI_LPTXTIMECNT, LPX_PERIOD); 1275 1276 value = ((LANEENABLE_L0EN << tc->dsi->lanes) - LANEENABLE_L0EN) | 1277 LANEENABLE_CLEN; 1278 regmap_write(tc->regmap, PPI_LANEENABLE, value); --- 224 unchanged lines hidden (view full) --- 1503 if (ret < 0) 1504 dev_err(tc->dev, "main link stream stop error: %d\n", ret); 1505 1506 ret = tc_main_link_disable(tc); 1507 if (ret < 0) 1508 dev_err(tc->dev, "main link disable error: %d\n", ret); 1509} 1510 |
1499static bool tc_bridge_mode_fixup(struct drm_bridge *bridge, 1500 const struct drm_display_mode *mode, 1501 struct drm_display_mode *adj) 1502{ 1503 /* Fixup sync polarities, both hsync and vsync are active low */ 1504 adj->flags = mode->flags; 1505 adj->flags |= (DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC); 1506 adj->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC); 1507 1508 return true; 1509} 1510 1511static int tc_common_atomic_check(struct drm_bridge *bridge, 1512 struct drm_bridge_state *bridge_state, 1513 struct drm_crtc_state *crtc_state, 1514 struct drm_connector_state *conn_state, 1515 const unsigned int max_khz) 1516{ 1517 tc_bridge_mode_fixup(bridge, &crtc_state->mode, 1518 &crtc_state->adjusted_mode); 1519 1520 if (crtc_state->adjusted_mode.clock > max_khz) 1521 return -EINVAL; 1522 1523 return 0; 1524} 1525 | |
1526static int tc_dpi_atomic_check(struct drm_bridge *bridge, 1527 struct drm_bridge_state *bridge_state, 1528 struct drm_crtc_state *crtc_state, 1529 struct drm_connector_state *conn_state) 1530{ 1531 /* DSI->DPI interface clock limitation: upto 100 MHz */ | 1511static int tc_dpi_atomic_check(struct drm_bridge *bridge, 1512 struct drm_bridge_state *bridge_state, 1513 struct drm_crtc_state *crtc_state, 1514 struct drm_connector_state *conn_state) 1515{ 1516 /* DSI->DPI interface clock limitation: upto 100 MHz */ |
1532 return tc_common_atomic_check(bridge, bridge_state, crtc_state, 1533 conn_state, 100000); | 1517 if (crtc_state->adjusted_mode.clock > 100000) 1518 return -EINVAL; 1519 1520 return 0; |
1534} 1535 1536static int tc_edp_atomic_check(struct drm_bridge *bridge, 1537 struct drm_bridge_state *bridge_state, 1538 struct drm_crtc_state *crtc_state, 1539 struct drm_connector_state *conn_state) 1540{ 1541 /* DPI->(e)DP interface clock limitation: upto 154 MHz */ | 1521} 1522 1523static int tc_edp_atomic_check(struct drm_bridge *bridge, 1524 struct drm_bridge_state *bridge_state, 1525 struct drm_crtc_state *crtc_state, 1526 struct drm_connector_state *conn_state) 1527{ 1528 /* DPI->(e)DP interface clock limitation: upto 154 MHz */ |
1542 return tc_common_atomic_check(bridge, bridge_state, crtc_state, 1543 conn_state, 154000); | 1529 if (crtc_state->adjusted_mode.clock > 154000) 1530 return -EINVAL; 1531 1532 return 0; |
1544} 1545 1546static enum drm_mode_status 1547tc_dpi_mode_valid(struct drm_bridge *bridge, 1548 const struct drm_display_info *info, 1549 const struct drm_display_mode *mode) 1550{ 1551 /* DPI interface clock limitation: upto 100 MHz */ --- 226 unchanged lines hidden (view full) --- 1778static const struct drm_bridge_funcs tc_edp_bridge_funcs = { 1779 .attach = tc_edp_bridge_attach, 1780 .detach = tc_edp_bridge_detach, 1781 .mode_valid = tc_edp_mode_valid, 1782 .mode_set = tc_bridge_mode_set, 1783 .atomic_check = tc_edp_atomic_check, 1784 .atomic_enable = tc_edp_bridge_atomic_enable, 1785 .atomic_disable = tc_edp_bridge_atomic_disable, | 1533} 1534 1535static enum drm_mode_status 1536tc_dpi_mode_valid(struct drm_bridge *bridge, 1537 const struct drm_display_info *info, 1538 const struct drm_display_mode *mode) 1539{ 1540 /* DPI interface clock limitation: upto 100 MHz */ --- 226 unchanged lines hidden (view full) --- 1767static const struct drm_bridge_funcs tc_edp_bridge_funcs = { 1768 .attach = tc_edp_bridge_attach, 1769 .detach = tc_edp_bridge_detach, 1770 .mode_valid = tc_edp_mode_valid, 1771 .mode_set = tc_bridge_mode_set, 1772 .atomic_check = tc_edp_atomic_check, 1773 .atomic_enable = tc_edp_bridge_atomic_enable, 1774 .atomic_disable = tc_edp_bridge_atomic_disable, |
1786 .mode_fixup = tc_bridge_mode_fixup, | |
1787 .detect = tc_bridge_detect, 1788 .get_edid = tc_get_edid, 1789 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 1790 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 1791 .atomic_reset = drm_atomic_helper_bridge_reset, 1792}; 1793 1794static bool tc_readable_reg(struct device *dev, unsigned int reg) --- 125 unchanged lines hidden (view full) --- 1920 } 1921 1922 return 0; 1923} 1924 1925static int tc_probe_dpi_bridge_endpoint(struct tc_data *tc) 1926{ 1927 struct device *dev = tc->dev; | 1775 .detect = tc_bridge_detect, 1776 .get_edid = tc_get_edid, 1777 .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, 1778 .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, 1779 .atomic_reset = drm_atomic_helper_bridge_reset, 1780}; 1781 1782static bool tc_readable_reg(struct device *dev, unsigned int reg) --- 125 unchanged lines hidden (view full) --- 1908 } 1909 1910 return 0; 1911} 1912 1913static int tc_probe_dpi_bridge_endpoint(struct tc_data *tc) 1914{ 1915 struct device *dev = tc->dev; |
1916 struct drm_bridge *bridge; |
|
1928 struct drm_panel *panel; 1929 int ret; 1930 1931 /* port@1 is the DPI input/output port */ | 1917 struct drm_panel *panel; 1918 int ret; 1919 1920 /* port@1 is the DPI input/output port */ |
1932 ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, NULL); | 1921 ret = drm_of_find_panel_or_bridge(dev->of_node, 1, 0, &panel, &bridge); |
1933 if (ret && ret != -ENODEV) 1934 return ret; 1935 1936 if (panel) { | 1922 if (ret && ret != -ENODEV) 1923 return ret; 1924 1925 if (panel) { |
1937 struct drm_bridge *panel_bridge; | 1926 bridge = devm_drm_panel_bridge_add(dev, panel); 1927 if (IS_ERR(bridge)) 1928 return PTR_ERR(bridge); 1929 } |
1938 | 1930 |
1939 panel_bridge = devm_drm_panel_bridge_add(dev, panel); 1940 if (IS_ERR(panel_bridge)) 1941 return PTR_ERR(panel_bridge); 1942 1943 tc->panel_bridge = panel_bridge; | 1931 if (bridge) { 1932 tc->panel_bridge = bridge; |
1944 tc->bridge.type = DRM_MODE_CONNECTOR_DPI; 1945 tc->bridge.funcs = &tc_dpi_bridge_funcs; 1946 1947 return 0; 1948 } 1949 1950 return ret; 1951} --- 53 unchanged lines hidden (view full) --- 2005 * Possible connections: 2006 * DPI -> port@1 -> port@2 -> eDP :: [port@0 is not connected] 2007 * DSI -> port@0 -> port@2 -> eDP :: [port@1 is not connected] 2008 * DSI -> port@0 -> port@1 -> DPI :: [port@2 is not connected] 2009 */ 2010 2011 for_each_endpoint_of_node(dev->of_node, node) { 2012 of_graph_parse_endpoint(node, &endpoint); | 1933 tc->bridge.type = DRM_MODE_CONNECTOR_DPI; 1934 tc->bridge.funcs = &tc_dpi_bridge_funcs; 1935 1936 return 0; 1937 } 1938 1939 return ret; 1940} --- 53 unchanged lines hidden (view full) --- 1994 * Possible connections: 1995 * DPI -> port@1 -> port@2 -> eDP :: [port@0 is not connected] 1996 * DSI -> port@0 -> port@2 -> eDP :: [port@1 is not connected] 1997 * DSI -> port@0 -> port@1 -> DPI :: [port@2 is not connected] 1998 */ 1999 2000 for_each_endpoint_of_node(dev->of_node, node) { 2001 of_graph_parse_endpoint(node, &endpoint); |
2013 if (endpoint.port > 2) | 2002 if (endpoint.port > 2) { 2003 of_node_put(node); |
2014 return -EINVAL; | 2004 return -EINVAL; |
2015 | 2005 } |
2016 mode |= BIT(endpoint.port); 2017 } 2018 2019 if (mode == mode_dpi_to_edp || mode == mode_dpi_to_dp) { 2020 tc->input_connector_dsi = false; 2021 return tc_probe_edp_bridge_endpoint(tc); 2022 } else if (mode == mode_dsi_to_dpi) { 2023 tc->input_connector_dsi = true; --- 165 unchanged lines hidden (view full) --- 2189 drm_bridge_remove(&tc->bridge); 2190 return ret; 2191 } 2192 } 2193 2194 return 0; 2195} 2196 | 2006 mode |= BIT(endpoint.port); 2007 } 2008 2009 if (mode == mode_dpi_to_edp || mode == mode_dpi_to_dp) { 2010 tc->input_connector_dsi = false; 2011 return tc_probe_edp_bridge_endpoint(tc); 2012 } else if (mode == mode_dsi_to_dpi) { 2013 tc->input_connector_dsi = true; --- 165 unchanged lines hidden (view full) --- 2179 drm_bridge_remove(&tc->bridge); 2180 return ret; 2181 } 2182 } 2183 2184 return 0; 2185} 2186 |
2197static void tc_remove(struct i2c_client *client) | 2187static int tc_remove(struct i2c_client *client) |
2198{ 2199 struct tc_data *tc = i2c_get_clientdata(client); 2200 2201 drm_bridge_remove(&tc->bridge); | 2188{ 2189 struct tc_data *tc = i2c_get_clientdata(client); 2190 2191 drm_bridge_remove(&tc->bridge); |
2192 2193 return 0; |
|
2202} 2203 2204static const struct i2c_device_id tc358767_i2c_ids[] = { 2205 { "tc358767", 0 }, 2206 { } 2207}; 2208MODULE_DEVICE_TABLE(i2c, tc358767_i2c_ids); 2209 --- 20 unchanged lines hidden --- | 2194} 2195 2196static const struct i2c_device_id tc358767_i2c_ids[] = { 2197 { "tc358767", 0 }, 2198 { } 2199}; 2200MODULE_DEVICE_TABLE(i2c, tc358767_i2c_ids); 2201 --- 20 unchanged lines hidden --- |