tc358767.c (385c59c7baaa4626f5c01888d50e86e5636e655e) tc358767.c (63f8f3badf799c8b63ff33a489886bc138ce5d09)
1/*
2 * tc358767 eDP bridge driver
3 *
4 * Copyright (C) 2016 CogentEmbedded Inc
5 * Author: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
6 *
7 * Copyright (C) 2016 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de>
8 *

--- 84 unchanged lines hidden (view full) ---

93
94/* Main Channel */
95#define DP0_SECSAMPLE 0x0640
96#define DP0_VIDSYNCDELAY 0x0644
97#define DP0_TOTALVAL 0x0648
98#define DP0_STARTVAL 0x064c
99#define DP0_ACTIVEVAL 0x0650
100#define DP0_SYNCVAL 0x0654
1/*
2 * tc358767 eDP bridge driver
3 *
4 * Copyright (C) 2016 CogentEmbedded Inc
5 * Author: Andrey Gusakov <andrey.gusakov@cogentembedded.com>
6 *
7 * Copyright (C) 2016 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de>
8 *

--- 84 unchanged lines hidden (view full) ---

93
94/* Main Channel */
95#define DP0_SECSAMPLE 0x0640
96#define DP0_VIDSYNCDELAY 0x0644
97#define DP0_TOTALVAL 0x0648
98#define DP0_STARTVAL 0x064c
99#define DP0_ACTIVEVAL 0x0650
100#define DP0_SYNCVAL 0x0654
101#define SYNCVAL_HS_POL_ACTIVE_LOW (1 << 15)
102#define SYNCVAL_VS_POL_ACTIVE_LOW (1 << 31)
103#define DP0_MISC 0x0658
104#define TU_SIZE_RECOMMENDED (63) /* LSCLK cycles per TU */
105#define BPC_6 (0 << 5)
106#define BPC_8 (1 << 5)
107
108/* AUX channel */
109#define DP0_AUXCFG0 0x0660
110#define DP0_AUXCFG1 0x0664

--- 28 unchanged lines hidden (view full) ---

139#define LT_STATUS_MASK (0x1f << 8)
140#define LT_CHANNEL1_EQ_BITS (DP_CHANNEL_EQ_BITS << 4)
141#define LT_INTERLANE_ALIGN_DONE BIT(3)
142#define LT_CHANNEL0_EQ_BITS (DP_CHANNEL_EQ_BITS)
143#define DP0_SNKLTCHGREQ 0x06d4
144#define DP0_LTLOOPCTRL 0x06d8
145#define DP0_SNKLTCTRL 0x06e4
146
101#define DP0_MISC 0x0658
102#define TU_SIZE_RECOMMENDED (63) /* LSCLK cycles per TU */
103#define BPC_6 (0 << 5)
104#define BPC_8 (1 << 5)
105
106/* AUX channel */
107#define DP0_AUXCFG0 0x0660
108#define DP0_AUXCFG1 0x0664

--- 28 unchanged lines hidden (view full) ---

137#define LT_STATUS_MASK (0x1f << 8)
138#define LT_CHANNEL1_EQ_BITS (DP_CHANNEL_EQ_BITS << 4)
139#define LT_INTERLANE_ALIGN_DONE BIT(3)
140#define LT_CHANNEL0_EQ_BITS (DP_CHANNEL_EQ_BITS)
141#define DP0_SNKLTCHGREQ 0x06d4
142#define DP0_LTLOOPCTRL 0x06d8
143#define DP0_SNKLTCTRL 0x06e4
144
147#define DP1_SRCCTRL 0x07a0
148
149/* PHY */
150#define DP_PHY_CTRL 0x0800
151#define DP_PHY_RST BIT(28) /* DP PHY Global Soft Reset */
152#define BGREN BIT(25) /* AUX PHY BGR Enable */
153#define PWR_SW_EN BIT(24) /* PHY Power Switch Enable */
154#define PHY_M1_RST BIT(12) /* Reset PHY1 Main Channel */
155#define PHY_RDY BIT(16) /* PHY Main Channels Ready */
156#define PHY_M0_RST BIT(8) /* Reset PHY0 Main Channel */
145/* PHY */
146#define DP_PHY_CTRL 0x0800
147#define DP_PHY_RST BIT(28) /* DP PHY Global Soft Reset */
148#define BGREN BIT(25) /* AUX PHY BGR Enable */
149#define PWR_SW_EN BIT(24) /* PHY Power Switch Enable */
150#define PHY_M1_RST BIT(12) /* Reset PHY1 Main Channel */
151#define PHY_RDY BIT(16) /* PHY Main Channels Ready */
152#define PHY_M0_RST BIT(8) /* Reset PHY0 Main Channel */
157#define PHY_2LANE BIT(2) /* PHY Enable 2 lanes */
158#define PHY_A0_EN BIT(1) /* PHY Aux Channel0 Enable */
159#define PHY_M0_EN BIT(0) /* PHY Main Channel0 Enable */
160
161/* PLL */
162#define DP0_PLLCTRL 0x0900
163#define DP1_PLLCTRL 0x0904 /* not defined in DS */
164#define PXL_PLLCTRL 0x0908
165#define PLLUPDATE BIT(2)

--- 37 unchanged lines hidden (view full) ---

203 struct drm_panel *panel;
204
205 /* link settings */
206 struct tc_edp_link link;
207
208 /* display edid */
209 struct edid *edid;
210 /* current mode */
153#define PHY_A0_EN BIT(1) /* PHY Aux Channel0 Enable */
154#define PHY_M0_EN BIT(0) /* PHY Main Channel0 Enable */
155
156/* PLL */
157#define DP0_PLLCTRL 0x0900
158#define DP1_PLLCTRL 0x0904 /* not defined in DS */
159#define PXL_PLLCTRL 0x0908
160#define PLLUPDATE BIT(2)

--- 37 unchanged lines hidden (view full) ---

198 struct drm_panel *panel;
199
200 /* link settings */
201 struct tc_edp_link link;
202
203 /* display edid */
204 struct edid *edid;
205 /* current mode */
211 struct drm_display_mode *mode;
206 const struct drm_display_mode *mode;
212
213 u32 rev;
214 u8 assr;
215
216 struct gpio_desc *sd_gpio;
217 struct gpio_desc *reset_gpio;
218 struct clk *refclk;
219};

--- 320 unchanged lines hidden (view full) ---

540 return ret;
541}
542
543static int tc_aux_link_setup(struct tc_data *tc)
544{
545 unsigned long rate;
546 u32 value;
547 int ret;
207
208 u32 rev;
209 u8 assr;
210
211 struct gpio_desc *sd_gpio;
212 struct gpio_desc *reset_gpio;
213 struct clk *refclk;
214};

--- 320 unchanged lines hidden (view full) ---

