lkml.org 
[lkml]   [2014]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 05/10] ARM: exynos: Move to generic power domain bindings
    Date
    This patch moves Exynos power domain code to use the new generic power
    domain look-up framework introduced by previous patch, allowing the new
    code to be compiled with CONFIG_ARCH_EXYNOS selected as well.

    Signed-off-by: Tomasz Figa <tomasz.figa@gmail.com>
    ---
    .../bindings/arm/exynos/power_domain.txt | 12 ++--
    arch/arm/mach-exynos/pm_domains.c | 80 +---------------------
    kernel/power/Kconfig | 2 +-
    3 files changed, 7 insertions(+), 87 deletions(-)

    diff --git a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
    index 5216b41..60f26a8 100644
    --- a/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
    +++ b/Documentation/devicetree/bindings/arm/exynos/power_domain.txt
    @@ -8,6 +8,8 @@ Required Properties:
    * samsung,exynos4210-pd - for exynos4210 type power domain.
    - reg: physical base address of the controller and length of memory mapped
    region.
    +- #power-domain-cells: number of cells in power domain specifier;
    + must be 0.

    Node of a device using power domains must have a samsung,power-domain property
    defined with a phandle to respective power domain.
    @@ -17,12 +19,8 @@ Example:
    lcd0: power-domain-lcd0 {
    compatible = "samsung,exynos4210-pd";
    reg = <0x10023C00 0x10>;
    + #power-domain-cells = <0>;
    };

    -Example of the node using power domain:
    -
    - node {
    - /* ... */
    - samsung,power-domain = <&lcd0>;
    - /* ... */
    - };
    +See Documentation/devicetree/bindings/power/power_domain.txt for description
    +of consumer-side bindings.
    diff --git a/arch/arm/mach-exynos/pm_domains.c b/arch/arm/mach-exynos/pm_domains.c
    index 1703593..eba90a1 100644
    --- a/arch/arm/mach-exynos/pm_domains.c
    +++ b/arch/arm/mach-exynos/pm_domains.c
    @@ -74,78 +74,6 @@ static int exynos_pd_power_off(struct generic_pm_domain *domain)
    return exynos_pd_power(domain, false);
    }

    -static void exynos_add_device_to_domain(struct exynos_pm_domain *pd,
    - struct device *dev)
    -{
    - int ret;
    -
    - dev_dbg(dev, "adding to power domain %s\n", pd->pd.name);
    -
    - while (1) {
    - ret = pm_genpd_add_device(&pd->pd, dev);
    - if (ret != -EAGAIN)
    - break;
    - cond_resched();
    - }
    -
    - pm_genpd_dev_need_restore(dev, true);
    -}
    -
    -static void exynos_remove_device_from_domain(struct device *dev)
    -{
    - struct generic_pm_domain *genpd = dev_to_genpd(dev);
    - int ret;
    -
    - dev_dbg(dev, "removing from power domain %s\n", genpd->name);
    -
    - while (1) {
    - ret = pm_genpd_remove_device(genpd, dev);
    - if (ret != -EAGAIN)
    - break;
    - cond_resched();
    - }
    -}
    -
    -static void exynos_read_domain_from_dt(struct device *dev)
    -{
    - struct platform_device *pd_pdev;
    - struct exynos_pm_domain *pd;
    - struct device_node *node;
    -
    - node = of_parse_phandle(dev->of_node, "samsung,power-domain", 0);
    - if (!node)
    - return;
    - pd_pdev = of_find_device_by_node(node);
    - if (!pd_pdev)
    - return;
    - pd = platform_get_drvdata(pd_pdev);
    - exynos_add_device_to_domain(pd, dev);
    -}
    -
    -static int exynos_pm_notifier_call(struct notifier_block *nb,
    - unsigned long event, void *data)
    -{
    - struct device *dev = data;
    -
    - switch (event) {
    - case BUS_NOTIFY_BIND_DRIVER:
    - if (dev->of_node)
    - exynos_read_domain_from_dt(dev);
    -
    - break;
    -
    - case BUS_NOTIFY_UNBOUND_DRIVER:
    - exynos_remove_device_from_domain(dev);
    -
    - break;
    - }
    - return NOTIFY_DONE;
    -}
    -
    -static struct notifier_block platform_nb = {
    - .notifier_call = exynos_pm_notifier_call,
    -};
    -
    static __init int exynos4_pm_init_power_domain(void)
    {
    struct platform_device *pdev;
    @@ -155,8 +83,6 @@ static __init int exynos4_pm_init_power_domain(void)
    struct exynos_pm_domain *pd;
    int on;

    - pdev = of_find_device_by_node(np);
    -
    pd = kzalloc(sizeof(*pd), GFP_KERNEL);
    if (!pd) {
    pr_err("%s: failed to allocate memory for domain\n",
    @@ -169,17 +95,13 @@ static __init int exynos4_pm_init_power_domain(void)
    pd->base = of_iomap(np, 0);
    pd->pd.power_off = exynos_pd_power_off;
    pd->pd.power_on = exynos_pd_power_on;
    - pd->pd.of_node = np;
    -
    - platform_set_drvdata(pdev, pd);

    on = __raw_readl(pd->base + 0x4) & S5P_INT_LOCAL_PWR_EN;

    pm_genpd_init(&pd->pd, NULL, !on);
    + of_genpd_add_provider(np, of_genpd_xlate_simple, &pd->pd);
    }

    - bus_register_notifier(&platform_bus_type, &platform_nb);
    -
    return 0;
    }
    arch_initcall(exynos4_pm_init_power_domain);
    diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig
    index 45aa98e..b17588c 100644
    --- a/kernel/power/Kconfig
    +++ b/kernel/power/Kconfig
    @@ -308,7 +308,7 @@ config PM_GENERIC_DOMAINS_RUNTIME

    config PM_GENERIC_DOMAINS_OF
    def_bool y
    - depends on PM_GENERIC_DOMAINS && OF && !ARCH_EXYNOS
    + depends on PM_GENERIC_DOMAINS && OF

    config CPU_PM
    bool
    --
    1.8.5.2


    \
     
     \ /
      Last update: 2014-01-11 21:21    [W:4.254 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site