Skip to content

Commit 1682ade

Browse files
committed
drm: xlnx: zynqmp_dpsub: Move pclk from zynqmp_disp to zynqmp_dpsub
The video clock is an external resource from the DPSUB point of view, not a resource internal to the display controller. Move it to the zynqmp_dpsub structure, to allow accessing it from outside the disp code. While at it, rename the fields from pclk and pclk_from_ps to vid_clk and vid_clk_from_ps, to better reflect their purpose and match the documentation. Signed-off-by: Laurent Pinchart <[email protected]>
1 parent 96e0e3e commit 1682ade

File tree

3 files changed

+28
-29
lines changed

3 files changed

+28
-29
lines changed

drivers/gpu/drm/xlnx/zynqmp_disp.c

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,6 @@ struct zynqmp_disp_layer {
169169
* @audio.clk: Audio clock
170170
* @audio.clk_from_ps: True of the audio clock comes from PS, false from PL
171171
* @layers: Layers (planes)
172-
* @pclk: Pixel clock
173-
* @pclk_from_ps: True of the video clock comes from PS, false from PL
174172
*/
175173
struct zynqmp_disp {
176174
struct device *dev;
@@ -192,9 +190,6 @@ struct zynqmp_disp {
192190
} audio;
193191

194192
struct zynqmp_disp_layer layers[ZYNQMP_DISP_NUM_LAYERS];
195-
196-
struct clk *pclk;
197-
bool pclk_from_ps;
198193
};
199194

200195
/* -----------------------------------------------------------------------------
@@ -1412,7 +1407,7 @@ static void zynqmp_disp_enable(struct zynqmp_disp *disp)
14121407

14131408
zynqmp_disp_avbuf_enable(disp);
14141409
/* Choose clock source based on the DT clock handle. */
1415-
zynqmp_disp_avbuf_set_clocks_sources(disp, disp->pclk_from_ps,
1410+
zynqmp_disp_avbuf_set_clocks_sources(disp, disp->dpsub->vid_clk_from_ps,
14161411
disp->audio.clk_from_ps, true);
14171412
zynqmp_disp_avbuf_enable_channels(disp);
14181413
zynqmp_disp_avbuf_enable_audio(disp);
@@ -1440,13 +1435,13 @@ static int zynqmp_disp_setup_clock(struct zynqmp_disp *disp,
14401435
long diff;
14411436
int ret;
14421437

1443-
ret = clk_set_rate(disp->pclk, mode_clock);
1438+
ret = clk_set_rate(disp->dpsub->vid_clk, mode_clock);
14441439
if (ret) {
1445-
dev_err(disp->dev, "failed to set a pixel clock\n");
1440+
dev_err(disp->dev, "failed to set the video clock\n");
14461441
return ret;
14471442
}
14481443

1449-
rate = clk_get_rate(disp->pclk);
1444+
rate = clk_get_rate(disp->dpsub->vid_clk);
14501445
diff = rate - mode_clock;
14511446
if (abs(diff) > mode_clock / 20)
14521447
dev_info(disp->dev,
@@ -1477,9 +1472,9 @@ zynqmp_disp_crtc_atomic_enable(struct drm_crtc *crtc,
14771472

14781473
zynqmp_disp_setup_clock(disp, adjusted_mode->clock * 1000);
14791474

1480-
ret = clk_prepare_enable(disp->pclk);
1475+
ret = clk_prepare_enable(disp->dpsub->vid_clk);
14811476
if (ret) {
1482-
dev_err(disp->dev, "failed to enable a pixel clock\n");
1477+
dev_err(disp->dev, "failed to enable the video clock\n");
14831478
pm_runtime_put_sync(disp->dev);
14841479
return;
14851480
}
@@ -1519,7 +1514,7 @@ zynqmp_disp_crtc_atomic_disable(struct drm_crtc *crtc,
15191514
}
15201515
spin_unlock_irq(&crtc->dev->event_lock);
15211516

1522-
clk_disable_unprepare(disp->pclk);
1517+
clk_disable_unprepare(disp->dpsub->vid_clk);
15231518
pm_runtime_put_sync(disp->dev);
15241519
}
15251520

@@ -1674,23 +1669,6 @@ int zynqmp_disp_probe(struct zynqmp_dpsub *dpsub, struct drm_device *drm)
16741669
if (IS_ERR(disp->audio.base))
16751670
return PTR_ERR(disp->audio.base);
16761671

1677-
/* Try the live PL video clock */
1678-
disp->pclk = devm_clk_get(disp->dev, "dp_live_video_in_clk");
1679-
if (!IS_ERR(disp->pclk))
1680-
disp->pclk_from_ps = false;
1681-
else if (PTR_ERR(disp->pclk) == -EPROBE_DEFER)
1682-
return PTR_ERR(disp->pclk);
1683-
1684-
/* If the live PL video clock is not valid, fall back to PS clock */
1685-
if (IS_ERR_OR_NULL(disp->pclk)) {
1686-
disp->pclk = devm_clk_get(disp->dev, "dp_vtc_pixel_clk_in");
1687-
if (IS_ERR(disp->pclk)) {
1688-
dev_err(disp->dev, "failed to init any video clock\n");
1689-
return PTR_ERR(disp->pclk);
1690-
}
1691-
disp->pclk_from_ps = true;
1692-
}
1693-
16941672
zynqmp_disp_audio_init(disp);
16951673

16961674
ret = zynqmp_disp_create_layers(disp);

drivers/gpu/drm/xlnx/zynqmp_dpsub.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,23 @@ static int zynqmp_dpsub_init_clocks(struct zynqmp_dpsub *dpsub)
214214
return ret;
215215
}
216216

217+
/* Try the live PL video clock */
218+
dpsub->vid_clk = devm_clk_get(dpsub->dev, "dp_live_video_in_clk");
219+
if (!IS_ERR(dpsub->vid_clk))
220+
dpsub->vid_clk_from_ps = false;
221+
else if (PTR_ERR(dpsub->vid_clk) == -EPROBE_DEFER)
222+
return PTR_ERR(dpsub->vid_clk);
223+
224+
/* If the live PL video clock is not valid, fall back to PS clock */
225+
if (IS_ERR_OR_NULL(dpsub->vid_clk)) {
226+
dpsub->vid_clk = devm_clk_get(dpsub->dev, "dp_vtc_pixel_clk_in");
227+
if (IS_ERR(dpsub->vid_clk)) {
228+
dev_err(dpsub->dev, "failed to init any video clock\n");
229+
return PTR_ERR(dpsub->vid_clk);
230+
}
231+
dpsub->vid_clk_from_ps = true;
232+
}
233+
217234
return 0;
218235
}
219236

drivers/gpu/drm/xlnx/zynqmp_dpsub.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ enum zynqmp_dpsub_format {
3333
* @drm: The DRM/KMS device
3434
* @dev: The physical device
3535
* @apb_clk: The APB clock
36+
* @vid_clk: Video clock
37+
* @vid_clk_from_ps: True of the video clock comes from PS, false from PL
3638
* @encoder: The dummy DRM encoder
3739
* @bridge: The DP encoder bridge
3840
* @disp: The display controller
@@ -44,6 +46,8 @@ struct zynqmp_dpsub {
4446
struct device *dev;
4547

4648
struct clk *apb_clk;
49+
struct clk *vid_clk;
50+
bool vid_clk_from_ps;
4751

4852
struct drm_encoder encoder;
4953
struct drm_bridge *bridge;

0 commit comments

Comments
 (0)