#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/semaphore.h>
#define AVS_MAX_CMD_ARGS …
#define AVS_PARAM_MULT(x) …
#define AVS_MBOX_COMMAND …
#define AVS_MBOX_STATUS …
#define AVS_MBOX_VOLTAGE0 …
#define AVS_MBOX_TEMP0 …
#define AVS_MBOX_PV0 …
#define AVS_MBOX_MV0 …
#define AVS_MBOX_PARAM(x) …
#define AVS_MBOX_REVISION …
#define AVS_MBOX_PSTATE …
#define AVS_MBOX_HEARTBEAT …
#define AVS_MBOX_MAGIC …
#define AVS_MBOX_SIGMA_HVT …
#define AVS_MBOX_SIGMA_SVT …
#define AVS_MBOX_VOLTAGE1 …
#define AVS_MBOX_TEMP1 …
#define AVS_MBOX_PV1 …
#define AVS_MBOX_MV1 …
#define AVS_MBOX_FREQUENCY …
#define AVS_CMD_AVAILABLE …
#define AVS_CMD_DISABLE …
#define AVS_CMD_ENABLE …
#define AVS_CMD_S2_ENTER …
#define AVS_CMD_S2_EXIT …
#define AVS_CMD_BBM_ENTER …
#define AVS_CMD_BBM_EXIT …
#define AVS_CMD_S3_ENTER …
#define AVS_CMD_S3_EXIT …
#define AVS_CMD_BALANCE …
#define AVS_CMD_GET_PMAP …
#define AVS_CMD_SET_PMAP …
#define AVS_CMD_GET_PSTATE …
#define AVS_CMD_SET_PSTATE …
#define AVS_MODE_AVS …
#define AVS_MODE_DFS …
#define AVS_MODE_DVS …
#define AVS_MODE_DVFS …
#define NDIV_INT_SHIFT …
#define NDIV_INT_MASK …
#define PDIV_SHIFT …
#define PDIV_MASK …
#define MDIV_P0_SHIFT …
#define MDIV_P0_MASK …
#define MDIV_P1_SHIFT …
#define MDIV_P1_MASK …
#define MDIV_P2_SHIFT …
#define MDIV_P2_MASK …
#define MDIV_P3_SHIFT …
#define MDIV_P3_MASK …
#define MDIV_P4_SHIFT …
#define MDIV_P4_MASK …
#define AVS_PSTATE_P0 …
#define AVS_PSTATE_P1 …
#define AVS_PSTATE_P2 …
#define AVS_PSTATE_P3 …
#define AVS_PSTATE_P4 …
#define AVS_PSTATE_MAX …
#define AVS_CPU_L2_SET0 …
#define AVS_CPU_L2_INT_MASK …
#define AVS_STATUS_CLEAR …
#define AVS_STATUS_SUCCESS …
#define AVS_STATUS_FAILURE …
#define AVS_STATUS_INVALID …
#define AVS_STATUS_NO_SUPP …
#define AVS_STATUS_NO_MAP …
#define AVS_STATUS_MAP_SET …
#define AVS_STATUS_MAX …
#define AVS_LOOP_LIMIT …
#define AVS_TIMEOUT …
#define AVS_FIRMWARE_MAGIC …
#define BRCM_AVS_CPUFREQ_PREFIX …
#define BRCM_AVS_CPUFREQ_NAME …
#define BRCM_AVS_CPU_DATA …
#define BRCM_AVS_CPU_INTR …
#define BRCM_AVS_HOST_INTR …
struct pmap { … };
struct private_data { … };
static void __iomem *__map_region(const char *name)
{ … }
static unsigned long wait_for_avs_command(struct private_data *priv,
unsigned long timeout)
{ … }
static int __issue_avs_command(struct private_data *priv, unsigned int cmd,
unsigned int num_in, unsigned int num_out,
u32 args[])
{ … }
static irqreturn_t irq_handler(int irq, void *data)
{ … }
static char *brcm_avs_mode_to_string(unsigned int mode)
{ … }
static void brcm_avs_parse_p1(u32 p1, unsigned int *mdiv_p0, unsigned int *pdiv,
unsigned int *ndiv)
{ … }
static void brcm_avs_parse_p2(u32 p2, unsigned int *mdiv_p1,
unsigned int *mdiv_p2, unsigned int *mdiv_p3,
unsigned int *mdiv_p4)
{ … }
static int brcm_avs_get_pmap(struct private_data *priv, struct pmap *pmap)
{ … }
static int brcm_avs_set_pmap(struct private_data *priv, struct pmap *pmap)
{ … }
static int brcm_avs_get_pstate(struct private_data *priv, unsigned int *pstate)
{ … }
static int brcm_avs_set_pstate(struct private_data *priv, unsigned int pstate)
{ … }
static u32 brcm_avs_get_voltage(void __iomem *base)
{ … }
static u32 brcm_avs_get_frequency(void __iomem *base)
{ … }
static struct cpufreq_frequency_table *
brcm_avs_get_freq_table(struct device *dev, struct private_data *priv)
{ … }
static bool brcm_avs_is_firmware_loaded(struct private_data *priv)
{ … }
static unsigned int brcm_avs_cpufreq_get(unsigned int cpu)
{ … }
static int brcm_avs_target_index(struct cpufreq_policy *policy,
unsigned int index)
{ … }
static int brcm_avs_suspend(struct cpufreq_policy *policy)
{ … }
static int brcm_avs_resume(struct cpufreq_policy *policy)
{ … }
static int brcm_avs_prepare_init(struct platform_device *pdev)
{ … }
static void brcm_avs_prepare_uninit(struct platform_device *pdev)
{ … }
static int brcm_avs_cpufreq_init(struct cpufreq_policy *policy)
{ … }
static ssize_t show_brcm_avs_pstate(struct cpufreq_policy *policy, char *buf)
{ … }
static ssize_t show_brcm_avs_mode(struct cpufreq_policy *policy, char *buf)
{ … }
static ssize_t show_brcm_avs_pmap(struct cpufreq_policy *policy, char *buf)
{ … }
static ssize_t show_brcm_avs_voltage(struct cpufreq_policy *policy, char *buf)
{ … }
static ssize_t show_brcm_avs_frequency(struct cpufreq_policy *policy, char *buf)
{ … }
cpufreq_freq_attr_ro(…);
cpufreq_freq_attr_ro(…);
cpufreq_freq_attr_ro(…);
cpufreq_freq_attr_ro(…);
cpufreq_freq_attr_ro(…);
static struct freq_attr *brcm_avs_cpufreq_attr[] = …;
static struct cpufreq_driver brcm_avs_driver = …;
static int brcm_avs_cpufreq_probe(struct platform_device *pdev)
{ … }
static void brcm_avs_cpufreq_remove(struct platform_device *pdev)
{ … }
static const struct of_device_id brcm_avs_cpufreq_match[] = …;
MODULE_DEVICE_TABLE(of, brcm_avs_cpufreq_match);
static struct platform_driver brcm_avs_cpufreq_platdrv = …;
module_platform_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;