535 return ret;
536}
537
538static int tc_aux_link_setup(struct tc_data *tc)
539{
540 unsigned long rate;
541 u32 value;
542 int ret;
548 u32 dp_phy_ctrl;
549
550 rate = clk_get_rate(tc->refclk);
551 switch (rate) {
552 case 38400000:
553 value = REF_FREQ_38M4;
554 break;
555 case 26000000:
556 value = REF_FREQ_26M;

--- 8 unchanged lines hidden (view full) ---

565 dev_err(tc->dev, "Invalid refclk rate: %lu Hz\n", rate);
566 return -EINVAL;
567 }
568
569 /* Setup DP-PHY / PLL */
570 value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
571 tc_write(SYS_PLLPARAM, value);
572
543
544 rate = clk_get_rate(tc->refclk);
545 switch (rate) {
546 case 38400000:
547 value = REF_FREQ_38M4;
548 break;
549 case 26000000:
550 value = REF_FREQ_26M;

--- 8 unchanged lines hidden (view full) ---

559 dev_err(tc->dev, "Invalid refclk rate: %lu Hz\n", rate);
560 return -EINVAL;
561 }
562
563 /* Setup DP-PHY / PLL */
564 value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
565 tc_write(SYS_PLLPARAM, value);
566
573 dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN;
574 if (tc->link.base.num_lanes == 2)
575 dp_phy_ctrl |= PHY_2LANE;
576 tc_write(DP_PHY_CTRL, dp_phy_ctrl);
567 tc_write(DP_PHY_CTRL, BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN);
577
578 /*
579 * Initially PLLs are in bypass. Force PLL parameter update,
580 * disable PLL bypass, enable PLL
581 */
582 tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
583 tc_wait_pll_lock(tc);
584

--- 67 unchanged lines hidden (view full) ---

652
653 return 0;
654
655err_dpcd_read:
656 dev_err(tc->dev, "failed to read DPCD: %d\n", ret);
657 return ret;
658}
659
568
569 /*
570 * Initially PLLs are in bypass. Force PLL parameter update,
571 * disable PLL bypass, enable PLL
572 */
573 tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
574 tc_wait_pll_lock(tc);
575

--- 67 unchanged lines hidden (view full) ---

643
644 return 0;
645
646err_dpcd_read:
647 dev_err(tc->dev, "failed to read DPCD: %d\n", ret);
648 return ret;
649}
650
660static int tc_set_video_mode(struct tc_data *tc, struct drm_display_mode *mode)
651static int tc_set_video_mode(struct tc_data *tc,
652 const struct drm_display_mode *mode)
661{
662 int ret;
663 int vid_sync_dly;
664 int max_tu_symbol;
665
666 int left_margin = mode->htotal - mode->hsync_end;
667 int right_margin = mode->hsync_start - mode->hdisplay;
668 int hsync_len = mode->hsync_end - mode->hsync_start;

--- 54 unchanged lines hidden (view full) ---

723 tc_write(DP0_TOTALVAL, (mode->vtotal << 16) | (mode->htotal));
724
725 tc_write(DP0_STARTVAL,
726 ((upper_margin + vsync_len) << 16) |
727 ((left_margin + hsync_len) << 0));
728
729 tc_write(DP0_ACTIVEVAL, (mode->vdisplay << 16) | (mode->hdisplay));
730
653{
654 int ret;
655 int vid_sync_dly;
656 int max_tu_symbol;
657
658 int left_margin = mode->htotal - mode->hsync_end;
659 int right_margin = mode->hsync_start - mode->hdisplay;
660 int hsync_len = mode->hsync_end - mode->hsync_start;

--- 54 unchanged lines hidden (view full) ---

715 tc_write(DP0_TOTALVAL, (mode->vtotal << 16) | (mode->htotal));
716
717 tc_write(DP0_STARTVAL,
718 ((upper_margin + vsync_len) << 16) |
719 ((left_margin + hsync_len) << 0));
720
721 tc_write(DP0_ACTIVEVAL, (mode->vdisplay << 16) | (mode->hdisplay));
722
731 tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0) |
732 ((mode->flags & DRM_MODE_FLAG_NHSYNC) ? SYNCVAL_HS_POL_ACTIVE_LOW : 0) |
733 ((mode->flags & DRM_MODE_FLAG_NVSYNC) ? SYNCVAL_VS_POL_ACTIVE_LOW : 0));
723 tc_write(DP0_SYNCVAL, (vsync_len << 16) | (hsync_len << 0));
734
735 tc_write(DPIPXLFMT, VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW |
736 DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888);
737
738 tc_write(DP0_MISC, (max_tu_symbol << 23) | (TU_SIZE_RECOMMENDED << 16) |
739 BPC_8);
740
741 return 0;

--- 93 unchanged lines hidden (view full) ---

