video: exynos_dsi: Use generic PHY driver
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Thu, 4 Apr 2013 12:13:51 +0000 (14:13 +0200)
committerChanho Park <chanho61.park@samsung.com>
Tue, 18 Nov 2014 02:44:40 +0000 (11:44 +0900)
Use the generic PHY API instead of the platform callback to control
the MIPI DSIM DPHY.

Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
Changes since v4:
 - updated to latest version of the PHY framework - removed PHY
   labels.

drivers/video/display/source-exynos_dsi.c
drivers/video/exynos/exynos_mipi_dsi.c
include/video/exynos_dsi.h
include/video/exynos_mipi_dsim.h

index d7094f4..d36162f 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/mm.h>
 #include <linux/module.h>
 #include <linux/of.h>
+#include <linux/phy/phy.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regulator/consumer.h>
@@ -219,6 +220,7 @@ struct exynos_dsi {
        bool enabled;
 
        struct platform_device *pdev;
+       struct phy *phy;
        struct device *dev;
        struct resource *res;
        struct clk *pll_clk;
@@ -816,6 +818,7 @@ again:
 
 static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi)
 {
+       static unsigned long j;
        struct exynos_dsi_transfer *xfer;
        unsigned long flags;
        bool start = true;
@@ -824,7 +827,8 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi)
 
        if (list_empty(&dsi->transfer_list)) {
                spin_unlock_irqrestore(&dsi->transfer_lock, flags);
-               dev_warn(dsi->dev, "unexpected TX/RX interrupt\n");
+               if (printk_timed_ratelimit(&j, 500))
+                       dev_warn(dsi->dev, "unexpected TX/RX interrupt\n");
                return false;
        }
 
@@ -996,8 +1000,7 @@ static int exynos_dsi_enable(struct video_source *src)
        clk_prepare_enable(dsi->bus_clk);
        clk_prepare_enable(dsi->pll_clk);
 
-       if (dsi->pd->phy_enable)
-               dsi->pd->phy_enable(dsi->pdev, true);
+       phy_power_on(dsi->phy);
 
        exynos_dsi_reset(dsi);
        exynos_dsi_init_link(dsi);
@@ -1022,8 +1025,7 @@ static int exynos_dsi_disable(struct video_source *src)
 
        exynos_dsi_disable_clock(dsi);
 
-       if (dsi->pd->phy_enable)
-               dsi->pd->phy_enable(dsi->pdev, false);
+       phy_power_off(dsi->phy);
 
        clk_disable_unprepare(dsi->pll_clk);
        clk_disable_unprepare(dsi->bus_clk);
@@ -1104,12 +1106,6 @@ static const struct dsi_video_source_ops exynos_dsi_ops = {
  * Device Tree
  */
 
-static int (* const of_phy_enables[])(struct platform_device *, bool) = {
-#ifdef CONFIG_S5P_SETUP_MIPIPHY
-       [0] = s5p_dsim_phy_enable,
-#endif
-};
-
 static struct exynos_dsi_platform_data *exynos_dsi_parse_dt(
                                                struct platform_device *pdev)
 {
@@ -1117,7 +1113,6 @@ static struct exynos_dsi_platform_data *exynos_dsi_parse_dt(
        struct exynos_dsi_platform_data *dsi_pd;
        struct device *dev = &pdev->dev;
        const __be32 *prop_data;
-       u32 val;
 
        dsi_pd = kzalloc(sizeof(*dsi_pd), GFP_KERNEL);
        if (!dsi_pd) {
@@ -1125,19 +1120,6 @@ static struct exynos_dsi_platform_data *exynos_dsi_parse_dt(
                return NULL;
        }
 
-       prop_data = of_get_property(node, "samsung,phy-type", NULL);
-       if (!prop_data) {
-               dev_err(dev, "failed to get phy-type property\n");
-               goto err_free_pd;
-       }
-
-       val = be32_to_cpu(*prop_data);
-       if (val >= ARRAY_SIZE(of_phy_enables) || !of_phy_enables[val]) {
-               dev_err(dev, "Invalid phy-type %u\n", val);
-               goto err_free_pd;
-       }
-       dsi_pd->phy_enable = of_phy_enables[val];
-
        prop_data = of_get_property(node, "samsung,pll-stable-time", NULL);
        if (!prop_data) {
                dev_err(dev, "failed to get pll-stable-time property\n");
@@ -1259,6 +1241,10 @@ static int exynos_dsi_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
+       dsi->phy = devm_phy_get(&pdev->dev, "dsim");
+       if (IS_ERR(dsi->phy))
+               return PTR_ERR(dsi->phy);
+
        platform_set_drvdata(pdev, dsi);
 
        dsi->irq = platform_get_irq(pdev, 0);
index 248e444..00b3a52 100644 (file)
@@ -373,7 +373,7 @@ static int exynos_mipi_dsi_probe(struct platform_device *pdev)
                return ret;
        }
 
-       dsim->phy = devm_phy_get(&pdev->dev, dsim_pd->phy_label);
+       dsim->phy = devm_phy_get(&pdev->dev, "dsim");
        if (IS_ERR(dsim->phy))
                return PTR_ERR(dsim->phy);
 
index 95e1568..5c062c7 100644 (file)
@@ -25,9 +25,6 @@
  */
 struct exynos_dsi_platform_data {
        unsigned int enabled;
-
-       int (*phy_enable)(struct platform_device *pdev, bool on);
-
        unsigned int pll_stable_time;
        unsigned long pll_clk_rate;
        unsigned long esc_clk_rate;
@@ -36,6 +33,4 @@ struct exynos_dsi_platform_data {
        unsigned short rx_timeout;
 };
 
-int s5p_dsim_phy_enable(struct platform_device *pdev, bool on);
-
 #endif /* _EXYNOS_MIPI_DSIM_H */
index 6843385..070983d 100644 (file)
@@ -216,7 +216,7 @@ struct mipi_dsim_config {
  *     automatically.
  * @e_clk_src: select byte clock source.
  * @pd: pointer to MIPI-DSI driver platform data.
- * @phy: pointer to the generic PHY
+ * @phy: pointer to the MIPI-DSI PHY
  */
 struct mipi_dsim_device {
        struct device                   *dev;
@@ -250,7 +250,6 @@ struct mipi_dsim_device {
  * @enabled: indicate whether mipi controller got enabled or not.
  * @lcd_panel_info: pointer for lcd panel specific structure.
  *     this structure specifies width, height, timing and polarity and so on.
- * @phy_label: the generic PHY label
  */
 struct mipi_dsim_platform_data {
        char                            lcd_panel_name[PANEL_NAME_SIZE];
@@ -258,8 +257,6 @@ struct mipi_dsim_platform_data {
        struct mipi_dsim_config         *dsim_config;
        unsigned int                    enabled;
        void                            *lcd_panel_info;
-
-       const char                      *phy_label;
 };
 
 /*