mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 00:53:34 +02:00
cpufreq: mediatek-hw: Separate per-domain and per-instance data
As it stood, the mediatek cpufreq driver could get away with never really having a private driver instance struct. This is because all data was stored in the per-domain structs. However, this complicates matters when actual per-instance data like the variant struct is introduced. Instead of having a pointer to it for every domain, have a pointer to a global "priv" struct that can be extended over time, and rename the "data" struct to "domain" to distinguish its purpose better. Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
This commit is contained in:
parent
2f5178abb9
commit
35eb6b7885
|
|
@ -35,13 +35,17 @@ enum {
|
|||
REG_ARRAY_SIZE,
|
||||
};
|
||||
|
||||
struct mtk_cpufreq_data {
|
||||
struct mtk_cpufreq_priv {
|
||||
const struct mtk_cpufreq_variant *variant;
|
||||
};
|
||||
|
||||
struct mtk_cpufreq_domain {
|
||||
struct mtk_cpufreq_priv *parent;
|
||||
struct cpufreq_frequency_table *table;
|
||||
void __iomem *reg_bases[REG_ARRAY_SIZE];
|
||||
struct resource *res;
|
||||
void __iomem *base;
|
||||
int nr_opp;
|
||||
const struct mtk_cpufreq_variant *variant;
|
||||
};
|
||||
|
||||
struct mtk_cpufreq_variant {
|
||||
|
|
@ -63,7 +67,7 @@ static int __maybe_unused
|
|||
mtk_cpufreq_get_cpu_power(struct device *cpu_dev, unsigned long *uW,
|
||||
unsigned long *KHz)
|
||||
{
|
||||
struct mtk_cpufreq_data *data;
|
||||
struct mtk_cpufreq_domain *data;
|
||||
struct cpufreq_policy *policy;
|
||||
int i;
|
||||
|
||||
|
|
@ -90,7 +94,7 @@ mtk_cpufreq_get_cpu_power(struct device *cpu_dev, unsigned long *uW,
|
|||
static int mtk_cpufreq_hw_target_index(struct cpufreq_policy *policy,
|
||||
unsigned int index)
|
||||
{
|
||||
struct mtk_cpufreq_data *data = policy->driver_data;
|
||||
struct mtk_cpufreq_domain *data = policy->driver_data;
|
||||
|
||||
writel_relaxed(index, data->reg_bases[REG_FREQ_PERF_STATE]);
|
||||
|
||||
|
|
@ -99,7 +103,7 @@ static int mtk_cpufreq_hw_target_index(struct cpufreq_policy *policy,
|
|||
|
||||
static unsigned int mtk_cpufreq_hw_get(unsigned int cpu)
|
||||
{
|
||||
struct mtk_cpufreq_data *data;
|
||||
struct mtk_cpufreq_domain *data;
|
||||
struct cpufreq_policy *policy;
|
||||
unsigned int index;
|
||||
|
||||
|
|
@ -118,7 +122,7 @@ static unsigned int mtk_cpufreq_hw_get(unsigned int cpu)
|
|||
static unsigned int mtk_cpufreq_hw_fast_switch(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq)
|
||||
{
|
||||
struct mtk_cpufreq_data *data = policy->driver_data;
|
||||
struct mtk_cpufreq_domain *data = policy->driver_data;
|
||||
unsigned int index;
|
||||
|
||||
index = cpufreq_table_find_index_dl(policy, target_freq, false);
|
||||
|
|
@ -129,7 +133,7 @@ static unsigned int mtk_cpufreq_hw_fast_switch(struct cpufreq_policy *policy,
|
|||
}
|
||||
|
||||
static int mtk_cpu_create_freq_table(struct platform_device *pdev,
|
||||
struct mtk_cpufreq_data *data)
|
||||
struct mtk_cpufreq_domain *data)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
u32 temp, i, freq, prev_freq = 0;
|
||||
|
|
@ -164,9 +168,9 @@ static int mtk_cpu_create_freq_table(struct platform_device *pdev,
|
|||
|
||||
static int mtk_cpu_resources_init(struct platform_device *pdev,
|
||||
struct cpufreq_policy *policy,
|
||||
const struct mtk_cpufreq_variant *variant)
|
||||
struct mtk_cpufreq_priv *priv)
|
||||
{
|
||||
struct mtk_cpufreq_data *data;
|
||||
struct mtk_cpufreq_domain *data;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
struct of_phandle_args args;
|
||||
|
|
@ -187,6 +191,8 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
|
|||
index = args.args[0];
|
||||
of_node_put(args.np);
|
||||
|
||||
data->parent = priv;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, index);
|
||||
if (!res) {
|
||||
dev_err(dev, "failed to get mem resource %d\n", index);
|
||||
|
|
@ -207,10 +213,9 @@ static int mtk_cpu_resources_init(struct platform_device *pdev,
|
|||
|
||||
data->base = base;
|
||||
data->res = res;
|
||||
data->variant = variant;
|
||||
|
||||
for (i = REG_FREQ_LUT_TABLE; i < REG_ARRAY_SIZE; i++)
|
||||
data->reg_bases[i] = base + variant->reg_offsets[i];
|
||||
data->reg_bases[i] = base + priv->variant->reg_offsets[i];
|
||||
|
||||
ret = mtk_cpu_create_freq_table(pdev, data);
|
||||
if (ret) {
|
||||
|
|
@ -231,7 +236,7 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
|
|||
{
|
||||
struct platform_device *pdev = cpufreq_get_driver_data();
|
||||
int sig, pwr_hw = CPUFREQ_HW_STATUS | SVS_HW_STATUS;
|
||||
struct mtk_cpufreq_data *data;
|
||||
struct mtk_cpufreq_domain *data;
|
||||
unsigned int latency;
|
||||
int ret;
|
||||
|
||||
|
|
@ -270,7 +275,7 @@ static int mtk_cpufreq_hw_cpu_init(struct cpufreq_policy *policy)
|
|||
|
||||
static void mtk_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct mtk_cpufreq_data *data = policy->driver_data;
|
||||
struct mtk_cpufreq_domain *data = policy->driver_data;
|
||||
struct resource *res = data->res;
|
||||
void __iomem *base = data->base;
|
||||
|
||||
|
|
@ -283,7 +288,7 @@ static void mtk_cpufreq_hw_cpu_exit(struct cpufreq_policy *policy)
|
|||
static void mtk_cpufreq_register_em(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct em_data_callback em_cb = EM_DATA_CB(mtk_cpufreq_get_cpu_power);
|
||||
struct mtk_cpufreq_data *data = policy->driver_data;
|
||||
struct mtk_cpufreq_domain *data = policy->driver_data;
|
||||
|
||||
em_dev_register_perf_domain(get_cpu_device(policy->cpu), data->nr_opp,
|
||||
&em_cb, policy->cpus, true);
|
||||
|
|
@ -305,6 +310,7 @@ static struct cpufreq_driver cpufreq_mtk_hw_driver = {
|
|||
|
||||
static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mtk_cpufreq_priv *priv;
|
||||
const void *data;
|
||||
int ret, cpu;
|
||||
struct device *cpu_dev;
|
||||
|
|
@ -328,7 +334,13 @@ static int mtk_cpufreq_hw_driver_probe(struct platform_device *pdev)
|
|||
if (!data)
|
||||
return -EINVAL;
|
||||
|
||||
platform_set_drvdata(pdev, (void *) data);
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->variant = data;
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
cpufreq_mtk_hw_driver.driver_data = pdev;
|
||||
|
||||
ret = cpufreq_register_driver(&cpufreq_mtk_hw_driver);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user