ARM: tegra: pcie: Remove dock detect variable
[linux-3.10.git] / arch / arm / mach-tegra / pm.h
index fafcf96..6b86d50 100644 (file)
@@ -2,20 +2,23 @@
  * arch/arm/mach-tegra/include/mach/pm.h
  *
  * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  *     Colin Cross <ccross@google.com>
  *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
+ * Copyright (c) 2010-2013, NVIDIA CORPORATION.  All rights reserved.
  *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * 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.
  *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 
 
 #include "iomap.h"
 
+#include "pmc.h"
+
 #define PMC_SCRATCH0           0x50
 #define PMC_SCRATCH1           0x54
 #define PMC_SCRATCH4           0x60
 
-enum tegra_suspend_mode {
-       TEGRA_SUSPEND_NONE = 0,
-       TEGRA_SUSPEND_LP2,      /* CPU voltage off */
-       TEGRA_SUSPEND_LP1,      /* CPU voltage off, DRAM self-refresh */
-       TEGRA_SUSPEND_LP0,      /* CPU + core voltage off, DRAM self-refresh */
-       TEGRA_MAX_SUSPEND_MODE,
-};
-
 enum suspend_stage {
        TEGRA_SUSPEND_BEFORE_PERIPHERAL,
        TEGRA_SUSPEND_BEFORE_CPU,
@@ -58,6 +55,7 @@ struct tegra_suspend_platform_data {
        unsigned long core_off_timer;   /* core power off time ticks, LP0 */
        bool corereq_high;         /* Core power request active-high */
        bool sysclkreq_high;       /* System clock request is active-high */
+       bool sysclkreq_gpio;       /* if System clock request is set to gpio */
        bool combined_req;         /* if core & CPU power requests are combined */
        enum tegra_suspend_mode suspend_mode;
        unsigned long cpu_lp2_min_residency; /* Min LP2 state residency in us */
@@ -65,18 +63,31 @@ struct tegra_suspend_platform_data {
        /* lp_state = 0 for LP0 state, 1 for LP1 state, 2 for LP2 state */
        void (*board_resume)(int lp_state, enum resume_stage stg);
        unsigned int cpu_resume_boost;  /* CPU frequency resume boost in kHz */
-#ifdef CONFIG_TEGRA_LP1_950
+#ifdef CONFIG_TEGRA_LP1_LOW_COREVOLTAGE
        bool lp1_lowvolt_support;
        unsigned int i2c_base_addr;
        unsigned int pmuslave_addr;
        unsigned int core_reg_addr;
+       unsigned int lp1_core_volt_low_cold;
        unsigned int lp1_core_volt_low;
        unsigned int lp1_core_volt_high;
 #endif
+       unsigned int lp1bb_core_volt_min;
+       unsigned long lp1bb_emc_rate_min;
+       unsigned long lp1bb_emc_rate_max;
 #ifdef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
-       unsigned long min_residency_noncpu;
+       unsigned long min_residency_vmin_fmin;
+       unsigned long min_residency_ncpu_slow;
+       unsigned long min_residency_ncpu_fast;
        unsigned long min_residency_crail;
+       bool crail_up_early;
 #endif
+       unsigned long min_residency_mclk_stop;
+       bool usb_vbus_internal_wake; /* support for internal vbus wake */
+       bool usb_id_internal_wake; /* support for internal id wake */
+
+       void (*suspend_dfll_bypass)(void);
+       void (*resume_dfll_bypass)(void);
 };
 
 /* clears io dpd settings before kernel code */
@@ -85,14 +96,35 @@ void tegra_bl_io_dpd_cleanup(void);
 unsigned long tegra_cpu_power_good_time(void);
 unsigned long tegra_cpu_power_off_time(void);
 unsigned long tegra_cpu_lp2_min_residency(void);
+unsigned long tegra_mc_clk_stop_min_residency(void);
 #ifdef CONFIG_ARCH_TEGRA_HAS_SYMMETRIC_CPU_PWR_GATE
-unsigned long tegra_min_residency_noncpu(void);
+unsigned long tegra_min_residency_vmin_fmin(void);
+unsigned long tegra_min_residency_ncpu(void);
 unsigned long tegra_min_residency_crail(void);
+bool tegra_crail_can_start_early(void);
+#else
+static inline bool tegra_crail_can_start_early(void)
+{ return false; }
 #endif
+void tegra_limit_cpu_power_timers(unsigned long us_on, unsigned long us_off);
 void tegra_clear_cpu_in_pd(int cpu);
 bool tegra_set_cpu_in_pd(int cpu);
 
+void tegra_mc_clk_prepare(void);
+void tegra_mc_clk_finish(void);
 int tegra_suspend_dram(enum tegra_suspend_mode mode, unsigned int flags);
+#ifdef CONFIG_TEGRA_LP0_IN_IDLE
+int tegra_enter_lp0(unsigned long sleep_time);
+#else
+static inline int tegra_enter_lp0(unsigned long sleep_time)
+{ return 0; }
+#endif
+#ifdef CONFIG_TEGRA_LP1_LOW_COREVOLTAGE
+int tegra_is_lp1_suspend_mode(void);
+#endif
+void tegra_lp1bb_suspend_emc_rate(unsigned long emc_min, unsigned long emc_max);
+void tegra_lp1bb_suspend_mv_set(int mv);
+unsigned long tegra_lp1bb_emc_min_rate_get(void);
 
 #ifdef CONFIG_ARCH_TEGRA_14x_SOC
 #define FLOW_CTRL_CLUSTER_CONTROL \
@@ -109,6 +141,8 @@ int tegra_suspend_dram(enum tegra_suspend_mode mode, unsigned int flags);
 #define FLOW_CTRL_RAM_REPAIR \
        (IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) + 0x40)
 #define FLOW_CTRL_RAM_REPAIR_BYPASS_EN (1<<2)
+#define FLOW_CTRL_RAM_REPAIR_STS       (1<<1)
+#define FLOW_CTRL_RAM_REPAIR_REQ       (1<<0)
 
 #define FUSE_SKU_DIRECT_CONFIG \
        (IO_ADDRESS(TEGRA_FUSE_BASE) + 0x1F4)
@@ -137,10 +171,22 @@ static inline void tegra_lp0_cpu_mode(bool enter) {}
 #endif
 
 #ifdef CONFIG_TEGRA_CLUSTER_CONTROL
-#define INSTRUMENT_CLUSTER_SWITCH 0    /* Should be zero for shipping code */
+#define INSTRUMENT_CLUSTER_SWITCH 1    /* Should be zero for shipping code */
 #define DEBUG_CLUSTER_SWITCH 0         /* Should be zero for shipping code */
 #define PARAMETERIZE_CLUSTER_SWITCH 1  /* Should be zero for shipping code */
 
+#define CLUSTER_SWITCH_TIME_AVG_SHIFT  4
+#define CLUSTER_SWITCH_AVG_SAMPLES     (0x1U << CLUSTER_SWITCH_TIME_AVG_SHIFT)
+
+enum tegra_cluster_switch_time_id {
+       tegra_cluster_switch_time_id_start = 0,
+       tegra_cluster_switch_time_id_prolog,
+       tegra_cluster_switch_time_id_switch,
+       tegra_cluster_switch_time_id_epilog,
+       tegra_cluster_switch_time_id_end,
+       tegra_cluster_switch_time_id_max
+};
+
 static inline bool is_g_cluster_present(void)
 {
        u32 fuse_sku = readl(FUSE_SKU_DIRECT_CONFIG);
@@ -197,6 +243,12 @@ static inline int tegra_cluster_switch(struct clk *cpu_clk,
 }
 #endif
 
+#if INSTRUMENT_CLUSTER_SWITCH
+void tegra_cluster_switch_time(unsigned int flags, int id);
+#else
+static inline void tegra_cluster_switch_time(unsigned int flags, int id) { }
+#endif
+
 #ifdef CONFIG_ARCH_TEGRA_2x_SOC
 void tegra2_lp0_suspend_init(void);
 void tegra2_lp2_set_trigger(unsigned long cycles);
@@ -276,7 +328,12 @@ void tegra_smp_clear_power_mask(void);
 static inline void tegra_smp_clear_power_mask(void){}
 #endif
 
-#ifdef CONFIG_TRUSTED_FOUNDATIONS
+#if defined(CONFIG_ARCH_TEGRA_14x_SOC)
+void tegra_smp_save_power_mask(void);
+void tegra_smp_restore_power_mask(void);
+#endif
+
+#ifdef CONFIG_TEGRA_USE_SECURE_KERNEL
 void tegra_generic_smc(u32 type, u32 subtype, u32 arg);
 #endif