|
@@ -0,0 +1,110 @@
|
|
|
+/*
|
|
|
+ * AM33XX CM functions
|
|
|
+ *
|
|
|
+ * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/
|
|
|
+ * Vaibhav Hiremath <hvaibhav@ti.com>
|
|
|
+ *
|
|
|
+ * Reference taken from from OMAP4 cminst44xx.c
|
|
|
+ *
|
|
|
+ * 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/types.h>
|
|
|
+#include <linux/errno.h>
|
|
|
+#include <linux/err.h>
|
|
|
+#include <linux/io.h>
|
|
|
+
|
|
|
+#include "clockdomain.h"
|
|
|
+#include "cm.h"
|
|
|
+#include "cm33xx.h"
|
|
|
+#include "cm-regbits-34xx.h"
|
|
|
+#include "cm-regbits-33xx.h"
|
|
|
+#include "prm33xx.h"
|
|
|
+
|
|
|
+/*
|
|
|
+ * CLKCTRL_IDLEST_*: possible values for the CM_*_CLKCTRL.IDLEST bitfield:
|
|
|
+ *
|
|
|
+ * 0x0 func: Module is fully functional, including OCP
|
|
|
+ * 0x1 trans: Module is performing transition: wakeup, or sleep, or sleep
|
|
|
+ * abortion
|
|
|
+ * 0x2 idle: Module is in Idle mode (only OCP part). It is functional if
|
|
|
+ * using separate functional clock
|
|
|
+ * 0x3 disabled: Module is disabled and cannot be accessed
|
|
|
+ *
|
|
|
+ */
|
|
|
+#define CLKCTRL_IDLEST_FUNCTIONAL 0x0
|
|
|
+#define CLKCTRL_IDLEST_INTRANSITION 0x1
|
|
|
+#define CLKCTRL_IDLEST_INTERFACE_IDLE 0x2
|
|
|
+#define CLKCTRL_IDLEST_DISABLED 0x3
|
|
|
+
|
|
|
+/* Private functions */
|
|
|
+
|
|
|
+/* Read a register in a CM instance */
|
|
|
+static inline u32 am33xx_cm_read_reg(s16 inst, u16 idx)
|
|
|
+{
|
|
|
+ return __raw_readl(cm_base + inst + idx);
|
|
|
+}
|
|
|
+
|
|
|
+/* Write into a register in a CM */
|
|
|
+static inline void am33xx_cm_write_reg(u32 val, s16 inst, u16 idx)
|
|
|
+{
|
|
|
+ __raw_writel(val, cm_base + inst + idx);
|
|
|
+}
|
|
|
+
|
|
|
+/* Read-modify-write a register in CM */
|
|
|
+static inline u32 am33xx_cm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = am33xx_cm_read_reg(inst, idx);
|
|
|
+ v &= ~mask;
|
|
|
+ v |= bits;
|
|
|
+ am33xx_cm_write_reg(v, inst, idx);
|
|
|
+
|
|
|
+ return v;
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 am33xx_cm_set_reg_bits(u32 bits, s16 inst, s16 idx)
|
|
|
+{
|
|
|
+ return am33xx_cm_rmw_reg_bits(bits, bits, inst, idx);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 am33xx_cm_clear_reg_bits(u32 bits, s16 inst, s16 idx)
|
|
|
+{
|
|
|
+ return am33xx_cm_rmw_reg_bits(bits, 0x0, inst, idx);
|
|
|
+}
|
|
|
+
|
|
|
+static inline u32 am33xx_cm_read_reg_bits(u16 inst, s16 idx, u32 mask)
|
|
|
+{
|
|
|
+ u32 v;
|
|
|
+
|
|
|
+ v = am33xx_cm_read_reg(inst, idx);
|
|
|
+ v &= mask;
|
|
|
+ v >>= __ffs(mask);
|
|
|
+
|
|
|
+ return v;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * _clkctrl_idlest - read a CM_*_CLKCTRL register; mask & shift IDLEST bitfield
|
|
|
+ * @inst: CM instance register offset (*_INST macro)
|
|
|
+ * @cdoffs: Clockdomain register offset (*_CDOFFS macro)
|
|
|
+ * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro)
|
|
|
+ *
|
|
|
+ * Return the IDLEST bitfield of a CM_*_CLKCTRL register, shifted down to
|
|
|
+ * bit 0.
|
|
|
+ */
|
|
|
+static u32 _clkctrl_idlest(u16 inst, s16 cdoffs, u16 clkctrl_offs)
|
|
|
+{
|
|
|
+ u32 v = am33xx_cm_read_reg(inst, clkctrl_offs);
|
|
|
+ v &= AM33XX_IDLEST_MASK;
|
|
|
+ v >>= AM33XX_IDLEST_SHIFT;
|
|
|
+ return v;
|