Skip to contentSkip to conversation

video: exynos_dp: Use the generic PHY driver

PATCH New Jingoo Han 3 participants 5 messages Jul 1, 2013 – Jul 2, 2013

Subsystems (4)
lore
Share & tools
lore

Jingoo Han

author
#0 lore raw

PATCH v3 3/3 video: exynos_dp: Use the generic PHY driver

Use the generic PHY API instead of the platform callback to control the DP PHY. The 'phy_label' field is added to the platform data structure to allow PHY lookup on non-dt platforms.

---
 .../devicetree/bindings/video/exynos_dp.txt        |   23 +---
 drivers/video/exynos/exynos_dp_core.c              |  118 ++------------------
 drivers/video/exynos/exynos_dp_core.h              |    2 +
 include/video/exynos_dp.h                          |    6 +-
 4 files changed, 21 insertions(+), 128 deletions(-)
Documentation/devicetree/bindings/video/exynos_dp.txt +6 -17
index 84f10c1..71645dc 100644
@@ -1,17 +1,6 @@
 The Exynos display port interface should be configured based on
 the type of panel connected to it.
 
-We use two nodes:
-	-dp-controller node
-	-dptx-phy node(defined inside dp-controller node)
-
-For the DP-PHY initialization, we use the dptx-phy node.
-Required properties for dptx-phy:
-	-reg:
-		Base address of DP PHY register.
-	-samsung,enable-mask:
-		The bit-mask used to enable/disable DP PHY.
-
 For the Panel initialization, we read data from dp-controller node.
 Required properties for dp-controller:
 	-compatible:
@@ -25,6 +14,10 @@ Required properties for dp-controller:
 		from common clock binding: handle to dp clock.
 	-clock-names:
 		from common clock binding: Shall be "dp".
+	-phys:
+		from general phy binding: the phandle for the PHY device.
+	-phy-names:
+		from general phy binding: Should be "dp".
 	-interrupt-parent:
 		phandle to Interrupt combiner node.
 	-samsung,color-space:
@@ -67,12 +60,8 @@ SOC specific portion:
 		interrupt-parent = <&combiner>;
 		clocks = <&clock 342>;
 		clock-names = "dp";
-
-		dptx-phy {
-			reg = <0x10040720>;
-			samsung,enable-mask = <1>;
-		};
-
+		phys = <&dp_phy>;
+		phy-names = "dp";
 	};
 
 Board Specific portion:
drivers/video/exynos/exynos_dp_core.c +11 -107

188 lines not on this page · raw message

drivers/video/exynos/exynos_dp_core.h +2 -0
index 6c567bbf..b3d0328 100644
@@ -42,6 +42,8 @@ struct exynos_dp_device {
 	struct video_info	*video_info;
 	struct link_train	link_train;
 	struct work_struct	hotplug_work;
+
+	struct phy		*phy;
 };
 
 /* exynos_dp_reg.c */
include/video/exynos_dp.h +2 -4
index bd8cabd..f38c9af 100644
@@ -122,10 +122,8 @@ struct video_info {
 };
 
 struct exynos_dp_platdata {
-	struct video_info *video_info;
-
-	void (*phy_init)(void);
-	void (*phy_exit)(void);
+	struct video_info	*video_info;
+	const char		*phy_label;
 };
 
 #endif /* _EXYNOS_DP_H */
Signature · 1 line
1.7.10.4
#1 lore raw

PATCH v3 3/3 video: exynos_dp: Use the generic PHY driver

Hi,

Quoted 121 lines · Jingoo Han

Use the generic PHY API instead of the platform callback to control the DP PHY. The 'phy_label' field is added to the platform data structure to allow PHY lookup on non-dt platforms.

---
  .../devicetree/bindings/video/exynos_dp.txt        |   23 +---
  drivers/video/exynos/exynos_dp_core.c              |  118 ++------------------
  drivers/video/exynos/exynos_dp_core.h              |    2 +
  include/video/exynos_dp.h                          |    6 +-
  4 files changed, 21 insertions(+), 128 deletions(-)
