235 lines
7.2 KiB
C
235 lines
7.2 KiB
C
|
/* Copyright (c) 2010-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_INCLUDE_MACH_RPM_REGULATOR_H
|
||
|
#define __ARCH_ARM_MACH_MSM_INCLUDE_MACH_RPM_REGULATOR_H
|
||
|
|
||
|
#include <linux/regulator/machine.h>
|
||
|
|
||
|
#define RPM_REGULATOR_DEV_NAME "rpm-regulator"
|
||
|
|
||
|
#include <mach/rpm-regulator-8660.h>
|
||
|
#include <mach/rpm-regulator-8960.h>
|
||
|
#include <mach/rpm-regulator-9615.h>
|
||
|
#include <mach/rpm-regulator-8974.h>
|
||
|
#include <mach/rpm-regulator-8930.h>
|
||
|
|
||
|
/**
|
||
|
* enum rpm_vreg_version - supported RPM regulator versions
|
||
|
*/
|
||
|
enum rpm_vreg_version {
|
||
|
RPM_VREG_VERSION_8660,
|
||
|
RPM_VREG_VERSION_8960,
|
||
|
RPM_VREG_VERSION_9615,
|
||
|
RPM_VREG_VERSION_8930,
|
||
|
RPM_VREG_VERSION_8930_PM8917,
|
||
|
RPM_VREG_VERSION_8960_PM8917,
|
||
|
RPM_VREG_VERSION_MAX = RPM_VREG_VERSION_8960_PM8917,
|
||
|
};
|
||
|
|
||
|
#define RPM_VREG_PIN_CTRL_NONE 0x00
|
||
|
|
||
|
/**
|
||
|
* enum rpm_vreg_state - enable state for switch or NCP
|
||
|
*/
|
||
|
enum rpm_vreg_state {
|
||
|
RPM_VREG_STATE_OFF,
|
||
|
RPM_VREG_STATE_ON,
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* enum rpm_vreg_freq - switching frequency for SMPS or NCP
|
||
|
*/
|
||
|
enum rpm_vreg_freq {
|
||
|
RPM_VREG_FREQ_NONE,
|
||
|
RPM_VREG_FREQ_19p20,
|
||
|
RPM_VREG_FREQ_9p60,
|
||
|
RPM_VREG_FREQ_6p40,
|
||
|
RPM_VREG_FREQ_4p80,
|
||
|
RPM_VREG_FREQ_3p84,
|
||
|
RPM_VREG_FREQ_3p20,
|
||
|
RPM_VREG_FREQ_2p74,
|
||
|
RPM_VREG_FREQ_2p40,
|
||
|
RPM_VREG_FREQ_2p13,
|
||
|
RPM_VREG_FREQ_1p92,
|
||
|
RPM_VREG_FREQ_1p75,
|
||
|
RPM_VREG_FREQ_1p60,
|
||
|
RPM_VREG_FREQ_1p48,
|
||
|
RPM_VREG_FREQ_1p37,
|
||
|
RPM_VREG_FREQ_1p28,
|
||
|
RPM_VREG_FREQ_1p20,
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* enum rpm_vreg_voltage_corner - possible voltage corner values
|
||
|
*
|
||
|
* These should be used in regulator_set_voltage and rpm_vreg_set_voltage calls
|
||
|
* for corner type regulators as if they had units of uV.
|
||
|
*/
|
||
|
enum rpm_vreg_voltage_corner {
|
||
|
RPM_VREG_CORNER_NONE = 1,
|
||
|
RPM_VREG_CORNER_LOW,
|
||
|
RPM_VREG_CORNER_NOMINAL,
|
||
|
RPM_VREG_CORNER_HIGH,
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* enum rpm_vreg_voter - RPM regulator voter IDs for private APIs
|
||
|
*/
|
||
|
enum rpm_vreg_voter {
|
||
|
RPM_VREG_VOTER_REG_FRAMEWORK, /* for internal use only */
|
||
|
RPM_VREG_VOTER1, /* for use by the acpu-clock driver */
|
||
|
RPM_VREG_VOTER2, /* for use by the acpu-clock driver */
|
||
|
RPM_VREG_VOTER3, /* for use by other drivers */
|
||
|
RPM_VREG_VOTER4, /* for use by the acpu-clock driver */
|
||
|
RPM_VREG_VOTER5, /* for use by the acpu-clock driver */
|
||
|
RPM_VREG_VOTER6, /* for use by the acpu-clock driver */
|
||
|
RPM_VREG_VOTER_COUNT,
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* struct rpm_regulator_init_data - RPM regulator initialization data
|
||
|
* @init_data: regulator constraints
|
||
|
* @id: regulator id; from enum rpm_vreg_id
|
||
|
* @sleep_selectable: flag which indicates that regulator should be accessable
|
||
|
* by external private API
|
||
|
* @system_uA: current drawn from regulator not accounted for by any
|
||
|
* regulator framework consumer
|
||
|
* @enable_time: time in us taken to enable a regulator to the maximum
|
||
|
* allowed voltage for the system. This is dependent upon
|
||
|
* the load and capacitance for a regulator on the board.
|
||
|
* @pull_down_enable: 0 = no pulldown, 1 = pulldown when regulator disabled
|
||
|
* @freq: enum value representing the switching frequency of an
|
||
|
* SMPS or NCP
|
||
|
* @pin_ctrl: pin control inputs to use for the regulator; should be
|
||
|
* a combination of RPM_VREG_PIN_CTRL_* values
|
||
|
* @pin_fn: action to perform when pin control pin(s) is/are active
|
||
|
* @force_mode: used to specify a force mode which overrides the votes
|
||
|
* of other RPM masters.
|
||
|
* @sleep_set_force_mode: force mode to use in sleep-set requests
|
||
|
* @power_mode: mode to use as HPM (typically PWM or hysteretic) when
|
||
|
* utilizing Auto mode selection
|
||
|
* @default_uV: initial voltage to set the regulator to if enable is
|
||
|
* called before set_voltage (e.g. when boot_on or
|
||
|
* always_on is set).
|
||
|
* @peak_uA: initial peak load requirement sent in RPM request; used
|
||
|
* to determine initial mode.
|
||
|
* @avg_uA: average load requirement sent in RPM request
|
||
|
* @state: initial enable state sent in RPM request for switch or
|
||
|
* NCP
|
||
|
*/
|
||
|
struct rpm_regulator_init_data {
|
||
|
struct regulator_init_data init_data;
|
||
|
int id;
|
||
|
int sleep_selectable;
|
||
|
int system_uA;
|
||
|
int enable_time;
|
||
|
unsigned pull_down_enable;
|
||
|
enum rpm_vreg_freq freq;
|
||
|
unsigned pin_ctrl;
|
||
|
int pin_fn;
|
||
|
int force_mode;
|
||
|
int sleep_set_force_mode;
|
||
|
int power_mode;
|
||
|
int default_uV;
|
||
|
unsigned peak_uA;
|
||
|
unsigned avg_uA;
|
||
|
enum rpm_vreg_state state;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* struct rpm_regulator_consumer_mapping - mapping used by private consumers
|
||
|
*/
|
||
|
struct rpm_regulator_consumer_mapping {
|
||
|
const char *dev_name;
|
||
|
const char *supply;
|
||
|
int vreg_id;
|
||
|
enum rpm_vreg_voter voter;
|
||
|
int sleep_also;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* struct rpm_regulator_platform_data - RPM regulator platform data
|
||
|
*/
|
||
|
struct rpm_regulator_platform_data {
|
||
|
struct rpm_regulator_init_data *init_data;
|
||
|
int num_regulators;
|
||
|
enum rpm_vreg_version version;
|
||
|
int vreg_id_vdd_mem;
|
||
|
int vreg_id_vdd_dig;
|
||
|
bool requires_tcxo_workaround;
|
||
|
struct rpm_regulator_consumer_mapping *consumer_map;
|
||
|
int consumer_map_len;
|
||
|
};
|
||
|
|
||
|
#ifdef CONFIG_MSM_RPM_REGULATOR
|
||
|
/**
|
||
|
* rpm_vreg_set_voltage - vote for a min_uV value of specified regualtor
|
||
|
* @vreg: ID for regulator
|
||
|
* @voter: ID for the voter
|
||
|
* @min_uV: minimum acceptable voltage (in uV) that is voted for
|
||
|
* @max_uV: maximum acceptable voltage (in uV) that is voted for
|
||
|
* @sleep_also: 0 for active set only, non-0 for active set and sleep set
|
||
|
*
|
||
|
* Returns 0 on success or errno.
|
||
|
*
|
||
|
* This function is used to vote for the voltage of a regulator without
|
||
|
* using the regulator framework. It is needed for consumers which wish to only
|
||
|
* vote for active set regulator voltage.
|
||
|
*
|
||
|
* If sleep_also == 0, then a sleep-set value of 0V will be voted for.
|
||
|
*
|
||
|
* This function may only be called for regulators which have the sleep flag
|
||
|
* specified in their private data.
|
||
|
*
|
||
|
* Consumers can vote to disable a regulator with this function by passing
|
||
|
* min_uV = 0 and max_uV = 0.
|
||
|
*
|
||
|
* Voltage switch type regulators may be controlled via rpm_vreg_set_voltage
|
||
|
* as well. For this type of regulator, max_uV > 0 is treated as an enable
|
||
|
* request and max_uV == 0 is treated as a disable request.
|
||
|
*/
|
||
|
int rpm_vreg_set_voltage(int vreg_id, enum rpm_vreg_voter voter, int min_uV,
|
||
|
int max_uV, int sleep_also);
|
||
|
|
||
|
/**
|
||
|
* rpm_vreg_set_frequency - sets the frequency of a switching regulator
|
||
|
* @vreg: ID for regulator
|
||
|
* @freq: enum corresponding to desired frequency
|
||
|
*
|
||
|
* Returns 0 on success or errno.
|
||
|
*/
|
||
|
int rpm_vreg_set_frequency(int vreg_id, enum rpm_vreg_freq freq);
|
||
|
|
||
|
#else
|
||
|
|
||
|
/*
|
||
|
* These stubs exist to allow consumers of these APIs to compile and run
|
||
|
* in absence of a real RPM regulator driver. It is assumed that they are
|
||
|
* aware of the state of their regulators and have either set them
|
||
|
* correctly by some other means or don't care about their state at all.
|
||
|
*/
|
||
|
static inline int rpm_vreg_set_voltage(int vreg_id, enum rpm_vreg_voter voter,
|
||
|
int min_uV, int max_uV, int sleep_also)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static inline int rpm_vreg_set_frequency(int vreg_id, enum rpm_vreg_freq freq)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#endif /* CONFIG_MSM_RPM_REGULATOR */
|
||
|
|
||
|
#endif
|