123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- /*
- * Copyright (c) 2011-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_RPM_REGULATOR_INT_H
- #define __ARCH_ARM_MACH_MSM_RPM_REGULATOR_INT_H
- #include <linux/regulator/driver.h>
- #include <mach/rpm.h>
- #include <mach/rpm-regulator.h>
- /* Possible RPM regulator request types */
- enum rpm_regulator_type {
- RPM_REGULATOR_TYPE_LDO,
- RPM_REGULATOR_TYPE_SMPS,
- RPM_REGULATOR_TYPE_VS,
- RPM_REGULATOR_TYPE_NCP,
- RPM_REGULATOR_TYPE_CORNER,
- RPM_REGULATOR_TYPE_MAX = RPM_REGULATOR_TYPE_CORNER,
- };
- struct request_member {
- int word;
- unsigned int mask;
- int shift;
- };
- /* Possible RPM regulator request members */
- struct rpm_vreg_parts {
- struct request_member mV; /* voltage: used if voltage is in mV */
- struct request_member uV; /* voltage: used if voltage is in uV */
- struct request_member ip; /* peak current in mA */
- struct request_member pd; /* pull down enable */
- struct request_member ia; /* average current in mA */
- struct request_member fm; /* force mode */
- struct request_member pm; /* power mode */
- struct request_member pc; /* pin control */
- struct request_member pf; /* pin function */
- struct request_member enable_state; /* NCP and switch */
- struct request_member comp_mode; /* NCP */
- struct request_member freq; /* frequency: NCP and SMPS */
- struct request_member freq_clk_src; /* clock source: SMPS */
- struct request_member hpm; /* switch: control OCP and SS */
- int request_len;
- };
- struct vreg_range {
- int min_uV;
- int max_uV;
- int step_uV;
- unsigned n_voltages;
- };
- struct vreg_set_points {
- struct vreg_range *range;
- int count;
- unsigned n_voltages;
- };
- struct vreg {
- struct msm_rpm_iv_pair req[2];
- struct msm_rpm_iv_pair prev_active_req[2];
- struct msm_rpm_iv_pair prev_sleep_req[2];
- struct rpm_regulator_init_data pdata;
- struct regulator_desc rdesc;
- struct regulator_desc rdesc_pc;
- struct regulator_dev *rdev;
- struct regulator_dev *rdev_pc;
- struct vreg_set_points *set_points;
- struct rpm_vreg_parts *part;
- int type;
- int id;
- bool requires_cxo;
- struct mutex pc_lock;
- int save_uV;
- int mode;
- bool is_enabled;
- bool is_enabled_pc;
- const int hpm_min_load;
- int active_min_uV_vote[RPM_VREG_VOTER_COUNT];
- int sleep_min_uV_vote[RPM_VREG_VOTER_COUNT];
- };
- struct vreg_config {
- struct vreg *vregs;
- int vregs_len;
- int vreg_id_min;
- int vreg_id_max;
- int pin_func_none;
- int pin_func_sleep_b;
- unsigned int mode_lpm;
- unsigned int mode_hpm;
- struct vreg_set_points **set_points;
- int set_points_len;
- const char **label_pin_ctrl;
- int label_pin_ctrl_len;
- const char **label_pin_func;
- int label_pin_func_len;
- const char **label_force_mode;
- int label_force_mode_len;
- const char **label_power_mode;
- int label_power_mode_len;
- int (*is_real_id) (int vreg_id);
- int (*pc_id_to_real_id) (int vreg_id);
- /* Legacy options to be used with MSM8660 */
- int use_legacy_optimum_mode;
- int ia_follows_ip;
- };
- #define REQUEST_MEMBER(_word, _mask, _shift) \
- { \
- .word = _word, \
- .mask = _mask, \
- .shift = _shift, \
- }
- #define VOLTAGE_RANGE(_min_uV, _max_uV, _step_uV) \
- { \
- .min_uV = _min_uV, \
- .max_uV = _max_uV, \
- .step_uV = _step_uV, \
- }
- #define SET_POINTS(_ranges) \
- { \
- .range = _ranges, \
- .count = ARRAY_SIZE(_ranges), \
- };
- #define MICRO_TO_MILLI(uV) ((uV) / 1000)
- #define MILLI_TO_MICRO(mV) ((mV) * 1000)
- #if defined(CONFIG_MSM_RPM_REGULATOR) && defined(CONFIG_ARCH_MSM8X60)
- struct vreg_config *get_config_8660(void);
- #else
- static inline struct vreg_config *get_config_8660(void)
- {
- return NULL;
- }
- #endif
- #if defined(CONFIG_MSM_RPM_REGULATOR) && \
- (defined(CONFIG_ARCH_MSM8960) || defined(CONFIG_ARCH_APQ8064))
- struct vreg_config *get_config_8960(void);
- struct vreg_config *get_config_8960_pm8917(void);
- #else
- static inline struct vreg_config *get_config_8960(void)
- {
- return NULL;
- }
- static inline struct vreg_config *get_config_8960_pm8917(void)
- {
- return NULL;
- }
- #endif
- #if defined(CONFIG_MSM_RPM_REGULATOR) && defined(CONFIG_ARCH_MSM9615)
- struct vreg_config *get_config_9615(void);
- #else
- static inline struct vreg_config *get_config_9615(void)
- {
- return NULL;
- }
- #endif
- #if defined(CONFIG_MSM_RPM_REGULATOR) && defined(CONFIG_ARCH_MSM8930)
- struct vreg_config *get_config_8930(void);
- struct vreg_config *get_config_8930_pm8917(void);
- #else
- static inline struct vreg_config *get_config_8930(void)
- {
- return NULL;
- }
- static inline struct vreg_config *get_config_8930_pm8917(void)
- {
- return NULL;
- }
- #endif
- #endif
|