Documentation/devicetree/bindings/video/exynos_dp.txt +6 -17
index 84f10c1..71645dc 100644
@@ -1,17 +1,6 @@
  The Exynos display port interface should be configured based on
  the type of panel connected to it.
 
-We use two nodes:
-	-dp-controller node
-	-dptx-phy node(defined inside dp-controller node)
-
-For the DP-PHY initialization, we use the dptx-phy node.
-Required properties for dptx-phy:
-	-reg:
-		Base address of DP PHY register.
-	-samsung,enable-mask:
-		The bit-mask used to enable/disable DP PHY.
-
  For the Panel initialization, we read data from dp-controller node.
  Required properties for dp-controller:
  	-compatible:
@@ -25,6 +14,10 @@ Required properties for dp-controller:
  		from common clock binding: handle to dp clock.
  	-clock-names:
  		from common clock binding: Shall be "dp".
+	-phys:
+		from general phy binding: the phandle for the PHY device.
+	-phy-names:
+		from general phy binding: Should be "dp".
  	-interrupt-parent:
  		phandle to Interrupt combiner node.
  	-samsung,color-space:
@@ -67,12 +60,8 @@ SOC specific portion:
  		interrupt-parent = <&combiner>;
  		clocks = <&clock 342>;
  		clock-names = "dp";
-
-		dptx-phy {
-			reg = <0x10040720>;
-			samsung,enable-mask = <1>;
-		};
-
+		phys = <&dp_phy>;
+		phy-names = "dp";
  	};
 
  Board Specific portion:
drivers/video/exynos/exynos_dp_core.c +1 -44
index 12bbede..bac515b 100644
@@ -19,6 +19,7 @@
  #include <linux/interrupt.h>
  #include <linux/delay.h>
  #include <linux/of.h>
+#include <linux/phy/phy.h>
 
  #include <video/exynos_dp.h>
 
@@ -960,84 +961,15 @@ static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  		return ERR_PTR(-EINVAL);
  	}
 
-	return pd;
-}
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	struct device_node *dp_phy_node = of_node_get(dp->dev->of_node);
-	u32 phy_base;
-	int ret = 0;
-
-	dp_phy_node = of_find_node_by_name(dp_phy_node, "dptx-phy");
-	if (!dp_phy_node) {
-		dev_err(dp->dev, "could not find dptx-phy node\n");
-		return -ENODEV;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "reg", &phy_base)) {
-		dev_err(dp->dev, "failed to get reg for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "samsung,enable-mask",
-				&dp->enable_mask)) {
-		dev_err(dp->dev, "failed to get enable-mask for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	dp->phy_addr = ioremap(phy_base, SZ_4);
-	if (!dp->phy_addr) {
-		dev_err(dp->dev, "failed to ioremap dp-phy\n");
-		ret = -ENOMEM;
-		goto err;
-	}
-
-err:
-	of_node_put(dp_phy_node);
-
-	return ret;
-}
-
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	u32 reg;

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 964

Quoted 10 lines
drivers/video/exynos/exynos_dp_core.c +1 -9
-
-	reg = __raw_readl(dp->phy_addr);
-	reg |= dp->enable_mask;
-	__raw_writel(reg, dp->phy_addr);
-}
-
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	u32 reg;
+	pd->phy_label = "dp";

Felipe had a comment to change the label to *display-port* no?

Thanks
Kishon

author
#2 lore raw

PATCH v3 3/3 video: exynos_dp: Use the generic PHY driver

Quoted 130 lines · Kishon Vijay Abraham I

Hi,

Quoted 6 lines · Jingoo Han

Use the generic PHY API instead of the platform callback to control the DP PHY. The 'phy_label' field is added to the platform data structure to allow PHY lookup on non-dt platforms.

Review

Quoted 8 lines
---
  .../devicetree/bindings/video/exynos_dp.txt        |   23 +---
  drivers/video/exynos/exynos_dp_core.c              |  118 ++------------------
  drivers/video/exynos/exynos_dp_core.h              |    2 +
  include/video/exynos_dp.h                          |    6 +-
  4 files changed, 21 insertions(+), 128 deletions(-)
