-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: OMAP AM33xx: clockdomains: Add clockdomain data and respective o…
…perations AM33XX PRCM module consists of various clockdomains, in all total we have 18 clockdomains available, with following controlling options, - SW Sleep: sw forced sleep transition - SW Wakeup: sw forced wakeup transition This patch adds all available clockdomain data, respective clockdomain operations for AM33XX family of device, and also integrates it into existing OMAP framework. Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com> Signed-off-by: Afzal Mohammed <afzal@ti.com> Signed-off-by: Vaibhav Bedia <vaibhav.bedia@ti.com> Cc: Kevin Hilman <khilman@ti.com> Cc: Rajendra Nayak <rnayak@ti.com> CC: Tony Lindgren <tony@atomide.com> Cc: Paul Walmsley <paul@pwsan.com> Cc: Benoit Cousson <b-cousson@ti.com> [paul@pwsan.com: removed CLKDM_NO_AUTODEPS from clockdomain flags, removed unnecessary .clktrctrl_offs field; updated for 3.5] Signed-off-by: Paul Walmsley <paul@pwsan.com>
- Loading branch information
Vaibhav Hiremath
authored and
Paul Walmsley
committed
Jun 18, 2012
1 parent
3f0ea76
commit 9c80f3a
Showing
5 changed files
with
275 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
/* | ||
* AM33XX clockdomain control | ||
* | ||
* Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ | ||
* Vaibhav Hiremath <hvaibhav@ti.com> | ||
* | ||
* Derived from mach-omap2/clockdomain44xx.c written by Rajendra Nayak | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation version 2. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
|
||
#include "clockdomain.h" | ||
#include "cm33xx.h" | ||
|
||
|
||
static int am33xx_clkdm_sleep(struct clockdomain *clkdm) | ||
{ | ||
am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs); | ||
return 0; | ||
} | ||
|
||
static int am33xx_clkdm_wakeup(struct clockdomain *clkdm) | ||
{ | ||
am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
return 0; | ||
} | ||
|
||
static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm) | ||
{ | ||
am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
} | ||
|
||
static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm) | ||
{ | ||
am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
} | ||
|
||
static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm) | ||
{ | ||
if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | ||
return am33xx_clkdm_wakeup(clkdm); | ||
|
||
return 0; | ||
} | ||
|
||
static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm) | ||
{ | ||
bool hwsup = false; | ||
|
||
hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs); | ||
|
||
if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) | ||
am33xx_clkdm_sleep(clkdm); | ||
|
||
return 0; | ||
} | ||
|
||
struct clkdm_ops am33xx_clkdm_operations = { | ||
.clkdm_sleep = am33xx_clkdm_sleep, | ||
.clkdm_wakeup = am33xx_clkdm_wakeup, | ||
.clkdm_allow_idle = am33xx_clkdm_allow_idle, | ||
.clkdm_deny_idle = am33xx_clkdm_deny_idle, | ||
.clkdm_clk_enable = am33xx_clkdm_clk_enable, | ||
.clkdm_clk_disable = am33xx_clkdm_clk_disable, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,196 @@ | ||
/* | ||
* AM33XX Clock Domain data. | ||
* | ||
* Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/ | ||
* Vaibhav Hiremath <hvaibhav@ti.com> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation version 2. | ||
* | ||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
* kind, whether express or implied; without even the implied warranty | ||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
*/ | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/io.h> | ||
|
||
#include "clockdomain.h" | ||
#include "cm.h" | ||
#include "cm33xx.h" | ||
#include "cm-regbits-33xx.h" | ||
|
||
static struct clockdomain l4ls_am33xx_clkdm = { | ||
.name = "l4ls_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_L4LS_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l3s_am33xx_clkdm = { | ||
.name = "l3s_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_L3S_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4fw_am33xx_clkdm = { | ||
.name = "l4fw_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_L4FW_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l3_am33xx_clkdm = { | ||
.name = "l3_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_L3_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4hs_am33xx_clkdm = { | ||
.name = "l4hs_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_L4HS_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain ocpwp_l3_am33xx_clkdm = { | ||
.name = "ocpwp_l3_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_OCPWP_L3_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain pruss_ocp_am33xx_clkdm = { | ||
.name = "pruss_ocp_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_PRUSS_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain cpsw_125mhz_am33xx_clkdm = { | ||
.name = "cpsw_125mhz_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_CPSW_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain lcdc_am33xx_clkdm = { | ||
.name = "lcdc_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_LCDC_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain clk_24mhz_am33xx_clkdm = { | ||
.name = "clk_24mhz_clkdm", | ||
.pwrdm = { .name = "per_pwrdm" }, | ||
.cm_inst = AM33XX_CM_PER_MOD, | ||
.clkdm_offs = AM33XX_CM_PER_CLK_24MHZ_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4_wkup_am33xx_clkdm = { | ||
.name = "l4_wkup_clkdm", | ||
.pwrdm = { .name = "wkup_pwrdm" }, | ||
.cm_inst = AM33XX_CM_WKUP_MOD, | ||
.clkdm_offs = AM33XX_CM_WKUP_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l3_aon_am33xx_clkdm = { | ||
.name = "l3_aon_clkdm", | ||
.pwrdm = { .name = "wkup_pwrdm" }, | ||
.cm_inst = AM33XX_CM_WKUP_MOD, | ||
.clkdm_offs = AM33XX_CM_L3_AON_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4_wkup_aon_am33xx_clkdm = { | ||
.name = "l4_wkup_aon_clkdm", | ||
.pwrdm = { .name = "wkup_pwrdm" }, | ||
.cm_inst = AM33XX_CM_WKUP_MOD, | ||
.clkdm_offs = AM33XX_CM_L4_WKUP_AON_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain mpu_am33xx_clkdm = { | ||
.name = "mpu_clkdm", | ||
.pwrdm = { .name = "mpu_pwrdm" }, | ||
.cm_inst = AM33XX_CM_MPU_MOD, | ||
.clkdm_offs = AM33XX_CM_MPU_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4_rtc_am33xx_clkdm = { | ||
.name = "l4_rtc_clkdm", | ||
.pwrdm = { .name = "rtc_pwrdm" }, | ||
.cm_inst = AM33XX_CM_RTC_MOD, | ||
.clkdm_offs = AM33XX_CM_RTC_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain gfx_l3_am33xx_clkdm = { | ||
.name = "gfx_l3_clkdm", | ||
.pwrdm = { .name = "gfx_pwrdm" }, | ||
.cm_inst = AM33XX_CM_GFX_MOD, | ||
.clkdm_offs = AM33XX_CM_GFX_L3_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain gfx_l4ls_gfx_am33xx_clkdm = { | ||
.name = "gfx_l4ls_gfx_clkdm", | ||
.pwrdm = { .name = "gfx_pwrdm" }, | ||
.cm_inst = AM33XX_CM_GFX_MOD, | ||
.clkdm_offs = AM33XX_CM_GFX_L4LS_GFX_CLKSTCTRL__1_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain l4_cefuse_am33xx_clkdm = { | ||
.name = "l4_cefuse_clkdm", | ||
.pwrdm = { .name = "cefuse_pwrdm" }, | ||
.cm_inst = AM33XX_CM_CEFUSE_MOD, | ||
.clkdm_offs = AM33XX_CM_CEFUSE_CLKSTCTRL_OFFSET, | ||
.flags = CLKDM_CAN_SWSUP, | ||
}; | ||
|
||
static struct clockdomain *clockdomains_am33xx[] __initdata = { | ||
&l4ls_am33xx_clkdm, | ||
&l3s_am33xx_clkdm, | ||
&l4fw_am33xx_clkdm, | ||
&l3_am33xx_clkdm, | ||
&l4hs_am33xx_clkdm, | ||
&ocpwp_l3_am33xx_clkdm, | ||
&pruss_ocp_am33xx_clkdm, | ||
&cpsw_125mhz_am33xx_clkdm, | ||
&lcdc_am33xx_clkdm, | ||
&clk_24mhz_am33xx_clkdm, | ||
&l4_wkup_am33xx_clkdm, | ||
&l3_aon_am33xx_clkdm, | ||
&l4_wkup_aon_am33xx_clkdm, | ||
&mpu_am33xx_clkdm, | ||
&l4_rtc_am33xx_clkdm, | ||
&gfx_l3_am33xx_clkdm, | ||
&gfx_l4ls_gfx_am33xx_clkdm, | ||
&l4_cefuse_am33xx_clkdm, | ||
NULL, | ||
}; | ||
|
||
void __init am33xx_clockdomains_init(void) | ||
{ | ||
clkdm_register_platform_funcs(&am33xx_clkdm_operations); | ||
clkdm_register_clkdms(clockdomains_am33xx); | ||
clkdm_complete_init(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters