* [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY @ 2013-08-26 8:55 Jingoo Han 2013-08-26 8:56 ` [PATCH 1/3] phy: Add driver for Exynos " Jingoo Han ` (3 more replies) 0 siblings, 4 replies; 10+ messages in thread From: Jingoo Han @ 2013-08-26 8:55 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: 'Greg Kroah-Hartman', linux-kernel, linux-samsung-soc, linux-fbdev, 'devicetree', 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', 'Jean-Christophe PLAGNIOL-VILLARD', Tomi Valkeinen, 'Jingoo Han' This patch series adds a simple driver for the Samsung Exynos SoC series DP transmitter PHY, using the generic PHY framework [1]. Previously the DP PHY used an internal DT node to control the PHY power enable bit. These patches was tested on Exynos5250. This PATCH v7 follows: * PATCH v6, sent on July, 9th 2013 * PATCH v5, sent on July, 8th 2013 * PATCH v4, sent on July, 2nd 2013 * PATCH v3, sent on July, 1st 2013 * PATCH v2, sent on June, 28th 2013 * PATCH v1, sent on June, 28th 2013 Changes from v6: * Re-based on git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy.git Changes from v5: * Re-based on git://gitorious.org/linuxphy/linuxphy.git Changes from v4: * Marked original bindings as deprecated in 'exynos_dp.txt' * Fixed typo of commit message. * Added Tomasz Figa's Reviewed-by. Changes from v3: * Added OF dependancy. * Removed redundant local variable 'void __iomem *addr'. * Removed unnecessary dev_set_drvdata(). * Added a patch that remove non-DT support for Exynos Display Port driver. * Removed unnecessary 'struct exynos_dp_platdata'. * Kept supporting the original bindings for DT compatibility. Changes from v2: * Removed redundant spinlock * Removed 'struct phy' from 'struct exynos_dp_video_phy' * Updated 'samsung-phy.txt', instead of creating 'samsung,exynos5250-dp-video-phy.txt'. * Removed unnecessary additional specifier from 'phys' DT property. * Added 'phys', 'phy-names' properties to 'exynos_dp.txt' file. * Added Felipe Balbi's Acked-by. Changes from v1: * Replaced exynos_dp_video_phy_xlate() with of_phy_simple_xlate(), as Kishon Vijay Abraham I guided. * Set the value of phy-cells as 0, because the phy_provider implements only one PHY. * Removed unnecessary header include. * Added '#ifdef CONFIG_OF' and of_match_ptr macro. This series depends on the generic PHY framework [1]. These patches refer to Sylwester Nawrocki's patches about Exynos MIPI [2]. [1] http://lwn.net/Articles/564188/ [2] http://www.spinics.net/lists/linux-samsung-soc/msg20098.html Jingoo Han (3): phy: Add driver for Exynos DP PHY video: exynos_dp: remove non-DT support for Exynos Display Port video: exynos_dp: Use the generic PHY driver .../devicetree/bindings/phy/samsung-phy.txt | 7 ++ .../devicetree/bindings/video/exynos_dp.txt | 17 +-- drivers/phy/Kconfig | 7 ++ drivers/phy/Makefile | 7 +- drivers/phy/phy-exynos-dp-video.c | 111 ++++++++++++++++ drivers/video/exynos/Kconfig | 2 +- drivers/video/exynos/exynos_dp_core.c | 132 ++++++-------------- drivers/video/exynos/exynos_dp_core.h | 110 ++++++++++++++++ drivers/video/exynos/exynos_dp_reg.c | 2 - include/video/exynos_dp.h | 131 ------------------- 10 files changed, 286 insertions(+), 240 deletions(-) create mode 100644 Documentation/devicetree/bindings/phy/samsung-phy.txt create mode 100644 drivers/phy/phy-exynos-dp-video.c delete mode 100644 include/video/exynos_dp.h -- 1.7.10.4 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/3] phy: Add driver for Exynos DP PHY 2013-08-26 8:55 [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Jingoo Han @ 2013-08-26 8:56 ` Jingoo Han 2013-08-26 8:57 ` [PATCH 2/3] video: exynos_dp: remove non-DT support for Exynos Display Port Jingoo Han ` (2 subsequent siblings) 3 siblings, 0 replies; 10+ messages in thread From: Jingoo Han @ 2013-08-26 8:56 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: 'Greg Kroah-Hartman', linux-kernel, linux-samsung-soc, linux-fbdev, 'devicetree', 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', 'Jean-Christophe PLAGNIOL-VILLARD', 'Tomi Valkeinen', 'Jingoo Han' Add a PHY provider driver for the Samsung Exynos SoC Display Port PHY. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> Cc: Sylwester Nawrocki <s.nawrocki@samsung.com> Acked-by: Felipe Balbi <balbi@ti.com> --- .../devicetree/bindings/phy/samsung-phy.txt | 7 ++ drivers/phy/Kconfig | 7 ++ drivers/phy/Makefile | 7 +- drivers/phy/phy-exynos-dp-video.c | 111 ++++++++++++++++++++ 4 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/phy/samsung-phy.txt create mode 100644 drivers/phy/phy-exynos-dp-video.c diff --git a/Documentation/devicetree/bindings/phy/samsung-phy.txt b/Documentation/devicetree/bindings/phy/samsung-phy.txt new file mode 100644 index 0000000..ee262238 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/samsung-phy.txt @@ -0,0 +1,7 @@ +Samsung EXYNOS SoC series Display Port PHY +------------------------------------------------- + +Required properties: +- compatible : should be "samsung,exynos5250-dp-video-phy"; +- reg : offset and length of the Display Port PHY register set; +- #phy-cells : from the generic PHY bindings, must be 0; diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index ac239ac..fed26a0 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -38,4 +38,11 @@ config TWL4030_USB This transceiver supports high and full speed devices plus, in host mode, low speed. +config PHY_EXYNOS_DP_VIDEO + tristate "EXYNOS SoC series Display Port PHY driver" + depends on OF + select GENERIC_PHY + help + Support for Display Port PHY found on Samsung EXYNOS SoCs. + endmenu diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index 0dd8a98..433e685 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -2,6 +2,7 @@ # Makefile for the phy drivers. # -obj-$(CONFIG_GENERIC_PHY) += phy-core.o -obj-$(CONFIG_OMAP_USB2) += phy-omap-usb2.o -obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o +obj-$(CONFIG_GENERIC_PHY) += phy-core.o +obj-$(CONFIG_OMAP_USB2) += phy-omap-usb2.o +obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o +obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO) += phy-exynos-dp-video.o diff --git a/drivers/phy/phy-exynos-dp-video.c b/drivers/phy/phy-exynos-dp-video.c new file mode 100644 index 0000000..1dbe6ce --- /dev/null +++ b/drivers/phy/phy-exynos-dp-video.c @@ -0,0 +1,111 @@ +/* + * Samsung EXYNOS SoC series Display Port PHY driver + * + * Copyright (C) 2013 Samsung Electronics Co., Ltd. + * Author: Jingoo Han <jg1.han@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/phy/phy.h> +#include <linux/platform_device.h> + +/* DPTX_PHY_CONTROL register */ +#define EXYNOS_DPTX_PHY_ENABLE (1 << 0) + +struct exynos_dp_video_phy { + void __iomem *regs; +}; + +static int __set_phy_state(struct exynos_dp_video_phy *state, unsigned int on) +{ + u32 reg; + + reg = readl(state->regs); + if (on) + reg |= EXYNOS_DPTX_PHY_ENABLE; + else + reg &= ~EXYNOS_DPTX_PHY_ENABLE; + writel(reg, state->regs); + + return 0; +} + +static int exynos_dp_video_phy_power_on(struct phy *phy) +{ + struct exynos_dp_video_phy *state = phy_get_drvdata(phy); + + return __set_phy_state(state, 1); +} + +static int exynos_dp_video_phy_power_off(struct phy *phy) +{ + struct exynos_dp_video_phy *state = phy_get_drvdata(phy); + + return __set_phy_state(state, 0); +} + +static struct phy_ops exynos_dp_video_phy_ops = { + .power_on = exynos_dp_video_phy_power_on, + .power_off = exynos_dp_video_phy_power_off, + .owner = THIS_MODULE, +}; + +static int exynos_dp_video_phy_probe(struct platform_device *pdev) +{ + struct exynos_dp_video_phy *state; + struct device *dev = &pdev->dev; + struct resource *res; + struct phy_provider *phy_provider; + struct phy *phy; + + state = devm_kzalloc(dev, sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + state->regs = devm_ioremap_resource(dev, res); + if (IS_ERR(state->regs)) + return PTR_ERR(state->regs); + + phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); + if (IS_ERR(phy_provider)) + return PTR_ERR(phy_provider); + + phy = devm_phy_create(dev, &exynos_dp_video_phy_ops, NULL); + if (IS_ERR(phy)) { + dev_err(dev, "failed to create Display Port PHY\n"); + return PTR_ERR(phy); + } + phy_set_drvdata(phy, state); + + return 0; +} + +static const struct of_device_id exynos_dp_video_phy_of_match[] = { + { .compatible = "samsung,exynos5250-dp-video-phy" }, + { }, +}; +MODULE_DEVICE_TABLE(of, exynos_dp_video_phy_of_match); + +static struct platform_driver exynos_dp_video_phy_driver = { + .probe = exynos_dp_video_phy_probe, + .driver = { + .name = "exynos-dp-video-phy", + .owner = THIS_MODULE, + .of_match_table = exynos_dp_video_phy_of_match, + } +}; +module_platform_driver(exynos_dp_video_phy_driver); + +MODULE_AUTHOR("Jingoo Han <jg1.han@samsung.com>"); +MODULE_DESCRIPTION("Samsung EXYNOS SoC DP PHY driver"); +MODULE_LICENSE("GPL v2"); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/3] video: exynos_dp: remove non-DT support for Exynos Display Port 2013-08-26 8:55 [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Jingoo Han 2013-08-26 8:56 ` [PATCH 1/3] phy: Add driver for Exynos " Jingoo Han @ 2013-08-26 8:57 ` Jingoo Han 2013-08-26 8:57 ` [PATCH 3/3] video: exynos_dp: Use the generic PHY driver Jingoo Han 2013-08-26 9:43 ` [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Kishon Vijay Abraham I 3 siblings, 0 replies; 10+ messages in thread From: Jingoo Han @ 2013-08-26 8:57 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: 'Greg Kroah-Hartman', linux-kernel, linux-samsung-soc, linux-fbdev, 'devicetree', 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', 'Jean-Christophe PLAGNIOL-VILLARD', 'Tomi Valkeinen', 'Jingoo Han' Exynos Display Port can be used only for Exynos SoCs. In addition, non-DT for EXYNOS SoCs is not supported from v3.11; thus, there is no need to support non-DT for Exynos Display Port. The 'include/video/exynos_dp.h' file has been used for non-DT support and the content of file include/video/exynos_dp.h is moved to drivers/video/exynos/exynos_dp_core.h. Thus, the 'exynos_dp.h' file is removed. Also, 'struct exynos_dp_platdata' is removed, because it is not used any more. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> --- drivers/video/exynos/Kconfig | 2 +- drivers/video/exynos/exynos_dp_core.c | 116 +++++++---------------------- drivers/video/exynos/exynos_dp_core.h | 109 +++++++++++++++++++++++++++ drivers/video/exynos/exynos_dp_reg.c | 2 - include/video/exynos_dp.h | 131 --------------------------------- 5 files changed, 135 insertions(+), 225 deletions(-) delete mode 100644 include/video/exynos_dp.h diff --git a/drivers/video/exynos/Kconfig b/drivers/video/exynos/Kconfig index 1b035b2..fab9019 100644 --- a/drivers/video/exynos/Kconfig +++ b/drivers/video/exynos/Kconfig @@ -29,7 +29,7 @@ config EXYNOS_LCD_S6E8AX0 config EXYNOS_DP bool "EXYNOS DP driver support" - depends on ARCH_EXYNOS + depends on OF && ARCH_EXYNOS default n help This enables support for DP device. diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c index 12bbede..05fed7d 100644 --- a/drivers/video/exynos/exynos_dp_core.c +++ b/drivers/video/exynos/exynos_dp_core.c @@ -20,8 +20,6 @@ #include <linux/delay.h> #include <linux/of.h> -#include <video/exynos_dp.h> - #include "exynos_dp_core.h" static int exynos_dp_init_dp(struct exynos_dp_device *dp) @@ -894,26 +892,17 @@ static void exynos_dp_hotplug(struct work_struct *work) dev_err(dp->dev, "unable to config video\n"); } -#ifdef CONFIG_OF -static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) +static struct video_info *exynos_dp_dt_parse_pdata(struct device *dev) { struct device_node *dp_node = dev->of_node; - struct exynos_dp_platdata *pd; struct video_info *dp_video_config; - pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); - if (!pd) { - dev_err(dev, "memory allocation for pdata failed\n"); - return ERR_PTR(-ENOMEM); - } dp_video_config = devm_kzalloc(dev, sizeof(*dp_video_config), GFP_KERNEL); - if (!dp_video_config) { dev_err(dev, "memory allocation for video config failed\n"); return ERR_PTR(-ENOMEM); } - pd->video_info = dp_video_config; dp_video_config->h_sync_polarity = of_property_read_bool(dp_node, "hsync-active-high"); @@ -960,7 +949,7 @@ static struct exynos_dp_platdata *exynos_dp_dt_parse_pdata(struct device *dev) return ERR_PTR(-EINVAL); } - return pd; + return dp_video_config; } static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp) @@ -1003,48 +992,30 @@ err: static void exynos_dp_phy_init(struct exynos_dp_device *dp) { - u32 reg; + if (dp->phy_addr) { + u32 reg; - reg = __raw_readl(dp->phy_addr); - reg |= dp->enable_mask; - __raw_writel(reg, dp->phy_addr); + 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; - - reg = __raw_readl(dp->phy_addr); - reg &= ~(dp->enable_mask); - __raw_writel(reg, dp->phy_addr); -} -#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; -} + if (dp->phy_addr) { + u32 reg; -static void exynos_dp_phy_exit(struct exynos_dp_device *dp) -{ - return; + reg = __raw_readl(dp->phy_addr); + reg &= ~(dp->enable_mask); + __raw_writel(reg, dp->phy_addr); + } } -#endif /* CONFIG_OF */ static int exynos_dp_probe(struct platform_device *pdev) { struct resource *res; struct exynos_dp_device *dp; - struct exynos_dp_platdata *pdata; int ret = 0; @@ -1057,21 +1028,13 @@ static int exynos_dp_probe(struct platform_device *pdev) dp->dev = &pdev->dev; - if (pdev->dev.of_node) { - pdata = exynos_dp_dt_parse_pdata(&pdev->dev); - if (IS_ERR(pdata)) - return PTR_ERR(pdata); + dp->video_info = exynos_dp_dt_parse_pdata(&pdev->dev); + if (IS_ERR(dp->video_info)) + return PTR_ERR(dp->video_info); - ret = exynos_dp_dt_parse_phydata(dp); - if (ret) - return ret; - } else { - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "no platform data\n"); - return -EINVAL; - } - } + ret = exynos_dp_dt_parse_phydata(dp); + if (ret) + return ret; dp->clock = devm_clk_get(&pdev->dev, "dp"); if (IS_ERR(dp->clock)) { @@ -1095,15 +1058,7 @@ static int exynos_dp_probe(struct platform_device *pdev) INIT_WORK(&dp->hotplug_work, exynos_dp_hotplug); - 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(); - } + exynos_dp_phy_init(dp); exynos_dp_init_dp(dp); @@ -1121,18 +1076,11 @@ 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(); - } + exynos_dp_phy_exit(dp); clk_disable_unprepare(dp->clock); @@ -1143,20 +1091,13 @@ static int exynos_dp_remove(struct platform_device *pdev) #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(); - } + exynos_dp_phy_exit(dp); clk_disable_unprepare(dp->clock); @@ -1165,16 +1106,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(); - } + exynos_dp_phy_init(dp); clk_prepare_enable(dp->clock); @@ -1203,7 +1137,7 @@ static struct platform_driver exynos_dp_driver = { .name = "exynos-dp", .owner = THIS_MODULE, .pm = &exynos_dp_pm_ops, - .of_match_table = of_match_ptr(exynos_dp_match), + .of_match_table = exynos_dp_match, }, }; diff --git a/drivers/video/exynos/exynos_dp_core.h b/drivers/video/exynos/exynos_dp_core.h index 6c567bbf..56cfec8 100644 --- a/drivers/video/exynos/exynos_dp_core.h +++ b/drivers/video/exynos/exynos_dp_core.h @@ -13,6 +13,99 @@ #ifndef _EXYNOS_DP_CORE_H #define _EXYNOS_DP_CORE_H +#define DP_TIMEOUT_LOOP_COUNT 100 +#define MAX_CR_LOOP 5 +#define MAX_EQ_LOOP 5 + +enum link_rate_type { + LINK_RATE_1_62GBPS = 0x06, + LINK_RATE_2_70GBPS = 0x0a +}; + +enum link_lane_count_type { + LANE_COUNT1 = 1, + LANE_COUNT2 = 2, + LANE_COUNT4 = 4 +}; + +enum link_training_state { + START, + CLOCK_RECOVERY, + EQUALIZER_TRAINING, + FINISHED, + FAILED +}; + +enum voltage_swing_level { + VOLTAGE_LEVEL_0, + VOLTAGE_LEVEL_1, + VOLTAGE_LEVEL_2, + VOLTAGE_LEVEL_3, +}; + +enum pre_emphasis_level { + PRE_EMPHASIS_LEVEL_0, + PRE_EMPHASIS_LEVEL_1, + PRE_EMPHASIS_LEVEL_2, + PRE_EMPHASIS_LEVEL_3, +}; + +enum pattern_set { + PRBS7, + D10_2, + TRAINING_PTN1, + TRAINING_PTN2, + DP_NONE +}; + +enum color_space { + COLOR_RGB, + COLOR_YCBCR422, + COLOR_YCBCR444 +}; + +enum color_depth { + COLOR_6, + COLOR_8, + COLOR_10, + COLOR_12 +}; + +enum color_coefficient { + COLOR_YCBCR601, + COLOR_YCBCR709 +}; + +enum dynamic_range { + VESA, + CEA +}; + +enum pll_status { + PLL_UNLOCKED, + PLL_LOCKED +}; + +enum clock_recovery_m_value_type { + CALCULATED_M, + REGISTER_M +}; + +enum video_timing_recognition_type { + VIDEO_TIMING_FROM_CAPTURE, + VIDEO_TIMING_FROM_REGISTER +}; + +enum analog_power_block { + AUX_BLOCK, + CH0_BLOCK, + CH1_BLOCK, + CH2_BLOCK, + CH3_BLOCK, + ANALOG_TOTAL, + POWER_ALL +}; + enum dp_irq_type { DP_IRQ_TYPE_HP_CABLE_IN, DP_IRQ_TYPE_HP_CABLE_OUT, @@ -20,6 +113,22 @@ enum dp_irq_type { DP_IRQ_TYPE_UNKNOWN, }; +struct video_info { + char *name; + + bool h_sync_polarity; + bool v_sync_polarity; + bool interlaced; + + enum color_space color_space; + enum dynamic_range dynamic_range; + enum color_coefficient ycbcr_coeff; + enum color_depth color_depth; + + enum link_rate_type link_rate; + enum link_lane_count_type lane_count; +}; + struct link_train { int eq_loop; int cr_loop[4]; diff --git a/drivers/video/exynos/exynos_dp_reg.c b/drivers/video/exynos/exynos_dp_reg.c index 29d9d03..b70da50 100644 --- a/drivers/video/exynos/exynos_dp_reg.c +++ b/drivers/video/exynos/exynos_dp_reg.c @@ -14,8 +14,6 @@ #include <linux/io.h> #include <linux/delay.h> -#include <video/exynos_dp.h> - #include "exynos_dp_core.h" #include "exynos_dp_reg.h" diff --git a/include/video/exynos_dp.h b/include/video/exynos_dp.h deleted file mode 100644 index bd8cabd..0000000 --- a/include/video/exynos_dp.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Samsung SoC DP device support - * - * Copyright (C) 2012 Samsung Electronics Co., Ltd. - * Author: Jingoo Han <jg1.han@samsung.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#ifndef _EXYNOS_DP_H -#define _EXYNOS_DP_H - -#define DP_TIMEOUT_LOOP_COUNT 100 -#define MAX_CR_LOOP 5 -#define MAX_EQ_LOOP 5 - -enum link_rate_type { - LINK_RATE_1_62GBPS = 0x06, - LINK_RATE_2_70GBPS = 0x0a -}; - -enum link_lane_count_type { - LANE_COUNT1 = 1, - LANE_COUNT2 = 2, - LANE_COUNT4 = 4 -}; - -enum link_training_state { - START, - CLOCK_RECOVERY, - EQUALIZER_TRAINING, - FINISHED, - FAILED -}; - -enum voltage_swing_level { - VOLTAGE_LEVEL_0, - VOLTAGE_LEVEL_1, - VOLTAGE_LEVEL_2, - VOLTAGE_LEVEL_3, -}; - -enum pre_emphasis_level { - PRE_EMPHASIS_LEVEL_0, - PRE_EMPHASIS_LEVEL_1, - PRE_EMPHASIS_LEVEL_2, - PRE_EMPHASIS_LEVEL_3, -}; - -enum pattern_set { - PRBS7, - D10_2, - TRAINING_PTN1, - TRAINING_PTN2, - DP_NONE -}; - -enum color_space { - COLOR_RGB, - COLOR_YCBCR422, - COLOR_YCBCR444 -}; - -enum color_depth { - COLOR_6, - COLOR_8, - COLOR_10, - COLOR_12 -}; - -enum color_coefficient { - COLOR_YCBCR601, - COLOR_YCBCR709 -}; - -enum dynamic_range { - VESA, - CEA -}; - -enum pll_status { - PLL_UNLOCKED, - PLL_LOCKED -}; - -enum clock_recovery_m_value_type { - CALCULATED_M, - REGISTER_M -}; - -enum video_timing_recognition_type { - VIDEO_TIMING_FROM_CAPTURE, - VIDEO_TIMING_FROM_REGISTER -}; - -enum analog_power_block { - AUX_BLOCK, - CH0_BLOCK, - CH1_BLOCK, - CH2_BLOCK, - CH3_BLOCK, - ANALOG_TOTAL, - POWER_ALL -}; - -struct video_info { - char *name; - - bool h_sync_polarity; - bool v_sync_polarity; - bool interlaced; - - enum color_space color_space; - enum dynamic_range dynamic_range; - enum color_coefficient ycbcr_coeff; - enum color_depth color_depth; - - enum link_rate_type link_rate; - enum link_lane_count_type lane_count; -}; - -struct exynos_dp_platdata { - struct video_info *video_info; - - void (*phy_init)(void); - void (*phy_exit)(void); -}; - -#endif /* _EXYNOS_DP_H */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/3] video: exynos_dp: Use the generic PHY driver 2013-08-26 8:55 [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Jingoo Han 2013-08-26 8:56 ` [PATCH 1/3] phy: Add driver for Exynos " Jingoo Han 2013-08-26 8:57 ` [PATCH 2/3] video: exynos_dp: remove non-DT support for Exynos Display Port Jingoo Han @ 2013-08-26 8:57 ` Jingoo Han 2013-08-26 9:43 ` [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Kishon Vijay Abraham I 3 siblings, 0 replies; 10+ messages in thread From: Jingoo Han @ 2013-08-26 8:57 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: 'Greg Kroah-Hartman', linux-kernel, linux-samsung-soc, linux-fbdev, 'devicetree', 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', 'Jean-Christophe PLAGNIOL-VILLARD', 'Tomi Valkeinen', 'Jingoo Han' Use the generic PHY API to control the DP PHY. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Reviewed-by: Tomasz Figa <t.figa@samsung.com> --- Documentation/devicetree/bindings/video/exynos_dp.txt | 17 +++++++++-------- drivers/video/exynos/exynos_dp_core.c | 16 ++++++++++++---- drivers/video/exynos/exynos_dp_core.h | 1 + 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Documentation/devicetree/bindings/video/exynos_dp.txt b/Documentation/devicetree/bindings/video/exynos_dp.txt index 84f10c1..3289d76 100644 --- a/Documentation/devicetree/bindings/video/exynos_dp.txt +++ b/Documentation/devicetree/bindings/video/exynos_dp.txt @@ -6,10 +6,10 @@ We use two nodes: -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: +Required properties for dptx-phy: deprecated, use phys and phy-names + -reg: deprecated Base address of DP PHY register. - -samsung,enable-mask: + -samsung,enable-mask: deprecated The bit-mask used to enable/disable DP PHY. For the Panel initialization, we read data from dp-controller node. @@ -27,6 +27,10 @@ Required properties for dp-controller: from common clock binding: Shall be "dp". -interrupt-parent: phandle to Interrupt combiner node. + -phys: + from general PHY binding: the phandle for the PHY device. + -phy-names: + from general PHY binding: Should be "dp". -samsung,color-space: input video data format. COLOR_RGB = 0, COLOR_YCBCR422 = 1, COLOR_YCBCR444 = 2 @@ -68,11 +72,8 @@ SOC specific portion: clocks = <&clock 342>; clock-names = "dp"; - dptx-phy { - reg = <0x10040720>; - samsung,enable-mask = <1>; - }; - + phys = <&dp_phy>; + phy-names = "dp"; }; Board Specific portion: diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c index 05fed7d..5e1a715 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 "exynos_dp_core.h" @@ -960,8 +961,11 @@ static int exynos_dp_dt_parse_phydata(struct exynos_dp_device *dp) 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; + dp->phy = devm_phy_get(dp->dev, "dp"); + if (IS_ERR(dp->phy)) + return PTR_ERR(dp->phy); + else + return 0; } if (of_property_read_u32(dp_phy_node, "reg", &phy_base)) { @@ -992,7 +996,9 @@ err: static void exynos_dp_phy_init(struct exynos_dp_device *dp) { - if (dp->phy_addr) { + if (dp->phy) { + phy_power_on(dp->phy); + } else if (dp->phy_addr) { u32 reg; reg = __raw_readl(dp->phy_addr); @@ -1003,7 +1009,9 @@ static void exynos_dp_phy_init(struct exynos_dp_device *dp) static void exynos_dp_phy_exit(struct exynos_dp_device *dp) { - if (dp->phy_addr) { + if (dp->phy) { + phy_power_off(dp->phy); + } else if (dp->phy_addr) { u32 reg; reg = __raw_readl(dp->phy_addr); diff --git a/drivers/video/exynos/exynos_dp_core.h b/drivers/video/exynos/exynos_dp_core.h index 56cfec8..607e36d 100644 --- a/drivers/video/exynos/exynos_dp_core.h +++ b/drivers/video/exynos/exynos_dp_core.h @@ -151,6 +151,7 @@ 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 */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY 2013-08-26 8:55 [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Jingoo Han ` (2 preceding siblings ...) 2013-08-26 8:57 ` [PATCH 3/3] video: exynos_dp: Use the generic PHY driver Jingoo Han @ 2013-08-26 9:43 ` Kishon Vijay Abraham I 3 siblings, 0 replies; 10+ messages in thread From: Kishon Vijay Abraham I @ 2013-08-26 9:43 UTC (permalink / raw) To: Jingoo Han Cc: 'Greg Kroah-Hartman', linux-kernel, linux-samsung-soc, linux-fbdev, 'devicetree', 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', 'Jean-Christophe PLAGNIOL-VILLARD', Tomi Valkeinen On Monday 26 August 2013 02:25 PM, Jingoo Han wrote: > This patch series adds a simple driver for the Samsung Exynos SoC > series DP transmitter PHY, using the generic PHY framework [1]. > Previously the DP PHY used an internal DT node to control the PHY > power enable bit. > > These patches was tested on Exynos5250. > > This PATCH v7 follows: > * PATCH v6, sent on July, 9th 2013 > * PATCH v5, sent on July, 8th 2013 > * PATCH v4, sent on July, 2nd 2013 > * PATCH v3, sent on July, 1st 2013 > * PATCH v2, sent on June, 28th 2013 > * PATCH v1, sent on June, 28th 2013 > > Changes from v6: > * Re-based on git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux-phy.git > > Changes from v5: > * Re-based on git://gitorious.org/linuxphy/linuxphy.git > > Changes from v4: > * Marked original bindings as deprecated in 'exynos_dp.txt' > * Fixed typo of commit message. > * Added Tomasz Figa's Reviewed-by. > > Changes from v3: > * Added OF dependancy. > * Removed redundant local variable 'void __iomem *addr'. > * Removed unnecessary dev_set_drvdata(). > * Added a patch that remove non-DT support for Exynos > Display Port driver. > * Removed unnecessary 'struct exynos_dp_platdata'. > * Kept supporting the original bindings for DT compatibility. > > Changes from v2: > * Removed redundant spinlock > * Removed 'struct phy' from 'struct exynos_dp_video_phy' > * Updated 'samsung-phy.txt', instead of creating > 'samsung,exynos5250-dp-video-phy.txt'. > * Removed unnecessary additional specifier from 'phys' > DT property. > * Added 'phys', 'phy-names' properties to 'exynos_dp.txt' file. > * Added Felipe Balbi's Acked-by. > > Changes from v1: > * Replaced exynos_dp_video_phy_xlate() with of_phy_simple_xlate(), > as Kishon Vijay Abraham I guided. > * Set the value of phy-cells as 0, because the phy_provider implements > only one PHY. > * Removed unnecessary header include. > * Added '#ifdef CONFIG_OF' and of_match_ptr macro. > > This series depends on the generic PHY framework [1]. These patches > refer to Sylwester Nawrocki's patches about Exynos MIPI [2]. > > [1] http://lwn.net/Articles/564188/ > [2] http://www.spinics.net/lists/linux-samsung-soc/msg20098.html > > Jingoo Han (3): > phy: Add driver for Exynos DP PHY > video: exynos_dp: remove non-DT support for Exynos Display Port > video: exynos_dp: Use the generic PHY driver FWIW, Acked-by: Kishon Vijay Abraham I <kishon@ti.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3] video: exynos_dp: Use the generic PHY driver @ 2013-06-28 5:24 Jingoo Han 2013-06-28 5:58 ` Kishon Vijay Abraham I 0 siblings, 1 reply; 10+ messages in thread From: Jingoo Han @ 2013-06-28 5:24 UTC (permalink / raw) To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-samsung-soc-u79uwXL29TY76Z2rM5mHXA Cc: linux-fbdev-u79uwXL29TY76Z2rM5mHXA, 'Kukjin Kim', Jingoo Han, 'Donghwa Lee', 'Felipe Balbi', 'Kishon Vijay Abraham I', 'Inki Dae', 'Kyungmin Park', 'Sylwester Nawrocki', devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, linux-media-u79uwXL29TY76Z2rM5mHXA 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-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org> --- .../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"; - 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 */ -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] video: exynos_dp: Use the generic PHY driver 2013-06-28 5:24 [PATCH 3/3] video: exynos_dp: Use the generic PHY driver Jingoo Han @ 2013-06-28 5:58 ` Kishon Vijay Abraham I 2013-06-28 6:04 ` Jingoo Han 0 siblings, 1 reply; 10+ messages in thread From: Kishon Vijay Abraham I @ 2013-06-28 5:58 UTC (permalink / raw) To: Jingoo Han Cc: linux-fbdev, 'Kukjin Kim', 'Tomasz Figa', 'Donghwa Lee', 'Felipe Balbi', 'Inki Dae', 'Kyungmin Park', linux-samsung-soc, 'Sylwester Nawrocki', 'Jean-Christophe PLAGNIOL-VILLARD', devicetree-discuss, linux-arm-kernel, linux-media 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] video: exynos_dp: Use the generic PHY driver 2013-06-28 5:58 ` Kishon Vijay Abraham I @ 2013-06-28 6:04 ` Jingoo Han 2013-06-28 9:27 ` Kishon Vijay Abraham I 0 siblings, 1 reply; 10+ messages in thread From: Jingoo Han @ 2013-06-28 6:04 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: linux-arm-kernel, linux-samsung-soc, linux-media, 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', devicetree-discuss, 'Inki Dae', 'Donghwa Lee', 'Kyungmin Park', 'Jean-Christophe PLAGNIOL-VILLARD', linux-fbdev, Jingoo Han 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] video: exynos_dp: Use the generic PHY driver 2013-06-28 6:04 ` Jingoo Han @ 2013-06-28 9:27 ` Kishon Vijay Abraham I 2013-07-01 0:35 ` Jingoo Han 0 siblings, 1 reply; 10+ messages in thread From: Kishon Vijay Abraham I @ 2013-06-28 9:27 UTC (permalink / raw) To: Jingoo Han Cc: linux-arm-kernel, linux-samsung-soc, linux-media, 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', devicetree-discuss, 'Inki Dae', 'Donghwa Lee', 'Kyungmin Park', 'Jean-Christophe PLAGNIOL-VILLARD', linux-fbdev 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 3/3] video: exynos_dp: Use the generic PHY driver 2013-06-28 9:27 ` Kishon Vijay Abraham I @ 2013-07-01 0:35 ` Jingoo Han 0 siblings, 0 replies; 10+ messages in thread From: Jingoo Han @ 2013-07-01 0:35 UTC (permalink / raw) To: 'Kishon Vijay Abraham I' Cc: linux-arm-kernel, linux-samsung-soc, linux-media, 'Kukjin Kim', 'Sylwester Nawrocki', 'Felipe Balbi', 'Tomasz Figa', devicetree-discuss, 'Inki Dae', 'Donghwa Lee', 'Kyungmin Park', 'Jean-Christophe PLAGNIOL-VILLARD', linux-fbdev, Jingoo Han 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 ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2013-08-26 9:43 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-08-26 8:55 [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Jingoo Han 2013-08-26 8:56 ` [PATCH 1/3] phy: Add driver for Exynos " Jingoo Han 2013-08-26 8:57 ` [PATCH 2/3] video: exynos_dp: remove non-DT support for Exynos Display Port Jingoo Han 2013-08-26 8:57 ` [PATCH 3/3] video: exynos_dp: Use the generic PHY driver Jingoo Han 2013-08-26 9:43 ` [PATCH V7 0/3] Generic PHY driver for the Exynos SoC DP PHY Kishon Vijay Abraham I -- strict thread matches above, loose matches on Subject: below -- 2013-06-28 5:24 [PATCH 3/3] video: exynos_dp: Use the generic PHY driver Jingoo Han 2013-06-28 5:58 ` Kishon Vijay Abraham I 2013-06-28 6:04 ` Jingoo Han 2013-06-28 9:27 ` Kishon Vijay Abraham I 2013-07-01 0:35 ` Jingoo Han
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).