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 ---