Skip to content

Commit

Permalink
ARM: keystone: add PM domain support for clock management
Browse files Browse the repository at this point in the history
Add runtime PM core support to Keystone SOCs by using the pm_clk
infrastructure of the PM core. Patch is based on Kevin's pm_domain
work on DaVinci SOCs.

Keystone SOC doesn't have depedency to enable clocks in early
in the boot and hence the clock and PM domain initialisation is done
at subsys_init() level.

Cc: Kevin Hilman <khilman@linaro.org>

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
  • Loading branch information
Santosh Shilimkar committed Oct 10, 2013
1 parent 4a19aad commit fc20ffe
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 0 deletions.
3 changes: 3 additions & 0 deletions arch/arm/mach-keystone/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@ plus_sec := $(call as-instr,.arch_extension sec,+sec)
AFLAGS_smc.o :=-Wa,-march=armv7-a$(plus_sec)

obj-$(CONFIG_SMP) += platsmp.o

# PM domain driver for Keystone SOCs
obj-$(CONFIG_ARCH_KEYSTONE) += pm_domain.o
70 changes: 70 additions & 0 deletions arch/arm/mach-keystone/pm_domain.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* PM domain driver for Keystone2 devices
*
* Copyright 2013 Texas Instruments, Inc.
* Santosh Shilimkar <santosh.shillimkar@ti.com>
*
* Based on Kevins work on DAVINCI SOCs
* Kevin Hilman <khilman@linaro.org>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*/

#include <linux/init.h>
#include <linux/pm_runtime.h>
#include <linux/pm_clock.h>
#include <linux/platform_device.h>
#include <linux/clk-provider.h>

#ifdef CONFIG_PM_RUNTIME
static int keystone_pm_runtime_suspend(struct device *dev)
{
int ret;

dev_dbg(dev, "%s\n", __func__);

ret = pm_generic_runtime_suspend(dev);
if (ret)
return ret;

ret = pm_clk_suspend(dev);
if (ret) {
pm_generic_runtime_resume(dev);
return ret;
}

return 0;
}

static int keystone_pm_runtime_resume(struct device *dev)
{
dev_dbg(dev, "%s\n", __func__);

pm_clk_resume(dev);

return pm_generic_runtime_resume(dev);
}
#endif

static struct dev_pm_domain keystone_pm_domain = {
.ops = {
SET_RUNTIME_PM_OPS(keystone_pm_runtime_suspend,
keystone_pm_runtime_resume, NULL)
USE_PLATFORM_PM_SLEEP_OPS
},
};

static struct pm_clk_notifier_block platform_domain_notifier = {
.pm_domain = &keystone_pm_domain,
};

int __init keystone_pm_runtime_init(void)
{
of_clk_init(NULL);
pm_clk_add_notifier(&platform_bus_type, &platform_domain_notifier);

return 0;
}
subsys_initcall(keystone_pm_runtime_init);

0 comments on commit fc20ffe

Please sign in to comment.