(quoted diff) +0 -0

b/Documentation/devicetree/bindings/video/exynos_dp.txt

Quoted 111 lines

index 84f10c1..71645dc 100644

Documentation/devicetree/bindings/video/exynos_dp.txt +6 -17
@@ -1,17 +1,6 @@
  The Exynos display port interface should be configured based on
  the type of panel connected to it.
 
-We use two nodes:
-	-dp-controller node
-	-dptx-phy node(defined inside dp-controller node)
-
-For the DP-PHY initialization, we use the dptx-phy node.
-Required properties for dptx-phy:
-	-reg:
-		Base address of DP PHY register.
-	-samsung,enable-mask:
-		The bit-mask used to enable/disable DP PHY.
-
  For the Panel initialization, we read data from dp-controller node.
  Required properties for dp-controller:
  	-compatible:
@@ -25,6 +14,10 @@ Required properties for dp-controller:
  		from common clock binding: handle to dp clock.
  	-clock-names:
  		from common clock binding: Shall be "dp".
+	-phys:
+		from general phy binding: the phandle for the PHY device.
+	-phy-names:
+		from general phy binding: Should be "dp".
  	-interrupt-parent:
  		phandle to Interrupt combiner node.
  	-samsung,color-space:
@@ -67,12 +60,8 @@ SOC specific portion:
  		interrupt-parent = <&combiner>;
  		clocks = <&clock 342>;
  		clock-names = "dp";
-
-		dptx-phy {
-			reg = <0x10040720>;
-			samsung,enable-mask = <1>;
-		};
-
+		phys = <&dp_phy>;
+		phy-names = "dp";
  	};
 
  Board Specific portion:
drivers/video/exynos/exynos_dp_core.c +1 -48
index 12bbede..bac515b 100644
@@ -19,6 +19,7 @@
  #include <linux/interrupt.h>
  #include <linux/delay.h>
  #include <linux/of.h>
+#include <linux/phy/phy.h>
 
  #include <video/exynos_dp.h>
 
@@ -960,84 +961,15 @@ static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  		return ERR_PTR(-EINVAL);
  	}
 
-	return pd;
-}
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	struct device_node *dp_phy_node = of_node_get(dp->dev->of_node);
-	u32 phy_base;
-	int ret = 0;
-
-	dp_phy_node = of_find_node_by_name(dp_phy_node, "dptx-phy");
-	if (!dp_phy_node) {
-		dev_err(dp->dev, "could not find dptx-phy node\n");
-		return -ENODEV;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "reg", &phy_base)) {
-		dev_err(dp->dev, "failed to get reg for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "samsung,enable-mask",
-				&dp->enable_mask)) {
-		dev_err(dp->dev, "failed to get enable-mask for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	dp->phy_addr = ioremap(phy_base, SZ_4);
-	if (!dp->phy_addr) {
-		dev_err(dp->dev, "failed to ioremap dp-phy\n");
-		ret = -ENOMEM;
-		goto err;
-	}
-
-err:
-	of_node_put(dp_phy_node);
-
-	return ret;
-}
-
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	u32 reg;
-
-	reg = __raw_readl(dp->phy_addr);
-	reg |= dp->enable_mask;
-	__raw_writel(reg, dp->phy_addr);
Quoted 8 lines

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 964

Quoted 6 lines
drivers/video/exynos/exynos_dp_core.c +1 -5
-}
-
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	u32 reg;
+	pd->phy_label = "dp";

Felipe had a comment to change the label to *display-port* no?

No, I don't think so. :)
I would like to use 'dp'.

Best regards,
Jingoo Han

Quoted 3 lines

Thanks
Kishon

#3 lore raw

PATCH v3 3/3 video: exynos_dp: Use the generic PHY driver

In reply to Jingoo Han

Hi Jingoo,

Quoted 3 lines · Jingoo Han

