@@ -937,6 +937,11 @@ static void rockchip_dsi_pre_init(struct dw_mipi_dsi *dsi)
937937 return ;
938938 }
939939
940+ if (clk_prepare_enable (dsi -> pllref_clk )) {
941+ dev_err (dsi -> dev , "Failed to enable pllref_clk\n" );
942+ return ;
943+ }
944+
940945 pm_runtime_get_sync (dsi -> dev );
941946
942947 if (dsi -> rst ) {
@@ -986,6 +991,7 @@ static void rockchip_dsi_init(struct dw_mipi_dsi *dsi)
986991static void rockchip_dsi_enable (struct dw_mipi_dsi * dsi )
987992{
988993 dw_mipi_dsi_set_mode (dsi , DSI_VIDEO_MODE );
994+ clk_disable_unprepare (dsi -> pllref_clk );
989995 clk_disable_unprepare (dsi -> pclk );
990996}
991997
@@ -1169,19 +1175,6 @@ static int dw_mipi_dsi_register(struct drm_device *drm,
11691175 return 0 ;
11701176}
11711177
1172- static int rockchip_mipi_parse_dt (struct dw_mipi_dsi * dsi )
1173- {
1174- struct device_node * np = dsi -> dev -> of_node ;
1175-
1176- dsi -> grf_regmap = syscon_regmap_lookup_by_phandle (np , "rockchip,grf" );
1177- if (IS_ERR (dsi -> grf_regmap )) {
1178- dev_err (dsi -> dev , "Unable to get rockchip,grf\n" );
1179- return PTR_ERR (dsi -> grf_regmap );
1180- }
1181-
1182- return 0 ;
1183- }
1184-
11851178static struct dw_mipi_dsi_plat_data rk3288_mipi_dsi_drv_data = {
11861179 .dsi0_en_bit = RK3288_DSI0_SEL_VOP_LIT ,
11871180 .dsi1_en_bit = RK3288_DSI1_SEL_VOP_LIT ,
@@ -1236,33 +1229,67 @@ MODULE_DEVICE_TABLE(of, dw_mipi_dsi_dt_ids);
12361229static int dw_mipi_dsi_bind (struct device * dev , struct device * master ,
12371230 void * data )
12381231{
1239- struct platform_device * pdev = to_platform_device (dev );
12401232 struct drm_device * drm = data ;
12411233 struct dw_mipi_dsi * dsi = dev_get_drvdata (dev );
1242- struct resource * res ;
12431234 int ret ;
12441235
12451236 if (!dsi -> panel )
12461237 return - EPROBE_DEFER ;
12471238
1248- ret = rockchip_mipi_parse_dt (dsi );
1249- if (ret )
1239+ ret = dw_mipi_dsi_register (drm , dsi );
1240+ if (ret ) {
1241+ dev_err (dev , "Failed to register mipi_dsi: %d\n" , ret );
12501242 return ret ;
1243+ }
12511244
1252- dsi -> phy = devm_phy_optional_get (dev , "mipi_dphy" );
1253- if (IS_ERR (dsi -> phy )) {
1254- ret = PTR_ERR (dsi -> phy );
1255- dev_err (dev , "failed to get mipi dphy: %d\n" , ret );
1256- return ret ;
1245+ dev_set_drvdata (dev , dsi );
1246+
1247+ pm_runtime_enable (dev );
1248+
1249+ return ret ;
1250+ }
1251+
1252+ static void dw_mipi_dsi_unbind (struct device * dev , struct device * master ,
1253+ void * data )
1254+ {
1255+ pm_runtime_disable (dev );
1256+ }
1257+
1258+ static const struct component_ops dw_mipi_dsi_ops = {
1259+ .bind = dw_mipi_dsi_bind ,
1260+ .unbind = dw_mipi_dsi_unbind ,
1261+ };
1262+
1263+ static int rockchip_dsi_get_reset_handle (struct dw_mipi_dsi * dsi )
1264+ {
1265+ struct device * dev = dsi -> dev ;
1266+
1267+ dsi -> rst = devm_reset_control_get_optional (dev , "apb" );
1268+ if (IS_ERR (dsi -> rst )) {
1269+ dev_info (dev , "no reset control specified\n" );
1270+ dsi -> rst = NULL ;
12571271 }
12581272
1259- res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
1260- if (!res )
1261- return - ENODEV ;
1273+ return 0 ;
1274+ }
12621275
1263- dsi -> base = devm_ioremap_resource (dev , res );
1264- if (IS_ERR (dsi -> base ))
1265- return PTR_ERR (dsi -> base );
1276+ static int rockchip_dsi_grf_regmap (struct dw_mipi_dsi * dsi )
1277+ {
1278+ struct device_node * np = dsi -> dev -> of_node ;
1279+
1280+ dsi -> grf_regmap = syscon_regmap_lookup_by_phandle (np , "rockchip,grf" );
1281+ if (IS_ERR (dsi -> grf_regmap )) {
1282+ dev_err (dsi -> dev , "Unable to get rockchip,grf\n" );
1283+ return PTR_ERR (dsi -> grf_regmap );
1284+ }
1285+
1286+ return 0 ;
1287+ }
1288+
1289+ static int rockchip_dsi_clk_get (struct dw_mipi_dsi * dsi )
1290+ {
1291+ struct device * dev = dsi -> dev ;
1292+ int ret ;
12661293
12671294 dsi -> pclk = devm_clk_get (dev , "pclk" );
12681295 if (IS_ERR (dsi -> pclk )) {
@@ -1271,62 +1298,52 @@ static int dw_mipi_dsi_bind(struct device *dev, struct device *master,
12711298 return ret ;
12721299 }
12731300
1274- /* optional */
12751301 dsi -> pllref_clk = devm_clk_get (dev , "ref" );
12761302 if (IS_ERR (dsi -> pllref_clk )) {
12771303 dev_info (dev , "No PHY reference clock specified\n" );
12781304 dsi -> pllref_clk = NULL ;
12791305 }
12801306
1281- /* optional */
12821307 dsi -> phy_cfg_clk = devm_clk_get (dev , "phy_cfg" );
12831308 if (IS_ERR (dsi -> phy_cfg_clk )) {
12841309 dev_info (dev , "No PHY APB clock specified\n" );
12851310 dsi -> phy_cfg_clk = NULL ;
12861311 }
12871312
1288- ret = clk_prepare_enable (dsi -> pllref_clk );
1289- if (ret ) {
1290- dev_err (dev , "%s: Failed to enable pllref_clk\n" , __func__ );
1291- return ret ;
1292- }
1313+ return 0 ;
1314+ }
12931315
1294- dsi -> rst = devm_reset_control_get_optional (dev , "apb" );
1295- if (IS_ERR (dsi -> rst )) {
1296- dev_info (dev , "no reset control specified\n" );
1297- dsi -> rst = NULL ;
1298- }
1316+ static int rockchip_dsi_dphy_parse (struct dw_mipi_dsi * dsi )
1317+ {
1318+ struct device * dev = dsi -> dev ;
1319+ int ret ;
12991320
1300- ret = dw_mipi_dsi_register (drm , dsi );
1301- if (ret ) {
1302- dev_err (dev , "Failed to register mipi_dsi: %d\n" , ret );
1303- goto err_pllref ;
1321+ dsi -> phy = devm_phy_optional_get (dev , "mipi_dphy" );
1322+ if (IS_ERR (dsi -> phy )) {
1323+ ret = PTR_ERR (dsi -> phy );
1324+ dev_err (dev , "failed to get mipi dphy: %d\n" , ret );
1325+ return ret ;
13041326 }
13051327
1306- dev_set_drvdata (dev , dsi );
1307-
1308- pm_runtime_enable (dev );
1309-
13101328 return 0 ;
1311-
1312- err_pllref :
1313- clk_disable_unprepare (dsi -> pllref_clk );
1314- return ret ;
13151329}
13161330
1317- static void dw_mipi_dsi_unbind (struct device * dev , struct device * master ,
1318- void * data )
1331+ static int rockchip_dsi_ioremap_resource (struct platform_device * pdev ,
1332+ struct dw_mipi_dsi * dsi )
13191333{
1320- struct dw_mipi_dsi * dsi = dev_get_drvdata (dev );
1334+ struct device * dev = & pdev -> dev ;
1335+ struct resource * res ;
13211336
1322- pm_runtime_disable ( dev );
1323- clk_disable_unprepare ( dsi -> pllref_clk );
1324- }
1337+ res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 );
1338+ if (! res )
1339+ return - ENODEV ;
13251340
1326- static const struct component_ops dw_mipi_dsi_ops = {
1327- .bind = dw_mipi_dsi_bind ,
1328- .unbind = dw_mipi_dsi_unbind ,
1329- };
1341+ dsi -> base = devm_ioremap_resource (dev , res );
1342+ if (IS_ERR (dsi -> base ))
1343+ return PTR_ERR (dsi -> base );
1344+
1345+ return 0 ;
1346+ }
13301347
13311348static int dw_mipi_dsi_probe (struct platform_device * pdev )
13321349{
@@ -1343,6 +1360,13 @@ static int dw_mipi_dsi_probe(struct platform_device *pdev)
13431360
13441361 dsi -> dev = dev ;
13451362 dsi -> pdata = pdata ;
1363+
1364+ rockchip_dsi_ioremap_resource (pdev , dsi );
1365+ rockchip_dsi_clk_get (dsi );
1366+ rockchip_dsi_dphy_parse (dsi );
1367+ rockchip_dsi_grf_regmap (dsi );
1368+ rockchip_dsi_get_reset_handle (dsi );
1369+
13461370 dsi -> dsi_host .ops = & dw_mipi_dsi_host_ops ;
13471371 dsi -> dsi_host .dev = & pdev -> dev ;
13481372
0 commit comments