835 u32 value;
836 int ret;
837 u8 tmp[8];
838
839 /* display mode should be set at this point */
840 if (!tc->mode)
841 return -EINVAL;
842
724
725 tc_write(DPIPXLFMT, VS_POL_ACTIVE_LOW | HS_POL_ACTIVE_LOW |
726 DE_POL_ACTIVE_HIGH | SUB_CFG_TYPE_CONFIG1 | DPI_BPP_RGB888);
727
728 tc_write(DP0_MISC, (max_tu_symbol << 23) | (TU_SIZE_RECOMMENDED << 16) |
729 BPC_8);
730
731 return 0;

--- 93 unchanged lines hidden (view full) ---

825 u32 value;
826 int ret;
827 u8 tmp[8];
828
829 /* display mode should be set at this point */
830 if (!tc->mode)
831 return -EINVAL;
832
843 tc_write(DP0_SRCCTRL, tc_srcctrl(tc));
844 /* SSCG and BW27 on DP1 must be set to the same as on DP0 */
845 tc_write(DP1_SRCCTRL,
846 (tc->link.spread ? DP0_SRCCTRL_SSCG : 0) |
847 ((tc->link.base.rate != 162000) ? DP0_SRCCTRL_BW27 : 0));
833 /* from excel file - DP0_SrcCtrl */
834 tc_write(DP0_SRCCTRL, DP0_SRCCTRL_SCRMBLDIS | DP0_SRCCTRL_EN810B |
835 DP0_SRCCTRL_LANESKEW | DP0_SRCCTRL_LANES_2 |
836 DP0_SRCCTRL_BW27 | DP0_SRCCTRL_AUTOCORRECT);
837 /* from excel file - DP1_SrcCtrl */
838 tc_write(0x07a0, 0x00003083);
848
849 rate = clk_get_rate(tc->refclk);
850 switch (rate) {
851 case 38400000:
852 value = REF_FREQ_38M4;
853 break;
854 case 26000000:
855 value = REF_FREQ_26M;

--- 4 unchanged lines hidden (view full) ---

860 case 13000000:
861 value = REF_FREQ_13M;
862 break;
863 default:
864 return -EINVAL;
865 }
866 value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
867 tc_write(SYS_PLLPARAM, value);
839
840 rate = clk_get_rate(tc->refclk);
841 switch (rate) {
842 case 38400000:
843 value = REF_FREQ_38M4;
844 break;
845 case 26000000:
846 value = REF_FREQ_26M;

--- 4 unchanged lines hidden (view full) ---

851 case 13000000:
852 value = REF_FREQ_13M;
853 break;
854 default:
855 return -EINVAL;
856 }
857 value |= SYSCLK_SEL_LSCLK | LSCLK_DIV_2;
858 tc_write(SYS_PLLPARAM, value);
868
869 /* Setup Main Link */
859 /* Setup Main Link */
870 dp_phy_ctrl = BGREN | PWR_SW_EN | PHY_A0_EN | PHY_M0_EN;
871 if (tc->link.base.num_lanes == 2)
872 dp_phy_ctrl |= PHY_2LANE;
860 dp_phy_ctrl = BGREN | PWR_SW_EN | BIT(2) | PHY_A0_EN | PHY_M0_EN;
873 tc_write(DP_PHY_CTRL, dp_phy_ctrl);
874 msleep(100);
875
876 /* PLL setup */
877 tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
878 tc_wait_pll_lock(tc);
879
880 tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN);

--- 232 unchanged lines hidden (view full) ---

1113 adj->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
1114
1115 return true;
1116}
1117
1118static enum drm_mode_status tc_connector_mode_valid(struct drm_connector *connector,
1119 struct drm_display_mode *mode)
1120{
861 tc_write(DP_PHY_CTRL, dp_phy_ctrl);
862 msleep(100);
863
864 /* PLL setup */
865 tc_write(DP0_PLLCTRL, PLLUPDATE | PLLEN);
866 tc_wait_pll_lock(tc);
867
868 tc_write(DP1_PLLCTRL, PLLUPDATE | PLLEN);

--- 232 unchanged lines hidden (view full) ---

1101 adj->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
1102
1103 return true;
1104}
1105
1106static enum drm_mode_status tc_connector_mode_valid(struct drm_connector *connector,
1107 struct drm_display_mode *mode)
1108{
1121 struct tc_data *tc = connector_to_tc(connector);
1122 u32 req, avail;
1123 u32 bits_per_pixel = 24;
1124
1125 /* DPI interface clock limitation: upto 154 MHz */
1126 if (mode->clock > 154000)
1127 return MODE_CLOCK_HIGH;
1128
1109 /* DPI interface clock limitation: upto 154 MHz */
1110 if (mode->clock > 154000)
1111 return MODE_CLOCK_HIGH;
1112
1129 req = mode->clock * bits_per_pixel / 8;
1130 avail = tc->link.base.num_lanes * tc->link.base.rate;
1131
1132 if (req > avail)
1133 return MODE_BAD;
1134
1135 return MODE_OK;
1136}
1137
1138static void tc_bridge_mode_set(struct drm_bridge *bridge,
1113 return MODE_OK;
1114}
1115
1116static void tc_bridge_mode_set(struct drm_bridge *bridge,
1139 struct drm_display_mode *mode,
1140 struct drm_display_mode *adj)
1117 const struct drm_display_mode *mode,
1118 const struct drm_display_mode *adj)
1141{
1142 struct tc_data *tc = bridge_to_tc(bridge);
1143
1144 tc->mode = mode;
1145}
1146
1147static int tc_connector_get_modes(struct drm_connector *connector)
1148{

--- 55 unchanged lines hidden (view full) ---

1204 u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
1205 struct tc_data *tc = bridge_to_tc(bridge);
1206 struct drm_device *drm = bridge->dev;
1207 int ret;
1208
1209 /* Create eDP connector */
1210 drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs);
1211 ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs,
1119{
1120 struct tc_data *tc = bridge_to_tc(bridge);
1121
1122 tc->mode = mode;
1123}
1124
1125static int tc_connector_get_modes(struct drm_connector *connector)
1126{

--- 55 unchanged lines hidden (view full) ---

1182 u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
1183 struct tc_data *tc = bridge_to_tc(bridge);
1184 struct drm_device *drm = bridge->dev;
1185 int ret;
1186
1187 /* Create eDP connector */
1188 drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs);
1189 ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs,
1212 tc->panel ? DRM_MODE_CONNECTOR_eDP :
1213 DRM_MODE_CONNECTOR_DisplayPort);
1190 DRM_MODE_CONNECTOR_eDP);
1214 if (ret)
1215 return ret;
1216
1217 if (tc->panel)
1218 drm_panel_attach(tc->panel, &tc->connector);
1219
1220 drm_display_info_set_bus_formats(&tc->connector.display_info,
1221 &bus_format, 1);
1191 if (ret)
1192 return ret;
1193
1194 if (tc->panel)
1195 drm_panel_attach(tc->panel, &tc->connector);
1196
1197 drm_display_info_set_bus_formats(&tc->connector.display_info,
1198 &bus_format, 1);
1222 tc->connector.display_info.bus_flags =
1223 DRM_BUS_FLAG_DE_HIGH |
1224 DRM_BUS_FLAG_PIXDATA_NEGEDGE |
1225 DRM_BUS_FLAG_SYNC_NEGEDGE;
1226 drm_connector_attach_encoder(&tc->connector, tc->bridge.encoder);
1227
1228 return 0;
1229}
1230
1231static const struct drm_bridge_funcs tc_bridge_funcs = {
1232 .attach = tc_bridge_attach,
1233 .mode_set = tc_bridge_mode_set,

--- 178 unchanged lines hidden ---
1199 drm_connector_attach_encoder(&tc->connector, tc->bridge.encoder);
1200
1201 return 0;
1202}
1203
1204static const struct drm_bridge_funcs tc_bridge_funcs = {
1205 .attach = tc_bridge_attach,
1206 .mode_set = tc_bridge_mode_set,

--- 178 unchanged lines hidden ---