cregit-Linux how code gets into the kernel

Release 4.14 drivers/cpufreq/sc520_freq.c

Directory: drivers/cpufreq
/*
 *      sc520_freq.c: cpufreq driver for the AMD Elan sc520
 *
 *      Copyright (C) 2005 Sean Young <sean@mess.org>
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of the GNU General Public License
 *      as published by the Free Software Foundation; either version
 *      2 of the License, or (at your option) any later version.
 *
 *      Based on elanfreq.c
 *
 *      2005-03-30: - initial revision
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

#include <linux/delay.h>
#include <linux/cpufreq.h>
#include <linux/timex.h>
#include <linux/io.h>

#include <asm/cpu_device_id.h>
#include <asm/msr.h>


#define MMCR_BASE	0xfffef000	
/* The default base address */

#define OFFS_CPUCTL	0x2   
/* CPU Control Register */


static __u8 __iomem *cpuctl;


static struct cpufreq_frequency_table sc520_freq_table[] = {
	{0, 0x01,	100000},
	{0, 0x02,	133000},
	{0, 0,	CPUFREQ_TABLE_END},
};


static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu) { u8 clockspeed_reg = *cpuctl; switch (clockspeed_reg & 0x03) { default: pr_err("error: cpuctl register has unexpected value %02x\n", clockspeed_reg); case 0x01: return 100000; case 0x02: return 133000; } }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones4191.11%150.00%
Joe Perches48.89%150.00%
Total45100.00%2100.00%


static int sc520_freq_target(struct cpufreq_policy *policy, unsigned int state) { u8 clockspeed_reg; local_irq_disable(); clockspeed_reg = *cpuctl & ~0x03; *cpuctl = clockspeed_reg | sc520_freq_table[state].driver_data; local_irq_enable(); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones3982.98%125.00%
Viresh Kumar817.02%375.00%
Total47100.00%4100.00%

/* * Module init and exit code */
static int sc520_freq_cpu_init(struct cpufreq_policy *policy) { struct cpuinfo_x86 *c = &cpu_data(0); /* capability check */ if (c->x86_vendor != X86_VENDOR_AMD || c->x86 != 4 || c->x86_model != 9) return -ENODEV; /* cpuinfo and default policy values */ policy->cpuinfo.transition_latency = 1000000; /* 1ms */ return cpufreq_table_validate_and_show(policy, sc520_freq_table); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones5990.77%133.33%
Mike Travis46.15%133.33%
Viresh Kumar23.08%133.33%
Total65100.00%3100.00%

static struct cpufreq_driver sc520_freq_driver = { .get = sc520_freq_get_cpu_frequency, .verify = cpufreq_generic_frequency_table_verify, .target_index = sc520_freq_target, .init = sc520_freq_cpu_init, .name = "sc520_freq", .attr = cpufreq_generic_attr, }; static const struct x86_cpu_id sc520_ids[] = { { X86_VENDOR_AMD, 4, 9 }, {} }; MODULE_DEVICE_TABLE(x86cpu, sc520_ids);
static int __init sc520_freq_init(void) { int err; if (!x86_match_cpu(sc520_ids)) return -ENODEV; cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1); if (!cpuctl) { pr_err("sc520_freq: error: failed to remap memory\n"); return -ENOMEM; } err = cpufreq_register_driver(&sc520_freq_driver); if (err) iounmap(cpuctl); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones5571.43%125.00%
Amol Lad1722.08%125.00%
Andi Kleen45.19%125.00%
Joe Perches11.30%125.00%
Total77100.00%4100.00%


static void __exit sc520_freq_exit(void) { cpufreq_unregister_driver(&sc520_freq_driver); iounmap(cpuctl); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones20100.00%1100.00%
Total20100.00%1100.00%

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);

Overall Contributors

PersonTokensPropCommitsCommitProp
Dave Jones34180.05%215.38%
Andi Kleen337.75%17.69%
Viresh Kumar194.46%646.15%
Amol Lad173.99%17.69%
Joe Perches122.82%215.38%
Mike Travis40.94%17.69%
Total426100.00%13100.00%
Directory: drivers/cpufreq
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.