Use the generic PHY API instead of the platform callback to control the DP PHY. The 'phy_label' field is added to the platform data structure to allow PHY lookup on non-dt platforms.

Since Exynos is currently a dt-only platform upstream, how about first making a pre-requisite patch that would remove support for non-dt platforms from this driver ? I think you could now move the content of file include/video/exynos_dp.h to e.g. drivers/video/ exynos/exynos_dp_core.h and remove the public exynos_dp.h file. pdata->phy_init/exit could also be dropped and you wouldn't need to care about non-dt support with the generic PHY API.

Quoted 123 lines
---
  .../devicetree/bindings/video/exynos_dp.txt        |   23 +---
  drivers/video/exynos/exynos_dp_core.c              |  118 ++------------------
  drivers/video/exynos/exynos_dp_core.h              |    2 +
  include/video/exynos_dp.h                          |    6 +-
  4 files changed, 21 insertions(+), 128 deletions(-)
Documentation/devicetree/bindings/video/exynos_dp.txt +6 -17
index 84f10c1..71645dc 100644
@@ -1,17 +1,6 @@
  The Exynos display port interface should be configured based on
  the type of panel connected to it.
 
-We use two nodes:
-	-dp-controller node
-	-dptx-phy node(defined inside dp-controller node)
-
-For the DP-PHY initialization, we use the dptx-phy node.
-Required properties for dptx-phy:
-	-reg:
-		Base address of DP PHY register.
-	-samsung,enable-mask:
-		The bit-mask used to enable/disable DP PHY.
-
  For the Panel initialization, we read data from dp-controller node.
  Required properties for dp-controller:
  	-compatible:
@@ -25,6 +14,10 @@ Required properties for dp-controller:
  		from common clock binding: handle to dp clock.
  	-clock-names:
  		from common clock binding: Shall be "dp".
+	-phys:
+		from general phy binding: the phandle for the PHY device.
+	-phy-names:
+		from general phy binding: Should be "dp".
  	-interrupt-parent:
  		phandle to Interrupt combiner node.
  	-samsung,color-space:
@@ -67,12 +60,8 @@ SOC specific portion:
  		interrupt-parent =<&combiner>;
  		clocks =<&clock 342>;
  		clock-names = "dp";
-
-		dptx-phy {
-			reg =<0x10040720>;
-			samsung,enable-mask =<1>;
-		};
-
+		phys =<&dp_phy>;
+		phy-names = "dp";
  	};
 
  Board Specific portion:
drivers/video/exynos/exynos_dp_core.c +1 -50
index 12bbede..bac515b 100644
@@ -19,6 +19,7 @@
  #include<linux/interrupt.h>
  #include<linux/delay.h>
  #include<linux/of.h>
+#include<linux/phy/phy.h>
 
  #include<video/exynos_dp.h>
 
@@ -960,84 +961,15 @@ static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  		return ERR_PTR(-EINVAL);
  	}
 
-	return pd;
-}
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	struct device_node *dp_phy_node = of_node_get(dp->dev->of_node);
-	u32 phy_base;
-	int ret = 0;
-
-	dp_phy_node = of_find_node_by_name(dp_phy_node, "dptx-phy");
-	if (!dp_phy_node) {
-		dev_err(dp->dev, "could not find dptx-phy node\n");
-		return -ENODEV;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "reg",&phy_base)) {
-		dev_err(dp->dev, "failed to get reg for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "samsung,enable-mask",
-				&dp->enable_mask)) {
-		dev_err(dp->dev, "failed to get enable-mask for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	dp->phy_addr = ioremap(phy_base, SZ_4);
-	if (!dp->phy_addr) {
-		dev_err(dp->dev, "failed to ioremap dp-phy\n");
-		ret = -ENOMEM;
-		goto err;
-	}
-
-err:
-	of_node_put(dp_phy_node);
-
-	return ret;
-}
-
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	u32 reg;
-
-	reg = __raw_readl(dp->phy_addr);
-	reg |= dp->enable_mask;
-	__raw_writel(reg, dp->phy_addr);
-}
-

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 967

