Skip to content

Commit 34440ed

Browse files
GnurouBen Skeggs
authored andcommitted
drm/nouveau/tegra: acquire and enable reference clock if needed
GM20B requires an extra clock compared to GK20A. Add that information into the platform data and acquire and enable this clock if necessary. Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
1 parent 52829d4 commit 34440ed

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

drivers/gpu/drm/nouveau/include/nvkm/core/tegra.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ struct nvkm_device_tegra {
1111

1212
struct reset_control *rst;
1313
struct clk *clk;
14+
struct clk *clk_ref;
1415
struct clk *clk_pwr;
1516

1617
struct regulator *vdd;
@@ -36,6 +37,10 @@ struct nvkm_device_tegra_func {
3637
* bypassed). A value of 0 means an IOMMU is never used.
3738
*/
3839
u8 iommu_bit;
40+
/*
41+
* Whether the chip requires a reference clock
42+
*/
43+
bool require_ref_clk;
3944
};
4045

4146
int nvkm_device_tegra_new(const struct nvkm_device_tegra_func *,

drivers/gpu/drm/nouveau/nouveau_platform.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,19 @@ static const struct nvkm_device_tegra_func gk20a_platform_data = {
5555
.iommu_bit = 34,
5656
};
5757

58+
static const struct nvkm_device_tegra_func gm20b_platform_data = {
59+
.iommu_bit = 34,
60+
.require_ref_clk = true,
61+
};
62+
5863
static const struct of_device_id nouveau_platform_match[] = {
5964
{
6065
.compatible = "nvidia,gk20a",
6166
.data = &gk20a_platform_data,
6267
},
6368
{
6469
.compatible = "nvidia,gm20b",
65-
.data = &gk20a_platform_data,
70+
.data = &gm20b_platform_data,
6671
},
6772
{ }
6873
};

drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ nvkm_device_tegra_power_up(struct nvkm_device_tegra *tdev)
3535
ret = clk_prepare_enable(tdev->clk);
3636
if (ret)
3737
goto err_clk;
38+
if (tdev->clk_ref) {
39+
ret = clk_prepare_enable(tdev->clk_ref);
40+
if (ret)
41+
goto err_clk_ref;
42+
}
3843
ret = clk_prepare_enable(tdev->clk_pwr);
3944
if (ret)
4045
goto err_clk_pwr;
@@ -57,6 +62,9 @@ nvkm_device_tegra_power_up(struct nvkm_device_tegra *tdev)
5762
err_clamp:
5863
clk_disable_unprepare(tdev->clk_pwr);
5964
err_clk_pwr:
65+
if (tdev->clk_ref)
66+
clk_disable_unprepare(tdev->clk_ref);
67+
err_clk_ref:
6068
clk_disable_unprepare(tdev->clk);
6169
err_clk:
6270
regulator_disable(tdev->vdd);
@@ -71,6 +79,8 @@ nvkm_device_tegra_power_down(struct nvkm_device_tegra *tdev)
7179
udelay(10);
7280

7381
clk_disable_unprepare(tdev->clk_pwr);
82+
if (tdev->clk_ref)
83+
clk_disable_unprepare(tdev->clk_ref);
7484
clk_disable_unprepare(tdev->clk);
7585
udelay(10);
7686

@@ -274,6 +284,13 @@ nvkm_device_tegra_new(const struct nvkm_device_tegra_func *func,
274284
goto free;
275285
}
276286

287+
if (func->require_ref_clk)
288+
tdev->clk_ref = devm_clk_get(&pdev->dev, "ref");
289+
if (IS_ERR(tdev->clk_ref)) {
290+
ret = PTR_ERR(tdev->clk_ref);
291+
goto free;
292+
}
293+
277294
tdev->clk_pwr = devm_clk_get(&pdev->dev, "pwr");
278295
if (IS_ERR(tdev->clk_pwr)) {
279296
ret = PTR_ERR(tdev->clk_pwr);

0 commit comments

Comments
 (0)