From: Kishon Vijay Abraham I <kishon@ti.com>
To: Vivek Gautam <gautam.vivek@samsung.com>
Cc: dri-devel@lists.freedesktop.org,
"linux-samsung-soc@vger.kernel.org"
<linux-samsung-soc@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
inki.dae@samsung.com, Sean Paul <seanpaul@google.com>,
Jingoo Han <jg1.han@samsung.com>,
ajaykumar.rs@samsung.com
Subject: Re: [PATCH v3 1/3] phy: exynos-dp-video: Use syscon support to control pmu register
Date: Thu, 18 Sep 2014 11:21:33 +0530 [thread overview]
Message-ID: <541A72E5.4000809@ti.com> (raw)
In-Reply-To: <CAFp+6iGNNygVrpQFaEao+aGAad=vgb6EDpJqRj8cA+5XSC8ZSg@mail.gmail.com>
On Thursday 18 September 2014 08:55 AM, Vivek Gautam wrote:
> Hi Kishon,
>
>
> On Wed, Sep 17, 2014 at 10:24 PM, Kishon Vijay Abraham I <kishon@ti.com> wrote:
>>
>>
>> On Tuesday 16 September 2014 10:32 AM, Vivek Gautam wrote:
>>> Currently the DP_PHY_ENABLE register is mapped in the driver,
>>> and accessed to control power to the PHY.
>>> With mfd-syscon and regmap interface available at our disposal,
>>> it's wise to use that instead of using a 'reg' property for the
>>> controller and allocating a memory resource for that.
>>>
>>> To facilitate this, we have added another compatible string
>>> for Exynso5420 SoC to acquire driver data which contains
>>> different DP-PHY-CONTROL register offset.
>>>
>>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>>> Cc: Jingoo Han <jg1.han@samsung.com>
>>> Cc: Kishon Vijay Abraham I <kishon@ti.com>
>>
>> Taking this in linux-phy tree. If someone has already taken this patch, please
>> let me know.
>
> Thanks for taking this. But just one check, i think i need to separate
> out the Documentation
> to a separate patch even before this driver patch. Isn't it ?
no.. that's alright.
Thanks
Kishon
>
>>
>> Thanks
>> Kishon
>>
>>> ---
>>>
>>> Changes since v2:
>>> - Using 'EXYNOS5_PHY_ENABLE' macro instead of 'EXYNOS_DPTX_PHY_ENABLE'
>>> since that's available with us in "linux/mfd/syscon/exynos5-pmu.h" file.
>>>
>>> Changes since v1:
>>> - state->regs should have been "struct regmap *" instead of
>>> "void __iomem *". So corrected the same.
>>>
>>> .../devicetree/bindings/phy/samsung-phy.txt | 7 +-
>>> drivers/phy/phy-exynos-dp-video.c | 79 +++++++++++++-------
>>> 2 files changed, 59 insertions(+), 27 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/phy/samsung-phy.txt b/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> index 7a6feea..15e0f2c 100644
>>> --- a/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> +++ b/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> @@ -17,8 +17,11 @@ 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;
>>> +- compatible : should be one of the following supported values:
>>> + - "samsung,exynos5250-dp-video-phy"
>>> + - "samsung,exynos5420-dp-video-phy"
>>> +- samsung,pmu-syscon: phandle for PMU system controller interface, used to
>>> + control pmu registers for power isolation.
>>> - #phy-cells : from the generic PHY bindings, must be 0;
>>>
>>> Samsung S5P/EXYNOS SoC series USB PHY
>>> diff --git a/drivers/phy/phy-exynos-dp-video.c b/drivers/phy/phy-exynos-dp-video.c
>>> index 8b3026e..53f44a0 100644
>>> --- a/drivers/phy/phy-exynos-dp-video.c
>>> +++ b/drivers/phy/phy-exynos-dp-video.c
>>> @@ -13,44 +13,55 @@
>>> #include <linux/io.h>
>>> #include <linux/kernel.h>
>>> #include <linux/module.h>
>>> +#include <linux/mfd/syscon.h>
>>> +#include <linux/mfd/syscon/exynos5-pmu.h>
>>> #include <linux/of.h>
>>> #include <linux/of_address.h>
>>> #include <linux/phy/phy.h>
>>> #include <linux/platform_device.h>
>>> +#include <linux/regmap.h>
>>>
>>> -/* DPTX_PHY_CONTROL register */
>>> -#define EXYNOS_DPTX_PHY_ENABLE (1 << 0)
>>> +struct exynos_dp_video_phy_drvdata {
>>> + u32 phy_ctrl_offset;
>>> +};
>>>
>>> struct exynos_dp_video_phy {
>>> - void __iomem *regs;
>>> + struct regmap *regs;
>>> + const struct exynos_dp_video_phy_drvdata *drvdata;
>>> };
>>>
>>> -static int __set_phy_state(struct exynos_dp_video_phy *state, unsigned int on)
>>> +static void exynos_dp_video_phy_pwr_isol(struct exynos_dp_video_phy *state,
>>> + unsigned int on)
>>> {
>>> - u32 reg;
>>> + unsigned int val;
>>> +
>>> + if (IS_ERR(state->regs))
>>> + return;
>>>
>>> - reg = readl(state->regs);
>>> - if (on)
>>> - reg |= EXYNOS_DPTX_PHY_ENABLE;
>>> - else
>>> - reg &= ~EXYNOS_DPTX_PHY_ENABLE;
>>> - writel(reg, state->regs);
>>> + val = on ? 0 : EXYNOS5_PHY_ENABLE;
>>>
>>> - return 0;
>>> + regmap_update_bits(state->regs, state->drvdata->phy_ctrl_offset,
>>> + EXYNOS5_PHY_ENABLE, val);
>>> }
>>>
>>> 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);
>>> + /* Disable power isolation on DP-PHY */
>>> + exynos_dp_video_phy_pwr_isol(state, 0);
>>> +
>>> + return 0;
>>> }
>>>
>>> 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);
>>> + /* Enable power isolation on DP-PHY */
>>> + exynos_dp_video_phy_pwr_isol(state, 1);
>>> +
>>> + return 0;
>>> }
>>>
>>> static struct phy_ops exynos_dp_video_phy_ops = {
>>> @@ -59,11 +70,31 @@ static struct phy_ops exynos_dp_video_phy_ops = {
>>> .owner = THIS_MODULE,
>>> };
>>>
>>> +static const struct exynos_dp_video_phy_drvdata exynos5250_dp_video_phy = {
>>> + .phy_ctrl_offset = EXYNOS5_DPTX_PHY_CONTROL,
>>> +};
>>> +
>>> +static const struct exynos_dp_video_phy_drvdata exynos5420_dp_video_phy = {
>>> + .phy_ctrl_offset = EXYNOS5420_DPTX_PHY_CONTROL,
>>> +};
>>> +
>>> +static const struct of_device_id exynos_dp_video_phy_of_match[] = {
>>> + {
>>> + .compatible = "samsung,exynos5250-dp-video-phy",
>>> + .data = &exynos5250_dp_video_phy,
>>> + }, {
>>> + .compatible = "samsung,exynos5420-dp-video-phy",
>>> + .data = &exynos5420_dp_video_phy,
>>> + },
>>> + { },
>>> +};
>>> +MODULE_DEVICE_TABLE(of, exynos_dp_video_phy_of_match);
>>> +
>>> 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;
>>> + const struct of_device_id *match;
>>> struct phy_provider *phy_provider;
>>> struct phy *phy;
>>>
>>> @@ -71,11 +102,15 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
>>> if (!state)
>>> return -ENOMEM;
>>>
>>> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> -
>>> - state->regs = devm_ioremap_resource(dev, res);
>>> - if (IS_ERR(state->regs))
>>> + state->regs = syscon_regmap_lookup_by_phandle(dev->of_node,
>>> + "samsung,pmu-syscon");
>>> + if (IS_ERR(state->regs)) {
>>> + dev_err(dev, "Failed to lookup PMU regmap\n");
>>> return PTR_ERR(state->regs);
>>> + }
>>> +
>>> + match = of_match_node(exynos_dp_video_phy_of_match, dev->of_node);
>>> + state->drvdata = match->data;
>>>
>>> phy = devm_phy_create(dev, NULL, &exynos_dp_video_phy_ops, NULL);
>>> if (IS_ERR(phy)) {
>>> @@ -89,12 +124,6 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
>>> return PTR_ERR_OR_ZERO(phy_provider);
>>> }
>>>
>>> -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 = {
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Kishon Vijay Abraham I <kishon@ti.com>
To: Vivek Gautam <gautam.vivek@samsung.com>
Cc: <dri-devel@lists.freedesktop.org>,
"linux-samsung-soc@vger.kernel.org"
<linux-samsung-soc@vger.kernel.org>,
"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
<inki.dae@samsung.com>, Sean Paul <seanpaul@google.com>,
Jingoo Han <jg1.han@samsung.com>, <ajaykumar.rs@samsung.com>
Subject: Re: [PATCH v3 1/3] phy: exynos-dp-video: Use syscon support to control pmu register
Date: Thu, 18 Sep 2014 11:21:33 +0530 [thread overview]
Message-ID: <541A72E5.4000809@ti.com> (raw)
In-Reply-To: <CAFp+6iGNNygVrpQFaEao+aGAad=vgb6EDpJqRj8cA+5XSC8ZSg@mail.gmail.com>
On Thursday 18 September 2014 08:55 AM, Vivek Gautam wrote:
> Hi Kishon,
>
>
> On Wed, Sep 17, 2014 at 10:24 PM, Kishon Vijay Abraham I <kishon@ti.com> wrote:
>>
>>
>> On Tuesday 16 September 2014 10:32 AM, Vivek Gautam wrote:
>>> Currently the DP_PHY_ENABLE register is mapped in the driver,
>>> and accessed to control power to the PHY.
>>> With mfd-syscon and regmap interface available at our disposal,
>>> it's wise to use that instead of using a 'reg' property for the
>>> controller and allocating a memory resource for that.
>>>
>>> To facilitate this, we have added another compatible string
>>> for Exynso5420 SoC to acquire driver data which contains
>>> different DP-PHY-CONTROL register offset.
>>>
>>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>>> Cc: Jingoo Han <jg1.han@samsung.com>
>>> Cc: Kishon Vijay Abraham I <kishon@ti.com>
>>
>> Taking this in linux-phy tree. If someone has already taken this patch, please
>> let me know.
>
> Thanks for taking this. But just one check, i think i need to separate
> out the Documentation
> to a separate patch even before this driver patch. Isn't it ?
no.. that's alright.
Thanks
Kishon
>
>>
>> Thanks
>> Kishon
>>
>>> ---
>>>
>>> Changes since v2:
>>> - Using 'EXYNOS5_PHY_ENABLE' macro instead of 'EXYNOS_DPTX_PHY_ENABLE'
>>> since that's available with us in "linux/mfd/syscon/exynos5-pmu.h" file.
>>>
>>> Changes since v1:
>>> - state->regs should have been "struct regmap *" instead of
>>> "void __iomem *". So corrected the same.
>>>
>>> .../devicetree/bindings/phy/samsung-phy.txt | 7 +-
>>> drivers/phy/phy-exynos-dp-video.c | 79 +++++++++++++-------
>>> 2 files changed, 59 insertions(+), 27 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/phy/samsung-phy.txt b/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> index 7a6feea..15e0f2c 100644
>>> --- a/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> +++ b/Documentation/devicetree/bindings/phy/samsung-phy.txt
>>> @@ -17,8 +17,11 @@ 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;
>>> +- compatible : should be one of the following supported values:
>>> + - "samsung,exynos5250-dp-video-phy"
>>> + - "samsung,exynos5420-dp-video-phy"
>>> +- samsung,pmu-syscon: phandle for PMU system controller interface, used to
>>> + control pmu registers for power isolation.
>>> - #phy-cells : from the generic PHY bindings, must be 0;
>>>
>>> Samsung S5P/EXYNOS SoC series USB PHY
>>> diff --git a/drivers/phy/phy-exynos-dp-video.c b/drivers/phy/phy-exynos-dp-video.c
>>> index 8b3026e..53f44a0 100644
>>> --- a/drivers/phy/phy-exynos-dp-video.c
>>> +++ b/drivers/phy/phy-exynos-dp-video.c
>>> @@ -13,44 +13,55 @@
>>> #include <linux/io.h>
>>> #include <linux/kernel.h>
>>> #include <linux/module.h>
>>> +#include <linux/mfd/syscon.h>
>>> +#include <linux/mfd/syscon/exynos5-pmu.h>
>>> #include <linux/of.h>
>>> #include <linux/of_address.h>
>>> #include <linux/phy/phy.h>
>>> #include <linux/platform_device.h>
>>> +#include <linux/regmap.h>
>>>
>>> -/* DPTX_PHY_CONTROL register */
>>> -#define EXYNOS_DPTX_PHY_ENABLE (1 << 0)
>>> +struct exynos_dp_video_phy_drvdata {
>>> + u32 phy_ctrl_offset;
>>> +};
>>>
>>> struct exynos_dp_video_phy {
>>> - void __iomem *regs;
>>> + struct regmap *regs;
>>> + const struct exynos_dp_video_phy_drvdata *drvdata;
>>> };
>>>
>>> -static int __set_phy_state(struct exynos_dp_video_phy *state, unsigned int on)
>>> +static void exynos_dp_video_phy_pwr_isol(struct exynos_dp_video_phy *state,
>>> + unsigned int on)
>>> {
>>> - u32 reg;
>>> + unsigned int val;
>>> +
>>> + if (IS_ERR(state->regs))
>>> + return;
>>>
>>> - reg = readl(state->regs);
>>> - if (on)
>>> - reg |= EXYNOS_DPTX_PHY_ENABLE;
>>> - else
>>> - reg &= ~EXYNOS_DPTX_PHY_ENABLE;
>>> - writel(reg, state->regs);
>>> + val = on ? 0 : EXYNOS5_PHY_ENABLE;
>>>
>>> - return 0;
>>> + regmap_update_bits(state->regs, state->drvdata->phy_ctrl_offset,
>>> + EXYNOS5_PHY_ENABLE, val);
>>> }
>>>
>>> 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);
>>> + /* Disable power isolation on DP-PHY */
>>> + exynos_dp_video_phy_pwr_isol(state, 0);
>>> +
>>> + return 0;
>>> }
>>>
>>> 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);
>>> + /* Enable power isolation on DP-PHY */
>>> + exynos_dp_video_phy_pwr_isol(state, 1);
>>> +
>>> + return 0;
>>> }
>>>
>>> static struct phy_ops exynos_dp_video_phy_ops = {
>>> @@ -59,11 +70,31 @@ static struct phy_ops exynos_dp_video_phy_ops = {
>>> .owner = THIS_MODULE,
>>> };
>>>
>>> +static const struct exynos_dp_video_phy_drvdata exynos5250_dp_video_phy = {
>>> + .phy_ctrl_offset = EXYNOS5_DPTX_PHY_CONTROL,
>>> +};
>>> +
>>> +static const struct exynos_dp_video_phy_drvdata exynos5420_dp_video_phy = {
>>> + .phy_ctrl_offset = EXYNOS5420_DPTX_PHY_CONTROL,
>>> +};
>>> +
>>> +static const struct of_device_id exynos_dp_video_phy_of_match[] = {
>>> + {
>>> + .compatible = "samsung,exynos5250-dp-video-phy",
>>> + .data = &exynos5250_dp_video_phy,
>>> + }, {
>>> + .compatible = "samsung,exynos5420-dp-video-phy",
>>> + .data = &exynos5420_dp_video_phy,
>>> + },
>>> + { },
>>> +};
>>> +MODULE_DEVICE_TABLE(of, exynos_dp_video_phy_of_match);
>>> +
>>> 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;
>>> + const struct of_device_id *match;
>>> struct phy_provider *phy_provider;
>>> struct phy *phy;
>>>
>>> @@ -71,11 +102,15 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
>>> if (!state)
>>> return -ENOMEM;
>>>
>>> - res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>> -
>>> - state->regs = devm_ioremap_resource(dev, res);
>>> - if (IS_ERR(state->regs))
>>> + state->regs = syscon_regmap_lookup_by_phandle(dev->of_node,
>>> + "samsung,pmu-syscon");
>>> + if (IS_ERR(state->regs)) {
>>> + dev_err(dev, "Failed to lookup PMU regmap\n");
>>> return PTR_ERR(state->regs);
>>> + }
>>> +
>>> + match = of_match_node(exynos_dp_video_phy_of_match, dev->of_node);
>>> + state->drvdata = match->data;
>>>
>>> phy = devm_phy_create(dev, NULL, &exynos_dp_video_phy_ops, NULL);
>>> if (IS_ERR(phy)) {
>>> @@ -89,12 +124,6 @@ static int exynos_dp_video_phy_probe(struct platform_device *pdev)
>>> return PTR_ERR_OR_ZERO(phy_provider);
>>> }
>>>
>>> -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 = {
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
>
next prev parent reply other threads:[~2014-09-18 5:51 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-16 4:06 [PATCH v2 1/3] phy: exynos-dp-video: Use syscon support to control pmu register Vivek Gautam
2014-09-16 4:06 ` Vivek Gautam
[not found] ` <1410840408-19954-1-git-send-email-gautam.vivek-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2014-09-16 5:02 ` [PATCH v3 " Vivek Gautam
2014-09-16 5:02 ` Vivek Gautam
2014-09-17 16:54 ` Kishon Vijay Abraham I
2014-09-17 16:54 ` Kishon Vijay Abraham I
2014-09-18 3:25 ` Vivek Gautam
2014-09-18 5:51 ` Kishon Vijay Abraham I [this message]
2014-09-18 5:51 ` Kishon Vijay Abraham I
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=541A72E5.4000809@ti.com \
--to=kishon@ti.com \
--cc=ajaykumar.rs@samsung.com \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=gautam.vivek@samsung.com \
--cc=inki.dae@samsung.com \
--cc=jg1.han@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=seanpaul@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.