Message ID | 001701ce73bf$bebf9f20$3c3edd60$@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Friday 28 June 2013 10:54 AM, Jingoo Han wrote: > 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. > > Signed-off-by: Jingoo Han <jg1.han@samsung.com> > --- > .../devicetree/bindings/video/exynos_dp.txt | 17 --- > 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, 15 insertions(+), 128 deletions(-) > > diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt b/Documentation/devicetree/bindings/video/exynos_dp.txt > index 84f10c1..a8320e3 100644 > --- a/Documentation/devicetree/bindings/video/exynos_dp.txt > +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt > @@ -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: > @@ -67,12 +56,6 @@ SOC specific portion: > interrupt-parent = <&combiner>; > clocks = <&clock 342>; > clock-names = "dp"; > - > - dptx-phy { > - reg = <0x10040720>; > - samsung,enable-mask = <1>; > - }; > - > }; > > Board Specific portion: > diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c > index 12bbede..bac515b 100644 > --- a/drivers/video/exynos/exynos_dp_core.c > +++ b/drivers/video/exynos/exynos_dp_core.c > @@ -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); > -} > - > -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) > -{ > - u32 reg; > + pd->phy_label = "dp"; In the case of non-dt boot, this phy_label should have ideally come from platform code. Thanks Kishon
On Friday, June 28, 2013 2:58 PM, Kishon Vijay Abraham I wrote: > > Hi, > > On Friday 28 June 2013 10:54 AM, Jingoo Han wrote: > > 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. > > > > Signed-off-by: Jingoo Han <jg1.han@samsung.com> > > --- > > .../devicetree/bindings/video/exynos_dp.txt | 17 --- > > 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, 15 insertions(+), 128 deletions(-) > > > > diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt > b/Documentation/devicetree/bindings/video/exynos_dp.txt > > index 84f10c1..a8320e3 100644 > > --- a/Documentation/devicetree/bindings/video/exynos_dp.txt > > +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt > > @@ -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: > > @@ -67,12 +56,6 @@ SOC specific portion: > > interrupt-parent = <&combiner>; > > clocks = <&clock 342>; > > clock-names = "dp"; > > - > > - dptx-phy { > > - reg = <0x10040720>; > > - samsung,enable-mask = <1>; > > - }; > > - > > }; > > > > Board Specific portion: > > diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c > > index 12bbede..bac515b 100644 > > --- a/drivers/video/exynos/exynos_dp_core.c > > +++ b/drivers/video/exynos/exynos_dp_core.c > > @@ -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); > > -} > > - > > -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) > > -{ > > - u32 reg; > > + pd->phy_label = "dp"; > > In the case of non-dt boot, this phy_label should have ideally come from > platform code. No, this is NOT the case of non-dt. 'pd->phy_label = "dp";' is included in exynos_dp_dt_parse_pdata(), not exynos_dp_phy_exit(). Also, exynos_dp_dt_parse_pdata() is called in the case of dt. But, diff is a little bit confusing. :( Best regards, Jingoo Han > > Thanks > Kishon
Hi, On Friday 28 June 2013 11:34 AM, Jingoo Han wrote: > On Friday, June 28, 2013 2:58 PM, Kishon Vijay Abraham I wrote: >> >> Hi, >> >> On Friday 28 June 2013 10:54 AM, Jingoo Han wrote: >>> 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. >>> >>> Signed-off-by: Jingoo Han <jg1.han@samsung.com> >>> --- >>> .../devicetree/bindings/video/exynos_dp.txt | 17 --- >>> 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, 15 insertions(+), 128 deletions(-) >>> >>> diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt >> b/Documentation/devicetree/bindings/video/exynos_dp.txt >>> index 84f10c1..a8320e3 100644 >>> --- a/Documentation/devicetree/bindings/video/exynos_dp.txt >>> +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt >>> @@ -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: >>> @@ -67,12 +56,6 @@ SOC specific portion: >>> interrupt-parent = <&combiner>; >>> clocks = <&clock 342>; >>> clock-names = "dp"; >>> - >>> - dptx-phy { >>> - reg = <0x10040720>; >>> - samsung,enable-mask = <1>; >>> - }; >>> - >>> }; >>> >>> Board Specific portion: >>> diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c >>> index 12bbede..bac515b 100644 >>> --- a/drivers/video/exynos/exynos_dp_core.c >>> +++ b/drivers/video/exynos/exynos_dp_core.c >>> @@ -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); >>> -} >>> - >>> -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) >>> -{ >>> - u32 reg; >>> + pd->phy_label = "dp"; >> >> In the case of non-dt boot, this phy_label should have ideally come from >> platform code. > > No, this is NOT the case of non-dt. > > 'pd->phy_label = "dp";' is included in exynos_dp_dt_parse_pdata(), > not exynos_dp_phy_exit(). > Also, exynos_dp_dt_parse_pdata() is called in the case of dt. ah.. right. Do you support non-dt boot. I dont see any modifications in the platform code? Thanks Kishon
On Friday, June 28, 2013 6:27 PM, Kishon Vijay Abraham I wrote: > > Hi, > > On Friday 28 June 2013 11:34 AM, Jingoo Han wrote: > > On Friday, June 28, 2013 2:58 PM, Kishon Vijay Abraham I wrote: > >> > >> Hi, > >> > >> On Friday 28 June 2013 10:54 AM, Jingoo Han wrote: > >>> 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. > >>> > >>> Signed-off-by: Jingoo Han <jg1.han@samsung.com> > >>> --- > >>> .../devicetree/bindings/video/exynos_dp.txt | 17 --- > >>> 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, 15 insertions(+), 128 deletions(-) > >>> > >>> diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt > >> b/Documentation/devicetree/bindings/video/exynos_dp.txt > >>> index 84f10c1..a8320e3 100644 > >>> --- a/Documentation/devicetree/bindings/video/exynos_dp.txt > >>> +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt > >>> @@ -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: > >>> @@ -67,12 +56,6 @@ SOC specific portion: > >>> interrupt-parent = <&combiner>; > >>> clocks = <&clock 342>; > >>> clock-names = "dp"; > >>> - > >>> - dptx-phy { > >>> - reg = <0x10040720>; > >>> - samsung,enable-mask = <1>; > >>> - }; > >>> - > >>> }; > >>> > >>> Board Specific portion: > >>> diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c > >>> index 12bbede..bac515b 100644 > >>> --- a/drivers/video/exynos/exynos_dp_core.c > >>> +++ b/drivers/video/exynos/exynos_dp_core.c > >>> @@ -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); > >>> -} > >>> - > >>> -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) > >>> -{ > >>> - u32 reg; > >>> + pd->phy_label = "dp"; > >> > >> In the case of non-dt boot, this phy_label should have ideally come from > >> platform code. > > > > No, this is NOT the case of non-dt. > > > > 'pd->phy_label = "dp";' is included in exynos_dp_dt_parse_pdata(), > > not exynos_dp_phy_exit(). > > Also, exynos_dp_dt_parse_pdata() is called in the case of dt. > > ah.. right. Do you support non-dt boot. I dont see any modifications in > the platform code? Platform code for non-DT has not been added; thus, there is no modification in the platform code. Best regards, Jingoo Han > > Thanks > Kishon
diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt b/Documentation/devicetree/bindings/video/exynos_dp.txt index 84f10c1..a8320e3 100644 --- a/Documentation/devicetree/bindings/video/exynos_dp.txt +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt @@ -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: @@ -67,12 +56,6 @@ SOC specific portion: interrupt-parent = <&combiner>; clocks = <&clock 342>; clock-names = "dp"; - - dptx-phy { - reg = <0x10040720>; - samsung,enable-mask = <1>; - }; - }; Board Specific portion: diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c index 12bbede..bac515b 100644 --- a/drivers/video/exynos/exynos_dp_core.c +++ b/drivers/video/exynos/exynos_dp_core.c @@ -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); -} - -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; } #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; -} - -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) -{ - return; -} #endif /* CONFIG_OF */ 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); diff --git a/drivers/video/exynos/exynos_dp_core.h b/drivers/video/exynos/exynos_dp_core.h index 6c567bbf..b3d0328 100644 --- a/drivers/video/exynos/exynos_dp_core.h +++ b/drivers/video/exynos/exynos_dp_core.h @@ -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 */ diff --git a/include/video/exynos_dp.h b/include/video/exynos_dp.h index bd8cabd..f38c9af 100644 --- a/include/video/exynos_dp.h +++ b/include/video/exynos_dp.h @@ -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 */
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. Signed-off-by: Jingoo Han <jg1.han@samsung.com> --- .../devicetree/bindings/video/exynos_dp.txt | 17 --- 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, 15 insertions(+), 128 deletions(-)