/* arch/arm/plat-s3c/include/plat/cpu-freq.h * * Copyright (c) 2006,2007 Simtec Electronics * http://armlinux.simtec.co.uk/ * Ben Dooks * * S3C CPU frequency scaling support - driver and board * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include struct s3c_cpufreq_info; struct s3c_cpufreq_board; struct s3c_iotimings; struct s3c_freq { unsigned long fclk; unsigned long armclk; unsigned long hclk_tns; /* in 10ths of ns */ unsigned long hclk; unsigned long pclk; }; /* wrapper 'struct cpufreq_freqs' so that any drivers receiving the * notification can use this information that is not provided by just * having the core frequency alone. */ struct s3c_cpufreq_freqs { struct cpufreq_freqs freqs; struct s3c_freq old; struct s3c_freq new; }; #define to_s3c_cpufreq(_cf) container_of(_cf, struct s3c_cpufreq_freqs, freqs) struct s3c_clkdivs { int p_divisor; /* fclk / pclk */ int h_divisor; /* fclk / hclk */ int arm_divisor; /* not all cpus have this. */ unsigned char dvs; /* using dvs mode to arm. */ }; #define PLLVAL(_m, _p, _s) (((_m) << 12) | ((_p) << 4) | (_s)) struct s3c_pllval { unsigned long freq; unsigned long pll_reg; }; struct s3c_cpufreq_config { struct s3c_freq freq; struct s3c_pllval pll; struct s3c_clkdivs divs; struct s3c_cpufreq_info *info; /* for core, not drivers */ struct s3c_cpufreq_board *board; }; /* s3c_cpufreq_board * * per-board configuraton information, such as memory refresh and * how to initialise IO timings. */ struct s3c_cpufreq_board { unsigned int refresh; /* refresh period in ns */ unsigned int auto_io:1; /* automatically init io timings. */ unsigned int need_io:1; /* set if needs io timing support. */ /* any non-zero field in here is taken as an upper limit. */ struct s3c_freq max; /* frequency limits */ }; /* Things depending on frequency scaling. */ #ifdef CONFIG_CPU_FREQ_S3C #define __init_or_cpufreq #else #define __init_or_cpufreq __init #endif /* Board functions */ #ifdef CONFIG_CPU_FREQ_S3C extern int s3c_cpufreq_setboard(struct s3c_cpufreq_board *board); #else static inline int s3c_cpufreq_setboard(struct s3c_cpufreq_board *board) { return 0; } #endif /* CONFIG_CPU_FREQ_S3C */