cregit-Linux how code gets into the kernel

Release 4.7 drivers/cpufreq/blackfin-cpufreq.c

Directory: drivers/cpufreq
/*
 * Blackfin core clock scaling
 *
 * Copyright 2008-2011 Analog Devices Inc.
 *
 * Licensed under the GPL-2 or later.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/clk.h>
#include <linux/cpufreq.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <asm/blackfin.h>
#include <asm/time.h>
#include <asm/dpmc.h>


/* this is the table of CCLK frequencies, in Hz */
/* .driver_data is the entry in the auxiliary dpm_state_table[] */

static struct cpufreq_frequency_table bfin_freq_table[] = {
	{
		.frequency = CPUFREQ_TABLE_END,
		.driver_data = 0,
        },
	{
		.frequency = CPUFREQ_TABLE_END,
		.driver_data = 1,
        },
	{
		.frequency = CPUFREQ_TABLE_END,
		.driver_data = 2,
        },
	{
		.frequency = CPUFREQ_TABLE_END,
		.driver_data = 0,
        },
};


static struct bfin_dpm_state {
	
unsigned int csel; /* system clock divider */
	
unsigned int tscale; /* change the divider on the core timer interrupt */
} 
dpm_state_table[3];

#if defined(CONFIG_CYCLES_CLOCKSOURCE)
/*
 * normalized to maximum frequency offset for CYCLES,
 * used in time-ts cycles clock source, but could be used
 * somewhere also.
 */

unsigned long long __bfin_cycles_off;

unsigned int __bfin_cycles_mod;
#endif

/**************************************************************************/

