cregit-Linux how code gets into the kernel

Release 4.14 arch/sparc/kernel/leon_pmc.c

// SPDX-License-Identifier: GPL-2.0
/* leon_pmc.c: LEON Power-down cpu_idle() handler
 *
 * Copyright (C) 2011 Daniel Hellstrom (daniel@gaisler.com) Aeroflex Gaisler AB
 */

#include <linux/init.h>
#include <linux/pm.h>

#include <asm/leon_amba.h>
#include <asm/cpu_type.h>
#include <asm/leon.h>
#include <asm/processor.h>

/* List of Systems that need fixup instructions around power-down instruction */

static unsigned int pmc_leon_fixup_ids[] = {
	AEROFLEX_UT699,
	GAISLER_GR712RC,
	LEON4_NEXTREME1,
	0
};


static int pmc_leon_need_fixup(void) { unsigned int systemid = amba_system_id >> 16; unsigned int *id; id = &pmc_leon_fixup_ids[0]; while (*id != 0) { if (*id == systemid) return 1; id++; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom5398.15%150.00%
Sam Ravnborg11.85%150.00%
Total54100.00%2100.00%

/* * CPU idle callback function for systems that need some extra handling * See .../arch/sparc/kernel/process.c */
static void pmc_leon_idle_fixup(void) { /* Prepare an address to a non-cachable region. APB is always * none-cachable. One instruction is executed after the Sleep * instruction, we make sure to read the bus and throw away the * value by accessing a non-cachable area, also we make sure the * MMU does not get a TLB miss here by using the MMU BYPASS ASI. */ register unsigned int address = (unsigned int)leon3_irqctrl_regs; /* Interrupts need to be enabled to not hang the CPU */ local_irq_enable(); __asm__ __volatile__ ( "wr %%g0, %%asr19\n" "lda [%0] %1, %%g0\n" : : "r"(address), "i"(ASI_LEON_BYPASS)); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom2177.78%125.00%
Andreas Larsson414.81%125.00%
David S. Miller13.70%125.00%
Sam Ravnborg13.70%125.00%
Total27100.00%4100.00%

/* * CPU idle callback function * See .../arch/sparc/kernel/process.c */
static void pmc_leon_idle(void) { /* Interrupts need to be enabled to not hang the CPU */ local_irq_enable(); /* For systems without power-down, this will be no-op */ __asm__ __volatile__ ("wr %g0, %asr19\n\t"); }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom1062.50%125.00%
Andreas Larsson425.00%125.00%
David S. Miller16.25%125.00%
Sam Ravnborg16.25%125.00%
Total16100.00%4100.00%

/* Install LEON Power Down function */
static int __init leon_pmc_install(void) { if (sparc_cpu_model == sparc_leon) { /* Assign power management IDLE handler */ if (pmc_leon_need_fixup()) sparc_idle = pmc_leon_idle_fixup; else sparc_idle = pmc_leon_idle; printk(KERN_INFO "leon: power management initialized\n"); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom3175.61%133.33%
Sam Ravnborg819.51%133.33%
Len Brown24.88%133.33%
Total41100.00%3100.00%

/* This driver is not critical to the boot process, don't care * if initialized late. */ late_initcall(leon_pmc_install);

Overall Contributors

PersonTokensPropCommitsCommitProp
Daniel Hellstrom15383.15%114.29%
Sam Ravnborg158.15%228.57%
Andreas Larsson84.35%114.29%
Len Brown52.72%114.29%
David S. Miller21.09%114.29%
Greg Kroah-Hartman10.54%114.29%
Total184100.00%7100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.