Skip to content

Commit 1417f10

Browse files
atseanpauldaeinki
authored andcommitted
drm/exynos: Move display implementation into dp
This patch moves the exynos_drm_display implementation from fimd into the dp driver. This will allow for tighter integration of the dp driver into the exynos drm driver. Signed-off-by: Sean Paul <[email protected]> Signed-off-by: Inki Dae <[email protected]>
1 parent 2e4e678 commit 1417f10

File tree

7 files changed

+131
-86
lines changed

7 files changed

+131
-86
lines changed

Documentation/devicetree/bindings/video/exynos_dp.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Required properties for dp-controller:
4949
-samsung,lane-count:
5050
number of lanes supported by the panel.
5151
LANE_COUNT1 = 1, LANE_COUNT2 = 2, LANE_COUNT4 = 4
52+
- display-timings: timings for the connected panel as described by
53+
Documentation/devicetree/bindings/video/display-timing.txt
5254

5355
Optional properties for dp-controller:
5456
-interlaced:
@@ -84,4 +86,19 @@ Board Specific portion:
8486
samsung,color-depth = <1>;
8587
samsung,link-rate = <0x0a>;
8688
samsung,lane-count = <4>;
89+
90+
display-timings {
91+
native-mode = <&lcd_timing>;
92+
lcd_timing: 1366x768 {
93+
clock-frequency = <70589280>;
94+
hactive = <1366>;
95+
vactive = <768>;
96+
hfront-porch = <40>;
97+
hback-porch = <40>;
98+
hsync-len = <32>;
99+
vback-porch = <10>;
100+
vfront-porch = <12>;
101+
vsync-len = <6>;
102+
};
103+
};
87104
};

Documentation/devicetree/bindings/video/samsung-fimd.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ Required properties:
3939

4040
Optional Properties:
4141
- samsung,power-domain: a phandle to FIMD power domain node.
42+
- samsung,invert-vden: video enable signal is inverted
43+
- samsung,invert-vclk: video clock signal is inverted
4244

4345
Example:
4446

drivers/gpu/drm/exynos/exynos_dp_core.c

Lines changed: 81 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@
1919
#include <linux/delay.h>
2020
#include <linux/of.h>
2121
#include <linux/phy/phy.h>
22+
#include <video/of_display_timing.h>
23+
#include <video/of_videomode.h>
2224

25+
#include <drm/drmP.h>
26+
27+
#include "exynos_drm_drv.h"
2328
#include "exynos_dp_core.h"
2429

2530
static int exynos_dp_init_dp(struct exynos_dp_device *dp)
@@ -892,6 +897,35 @@ static void exynos_dp_hotplug(struct work_struct *work)
892897
dev_err(dp->dev, "unable to config video\n");
893898
}
894899

900+
static bool exynos_dp_display_is_connected(struct exynos_drm_display *display)
901+
{
902+
return true;
903+
}
904+
905+
static void *exynos_dp_get_panel(struct exynos_drm_display *display)
906+
{
907+
struct exynos_dp_device *dp = display->ctx;
908+
909+
return &dp->panel;
910+
}
911+
912+
static int exynos_dp_check_mode(struct exynos_drm_display *display,
913+
struct drm_display_mode *mode)
914+
{
915+
return 0;
916+
}
917+
918+
static struct exynos_drm_display_ops exynos_dp_display_ops = {
919+
.is_connected = exynos_dp_display_is_connected,
920+
.get_panel = exynos_dp_get_panel,
921+
.check_mode = exynos_dp_check_mode,
922+
};
923+
924+
static struct exynos_drm_display exynos_dp_display = {
925+
.type = EXYNOS_DISPLAY_TYPE_LCD,
926+
.ops = &exynos_dp_display_ops,
927+
};
928+
895929
static struct video_info *exynos_dp_dt_parse_pdata(struct device *dev)
896930
{
897931
struct device_node *dp_node = dev->of_node;
@@ -993,6 +1027,19 @@ static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
9931027
return ret;
9941028
}
9951029

1030+
static int exynos_dp_dt_parse_panel(struct exynos_dp_device *dp)
1031+
{
1032+
int ret;
1033+
1034+
ret = of_get_videomode(dp->dev->of_node, &dp->panel.vm,
1035+
OF_USE_NATIVE_MODE);
1036+
if (ret) {
1037+
DRM_ERROR("failed: of_get_videomode() : %d\n", ret);
1038+
return ret;
1039+
}
1040+
return 0;
1041+
}
1042+
9961043
static void exynos_dp_phy_init(struct exynos_dp_device *dp)
9971044
{
9981045
if (dp->phy) {
@@ -1019,6 +1066,28 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
10191066
}
10201067
}
10211068

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+
10221091
static int exynos_dp_probe(struct platform_device *pdev)
10231092
{
10241093
struct resource *res;
@@ -1043,6 +1112,10 @@ static int exynos_dp_probe(struct platform_device *pdev)
10431112
if (ret)
10441113
return ret;
10451114

1115+
ret = exynos_dp_dt_parse_panel(dp);
1116+
if (ret)
1117+
return ret;
1118+
10461119
dp->clock = devm_clk_get(&pdev->dev, "dp");
10471120
if (IS_ERR(dp->clock)) {
10481121
dev_err(&pdev->dev, "failed to get clock\n");
@@ -1078,13 +1151,18 @@ static int exynos_dp_probe(struct platform_device *pdev)
10781151

10791152
platform_set_drvdata(pdev, dp);
10801153

1154+
exynos_dp_display.ctx = dp;
1155+
exynos_drm_display_register(&exynos_dp_display);
1156+
10811157
return 0;
10821158
}
10831159

10841160
static int exynos_dp_remove(struct platform_device *pdev)
10851161
{
10861162
struct exynos_dp_device *dp = platform_get_drvdata(pdev);
10871163

1164+
exynos_drm_display_unregister(&exynos_dp_display);
1165+
10881166
flush_work(&dp->hotplug_work);
10891167

10901168
exynos_dp_phy_exit(dp);
@@ -1100,29 +1178,15 @@ static int exynos_dp_suspend(struct device *dev)
11001178
{
11011179
struct exynos_dp_device *dp = dev_get_drvdata(dev);
11021180

1103-
disable_irq(dp->irq);
1104-
1105-
flush_work(&dp->hotplug_work);
1106-
1107-
exynos_dp_phy_exit(dp);
1108-
1109-
clk_disable_unprepare(dp->clock);
1110-
1181+
exynos_dp_poweroff(dp);
11111182
return 0;
11121183
}
11131184

11141185
static int exynos_dp_resume(struct device *dev)
11151186
{
11161187
struct exynos_dp_device *dp = dev_get_drvdata(dev);
11171188

1118-
exynos_dp_phy_init(dp);
1119-
1120-
clk_prepare_enable(dp->clock);
1121-
1122-
exynos_dp_init_dp(dp);
1123-
1124-
enable_irq(dp->irq);
1125-
1189+
exynos_dp_poweron(dp);
11261190
return 0;
11271191
}
11281192
#endif
@@ -1137,7 +1201,7 @@ static const struct of_device_id exynos_dp_match[] = {
11371201
};
11381202
MODULE_DEVICE_TABLE(of, exynos_dp_match);
11391203

1140-
static struct platform_driver exynos_dp_driver = {
1204+
struct platform_driver dp_driver = {
11411205
.probe = exynos_dp_probe,
11421206
.remove = exynos_dp_remove,
11431207
.driver = {
@@ -1148,8 +1212,6 @@ static struct platform_driver exynos_dp_driver = {
11481212
},
11491213
};
11501214

1151-
module_platform_driver(exynos_dp_driver);
1152-
11531215
MODULE_AUTHOR("Jingoo Han <[email protected]>");
11541216
MODULE_DESCRIPTION("Samsung SoC DP Driver");
11551217
MODULE_LICENSE("GPL");

drivers/gpu/drm/exynos/exynos_dp_core.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#ifndef _EXYNOS_DP_CORE_H
1414
#define _EXYNOS_DP_CORE_H
1515

16+
#include <drm/exynos_drm.h>
17+
1618
#define DP_TIMEOUT_LOOP_COUNT 100
1719
#define MAX_CR_LOOP 5
1820
#define MAX_EQ_LOOP 5
@@ -152,6 +154,8 @@ struct exynos_dp_device {
152154
struct link_train link_train;
153155
struct work_struct hotplug_work;
154156
struct phy *phy;
157+
158+
struct exynos_drm_panel_info panel;
155159
};
156160

157161
/* exynos_dp_reg.c */

drivers/gpu/drm/exynos/exynos_drm_drv.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,12 @@ static int __init exynos_drm_init(void)
357357
{
358358
int ret;
359359

360+
#ifdef CONFIG_DRM_EXYNOS_DP
361+
ret = platform_driver_register(&dp_driver);
362+
if (ret < 0)
363+
goto out_dp;
364+
#endif
365+
360366
#ifdef CONFIG_DRM_EXYNOS_FIMD
361367
ret = platform_driver_register(&fimd_driver);
362368
if (ret < 0)
@@ -471,6 +477,10 @@ static int __init exynos_drm_init(void)
471477
#ifdef CONFIG_DRM_EXYNOS_FIMD
472478
platform_driver_unregister(&fimd_driver);
473479
out_fimd:
480+
#endif
481+
#ifdef CONFIG_DRM_EXYNOS_DP
482+
platform_driver_unregister(&dp_driver);
483+
out_dp:
474484
#endif
475485
return ret;
476486
}
@@ -514,6 +524,10 @@ static void __exit exynos_drm_exit(void)
514524
#ifdef CONFIG_DRM_EXYNOS_FIMD
515525
platform_driver_unregister(&fimd_driver);
516526
#endif
527+
528+
#ifdef CONFIG_DRM_EXYNOS_DP
529+
platform_driver_unregister(&dp_driver);
530+
#endif
517531
}
518532

519533
module_init(exynos_drm_init);

drivers/gpu/drm/exynos/exynos_drm_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ int exynos_platform_device_ipp_register(void);
370370
*/
371371
void exynos_platform_device_ipp_unregister(void);
372372

373+
extern struct platform_driver dp_driver;
373374
extern struct platform_driver fimd_driver;
374375
extern struct platform_driver hdmi_driver;
375376
extern struct platform_driver mixer_driver;

0 commit comments

Comments
 (0)