static void __init bfin_init_tables(unsigned long cclk, unsigned long sclk) { unsigned long csel, min_cclk; int index; /* Anomaly 273 seems to still exist on non-BF54x w/dcache turned on */ #if ANOMALY_05000273 || ANOMALY_05000274 || \ (!(defined(CONFIG_BF54x) || defined(CONFIG_BF60x)) \ && defined(CONFIG_BFIN_EXTMEM_DCACHEABLE)) min_cclk = sclk * 2; #else min_cclk = sclk; #endif #ifndef CONFIG_BF60x csel = ((bfin_read_PLL_DIV() & CSEL) >> 4); #else csel = bfin_read32(CGU0_DIV) & 0x1F; #endif for (index = 0; (cclk >> index) >= min_cclk && csel <= 3 && index < 3; index++, csel++) { bfin_freq_table[index].frequency = cclk >> index; #ifndef CONFIG_BF60x dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */ #else dpm_state_table[index].csel = csel; #endif dpm_state_table[index].tscale = (TIME_SCALE >> index) - 1; pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n", bfin_freq_table[index].frequency, dpm_state_table[index].csel, dpm_state_table[index].tscale); } return; }

Contributors

PersonTokensPropCommitsCommitProp
graf yanggraf yang14771.36%125.00%
steven miaosteven miao4119.90%125.00%
james cosinjames cosin104.85%125.00%
sonic zhangsonic zhang83.88%125.00%
Total206100.00%4100.00%


static void bfin_adjust_core_timer(void *info) { unsigned int tscale; unsigned int index = *(unsigned int *)info; /* we have to adjust the core timer, because it is using cclk */ tscale = dpm_state_table[index].tscale; bfin_write_TSCALE(tscale); return; }

Contributors

PersonTokensPropCommitsCommitProp
graf yanggraf yang42100.00%1100.00%
Total42100.00%1100.00%


static unsigned int bfin_getfreq_khz(unsigned int cpu) { /* Both CoreA/B have the same core clock */ return get_cclk() / 1000; }

Contributors

PersonTokensPropCommitsCommitProp
michael hennerichmichael hennerich1794.44%266.67%
graf yanggraf yang15.56%133.33%
Total18100.00%3100.00%

#ifdef CONFIG_BF60x
static int cpu_set_cclk(int cpu, unsigned long new) { struct clk *clk; int ret; clk = clk_get(NULL, "CCLK"); if (IS_ERR(clk)) return -ENODEV; ret = clk_set_rate(clk, new); clk_put(clk); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
steven miaosteven miao5696.55%133.33%
sf markus elfringsf markus elfring23.45%266.67%
Total58100.00%3100.00%

#endif
static int bfin_target(struct cpufreq_policy *policy, unsigned int index) { #ifndef CONFIG_BF60x unsigned int plldiv; #endif static unsigned long lpj_ref; static unsigned int lpj_ref_freq; unsigned int old_freq, new_freq; int ret = 0; #if defined(CONFIG_CYCLES_CLOCKSOURCE) cycles_t cycles; #endif old_freq = bfin_getfreq_khz(0); new_freq = bfin_freq_table[index].frequency; #ifndef CONFIG_BF60x plldiv = (bfin_read_PLL_DIV() & SSEL) | dpm_state_table[index].csel; bfin_write_PLL_DIV(plldiv); #else ret = cpu_set_cclk(policy->cpu, new_freq * 1000); if (ret != 0) { WARN_ONCE(ret, "cpufreq set freq failed %d\n", ret); return ret; } #endif on_each_cpu(bfin_adjust_core_timer, &index, 1); #if defined(CONFIG_CYCLES_CLOCKSOURCE) cycles = get_cycles(); SSYNC(); cycles += 10; /* ~10 cycles we lose after get_cycles() */ __bfin_cycles_off += (cycles << __bfin_cycles_mod) - (cycles << index); __bfin_cycles_mod = index; #endif if (!lpj_ref_freq) { lpj_ref = loops_per_jiffy; lpj_ref_freq = old_freq; } if (new_freq != old_freq) { loops_per_jiffy = cpufreq_scale(lpj_ref, lpj_ref_freq, new_freq); } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
graf yanggraf yang6328.77%216.67%
michael hennerichmichael hennerich5324.20%216.67%
steven miaosteven miao4018.26%216.67%
vitja makarovvitja makarov3013.70%18.33%
viresh kumarviresh kumar2611.87%325.00%
bob liubob liu62.74%18.33%
nick andrewnick andrew10.46%18.33%
Total219100.00%12100.00%


static int __bfin_cpu_init(struct cpufreq_policy *policy) { unsigned long cclk, sclk; cclk = get_cclk() / 1000; sclk = get_sclk() / 1000; if (policy->cpu == CPUFREQ_CPU) bfin_init_tables(cclk, sclk); policy->cpuinfo.transition_latency = 50000; /* 50us assumed */ return cpufreq_table_validate_and_show(policy, bfin_freq_table); }

Contributors

PersonTokensPropCommitsCommitProp
vitja makarovvitja makarov2742.86%114.29%
michael hennerichmichael hennerich2539.68%457.14%
graf yanggraf yang1015.87%114.29%
viresh kumarviresh kumar11.59%114.29%
Total63100.00%7100.00%

static struct cpufreq_driver bfin_driver = { .verify = cpufreq_generic_frequency_table_verify, .target_index = bfin_target, .get = bfin_getfreq_khz, .init = __bfin_cpu_init, .name = "bfin cpufreq", .attr = cpufreq_generic_attr, };
static int __init bfin_cpu_init(void) { return cpufreq_register_driver(&bfin_driver); }

Contributors

PersonTokensPropCommitsCommitProp
vitja makarovvitja makarov16100.00%1100.00%
Total16100.00%1100.00%


static void __exit bfin_cpu_exit(void) { cpufreq_unregister_driver(&bfin_driver); }

Contributors

PersonTokensPropCommitsCommitProp
vitja makarovvitja makarov15100.00%1100.00%
Total15100.00%1100.00%

MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); MODULE_DESCRIPTION("cpufreq driver for Blackfin"); MODULE_LICENSE("GPL"); module_init(bfin_cpu_init); module_exit(bfin_cpu_exit);

Overall Contributors

PersonTokensPropCommitsCommitProp
graf yanggraf yang27432.81%28.33%
michael hennerichmichael hennerich19723.59%520.83%
vitja makarovvitja makarov15118.08%14.17%
steven miaosteven miao14016.77%28.33%
viresh kumarviresh kumar354.19%625.00%
bob liubob liu111.32%14.17%
james cosinjames cosin101.20%14.17%
sonic zhangsonic zhang80.96%14.17%
paul gortmakerpaul gortmaker30.36%14.17%
mike frysingermike frysinger30.36%14.17%
sf markus elfringsf markus elfring20.24%28.33%
nick andrewnick andrew10.12%14.17%
Total835100.00%24100.00%
Directory: drivers/cpufreq
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}