Quoted 10 lines
drivers/video/exynos/exynos_dp_core.c +2 -6
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	u32 reg;
+	pd->phy_label = "dp";
 
-	reg = __raw_readl(dp->phy_addr);
-	reg&= ~(dp->enable_mask);
-	__raw_writel(reg, dp->phy_addr);
+	return pd;
  }

I'm afraid you cannot simply remove the above code, the original binding still needs to be supported. As far as I can see Arndale and smdk5250 are already users of that binding in mainline now.

Thus the benefits of adding the generic PHY support to this Display Port controller driver are starting to be a bit questionable.

Quoted 11 lines
drivers/video/exynos/exynos_dp_core.c +0 -6
  #else
  static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  {
  	return NULL;
  }
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	return -EINVAL;
-}
-

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 973

Quoted 10 lines
drivers/video/exynos/exynos_dp_core.c +0 -9
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	return;
-}
-
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	return;
-}
  #endif /* CONFIG_OF */

I think you could make the driver dependent on CONFIG_OF now and related #ifdefs and !CONFIG_OF function stubs could be removed.

Quoted 119 lines
drivers/video/exynos/exynos_dp_core.c +8 -36
  static int exynos_dp_probe(struct platform_device *pdev)
@@ -1061,10 +993,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
  		pdata = exynos_dp_dt_parse_pdata(&pdev->dev);
  		if (IS_ERR(pdata))
  			return PTR_ERR(pdata);
-
-		ret = exynos_dp_dt_parse_phydata(dp);
-		if (ret)
-			return ret;
  	} else {
  		pdata = pdev->dev.platform_data;
  		if (!pdata) {
@@ -1073,6 +1001,10 @@ static int exynos_dp_probe(struct platform_device *pdev)
  		}
  	}
 
