Blame view
drivers/cpufreq/sc520_freq.c
2.76 KB
2874c5fd2 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
2 3 4 5 6 |
/* * sc520_freq.c: cpufreq driver for the AMD Elan sc520 * * Copyright (C) 2005 Sean Young <sean@mess.org> * |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
7 8 9 10 |
* Based on elanfreq.c * * 2005-03-30: - initial revision */ |
1c5864e26 cpufreq: Use cons... |
11 |
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
12 13 14 15 16 17 |
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/cpufreq.h> |
6072ace43 [CPUFREQ] checkpa... |
18 19 |
#include <linux/timex.h> #include <linux/io.h> |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
20 |
|
fa8031aef cpufreq: Add supp... |
21 |
#include <asm/cpu_device_id.h> |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
22 |
#include <asm/msr.h> |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
23 24 25 26 27 |
#define MMCR_BASE 0xfffef000 /* The default base address */ #define OFFS_CPUCTL 0x2 /* CPU Control Register */ static __u8 __iomem *cpuctl; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
28 |
static struct cpufreq_frequency_table sc520_freq_table[] = { |
7f4b04614 cpufreq: create a... |
29 30 31 |
{0, 0x01, 100000}, {0, 0x02, 133000}, {0, 0, CPUFREQ_TABLE_END}, |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
32 33 34 35 36 37 38 39 |
}; static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu) { u8 clockspeed_reg = *cpuctl; switch (clockspeed_reg & 0x03) { default: |
1c5864e26 cpufreq: Use cons... |
40 41 |
pr_err("error: cpuctl register has unexpected value %02x ", |
b49c22a6c cpufreq: Convert ... |
42 |
clockspeed_reg); |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
43 44 45 46 47 48 |
case 0x01: return 100000; case 0x02: return 133000; } } |
9c0ebcf78 cpufreq: Implemen... |
49 |
static int sc520_freq_target(struct cpufreq_policy *policy, unsigned int state) |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
50 |
{ |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
51 |
u8 clockspeed_reg; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
52 53 54 |
local_irq_disable(); clockspeed_reg = *cpuctl & ~0x03; |
507015880 cpufreq: rename i... |
55 |
*cpuctl = clockspeed_reg | sc520_freq_table[state].driver_data; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
56 57 |
local_irq_enable(); |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
58 59 |
return 0; } |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
60 61 62 63 64 65 |
/* * Module init and exit code */ static int sc520_freq_cpu_init(struct cpufreq_policy *policy) { |
92cb7612a x86: convert cpui... |
66 |
struct cpuinfo_x86 *c = &cpu_data(0); |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
67 68 69 70 71 72 73 |
/* capability check */ if (c->x86_vendor != X86_VENDOR_AMD || c->x86 != 4 || c->x86_model != 9) return -ENODEV; /* cpuinfo and default policy values */ |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
74 |
policy->cpuinfo.transition_latency = 1000000; /* 1ms */ |
f35750c88 cpufreq: sc520: D... |
75 |
policy->freq_table = sc520_freq_table; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
76 |
|
f35750c88 cpufreq: sc520: D... |
77 |
return 0; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
78 |
} |
221dee285 Revert "[CPUFREQ]... |
79 |
static struct cpufreq_driver sc520_freq_driver = { |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
80 |
.get = sc520_freq_get_cpu_frequency, |
a823c4aec cpufreq: sc520: U... |
81 |
.verify = cpufreq_generic_frequency_table_verify, |
9c0ebcf78 cpufreq: Implemen... |
82 |
.target_index = sc520_freq_target, |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
83 |
.init = sc520_freq_cpu_init, |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
84 |
.name = "sc520_freq", |
a823c4aec cpufreq: sc520: U... |
85 |
.attr = cpufreq_generic_attr, |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
86 |
}; |
fa8031aef cpufreq: Add supp... |
87 |
static const struct x86_cpu_id sc520_ids[] = { |
b11d77fa3 cpufreq: Convert ... |
88 |
X86_MATCH_VENDOR_FAM_MODEL(AMD, 4, 9, NULL), |
fa8031aef cpufreq: Add supp... |
89 90 91 |
{} }; MODULE_DEVICE_TABLE(x86cpu, sc520_ids); |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
92 93 94 |
static int __init sc520_freq_init(void) { |
3e74341c7 [CPUFREQ] sc520_f... |
95 |
int err; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
96 |
|
fa8031aef cpufreq: Add supp... |
97 |
if (!x86_match_cpu(sc520_ids)) |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
98 |
return -ENODEV; |
fa8031aef cpufreq: Add supp... |
99 |
|
bf6fc9fd2 [CPUFREQ] AMD Ela... |
100 |
cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1); |
6072ace43 [CPUFREQ] checkpa... |
101 |
if (!cpuctl) { |
b49c22a6c cpufreq: Convert ... |
102 103 |
pr_err("sc520_freq: error: failed to remap memory "); |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
104 105 |
return -ENOMEM; } |
3e74341c7 [CPUFREQ] sc520_f... |
106 107 108 109 110 |
err = cpufreq_register_driver(&sc520_freq_driver); if (err) iounmap(cpuctl); return err; |
bf6fc9fd2 [CPUFREQ] AMD Ela... |
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
} static void __exit sc520_freq_exit(void) { cpufreq_unregister_driver(&sc520_freq_driver); iounmap(cpuctl); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Sean Young <sean@mess.org>"); MODULE_DESCRIPTION("cpufreq driver for AMD's Elan sc520 CPU"); module_init(sc520_freq_init); module_exit(sc520_freq_exit); |