Re: [PATCH] phy: Add exynos-phy driver
Hi, On Wednesday 11 December 2013 03:46 PM, Sylwester Nawrocki wrote: > On 11/12/13 10:54, Kishon Vijay Abraham I wrote: >> On Wednesday 27 November 2013 06:56 PM, Tomasz Stanislawski wrote: Hello everyone, The Samsung SoCs from Exynos family are enhanced with a bunch of switches dedicated for IP blocks. Those switches are called PHYs in Exynos specification. They are usually controlled by a single bit in a single one-word-long register. >> >> So only enabling this switch is enough for the controller or some other >> actual >> PHY IP is needed along with this switch? >> >> However I'm not sure if the switch should be modelled as PHY as it is not a >> PHY >> in the real sense. > > These are ordinary PHY devices embedded in an SoC. I wouldn't really call > them "switches", as they indeed provide the physical layer functionality > for various interfaces, like USB, HDMI, MIPI CSI/DSI, etc. Their control Are they used along with the phy IPs for which Kamil and others have sent patches or this is used in different SoCs from what Kamil uses? Thanks Kishon > interface is often very simple - usually only an enable and a reset > control bit. But that can't change the fact they are real PHY devices, > so let's not call them switches, that's just untrue. > > Regards, > Sylwester > -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] phy: Add exynos-phy driver
On 11/12/13 10:54, Kishon Vijay Abraham I wrote: > On Wednesday 27 November 2013 06:56 PM, Tomasz Stanislawski wrote: >> > Hello everyone, >> > The Samsung SoCs from Exynos family are enhanced with a bunch of switches >> > dedicated for IP blocks. Those switches are called PHYs in Exynos >> > specification. They are usually controlled by a single bit in a single >> > one-word-long register. > > So only enabling this switch is enough for the controller or some other actual > PHY IP is needed along with this switch? > > However I'm not sure if the switch should be modelled as PHY as it is not a > PHY > in the real sense. These are ordinary PHY devices embedded in an SoC. I wouldn't really call them "switches", as they indeed provide the physical layer functionality for various interfaces, like USB, HDMI, MIPI CSI/DSI, etc. Their control interface is often very simple - usually only an enable and a reset control bit. But that can't change the fact they are real PHY devices, so let's not call them switches, that's just untrue. Regards, Sylwester -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] phy: Add exynos-phy driver
Hi, On Wednesday 27 November 2013 06:56 PM, Tomasz Stanislawski wrote: > Hello everyone, > The Samsung SoCs from Exynos family are enhanced with a bunch of switches > dedicated for IP blocks. Those switches are called PHYs in Exynos > specification. They are usually controlled by a single bit in a single > one-word-long register. So only enabling this switch is enough for the controller or some other actual PHY IP is needed along with this switch? However I'm not sure if the switch should be modelled as PHY as it is not a PHY in the real sense. Thanks Kishon > > A IP driver has to control such a switch in an abstract manner. Therefore, > such 'enablers' were implemented as clocks in older versions of Linux kernel. > With the dawn of PHY subsystems, PHYs become a natural way of exporting the > 'enabler' functionality to drivers. However, there is an unexpected > consequence. Some of those 1-bit PHYs were implemented as separate drivers. > This means that one has to create a struct device, struct phy, its phy > provider > and 100-150 lines of driver code to basically set one bit. > > The DP phy driver is a good example: > https://lkml.org/lkml/2013/7/18/53 > > And simple-phy RFC (shares only driver code but not other resources): > https://lkml.org/lkml/2013/10/21/313 > > To avoid waste of resources I propose to create all such 1-bit phys from > Exynos > SoC using a single device, driver and phy provider. > > This patchset contains a proposed solution. > > All comment are welcome. > > Hopefully in future the functionality introduced by this patch may be merged > into a larger Power Management Unit (PMU) gluer driver. On Samsusng SoC , the > PMU part contains a number of register barely linked to power management (like > clock gating, clock dividers, CPU resetting, etc.). It may be tempting to > create a hybrid driver that export clocks/phys/etc that are controlled by PMU > unit. > > Regards, > Tomasz Stanislawski > > Tomasz Stanislawski (1): > phy: Add exynos-phy driver > > drivers/phy/Kconfig |5 ++ > drivers/phy/Makefile |1 + > drivers/phy/exynos-phy.c | 152 > ++ > 3 files changed, 158 insertions(+) > create mode 100644 drivers/phy/exynos-phy.c > -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] phy: Add exynos-phy driver
Add exynos-phy driver to support a single register PHY interfaces present on Exynos4 SoC. Signed-off-by: Tomasz Stanislawski Signed-off-by: Kyungmin Park --- drivers/phy/Kconfig |5 ++ drivers/phy/Makefile |1 + drivers/phy/exynos-phy.c | 152 ++ 3 files changed, 158 insertions(+) create mode 100644 drivers/phy/exynos-phy.c diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index a344f3d..4414c73 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -51,4 +51,9 @@ config PHY_EXYNOS_DP_VIDEO help Support for Display Port PHY found on Samsung EXYNOS SoCs. +config EXYNOS_PHY + tristate "Exynos PHY driver" + help + Support for PHY controllers on SoCs from Exynos family. + endmenu diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index d0caae9..b2a833d 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -5,5 +5,6 @@ obj-$(CONFIG_GENERIC_PHY) += phy-core.o obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO) += phy-exynos-dp-video.o obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO)+= phy-exynos-mipi-video.o +obj-$(CONFIG_EXYNOS_PHY) += exynos-phy.o obj-$(CONFIG_OMAP_USB2)+= phy-omap-usb2.o obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o diff --git a/drivers/phy/exynos-phy.c b/drivers/phy/exynos-phy.c new file mode 100644 index 000..5a1ae6d --- /dev/null +++ b/drivers/phy/exynos-phy.c @@ -0,0 +1,152 @@ +/* + * Exynos PHY driver + * + * Copyright (C) 2013 Samsung Electronics Co., Ltd. + * Author: Tomasz Stanislawski + * + * 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 +#include +#include +#include +#include +#include +#include + +#define EXYNOS_PHY_ENABLE (1 << 0) + +static int exynos_phy_power_on(struct phy *phy) +{ + void __iomem *reg = phy_get_drvdata(phy); + u32 val; + + val = readl(reg); + val |= EXYNOS_PHY_ENABLE; + writel(val, reg); + + return 0; +} + +static int exynos_phy_power_off(struct phy *phy) +{ + void __iomem *reg = phy_get_drvdata(phy); + u32 val; + + val = readl(reg); + val &= ~EXYNOS_PHY_ENABLE; + writel(val, reg); + + return 0; +} + +static struct phy_ops exynos_phy_ops = { + .power_on = exynos_phy_power_on, + .power_off = exynos_phy_power_off, + .owner = THIS_MODULE, +}; + +static const u32 exynos4210_offsets[] = { + 0x0700, /* HDMI_PHY */ + 0x070C, /* DAC_PHY */ + 0x0718, /* ADC_PHY */ + 0x071C, /* PCIE_PHY */ + 0x0720, /* SATA_PHY */ + ~0, /* end mark */ +}; + +static const u32 exynos4412_offsets[] = { + 0x0700, /* HDMI_PHY */ + 0x0718, /* ADC_PHY */ + ~0, /* end mark */ +}; + +static const struct of_device_id exynos_phy_of_match[] = { + { .compatible = "exynos4210-phy", .data = exynos4210_offsets}, + { .compatible = "exynos4412-phy", .data = exynos4412_offsets}, + { }, +}; +MODULE_DEVICE_TABLE(of, exynos_phy_of_match); + +static struct phy *exynos_phy_xlate(struct device *dev, + struct of_phandle_args *args) +{ + struct phy **phys = dev_get_drvdata(dev); + int index = args->args[0]; + int i; + + /* verify if index is valid */ + for (i = 0; i <= index; ++i) + if (!phys[i]) + return ERR_PTR(-ENODEV); + + return phys[index]; +} + +static int exynos_phy_probe(struct platform_device *pdev) +{ + const struct of_device_id *of_id = of_match_device( + of_match_ptr(exynos_phy_of_match), &pdev->dev); + const u32 *offsets = of_id->data; + int count; + struct device *dev = &pdev->dev; + struct phy **phys; + struct resource *res; + void __iomem *regs; + int i; + struct phy_provider *phy_provider; + + /* count number of phys to create */ + for (count = 0; offsets[count] != ~0; ++count) + ; + + phys = devm_kzalloc(dev, (count + 1) * sizeof(phys[0]), GFP_KERNEL); + if (!phys) + return -ENOMEM; + + dev_set_drvdata(dev, phys); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + regs = devm_ioremap(dev, res->start, res->end); + if (IS_ERR(regs)) { + dev_err(dev, "failed to ioremap registers\n"); + return PTR_ERR(regs); + } + + /* NOTE: last entry in phys[] is NULL */ + for (i = 0; i < count; ++i) { + phys[i] = devm_phy_create(dev, &exynos_phy_ops, NULL); + if (IS_ERR(phys[i])) { + dev_err(dev, "failed to create PHY %d\n", i); + return PTR_ERR(phys[i]); + } + phy_set_drvdata(phys[i], regs
[PATCH] phy: Add exynos-phy driver
Hello everyone, The Samsung SoCs from Exynos family are enhanced with a bunch of switches dedicated for IP blocks. Those switches are called PHYs in Exynos specification. They are usually controlled by a single bit in a single one-word-long register. A IP driver has to control such a switch in an abstract manner. Therefore, such 'enablers' were implemented as clocks in older versions of Linux kernel. With the dawn of PHY subsystems, PHYs become a natural way of exporting the 'enabler' functionality to drivers. However, there is an unexpected consequence. Some of those 1-bit PHYs were implemented as separate drivers. This means that one has to create a struct device, struct phy, its phy provider and 100-150 lines of driver code to basically set one bit. The DP phy driver is a good example: https://lkml.org/lkml/2013/7/18/53 And simple-phy RFC (shares only driver code but not other resources): https://lkml.org/lkml/2013/10/21/313 To avoid waste of resources I propose to create all such 1-bit phys from Exynos SoC using a single device, driver and phy provider. This patchset contains a proposed solution. All comment are welcome. Hopefully in future the functionality introduced by this patch may be merged into a larger Power Management Unit (PMU) gluer driver. On Samsusng SoC , the PMU part contains a number of register barely linked to power management (like clock gating, clock dividers, CPU resetting, etc.). It may be tempting to create a hybrid driver that export clocks/phys/etc that are controlled by PMU unit. Regards, Tomasz Stanislawski Tomasz Stanislawski (1): phy: Add exynos-phy driver drivers/phy/Kconfig |5 ++ drivers/phy/Makefile |1 + drivers/phy/exynos-phy.c | 152 ++ 3 files changed, 158 insertions(+) create mode 100644 drivers/phy/exynos-phy.c -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html