Skip to content

Commit d6dfcd0

Browse files
xubilvrkhuangtao
authored andcommitted
drm/rockchip: dw-mipi-dsi: analyze the platform parameters in the probe function
The analysis of platform parameters Only need to do it once, if this in bind function, when return -EPROBE_DEFER, it will be executed more than once. Change-Id: I508021f930d39e1b79e1421c4262b9e7ab501b6c Signed-off-by: xubilv <xbl@rock-chips.com>
1 parent 52053e1 commit d6dfcd0

1 file changed

Lines changed: 86 additions & 62 deletions

File tree

drivers/gpu/drm/rockchip/dw-mipi-dsi.c

Lines changed: 86 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
986991
static 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-
11851178
static 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);
12361229
static 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

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

Comments
 (0)