/* * Copyright (c) 2012, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * 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. * */ #ifndef __ARCH_ARM_MACH_MSM_CPR_H #define __ARCH_ARM_MACH_MSM_CPR_H /* Register Offsets for RBCPR */ /* RBCPR Gate Count and Target Registers */ #define RBCPR_GCNT_TARGET(n) (0x60 + 4 * n) /* RBCPR Timer Control */ #define RBCPR_TIMER_INTERVAL 0x44 #define RBIF_TIMER_ADJUST 0x4C /* RBCPR Config Register */ #define RBIF_LIMIT 0x48 #define RBCPR_STEP_QUOT 0X80 #define RBCPR_CTL 0x90 #define RBIF_SW_VLEVEL 0x94 #define RBIF_CONT_ACK_CMD 0x98 #define RBIF_CONT_NACK_CMD 0x9C /* RBCPR Result status Register */ #define RBCPR_RESULT_0 0xA0 #define RBCPR_RESULT_1 0xA4 #define RBCPR_QUOT_AVG 0x118 /* RBCPR DEBUG Register */ #define RBCPR_DEBUG1 0x120 /* RBCPR Interrupt Control Register */ #define RBIF_IRQ_EN(n) (0x100 + 4 * n) #define RBIF_IRQ_CLEAR 0x110 #define RBIF_IRQ_STATUS 0x114 /* Bit Mask Values */ #define GCNT_M 0x003FF000 #define TARGET_M 0x00000FFF #define SW_VLEVEL_M 0x0000003F #define UP_FLAG_M 0x00000010 #define DOWN_FLAG_M 0x00000004 #define CEILING_M 0x00000FC0 #define FLOOR_M 0x0000003F #define LOOP_EN_M 0x00000001 #define TIMER_M 0x00000008 #define SW_AUTO_CONT_ACK_EN_M 0x00000020 #define SW_AUTO_CONT_NACK_DN_EN_M 0x00000040 #define HW_TO_PMIC_EN_M BIT(4) #define BUSY_M BIT(19) #define QUOT_SLOW_M 0x00FFF000 #define UP_THRESHOLD_M 0x0F000000 #define DN_THRESHOLD_M 0xF0000000 /* Bit Values */ #define ENABLE_CPR BIT(0) #define DISABLE_CPR 0x0 #define ENABLE_TIMER BIT(3) #define DISABLE_TIMER 0x0 #define SW_MODE 0x0 #define SW_AUTO_CONT_ACK_EN BIT(5) #define SW_AUTO_CONT_NACK_DN_EN BIT(6) /* Shift Values */ #define RBIF_CONS_DN_SHIFT (0x4) /* Test values for RBCPR RUMI Testing */ #define GNT_CNT 0xC0 #define TARGET 0xEFF #define CEILING_V 0x30 #define FLOOR_V 0x15 #define SW_LEVEL 0x20 /* Interrupt Mask for All interrupt flags */ #define INT_MASK (MIN_INT | DOWN_INT | MID_INT | UP_INT | MAX_INT) /* Number of oscilator in each sensor */ #define NUM_OSC 8 #define CPR_MODE 2 /** * enum cpr_mode - Modes in which cpr is used */ enum cpr_mode { NORMAL_MODE = 0, TURBO_MODE, SVS_MODE, }; /** * enum cpr_action - Cpr actions to be taken */ enum cpr_action { DOWN = 0, UP, }; /** * enum cpr_interrupt */ enum cpr_interrupt { DONE_INT = BIT(0), MIN_INT = BIT(1), DOWN_INT = BIT(2), MID_INT = BIT(3), UP_INT = BIT(4), MAX_INT = BIT(5), }; /** * struct msm_cpr_osc - Data for CPR ring oscillator * @gcnt: gate count value for the oscillator * @quot: target value for ring oscillator */ struct msm_cpr_osc { int gcnt; uint32_t quot; }; /** * struct msm_cpr_mode - Data for CPR modes of operation * @msm_cpr_osc: structure for oscillator data * @ring_osc: ring oscillator of the sensor * @tgt_volt_offset: inital voltage offset from default value * @step_quot: step Quot for CPR calcuation */ struct msm_cpr_mode { struct msm_cpr_osc ring_osc_data[NUM_OSC]; int ring_osc; int32_t tgt_volt_offset; uint32_t step_quot; uint32_t turbo_Vmax; uint32_t turbo_Vmin; uint32_t nom_Vmax; uint32_t nom_Vmin; uint32_t calibrated_uV; }; /** * struct msm_cpr_config - Platform data for CPR configuration * @ref_clk_khz: clock value of CPR in KHz * @delay_us: timer delay in micro second * @irq_line: irq line to be use (0 or 1 or 2) * @msm_cpr_mode: structure for CPR mode data */ struct msm_cpr_config { unsigned long ref_clk_khz; unsigned long delay_us; int irq_line; struct msm_cpr_mode *cpr_mode_data; int min_down_step; uint32_t tgt_count_div_N; /* Target Cnt(Nom) = Target Cnt(Turbo) / N */ uint32_t floor; uint32_t ceiling; uint32_t sw_vlevel; uint32_t up_threshold; uint32_t dn_threshold; uint32_t up_margin; uint32_t dn_margin; uint32_t max_nom_freq; uint32_t max_freq; uint32_t max_quot; bool disable_cpr; uint32_t step_size; uint32_t (*get_quot)(uint32_t max_quot, uint32_t max_freq, uint32_t new_freq); void (*clk_enable)(void); }; /** * struct msm_cpr_config - CPR Registers */ struct msm_cpr_reg { uint32_t rbif_timer_interval; uint32_t rbif_int_en; uint32_t rbif_limit; uint32_t rbif_timer_adjust; uint32_t rbcpr_gcnt_target; uint32_t rbcpr_step_quot; uint32_t rbif_sw_level; uint32_t rbcpr_ctl; }; #if defined(CONFIG_MSM_CPR) || defined(CONFIG_MSM_CPR_MODULE) /* msm_cpr_pm_resume: Used by Power Manager for Idle Power Collapse */ void msm_cpr_pm_resume(void); /* msm_cpr_pm_suspend: Used by Power Manager for Idle Power Collapse */ void msm_cpr_pm_suspend(void); /* msm_cpr_enable: Used by Power Manager for GDFS */ void msm_cpr_enable(void); /* msm_cpr_disable: Used by Power Manager for GDFS */ void msm_cpr_disable(void); #else /* msm_cpr_pm_resume: Used by Power Manager for Idle Power Collapse */ void msm_cpr_pm_resume(void) { } /* msm_cpr_pm_suspend: Used by Power Manager for Idle Power Collapse */ void msm_cpr_pm_suspend(void) { } /* msm_cpr_enable: Used by Power Manager for GDFS */ void msm_cpr_enable(void) { } /* msm_cpr_disable: Used by Power Manager for GDFS */ void msm_cpr_disable(void) { } #endif #ifdef CONFIG_DEBUG_FS int msm_cpr_debug_init(void *); #else static inline int msm_cpr_debug_init(void *) { return 0; } #endif #endif /* __ARCH_ARM_MACH_MSM_CPR_H */