+	dp->phy = devm_phy_get(&pdev->dev, pdata->phy_label);
+	if (IS_ERR(dp->phy))
+		return PTR_ERR(dp->phy);
+
  	dp->clock = devm_clk_get(&pdev->dev, "dp");
  	if (IS_ERR(dp->clock)) {
  		dev_err(&pdev->dev, "failed to get clock\n");
@@ -1097,13 +1029,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
  	dp->video_info = pdata->video_info;
 
-	if (pdev->dev.of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_init(dp);
-	} else {
-		if (pdata->phy_init)
-			pdata->phy_init();
-	}
+	phy_power_on(dp->phy);
 
  	exynos_dp_init_dp(dp);
 
@@ -1121,42 +1047,27 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
  static int exynos_dp_remove(struct platform_device *pdev)
  {
-	struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
  	struct exynos_dp_device *dp = platform_get_drvdata(pdev);
 
  	flush_work(&dp->hotplug_work);
 
-	if (pdev->dev.of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_exit(dp);
-	} else {
-		if (pdata->phy_exit)
-			pdata->phy_exit();
-	}
+	phy_power_off(dp->phy);
 
  	clk_disable_unprepare(dp->clock);
 
-
  	return 0;
  }
 
  #ifdef CONFIG_PM_SLEEP
  static int exynos_dp_suspend(struct device *dev)
  {
-	struct exynos_dp_platdata *pdata = dev->platform_data;
  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
  	disable_irq(dp->irq);
 
  	flush_work(&dp->hotplug_work);
 
-	if (dev->of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_exit(dp);
-	} else {
-		if (pdata->phy_exit)
-			pdata->phy_exit();
-	}
+	phy_power_off(dp->phy);
 
  	clk_disable_unprepare(dp->clock);
 
@@ -1165,16 +1076,9 @@ static int exynos_dp_suspend(struct device *dev)
 
  static int exynos_dp_resume(struct device *dev)
  {
-	struct exynos_dp_platdata *pdata = dev->platform_data;
  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
-	if (dev->of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_init(dp);
-	} else {
-		if (pdata->phy_init)
-			pdata->phy_init();
-	}
+	phy_power_on(dp->phy);
 
  	clk_prepare_enable(dp->clock);
 
drivers/video/exynos/exynos_dp_core.h +2 -0
index 6c567bbf..b3d0328 100644
@@ -42,6 +42,8 @@ struct exynos_dp_device {
  	struct video_info	*video_info;
  	struct link_train	link_train;
  	struct work_struct	hotplug_work;
+
+	struct phy		*phy;
  };
 
  /* exynos_dp_reg.c */
include/video/exynos_dp.h +0 -0
index bd8cabd..f38c9af 100644

include/video/exynos_dp.h struct video_info { · line 124

Quoted 3 lines
include/video/exynos_dp.h +0 -0
@@ -122,10 +122,8 @@ struct video_info {
  };
 
  struct exynos_dp_platdata {

Since Exynos doesn't support non-dt boot now this platform data structure is not used, is it ?

include/video/exynos_dp.h struct video_info { · line 129

Quoted 9 lines
include/video/exynos_dp.h +2 -4
-	struct video_info *video_info;
-
-	void (*phy_init)(void);
-	void (*phy_exit)(void);
+	struct video_info	*video_info;
+	const char		*phy_label;
  };
 
  #endif /* _EXYNOS_DP_H */

Regards,
Sylwester

author
#4 lore raw

PATCH v3 3/3 video: exynos_dp: Use the generic PHY driver

Quoted 8 lines · Sylwester Nawrocki

Hi Jingoo,

Quoted 3 lines · Jingoo Han

Use the generic PHY API instead of the platform callback to control the DP PHY. The 'phy_label' field is added to the platform data structure to allow PHY lookup on non-dt platforms.

Quoted 7 lines

Since Exynos is currently a dt-only platform upstream, how about first making a pre-requisite patch that would remove support for non-dt platforms from this driver ? I think you could now move the content of file include/video/exynos_dp.h to e.g. drivers/video/ exynos/exynos_dp_core.h and remove the public exynos_dp.h file. pdata->phy_init/exit could also be dropped and you wouldn't need to care about non-dt support with the generic PHY API.

Yes, you're right.

I will make the pre-requisite patch that would remove support for non-dt platforms from exynos_dp_core.c.
Then, I will move the content of file include/video/exynos_dp.h and remove 'exynos_dp.h' file.

Quoted 140 lines

Review

Quoted 11 lines
---
  .../devicetree/bindings/video/exynos_dp.txt        |   23 +---
  drivers/video/exynos/exynos_dp_core.c              |  118 ++------------------
  drivers/video/exynos/exynos_dp_core.h              |    2 +
  include/video/exynos_dp.h                          |    6 +-
  4 files changed, 21 insertions(+), 128 deletions(-)
(quoted diff) +0 -0

b/Documentation/devicetree/bindings/video/exynos_dp.txt

Quoted 113 lines

index 84f10c1..71645dc 100644

Documentation/devicetree/bindings/video/exynos_dp.txt +6 -17
@@ -1,17 +1,6 @@
  The Exynos display port interface should be configured based on
  the type of panel connected to it.
 
-We use two nodes:
-	-dp-controller node
-	-dptx-phy node(defined inside dp-controller node)
-
-For the DP-PHY initialization, we use the dptx-phy node.
-Required properties for dptx-phy:
-	-reg:
-		Base address of DP PHY register.
-	-samsung,enable-mask:
-		The bit-mask used to enable/disable DP PHY.
-
  For the Panel initialization, we read data from dp-controller node.
  Required properties for dp-controller:
  	-compatible:
@@ -25,6 +14,10 @@ Required properties for dp-controller:
  		from common clock binding: handle to dp clock.
  	-clock-names:
  		from common clock binding: Shall be "dp".
+	-phys:
+		from general phy binding: the phandle for the PHY device.
+	-phy-names:
+		from general phy binding: Should be "dp".
  	-interrupt-parent:
  		phandle to Interrupt combiner node.
  	-samsung,color-space:
@@ -67,12 +60,8 @@ SOC specific portion:
  		interrupt-parent =<&combiner>;
  		clocks =<&clock 342>;
  		clock-names = "dp";
-
-		dptx-phy {
-			reg =<0x10040720>;
-			samsung,enable-mask =<1>;
-		};
-
+		phys =<&dp_phy>;
+		phy-names = "dp";
  	};
 
  Board Specific portion:
drivers/video/exynos/exynos_dp_core.c +1 -50
index 12bbede..bac515b 100644
@@ -19,6 +19,7 @@
  #include<linux/interrupt.h>
  #include<linux/delay.h>
  #include<linux/of.h>
+#include<linux/phy/phy.h>
 
  #include<video/exynos_dp.h>
 
@@ -960,84 +961,15 @@ static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  		return ERR_PTR(-EINVAL);
  	}
 
-	return pd;
-}
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	struct device_node *dp_phy_node = of_node_get(dp->dev->of_node);
-	u32 phy_base;
-	int ret = 0;
-
-	dp_phy_node = of_find_node_by_name(dp_phy_node, "dptx-phy");
-	if (!dp_phy_node) {
-		dev_err(dp->dev, "could not find dptx-phy node\n");
-		return -ENODEV;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "reg",&phy_base)) {
-		dev_err(dp->dev, "failed to get reg for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	if (of_property_read_u32(dp_phy_node, "samsung,enable-mask",
-				&dp->enable_mask)) {
-		dev_err(dp->dev, "failed to get enable-mask for dptx-phy\n");
-		ret = -EINVAL;
-		goto err;
-	}
-
-	dp->phy_addr = ioremap(phy_base, SZ_4);
-	if (!dp->phy_addr) {
-		dev_err(dp->dev, "failed to ioremap dp-phy\n");
-		ret = -ENOMEM;
-		goto err;
-	}
-
-err:
-	of_node_put(dp_phy_node);
-
-	return ret;
-}
-
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	u32 reg;
-
-	reg = __raw_readl(dp->phy_addr);
-	reg |= dp->enable_mask;
-	__raw_writel(reg, dp->phy_addr);
-}
-

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 967

