Skip to content

Commit 12f5ad6

Browse files
atseanpauldaeinki
authored andcommitted
drm/exynos: Implement dpms display callback in DP
This patch implements the dpms display callback for the DP driver. Signed-off-by: Sean Paul <[email protected]> Signed-off-by: Inki Dae <[email protected]>
1 parent 1417f10 commit 12f5ad6

File tree

2 files changed

+81
-62
lines changed

2 files changed

+81
-62
lines changed

drivers/gpu/drm/exynos/exynos_dp_core.c

Lines changed: 80 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -915,10 +915,78 @@ static int exynos_dp_check_mode(struct exynos_drm_display *display,
915915
return 0;
916916
}
917917

918+
static void exynos_dp_phy_init(struct exynos_dp_device *dp)
919+
{
920+
if (dp->phy) {
921+
phy_power_on(dp->phy);
922+
} else if (dp->phy_addr) {
923+
u32 reg;
924+
925+
reg = __raw_readl(dp->phy_addr);
926+
reg |= dp->enable_mask;
927+
__raw_writel(reg, dp->phy_addr);
928+
}
929+
}
930+
931+
static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
932+
{
933+
if (dp->phy) {
934+
phy_power_off(dp->phy);
935+
} else if (dp->phy_addr) {
936+
u32 reg;
937+
938+
reg = __raw_readl(dp->phy_addr);
939+
reg &= ~(dp->enable_mask);
940+
__raw_writel(reg, dp->phy_addr);
941+
}
942+
}
943+
944+
static void exynos_dp_poweron(struct exynos_dp_device *dp)
945+
{
946+
if (dp->dpms_mode == DRM_MODE_DPMS_ON)
947+
return;
948+
949+
clk_prepare_enable(dp->clock);
950+
exynos_dp_phy_init(dp);
951+
exynos_dp_init_dp(dp);
952+
enable_irq(dp->irq);
953+
}
954+
955+
static void exynos_dp_poweroff(struct exynos_dp_device *dp)
956+
{
957+
if (dp->dpms_mode != DRM_MODE_DPMS_ON)
958+
return;
959+
960+
disable_irq(dp->irq);
961+
flush_work(&dp->hotplug_work);
962+
exynos_dp_phy_exit(dp);
963+
clk_disable_unprepare(dp->clock);
964+
}
965+
966+
static void exynos_dp_dpms(struct exynos_drm_display *display, int mode)
967+
{
968+
struct exynos_dp_device *dp = display->ctx;
969+
970+
switch (mode) {
971+
case DRM_MODE_DPMS_ON:
972+
exynos_dp_poweron(dp);
973+
break;
974+
case DRM_MODE_DPMS_STANDBY:
975+
case DRM_MODE_DPMS_SUSPEND:
976+
case DRM_MODE_DPMS_OFF:
977+
exynos_dp_poweroff(dp);
978+
break;
979+
default:
980+
break;
981+
};
982+
dp->dpms_mode = mode;
983+
}
984+
918985
static struct exynos_drm_display_ops exynos_dp_display_ops = {
919986
.is_connected = exynos_dp_display_is_connected,
920987
.get_panel = exynos_dp_get_panel,
921988
.check_mode = exynos_dp_check_mode,
989+
.dpms = exynos_dp_dpms,
922990
};
923991

924992
static struct exynos_drm_display exynos_dp_display = {
@@ -1040,54 +1108,6 @@ static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
10401108
return 0;
10411109
}
10421110

