171348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley/* 24bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * OMAP3xxx CM module functions 371348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * 471348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * Copyright (C) 2009 Nokia Corporation 54bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * Copyright (C) 2008-2010, 2012 Texas Instruments, Inc. 671348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * Paul Walmsley 74bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * Rajendra Nayak <rnayak@ti.com> 871348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * 971348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * This program is free software; you can redistribute it and/or modify 1071348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * it under the terms of the GNU General Public License version 2 as 1171348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * published by the Free Software Foundation. 1271348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley */ 1371348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 1471348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/kernel.h> 1571348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/types.h> 1671348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/delay.h> 1771348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/errno.h> 1871348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/err.h> 1971348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include <linux/io.h> 2071348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 214bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley#include "prm2xxx_3xxx.h" 2271348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include "cm.h" 23ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm3xxx.h" 2471348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley#include "cm-regbits-34xx.h" 254bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley#include "clockdomain.h" 2671348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 27ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleystatic const u8 omap3xxx_cm_idlest_offs[] = { 28ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3 2971348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley}; 3071348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 3155ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley/* 3255ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley * 3355ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley */ 3455ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 3555ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsleystatic void _write_clktrctrl(u8 c, s16 module, u32 mask) 3655ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 3755ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley u32 v; 3855ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 3955ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v = omap2_cm_read_mod_reg(module, OMAP2_CM_CLKSTCTRL); 4055ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v &= ~mask; 4155ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v |= c << __ffs(mask); 4255ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley omap2_cm_write_mod_reg(v, module, OMAP2_CM_CLKSTCTRL); 4355ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 4455ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 45ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleybool omap3xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask) 4655ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 4755ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley u32 v; 4855ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 4955ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v = omap2_cm_read_mod_reg(module, OMAP2_CM_CLKSTCTRL); 5055ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v &= mask; 5155ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley v >>= __ffs(mask); 5255ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 53ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley return (v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ? 1 : 0; 5455ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 5555ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 5655ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsleyvoid omap3xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask) 5755ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 5855ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley _write_clktrctrl(OMAP34XX_CLKSTCTRL_ENABLE_AUTO, module, mask); 5955ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 6055ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 6155ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsleyvoid omap3xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask) 6255ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 6355ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley _write_clktrctrl(OMAP34XX_CLKSTCTRL_DISABLE_AUTO, module, mask); 6455ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 6555ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 6655ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsleyvoid omap3xxx_cm_clkdm_force_sleep(s16 module, u32 mask) 6755ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 6855ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley _write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_SLEEP, module, mask); 6955ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 7055ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 7155ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsleyvoid omap3xxx_cm_clkdm_force_wakeup(s16 module, u32 mask) 7255ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley{ 7355ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley _write_clktrctrl(OMAP34XX_CLKSTCTRL_FORCE_WAKEUP, module, mask); 7455ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley} 7555ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 760fd0c21be71293d8a54d9075b18b5a25a1868057Paul Walmsley/* 7755ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley * 7855ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley */ 7955ae35073b1c76f24c3736cf797c40d9932b19aaPaul Walmsley 8071348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley/** 81ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * omap3xxx_cm_wait_module_ready - wait for a module to leave idle or standby 8271348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * @prcm_mod: PRCM module offset 8371348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3) 8471348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * @idlest_shift: shift of the bit in the CM_IDLEST* register to check 8571348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley * 86ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * Wait for the PRCM to indicate that the module identified by 87ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * (@prcm_mod, @idlest_id, @idlest_shift) is clocked. Return 0 upon 88ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * success or -EBUSY if the module doesn't enable in time. 8971348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley */ 90ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyint omap3xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) 9171348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley{ 9271348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley int ena = 0, i = 0; 9371348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley u8 cm_idlest_reg; 9471348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley u32 mask; 9571348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 96ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley if (!idlest_id || (idlest_id > ARRAY_SIZE(omap3xxx_cm_idlest_offs))) 9771348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley return -EINVAL; 9871348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 99ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley cm_idlest_reg = omap3xxx_cm_idlest_offs[idlest_id - 1]; 10071348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 1016405616754f70a11c5410b321495fcd61e70b240Kevin Hilman mask = 1 << idlest_shift; 102ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley ena = 0; 1036405616754f70a11c5410b321495fcd61e70b240Kevin Hilman 104ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley omap_test_timeout(((omap2_cm_read_mod_reg(prcm_mod, cm_idlest_reg) & 105ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley mask) == ena), MAX_MODULE_READY_TIME, i); 10671348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 10771348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; 10871348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley} 10971348bcaac6f4c372525d4d62e88a82a7330435bPaul Walmsley 110c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley/** 111c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * omap3xxx_cm_split_idlest_reg - split CM_IDLEST reg addr into its components 112c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @idlest_reg: CM_IDLEST* virtual address 113c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @prcm_inst: pointer to an s16 to return the PRCM instance offset 114c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @idlest_reg_id: pointer to a u8 to return the CM_IDLESTx register ID 115c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * 116c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * XXX This function is only needed until absolute register addresses are 117c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * removed from the OMAP struct clk records. 118c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley */ 119c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleyint omap3xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst, 120c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley u8 *idlest_reg_id) 121c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{ 122c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley unsigned long offs; 123c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley u8 idlest_offs; 124c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley int i; 125c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 126c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley if (idlest_reg < (cm_base + OMAP3430_IVA2_MOD) || 127c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley idlest_reg > (cm_base + 0x1ffff)) 128c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley return -EINVAL; 129c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 130c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley idlest_offs = (unsigned long)idlest_reg & 0xff; 131c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley for (i = 0; i < ARRAY_SIZE(omap3xxx_cm_idlest_offs); i++) { 132c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley if (idlest_offs == omap3xxx_cm_idlest_offs[i]) { 133c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley *idlest_reg_id = i + 1; 134c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley break; 135c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley } 136c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley } 137c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 138c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley if (i == ARRAY_SIZE(omap3xxx_cm_idlest_offs)) 139c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley return -EINVAL; 140c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 141c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley offs = idlest_reg - cm_base; 142c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley offs &= 0xff00; 143c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley *prcm_inst = offs; 144c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 145c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley return 0; 146c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley} 147c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 1484bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley/* Clockdomain low-level operations */ 1494bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1504bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_add_sleepdep(struct clockdomain *clkdm1, 1514bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley struct clockdomain *clkdm2) 1524bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 1534bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap2_cm_set_mod_reg_bits((1 << clkdm2->dep_bit), 1544bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm1->pwrdm.ptr->prcm_offs, 1554bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley OMAP3430_CM_SLEEPDEP); 1564bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 1574bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 1584bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1594bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_del_sleepdep(struct clockdomain *clkdm1, 1604bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley struct clockdomain *clkdm2) 1614bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 1624bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap2_cm_clear_mod_reg_bits((1 << clkdm2->dep_bit), 1634bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm1->pwrdm.ptr->prcm_offs, 1644bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley OMAP3430_CM_SLEEPDEP); 1654bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 1664bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 1674bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1684bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_read_sleepdep(struct clockdomain *clkdm1, 1694bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley struct clockdomain *clkdm2) 1704bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 1714bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return omap2_cm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, 1724bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley OMAP3430_CM_SLEEPDEP, 1734bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley (1 << clkdm2->dep_bit)); 1744bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 1754bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1764bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) 1774bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 1784bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley struct clkdm_dep *cd; 1794bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley u32 mask = 0; 1804bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1814bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley for (cd = clkdm->sleepdep_srcs; cd && cd->clkdm_name; cd++) { 1824bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (!cd->clkdm) 1834bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley continue; /* only happens if data is erroneous */ 1844bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1854bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley mask |= 1 << cd->clkdm->dep_bit; 18692493870196f52c743330db7b545b54b2abfda82Paul Walmsley cd->sleepdep_usecount = 0; 1874bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } 1884bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap2_cm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, 1894bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley OMAP3430_CM_SLEEPDEP); 1904bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 1914bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 1924bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 1934bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_sleep(struct clockdomain *clkdm) 1944bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 1954bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_force_sleep(clkdm->pwrdm.ptr->prcm_offs, 1964bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 1974bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 1984bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 1994bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2004bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_wakeup(struct clockdomain *clkdm) 2014bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 2024bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_force_wakeup(clkdm->pwrdm.ptr->prcm_offs, 2034bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2044bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2054bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 2064bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2074bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm) 2084bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 20992493870196f52c743330db7b545b54b2abfda82Paul Walmsley if (clkdm->usecount > 0) 21065958fb6ca7b7e504caf852e492fe554224de1baPaul Walmsley clkdm_add_autodeps(clkdm); 2114bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2124bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2134bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2144bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 2154bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2164bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic void omap3xxx_clkdm_deny_idle(struct clockdomain *clkdm) 2174bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 2184bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2194bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2204bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 22192493870196f52c743330db7b545b54b2abfda82Paul Walmsley if (clkdm->usecount > 0) 22265958fb6ca7b7e504caf852e492fe554224de1baPaul Walmsley clkdm_del_autodeps(clkdm); 2234bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 2244bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2254bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) 2264bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 2274bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley bool hwsup = false; 2284bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2294bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (!clkdm->clktrctrl_mask) 2304bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2314bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2324bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley /* 2334bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * The CLKDM_MISSING_IDLE_REPORTING flag documentation has 2344bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * more details on the unpleasant problem this is working 2354bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * around 2364bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley */ 2374bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if ((clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) && 2384bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) { 2394bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_clkdm_wakeup(clkdm); 2404bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2414bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } 2424bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2434bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley hwsup = omap3xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2444bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2454bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2464bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (hwsup) { 2474bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley /* Disable HW transitions when we are changing deps */ 2484bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2494bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 25065958fb6ca7b7e504caf852e492fe554224de1baPaul Walmsley clkdm_add_autodeps(clkdm); 2514bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2524bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2534bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } else { 2544bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) 2554bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_clkdm_wakeup(clkdm); 2564bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } 2574bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2584bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2594bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 2604bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2614bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap3xxx_clkdm_clk_disable(struct clockdomain *clkdm) 2624bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{ 2634bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley bool hwsup = false; 2644bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2654bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (!clkdm->clktrctrl_mask) 2664bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2674bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2684bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley /* 2694bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * The CLKDM_MISSING_IDLE_REPORTING flag documentation has 2704bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * more details on the unpleasant problem this is working 2714bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * around 2724bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley */ 2734bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING && 2744bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley !(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) { 2754bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2764bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2774bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2784bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } 2794bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2804bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley hwsup = omap3xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2814bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2824bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2834bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (hwsup) { 2844bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley /* Disable HW transitions when we are changing deps */ 2854bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2864bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 28765958fb6ca7b7e504caf852e492fe554224de1baPaul Walmsley clkdm_del_autodeps(clkdm); 2884bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, 2894bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley clkdm->clktrctrl_mask); 2904bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } else { 2914bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP) 2924bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley omap3xxx_clkdm_sleep(clkdm); 2934bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley } 2944bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2954bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley return 0; 2964bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley} 2974bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 2984bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystruct clkdm_ops omap3_clkdm_operations = { 2994bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_add_wkdep = omap2_clkdm_add_wkdep, 3004bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_del_wkdep = omap2_clkdm_del_wkdep, 3014bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_read_wkdep = omap2_clkdm_read_wkdep, 3024bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps, 3034bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_add_sleepdep = omap3xxx_clkdm_add_sleepdep, 3044bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_del_sleepdep = omap3xxx_clkdm_del_sleepdep, 3054bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_read_sleepdep = omap3xxx_clkdm_read_sleepdep, 3064bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_clear_all_sleepdeps = omap3xxx_clkdm_clear_all_sleepdeps, 3074bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_sleep = omap3xxx_clkdm_sleep, 3084bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_wakeup = omap3xxx_clkdm_wakeup, 3094bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_allow_idle = omap3xxx_clkdm_allow_idle, 3104bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_deny_idle = omap3xxx_clkdm_deny_idle, 3114bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_clk_enable = omap3xxx_clkdm_clk_enable, 3124bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley .clkdm_clk_disable = omap3xxx_clkdm_clk_disable, 3134bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley}; 3144bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley 315f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley/* 316f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley * Context save/restore code - OMAP3 only 317f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley */ 318f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsleystruct omap3_cm_regs { 319f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_clksel1; 320f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_clksel2; 321f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cm_sysconfig; 322f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 sgx_cm_clksel; 323f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_clksel; 324f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_clksel; 325f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_clksel; 326f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 emu_cm_clksel; 327f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 emu_cm_clkstctrl; 328a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin u32 pll_cm_autoidle; 329f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 pll_cm_autoidle2; 330f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 pll_cm_clksel4; 331f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 pll_cm_clksel5; 332f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 pll_cm_clken2; 333f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cm_polctrl; 334f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_fclken; 335f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_clken_pll; 336f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_fclken1; 337f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_fclken3; 338f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 sgx_cm_fclken; 339f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 wkup_cm_fclken; 340f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_fclken; 341f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_fclken; 342f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_fclken; 343f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 usbhost_cm_fclken; 344f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_iclken1; 345f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_iclken2; 346f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_iclken3; 347f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 sgx_cm_iclken; 348f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 wkup_cm_iclken; 349f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_iclken; 350f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_iclken; 351f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_iclken; 352f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 usbhost_cm_iclken; 353f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_autoidle2; 354f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 mpu_cm_autoidle2; 355f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 iva2_cm_clkstctrl; 356f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 mpu_cm_clkstctrl; 357f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_clkstctrl; 358f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 sgx_cm_clkstctrl; 359f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_clkstctrl; 360f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_clkstctrl; 361f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_clkstctrl; 362f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 neon_cm_clkstctrl; 363f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 usbhost_cm_clkstctrl; 364f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_autoidle1; 365f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_autoidle2; 366f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 core_cm_autoidle3; 367f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 wkup_cm_autoidle; 368f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_autoidle; 369f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_autoidle; 370f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_autoidle; 371f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 usbhost_cm_autoidle; 372f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 sgx_cm_sleepdep; 373f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 dss_cm_sleepdep; 374f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cam_cm_sleepdep; 375f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 per_cm_sleepdep; 376f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 usbhost_cm_sleepdep; 377f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley u32 cm_clkout_ctrl; 378f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley}; 379f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley 380f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsleystatic struct omap3_cm_regs cm_context; 381f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley 382f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsleyvoid omap3_cm_save_context(void) 383f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley{ 384f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.iva2_cm_clksel1 = 385c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL1); 386f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.iva2_cm_clksel2 = 387c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL2); 388b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo cm_context.cm_sysconfig = 389b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo omap2_cm_read_mod_reg(OCP_MOD, OMAP3430_CM_SYSCONFIG); 390f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.sgx_cm_clksel = 391c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL); 392f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_clksel = 393c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, CM_CLKSEL); 394f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_clksel = 395c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, CM_CLKSEL); 396f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_clksel = 397c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_CLKSEL); 398f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.emu_cm_clksel = 399c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, CM_CLKSEL1); 400f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.emu_cm_clkstctrl = 401c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, OMAP2_CM_CLKSTCTRL); 402a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin /* 403a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * As per erratum i671, ROM code does not respect the PER DPLL 404a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. 405a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * In this case, even though this register has been saved in 406a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * scratchpad contents, we need to restore AUTO_PERIPH_DPLL 407a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * by ourselves. So, we need to save it anyway. 408a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin */ 409a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin cm_context.pll_cm_autoidle = 410a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); 411f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.pll_cm_autoidle2 = 412c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE2); 413f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.pll_cm_clksel4 = 414c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL4); 415f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.pll_cm_clksel5 = 416c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5); 417f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.pll_cm_clken2 = 418c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2); 419b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo cm_context.cm_polctrl = 420b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo omap2_cm_read_mod_reg(OCP_MOD, OMAP3430_CM_POLCTRL); 421f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.iva2_cm_fclken = 422c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_FCLKEN); 423c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley cm_context.iva2_cm_clken_pll = 424c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL); 425f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_fclken1 = 426c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1); 427f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_fclken3 = 428c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3); 429f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.sgx_cm_fclken = 430c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_FCLKEN); 431f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.wkup_cm_fclken = 432c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(WKUP_MOD, CM_FCLKEN); 433f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_fclken = 434c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, CM_FCLKEN); 435f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_fclken = 436c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, CM_FCLKEN); 437f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_fclken = 438c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN); 439f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.usbhost_cm_fclken = 440c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN); 441f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_iclken1 = 442c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_ICLKEN1); 443f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_iclken2 = 444c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_ICLKEN2); 445f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_iclken3 = 446c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_ICLKEN3); 447f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.sgx_cm_iclken = 448c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_ICLKEN); 449f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.wkup_cm_iclken = 450c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(WKUP_MOD, CM_ICLKEN); 451f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_iclken = 452c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, CM_ICLKEN); 453f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_iclken = 454c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, CM_ICLKEN); 455f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_iclken = 456c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN); 457f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.usbhost_cm_iclken = 458c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN); 459f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.iva2_cm_autoidle2 = 460c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_AUTOIDLE2); 461f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.mpu_cm_autoidle2 = 462c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(MPU_MOD, CM_AUTOIDLE2); 463f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.iva2_cm_clkstctrl = 464c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL); 465f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.mpu_cm_clkstctrl = 466c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(MPU_MOD, OMAP2_CM_CLKSTCTRL); 467f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_clkstctrl = 468c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, OMAP2_CM_CLKSTCTRL); 469f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.sgx_cm_clkstctrl = 470c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, OMAP2_CM_CLKSTCTRL); 471f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_clkstctrl = 472c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, OMAP2_CM_CLKSTCTRL); 473f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_clkstctrl = 474c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, OMAP2_CM_CLKSTCTRL); 475f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_clkstctrl = 476c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, OMAP2_CM_CLKSTCTRL); 477f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.neon_cm_clkstctrl = 478c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_NEON_MOD, OMAP2_CM_CLKSTCTRL); 479f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.usbhost_cm_clkstctrl = 480c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, 481c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 482f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_autoidle1 = 483c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE1); 484f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_autoidle2 = 485c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE2); 486f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.core_cm_autoidle3 = 487c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE3); 488f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.wkup_cm_autoidle = 489c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(WKUP_MOD, CM_AUTOIDLE); 490f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_autoidle = 491c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, CM_AUTOIDLE); 492f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_autoidle = 493c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, CM_AUTOIDLE); 494f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_autoidle = 495c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE); 496f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.usbhost_cm_autoidle = 497c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_AUTOIDLE); 498f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.sgx_cm_sleepdep = 499c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_SGX_MOD, 500c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 501f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.dss_cm_sleepdep = 502c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_DSS_MOD, OMAP3430_CM_SLEEPDEP); 503f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cam_cm_sleepdep = 504c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CAM_MOD, OMAP3430_CM_SLEEPDEP); 505f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.per_cm_sleepdep = 506c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_PER_MOD, OMAP3430_CM_SLEEPDEP); 507f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.usbhost_cm_sleepdep = 508c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, 509c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 510f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley cm_context.cm_clkout_ctrl = 511c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_read_mod_reg(OMAP3430_CCR_MOD, 512c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3_CM_CLKOUT_CTRL_OFFSET); 513f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley} 514f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley 515f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsleyvoid omap3_cm_restore_context(void) 516f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley{ 517c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_clksel1, OMAP3430_IVA2_MOD, 518c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL1); 519c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_clksel2, OMAP3430_IVA2_MOD, 520c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL2); 521b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo omap2_cm_write_mod_reg(cm_context.cm_sysconfig, OCP_MOD, 522b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo OMAP3430_CM_SYSCONFIG); 523c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD, 524c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL); 525c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_clksel, OMAP3430_DSS_MOD, 526c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL); 527c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_clksel, OMAP3430_CAM_MOD, 528c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL); 529c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_clksel, OMAP3430_PER_MOD, 530c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL); 531c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.emu_cm_clksel, OMAP3430_EMU_MOD, 532c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_CLKSEL1); 533c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.emu_cm_clkstctrl, OMAP3430_EMU_MOD, 534c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 535a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin /* 536a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * As per erratum i671, ROM code does not respect the PER DPLL 537a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. 538a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin * In this case, we need to restore AUTO_PERIPH_DPLL by ourselves. 539a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin */ 540a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle, PLL_MOD, 541a8ae645c014bc01090367de84f7601ad11628971Eduardo Valentin CM_AUTOIDLE); 542c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle2, PLL_MOD, 543c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE2); 544c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.pll_cm_clksel4, PLL_MOD, 545c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_CM_CLKSEL4); 546c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.pll_cm_clksel5, PLL_MOD, 547c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_CM_CLKSEL5); 548c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.pll_cm_clken2, PLL_MOD, 549c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_CM_CLKEN2); 550b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo omap2_cm_write_mod_reg(cm_context.cm_polctrl, OCP_MOD, 551b21be7bcd8871014a5e446886ea7fb9ae9d6e591Tero Kristo OMAP3430_CM_POLCTRL); 552c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_fclken, OMAP3430_IVA2_MOD, 553c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN); 554c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_clken_pll, OMAP3430_IVA2_MOD, 555c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_CLKEN_PLL); 556c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_fclken1, CORE_MOD, 557c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN1); 558c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_fclken3, CORE_MOD, 559c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_CM_FCLKEN3); 560c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.sgx_cm_fclken, OMAP3430ES2_SGX_MOD, 561c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN); 562c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.wkup_cm_fclken, WKUP_MOD, CM_FCLKEN); 563c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_fclken, OMAP3430_DSS_MOD, 564c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN); 565c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_fclken, OMAP3430_CAM_MOD, 566c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN); 567c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_fclken, OMAP3430_PER_MOD, 568c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_FCLKEN); 569c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.usbhost_cm_fclken, 570c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_USBHOST_MOD, CM_FCLKEN); 571c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_iclken1, CORE_MOD, 572c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN1); 573c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_iclken2, CORE_MOD, 574c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN2); 575c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_iclken3, CORE_MOD, 576c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN3); 577c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.sgx_cm_iclken, OMAP3430ES2_SGX_MOD, 578c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN); 579c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.wkup_cm_iclken, WKUP_MOD, CM_ICLKEN); 580c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_iclken, OMAP3430_DSS_MOD, 581c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN); 582c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_iclken, OMAP3430_CAM_MOD, 583c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN); 584c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_iclken, OMAP3430_PER_MOD, 585c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_ICLKEN); 586c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.usbhost_cm_iclken, 587c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_USBHOST_MOD, CM_ICLKEN); 588c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_autoidle2, OMAP3430_IVA2_MOD, 589c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE2); 590c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.mpu_cm_autoidle2, MPU_MOD, 591c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE2); 592c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.iva2_cm_clkstctrl, OMAP3430_IVA2_MOD, 593c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 594c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.mpu_cm_clkstctrl, MPU_MOD, 595c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 596c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_clkstctrl, CORE_MOD, 597c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 598c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.sgx_cm_clkstctrl, OMAP3430ES2_SGX_MOD, 599c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 600c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_clkstctrl, OMAP3430_DSS_MOD, 601c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 602c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_clkstctrl, OMAP3430_CAM_MOD, 603c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 604c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_clkstctrl, OMAP3430_PER_MOD, 605c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 606c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.neon_cm_clkstctrl, OMAP3430_NEON_MOD, 607c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP2_CM_CLKSTCTRL); 608c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.usbhost_cm_clkstctrl, 609c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_USBHOST_MOD, OMAP2_CM_CLKSTCTRL); 610c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_autoidle1, CORE_MOD, 611c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE1); 612c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_autoidle2, CORE_MOD, 613c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE2); 614c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.core_cm_autoidle3, CORE_MOD, 615c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE3); 616c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.wkup_cm_autoidle, WKUP_MOD, 617c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE); 618c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_autoidle, OMAP3430_DSS_MOD, 619c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE); 620c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_autoidle, OMAP3430_CAM_MOD, 621c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE); 622c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_autoidle, OMAP3430_PER_MOD, 623c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley CM_AUTOIDLE); 624c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.usbhost_cm_autoidle, 625c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_USBHOST_MOD, CM_AUTOIDLE); 626c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.sgx_cm_sleepdep, OMAP3430ES2_SGX_MOD, 627c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 628c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.dss_cm_sleepdep, OMAP3430_DSS_MOD, 629c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 630c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cam_cm_sleepdep, OMAP3430_CAM_MOD, 631c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 632c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.per_cm_sleepdep, OMAP3430_PER_MOD, 633c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430_CM_SLEEPDEP); 634c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.usbhost_cm_sleepdep, 635c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3430ES2_USBHOST_MOD, OMAP3430_CM_SLEEPDEP); 636c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley omap2_cm_write_mod_reg(cm_context.cm_clkout_ctrl, OMAP3430_CCR_MOD, 637c4d7e58fb52c632d8e33cd23a4917d7a7f8302acPaul Walmsley OMAP3_CM_CLKOUT_CTRL_OFFSET); 638f0611a5c220e50dec65041b10bd2fe9484f061a6Paul Walmsley} 639c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 640c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristovoid omap3_cm_save_scratchpad_contents(u32 *ptr) 641c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo{ 642c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL); 643c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); 644c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); 645c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo 646c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo /* 647c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo * As per erratum i671, ROM code does not respect the PER DPLL 648c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo * programming scheme if CM_AUTOIDLE_PLL..AUTO_PERIPH_DPLL == 1. 649c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo * Then, in anycase, clear these bits to avoid extra latencies. 650c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo */ 651c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE) & 652c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo ~OMAP3430_AUTO_PERIPH_DPLL_MASK; 653c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); 654c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL); 655c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3); 656c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL); 657c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL); 658c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL); 659c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo *ptr++ = omap2_cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL); 660c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo} 661c6a2d839d0dba8a06f55c7b06f8ce33bdbe4aea3Tero Kristo 662c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley/* 663c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * 664c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley */ 665c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 666c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleystatic struct cm_ll_data omap3xxx_cm_ll_data = { 667c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley .split_idlest_reg = &omap3xxx_cm_split_idlest_reg, 668c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley .wait_module_ready = &omap3xxx_cm_wait_module_ready, 669c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley}; 670c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 671c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleyint __init omap3xxx_cm_init(void) 672c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{ 673c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley return cm_register(&omap3xxx_cm_ll_data); 674c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley} 675c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley 676c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleystatic void __exit omap3xxx_cm_exit(void) 677c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{ 6787af1363742e0e2752e90d5de2ddb9c48665fc567Tero Kristo cm_unregister(&omap3xxx_cm_ll_data); 679c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley} 680c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley__exitcall(omap3xxx_cm_exit); 681