77#include <config.h>
88#include <common.h>
99#include <errno.h>
10- #include <malloc.h>
1110#include <asm/unaligned.h>
1211#include <asm/io.h>
1312#include <asm/hardware.h>
14- #include <linux/list.h>
1513#include <dm/device.h>
1614#include <dm/read.h>
1715#include <dm/of_access.h>
2119#include "rockchip_display.h"
2220#include "rockchip_crtc.h"
2321#include "rockchip_connector.h"
22+ #include "rockchip_panel.h"
2423#include "rockchip_phy.h"
2524#include "rockchip_mipi_dsi.h"
2625
27- #define MSEC_PER_SEC 1000L
28- #define USEC_PER_SEC 1000000L
29-
3026#define DSI_VERSION 0x00
3127#define DSI_PWR_UP 0x04
3228#define RESET 0
@@ -232,11 +228,9 @@ struct dw_mipi_dsi {
232228 struct udevice * dev ;
233229 void * base ;
234230 void * grf ;
235- const void * blob ;
236- ofnode node ;
237231 int id ;
238232
239- /* dual-channel */
233+ /* for dual-channel */
240234 struct dw_mipi_dsi * master ;
241235 struct dw_mipi_dsi * slave ;
242236
@@ -855,10 +849,8 @@ static ssize_t dw_mipi_dsi_transfer(struct dw_mipi_dsi *dsi,
855849
856850 if (dsi -> slave ) {
857851 ret = dw_mipi_dsi_transfer (dsi -> slave , msg );
858- if (ret ) {
859- printf ("failed to send command through dsi slave, ret = %d\n" , ret );
852+ if (ret < 0 )
860853 return ret ;
861- }
862854 }
863855
864856 return msg -> rx_len ? msg -> rx_len : msg -> tx_len ;
@@ -868,7 +860,7 @@ static ssize_t dw_mipi_dsi_connector_transfer(struct display_state *state,
868860 const struct mipi_dsi_msg * msg )
869861{
870862 struct connector_state * conn_state = & state -> conn_state ;
871- struct dw_mipi_dsi * dsi = conn_state -> private ;
863+ struct dw_mipi_dsi * dsi = dev_get_priv ( conn_state -> dev ) ;
872864
873865 return dw_mipi_dsi_transfer (dsi , msg );
874866}
@@ -1091,109 +1083,36 @@ static void dw_mipi_dsi_clear_err(struct dw_mipi_dsi *dsi)
10911083 dsi_write (dsi , DSI_INT_MSK1 , 0 );
10921084}
10931085
1094- static int dw_mipi_dsi_dual_channel_probe (struct dw_mipi_dsi * master )
1095- {
1096- int phandle ;
1097- struct device_node * np ;
1098- struct dw_mipi_dsi * slave = NULL ;
1099-
1100- phandle = ofnode_read_u32_default (master -> node , "rockchip,dual-channel" , -1 );
1101- if (phandle < 0 )
1102- return 0 ;
1103-
1104- np = of_find_node_by_phandle (phandle );
1105- if (ofnode_valid (np_to_ofnode (np ))) {
1106- printf ("failed to find dsi slave node\n" );
1107- return - ENODEV ;
1108- }
1109-
1110- if (!of_device_is_available (np )) {
1111- printf ("dsi slave node is not available\n" );
1112- return - ENODEV ;
1113- }
1114-
1115- slave = malloc (sizeof (* slave ));
1116- if (!slave )
1117- return - ENOMEM ;
1118-
1119- memset (slave , 0 , sizeof (* slave ));
1120-
1121- master -> lanes /= 2 ;
1122- master -> slave = slave ;
1123- slave -> master = master ;
1124-
1125- slave -> blob = master -> blob ;
1126- slave -> node = np_to_ofnode (np );
1127- slave -> base = (u32 * )ofnode_get_addr_index (slave -> node , 0 );
1128- slave -> pdata = master -> pdata ;
1129- slave -> id = 1 ;
1130- slave -> dphy .phy = master -> dphy .phy ;
1131- slave -> lanes = master -> lanes ;
1132- slave -> format = master -> format ;
1133- slave -> mode_flags = master -> mode_flags ;
1134- slave -> channel = master -> channel ;
1135-
1136- return 0 ;
1137- }
1138-
11391086static int dw_mipi_dsi_connector_init (struct display_state * state )
11401087{
11411088 struct connector_state * conn_state = & state -> conn_state ;
1142- const struct rockchip_connector * connector = conn_state -> connector ;
1143- const struct dw_mipi_dsi_plat_data * pdata = connector -> data ;
1144- ofnode mipi_node = conn_state -> node ;
11451089 struct dw_mipi_dsi * dsi = dev_get_priv (conn_state -> dev );
1146- ofnode panel ;
1147- int id ;
1148- int ret ;
1090+ struct rockchip_panel * panel = state_get_panel (state );
11491091
1150- dsi -> base = dev_read_addr_ptr (conn_state -> dev );
1151- dsi -> grf = syscon_get_first_range (ROCKCHIP_SYSCON_GRF );
1152- if (dsi -> grf <= 0 ) {
1153- printf ("%s: Get syscon grf failed (ret=%p)\n" ,
1154- __func__ , dsi -> grf );
1155- return - ENXIO ;
1156- }
1157-
1158- id = of_alias_get_id (ofnode_to_np (mipi_node ), "dsi" );
1159- if (id < 0 )
1160- id = 0 ;
1161-
1162- dsi -> pdata = pdata ;
1163- dsi -> id = id ;
1164- dsi -> blob = state -> blob ;
1165- dsi -> node = mipi_node ;
11661092 dsi -> dphy .phy = conn_state -> phy ;
11671093
1168- conn_state -> private = dsi ;
1094+ dsi -> lanes = dev_read_u32_default (panel -> dev , "dsi,lanes" , 4 );
1095+ dsi -> format = dev_read_u32_default (panel -> dev , "dsi,format" ,
1096+ MIPI_DSI_FMT_RGB888 );
1097+ dsi -> mode_flags = dev_read_u32_default (panel -> dev , "dsi,flags" ,
1098+ MIPI_DSI_MODE_VIDEO |
1099+ MIPI_DSI_MODE_VIDEO_BURST |
1100+ MIPI_DSI_MODE_LPM |
1101+ MIPI_DSI_MODE_EOT_PACKET );
1102+ dsi -> channel = dev_read_u32_default (panel -> dev , "reg" , 0 );
1103+
11691104 conn_state -> output_mode = ROCKCHIP_OUT_MODE_P888 ;
11701105 conn_state -> color_space = V4L2_COLORSPACE_DEFAULT ;
1171-
1172- panel = dev_read_subnode (conn_state -> dev , "panel" );
1173- if (!ofnode_valid (panel )) {
1174- printf ("failed to find panel node\n" );
1175- return -1 ;
1176- }
1177-
1178- #define FDT_GET_INT (val , name ) \
1179- val = ofnode_read_s32_default(panel, name, -1); \
1180- if (val < 0) { \
1181- printf("Can't get %s\n", name); \
1182- return -1; \
1183- }
1184-
1185- FDT_GET_INT (dsi -> lanes , "dsi,lanes" );
1186- FDT_GET_INT (dsi -> format , "dsi,format" );
1187- FDT_GET_INT (dsi -> mode_flags , "dsi,flags" );
1188- FDT_GET_INT (dsi -> channel , "reg" );
1189-
1190- ret = dw_mipi_dsi_dual_channel_probe (dsi );
1191- if (ret )
1192- return ret ;
1193-
11941106 conn_state -> type = DRM_MODE_CONNECTOR_DSI ;
1195- if (dsi -> slave )
1107+
1108+ if (dsi -> slave ) {
1109+ dsi -> lanes /= 2 ;
1110+ dsi -> slave -> lanes = dsi -> lanes ;
1111+ dsi -> slave -> format = dsi -> format ;
1112+ dsi -> slave -> mode_flags = dsi -> mode_flags ;
1113+ dsi -> slave -> channel = dsi -> channel ;
11961114 conn_state -> output_type = ROCKCHIP_OUTPUT_DSI_DUAL_CHANNEL ;
1115+ }
11971116
11981117 return 0 ;
11991118}
@@ -1279,7 +1198,7 @@ static int dw_mipi_dsi_connector_prepare(struct display_state *state)
12791198{
12801199 struct connector_state * conn_state = & state -> conn_state ;
12811200 struct crtc_state * crtc_state = & state -> crtc_state ;
1282- struct dw_mipi_dsi * dsi = conn_state -> private ;
1201+ struct dw_mipi_dsi * dsi = dev_get_priv ( conn_state -> dev ) ;
12831202 unsigned long lane_rate ;
12841203
12851204 dsi -> mode = & conn_state -> mode ;
@@ -1304,15 +1223,15 @@ static int dw_mipi_dsi_connector_prepare(struct display_state *state)
13041223static void dw_mipi_dsi_connector_unprepare (struct display_state * state )
13051224{
13061225 struct connector_state * conn_state = & state -> conn_state ;
1307- struct dw_mipi_dsi * dsi = conn_state -> private ;
1226+ struct dw_mipi_dsi * dsi = dev_get_priv ( conn_state -> dev ) ;
13081227
13091228 dw_mipi_dsi_post_disable (dsi );
13101229}
13111230
13121231static int dw_mipi_dsi_connector_enable (struct display_state * state )
13131232{
13141233 struct connector_state * conn_state = & state -> conn_state ;
1315- struct dw_mipi_dsi * dsi = conn_state -> private ;
1234+ struct dw_mipi_dsi * dsi = dev_get_priv ( conn_state -> dev ) ;
13161235
13171236 dw_mipi_dsi_enable (dsi );
13181237
@@ -1322,7 +1241,7 @@ static int dw_mipi_dsi_connector_enable(struct display_state *state)
13221241static int dw_mipi_dsi_connector_disable (struct display_state * state )
13231242{
13241243 struct connector_state * conn_state = & state -> conn_state ;
1325- struct dw_mipi_dsi * dsi = conn_state -> private ;
1244+ struct dw_mipi_dsi * dsi = dev_get_priv ( conn_state -> dev ) ;
13261245
13271246 dw_mipi_dsi_disable (dsi );
13281247
@@ -1338,6 +1257,61 @@ static const struct rockchip_connector_funcs dw_mipi_dsi_connector_funcs = {
13381257 .transfer = dw_mipi_dsi_connector_transfer ,
13391258};
13401259
1260+ static int dw_mipi_dsi_dual_channel_probe (struct dw_mipi_dsi * master )
1261+ {
1262+ struct udevice * dev ;
1263+ struct dw_mipi_dsi * slave ;
1264+ int ret ;
1265+
1266+ ret = uclass_get_device_by_phandle (UCLASS_DISPLAY , master -> dev ,
1267+ "rockchip,dual-channel" , & dev );
1268+ if (ret == - ENOENT ) {
1269+ return 0 ;
1270+ } else if (ret ) {
1271+ dev_err (dev , "failed to find slave device: %d\n" , ret );
1272+ return ret ;
1273+ }
1274+
1275+ slave = dev_get_priv (dev );
1276+ if (!slave ) {
1277+ dev_err (dev , "failed to get slave channel\n" );
1278+ return - ENODEV ;
1279+ }
1280+
1281+ master -> slave = slave ;
1282+ slave -> master = master ;
1283+
1284+ return 0 ;
1285+ }
1286+
1287+ static int dw_mipi_dsi_probe (struct udevice * dev )
1288+ {
1289+ struct dw_mipi_dsi * dsi = dev_get_priv (dev );
1290+ const struct rockchip_connector * connector =
1291+ (const struct rockchip_connector * )dev_get_driver_data (dev );
1292+ const struct dw_mipi_dsi_plat_data * pdata = connector -> data ;
1293+ int id , ret ;
1294+
1295+ dsi -> base = dev_read_addr_ptr (dev );
1296+ dsi -> grf = syscon_get_first_range (ROCKCHIP_SYSCON_GRF );
1297+ if (IS_ERR (dsi -> grf ))
1298+ return PTR_ERR (dsi -> grf );
1299+
1300+ id = of_alias_get_id (ofnode_to_np (dev -> node ), "dsi" );
1301+ if (id < 0 )
1302+ id = 0 ;
1303+
1304+ dsi -> dev = dev ;
1305+ dsi -> pdata = pdata ;
1306+ dsi -> id = id ;
1307+
1308+ ret = dw_mipi_dsi_dual_channel_probe (dsi );
1309+ if (ret )
1310+ return ret ;
1311+
1312+ return 0 ;
1313+ }
1314+
13411315static const u32 px30_dsi_grf_reg_fields [MAX_FIELDS ] = {
13421316 [DPIUPDATECFG ] = GRF_REG_FIELD (0x0434 , 7 , 7 ),
13431317 [DPICOLORM ] = GRF_REG_FIELD (0x0434 , 3 , 3 ),
@@ -1469,6 +1443,7 @@ static const u32 rk3399_dsi1_grf_reg_fields[MAX_FIELDS] = {
14691443 [DPICOLORM ] = GRF_REG_FIELD (0x6250 , 1 , 1 ),
14701444 [TURNDISABLE ] = GRF_REG_FIELD (0x625c , 12 , 15 ),
14711445 [FORCETXSTOPMODE ] = GRF_REG_FIELD (0x625c , 8 , 11 ),
1446+ [FORCERXMODE ] = GRF_REG_FIELD (0x625c , 4 , 7 ),
14721447 [ENABLE_N ] = GRF_REG_FIELD (0x625c , 0 , 3 ),
14731448 [MASTERSLAVEZ ] = GRF_REG_FIELD (0x6260 , 7 , 7 ),
14741449 [ENABLECLK ] = GRF_REG_FIELD (0x6260 , 6 , 6 ),
@@ -1538,15 +1513,6 @@ static const struct udevice_id dw_mipi_dsi_ids[] = {
15381513 {}
15391514};
15401515
1541- static int dw_mipi_dsi_probe (struct udevice * dev )
1542- {
1543- struct dw_mipi_dsi * dsi = dev_get_priv (dev );
1544-
1545- dsi -> dev = dev ;
1546-
1547- return 0 ;
1548- }
1549-
15501516U_BOOT_DRIVER (dw_mipi_dsi ) = {
15511517 .name = "dw_mipi_dsi" ,
15521518 .id = UCLASS_DISPLAY ,
0 commit comments