1043-
static void exynos_dp_phy_init(struct exynos_dp_device *dp)
1044-
{
1045-
if (dp->phy) {
1046-
phy_power_on(dp->phy);
1047-
} else if (dp->phy_addr) {
1048-
u32 reg;
1049-
1050-
reg = __raw_readl(dp->phy_addr);
1051-
reg |= dp->enable_mask;
1052-
__raw_writel(reg, dp->phy_addr);
1053-
}
1054-
}
1055-
1056-
static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
1057-
{
1058-
if (dp->phy) {
1059-
phy_power_off(dp->phy);
1060-
} else if (dp->phy_addr) {
1061-
u32 reg;
1062-
1063-
reg = __raw_readl(dp->phy_addr);
1064-
reg &= ~(dp->enable_mask);
1065-
__raw_writel(reg, dp->phy_addr);
1066-
}
1067-
}
1068-
1069-
void exynos_dp_poweron(struct exynos_dp_device *dp)
1070-
{
1071-
exynos_dp_phy_init(dp);
1072-
1073-
clk_prepare_enable(dp->clock);
1074-
1075-
exynos_dp_init_dp(dp);
1076-
1077-
enable_irq(dp->irq);
1078-
}
1079-
1080-
void exynos_dp_poweroff(struct exynos_dp_device *dp)
1081-
{
1082-
disable_irq(dp->irq);
1083-
1084-
flush_work(&dp->hotplug_work);
1085-
1086-
exynos_dp_phy_exit(dp);
1087-
1088-
clk_disable_unprepare(dp->clock);
1089-
}
1090-
10911111
static int exynos_dp_probe(struct platform_device *pdev)
10921112
{
10931113
struct resource *res;
@@ -1103,6 +1123,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
11031123
}
11041124

11051125
dp->dev = &pdev->dev;
1126+
dp->dpms_mode = DRM_MODE_DPMS_OFF;
11061127

11071128
dp->video_info = exynos_dp_dt_parse_pdata(&pdev->dev);
11081129
if (IS_ERR(dp->video_info))
@@ -1148,45 +1169,42 @@ static int exynos_dp_probe(struct platform_device *pdev)
11481169
dev_err(&pdev->dev, "failed to request irq\n");
11491170
return ret;
11501171
}
1151-
1152-
platform_set_drvdata(pdev, dp);
1172+
disable_irq(dp->irq);
11531173

11541174
exynos_dp_display.ctx = dp;
1175+
1176+
platform_set_drvdata(pdev, &exynos_dp_display);
11551177
exynos_drm_display_register(&exynos_dp_display);
11561178

11571179
return 0;
11581180
}
11591181

11601182
static int exynos_dp_remove(struct platform_device *pdev)
11611183
{
1162-
struct exynos_dp_device *dp = platform_get_drvdata(pdev);
1184+
struct exynos_drm_display *display = platform_get_drvdata(pdev);
11631185

1186+
exynos_dp_dpms(display, DRM_MODE_DPMS_OFF);
11641187
exynos_drm_display_unregister(&exynos_dp_display);
11651188

1166-
flush_work(&dp->hotplug_work);
1167-
1168-
exynos_dp_phy_exit(dp);
1169-
1170-
clk_disable_unprepare(dp->clock);
1171-
1172-
11731189
return 0;
11741190
}
11751191

11761192
#ifdef CONFIG_PM_SLEEP
11771193
static int exynos_dp_suspend(struct device *dev)
11781194
{
1179-
struct exynos_dp_device *dp = dev_get_drvdata(dev);
1195+
struct platform_device *pdev = to_platform_device(dev);
1196+
struct exynos_drm_display *display = platform_get_drvdata(pdev);
11801197

1181-
exynos_dp_poweroff(dp);
1198+
exynos_dp_dpms(display, DRM_MODE_DPMS_OFF);
11821199
return 0;
11831200
}
11841201

11851202
static int exynos_dp_resume(struct device *dev)
11861203
{
1187-
struct exynos_dp_device *dp = dev_get_drvdata(dev);
1204+
struct platform_device *pdev = to_platform_device(dev);
1205+
struct exynos_drm_display *display = platform_get_drvdata(pdev);
11881206

1189-
exynos_dp_poweron(dp);
1207+
exynos_dp_dpms(display, DRM_MODE_DPMS_ON);
11901208
return 0;
11911209
}
11921210
#endif

drivers/gpu/drm/exynos/exynos_dp_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ struct exynos_dp_device {
154154
struct link_train link_train;
155155
struct work_struct hotplug_work;
156156
struct phy *phy;
157+
int dpms_mode;
157158

158159
struct exynos_drm_panel_info panel;
159160
};

0 commit comments

Comments
 (0)