Quoted 10 lines
drivers/video/exynos/exynos_dp_core.c +2 -6
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	u32 reg;
+	pd->phy_label = "dp";
 
-	reg = __raw_readl(dp->phy_addr);
-	reg&= ~(dp->enable_mask);
-	__raw_writel(reg, dp->phy_addr);
+	return pd;
  }

I'm afraid you cannot simply remove the above code, the original binding still needs to be supported. As far as I can see Arndale and smdk5250 are already users of that binding in mainline now.

Quoted 2 lines

Thus the benefits of adding the generic PHY support to this Display Port controller driver are starting to be a bit questionable.

OK.
I will keep supporting this original DT binding.

Quoted 17 lines
Quoted 17 lines
drivers/video/exynos/exynos_dp_core.c +0 -11
  #else
  static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev)
  {
  	return NULL;
  }
-
-static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp)
-{
-	return -EINVAL;
-}
-
-static void exynos_dp_phy_init(struct exynos_dp_device *dp)
-{
-	return;
-}
-
Quoted 8 lines

drivers/video/exynos/exynos_dp_core.c static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) · line 973

Quoted 5 lines
drivers/video/exynos/exynos_dp_core.c +0 -4
-static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
-{
-	return;
-}
  #endif /* CONFIG_OF */

I think you could make the driver dependent on CONFIG_OF now and related #ifdefs and !CONFIG_OF function stubs could be removed.

OK.
I will add 'depends on OF', then remove '#ifdef CONFIG_OF' as well as !CONFIG_OF function stubs.

Quoted 122 lines
Quoted 122 lines
drivers/video/exynos/exynos_dp_core.c +8 -36
  static int exynos_dp_probe(struct platform_device *pdev)
@@ -1061,10 +993,6 @@ static int exynos_dp_probe(struct platform_device *pdev)
  		pdata = exynos_dp_dt_parse_pdata(&pdev->dev);
  		if (IS_ERR(pdata))
  			return PTR_ERR(pdata);
-
-		ret = exynos_dp_dt_parse_phydata(dp);
-		if (ret)
-			return ret;
  	} else {
  		pdata = pdev->dev.platform_data;
  		if (!pdata) {
@@ -1073,6 +1001,10 @@ static int exynos_dp_probe(struct platform_device *pdev)
  		}
  	}
 
+	dp->phy = devm_phy_get(&pdev->dev, pdata->phy_label);
+	if (IS_ERR(dp->phy))
+		return PTR_ERR(dp->phy);
+
  	dp->clock = devm_clk_get(&pdev->dev, "dp");
  	if (IS_ERR(dp->clock)) {
  		dev_err(&pdev->dev, "failed to get clock\n");
@@ -1097,13 +1029,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
  	dp->video_info = pdata->video_info;
 
-	if (pdev->dev.of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_init(dp);
-	} else {
-		if (pdata->phy_init)
-			pdata->phy_init();
-	}
+	phy_power_on(dp->phy);
 
  	exynos_dp_init_dp(dp);
 
@@ -1121,42 +1047,27 @@ static int exynos_dp_probe(struct platform_device *pdev)
 
  static int exynos_dp_remove(struct platform_device *pdev)
  {
-	struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
  	struct exynos_dp_device *dp = platform_get_drvdata(pdev);
 
  	flush_work(&dp->hotplug_work);
 
-	if (pdev->dev.of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_exit(dp);
-	} else {
-		if (pdata->phy_exit)
-			pdata->phy_exit();
-	}
+	phy_power_off(dp->phy);
 
  	clk_disable_unprepare(dp->clock);
 
-
  	return 0;
  }
 
  #ifdef CONFIG_PM_SLEEP
  static int exynos_dp_suspend(struct device *dev)
  {
-	struct exynos_dp_platdata *pdata = dev->platform_data;
  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
  	disable_irq(dp->irq);
 
  	flush_work(&dp->hotplug_work);
 
-	if (dev->of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_exit(dp);
-	} else {
-		if (pdata->phy_exit)
-			pdata->phy_exit();
-	}
+	phy_power_off(dp->phy);
 
  	clk_disable_unprepare(dp->clock);
 
@@ -1165,16 +1076,9 @@ static int exynos_dp_suspend(struct device *dev)
 
  static int exynos_dp_resume(struct device *dev)
  {
-	struct exynos_dp_platdata *pdata = dev->platform_data;
  	struct exynos_dp_device *dp = dev_get_drvdata(dev);
 
-	if (dev->of_node) {
-		if (dp->phy_addr)
-			exynos_dp_phy_init(dp);
-	} else {
-		if (pdata->phy_init)
-			pdata->phy_init();
-	}
+	phy_power_on(dp->phy);
 
  	clk_prepare_enable(dp->clock);
 
drivers/video/exynos/exynos_dp_core.h +2 -0
index 6c567bbf..b3d0328 100644
@@ -42,6 +42,8 @@ struct exynos_dp_device {
  	struct video_info	*video_info;
  	struct link_train	link_train;
  	struct work_struct	hotplug_work;
+
+	struct phy		*phy;
  };
 
  /* exynos_dp_reg.c */
include/video/exynos_dp.h +0 -0
index bd8cabd..f38c9af 100644
@@ -122,10 +122,8 @@ struct video_info {
  };
 
Quoted 4 lines

include/video/exynos_dp.h struct video_info { · line 124

Quoted 1 line
include/video/exynos_dp.h +0 -0
  struct exynos_dp_platdata {

Since Exynos doesn't support non-dt boot now this platform data structure is not used, is it ?

You're right.
It can be removed, if Exynos DP driver does not non-DT.

Best regards,
Jingoo Han

Quoted 13 lines

include/video/exynos_dp.h struct video_info { · line 129

Quoted 10 lines
include/video/exynos_dp.h +2 -4
-	struct video_info *video_info;
-
-	void (*phy_init)(void);
-	void (*phy_exit)(void);
+	struct video_info	*video_info;
+	const char		*phy_label;
  };
 
  #endif /* _EXYNOS_DP_H */

Regards,
Sylwester