mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'pm-cpufreq'
* pm-cpufreq: (60 commits) cpufreq: pmac32-cpufreq: remove device tree parsing for cpu nodes cpufreq: pmac64-cpufreq: remove device tree parsing for cpu nodes cpufreq: maple-cpufreq: remove device tree parsing for cpu nodes cpufreq: arm_big_little: remove device tree parsing for cpu nodes cpufreq: kirkwood-cpufreq: remove device tree parsing for cpu nodes cpufreq: spear-cpufreq: remove device tree parsing for cpu nodes cpufreq: highbank-cpufreq: remove device tree parsing for cpu nodes cpufreq: cpufreq-cpu0: remove device tree parsing for cpu nodes cpufreq: imx6q-cpufreq: remove device tree parsing for cpu nodes drivers/bus: arm-cci: avoid parsing DT for cpu device nodes ARM: mvebu: remove device tree parsing for cpu nodes ARM: topology: remove hwid/MPIDR dependency from cpu_capacity of/device: add helper to get cpu device node from logical cpu index driver/core: cpu: initialize of_node in cpu's device struture ARM: DT/kernel: define ARM specific arch_match_cpu_phys_id of: move of_get_cpu_node implementation to DT core library powerpc: refactor of_get_cpu_node to support other architectures openrisc: remove undefined of_get_cpu_node declaration microblaze: remove undefined of_get_cpu_node declaration cpufreq: fix bad unlock balance on !CONFIG_SMP ...
This commit is contained in:
commit
7a330a5416
77 changed files with 917 additions and 1120 deletions
|
|
@ -18,6 +18,7 @@
|
|||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
|
@ -230,6 +231,100 @@ const void *of_get_property(const struct device_node *np, const char *name,
|
|||
}
|
||||
EXPORT_SYMBOL(of_get_property);
|
||||
|
||||
/*
|
||||
* arch_match_cpu_phys_id - Match the given logical CPU and physical id
|
||||
*
|
||||
* @cpu: logical cpu index of a core/thread
|
||||
* @phys_id: physical identifier of a core/thread
|
||||
*
|
||||
* CPU logical to physical index mapping is architecture specific.
|
||||
* However this __weak function provides a default match of physical
|
||||
* id to logical cpu index. phys_id provided here is usually values read
|
||||
* from the device tree which must match the hardware internal registers.
|
||||
*
|
||||
* Returns true if the physical identifier and the logical cpu index
|
||||
* correspond to the same core/thread, false otherwise.
|
||||
*/
|
||||
bool __weak arch_match_cpu_phys_id(int cpu, u64 phys_id)
|
||||
{
|
||||
return (u32)phys_id == cpu;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given "prop_name" property holds the physical id of the
|
||||
* core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
|
||||
* NULL, local thread number within the core is returned in it.
|
||||
*/
|
||||
static bool __of_find_n_match_cpu_property(struct device_node *cpun,
|
||||
const char *prop_name, int cpu, unsigned int *thread)
|
||||
{
|
||||
const __be32 *cell;
|
||||
int ac, prop_len, tid;
|
||||
u64 hwid;
|
||||
|
||||
ac = of_n_addr_cells(cpun);
|
||||
cell = of_get_property(cpun, prop_name, &prop_len);
|
||||
if (!cell)
|
||||
return false;
|
||||
prop_len /= sizeof(*cell);
|
||||
for (tid = 0; tid < prop_len; tid++) {
|
||||
hwid = of_read_number(cell, ac);
|
||||
if (arch_match_cpu_phys_id(cpu, hwid)) {
|
||||
if (thread)
|
||||
*thread = tid;
|
||||
return true;
|
||||
}
|
||||
cell += ac;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* of_get_cpu_node - Get device node associated with the given logical CPU
|
||||
*
|
||||
* @cpu: CPU number(logical index) for which device node is required
|
||||
* @thread: if not NULL, local thread number within the physical core is
|
||||
* returned
|
||||
*
|
||||
* The main purpose of this function is to retrieve the device node for the
|
||||
* given logical CPU index. It should be used to initialize the of_node in
|
||||
* cpu device. Once of_node in cpu device is populated, all the further
|
||||
* references can use that instead.
|
||||
*
|
||||
* CPU logical to physical index mapping is architecture specific and is built
|
||||
* before booting secondary cores. This function uses arch_match_cpu_phys_id
|
||||
* which can be overridden by architecture specific implementation.
|
||||
*
|
||||
* Returns a node pointer for the logical cpu if found, else NULL.
|
||||
*/
|
||||
struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
|
||||
{
|
||||
struct device_node *cpun, *cpus;
|
||||
|
||||
cpus = of_find_node_by_path("/cpus");
|
||||
if (!cpus) {
|
||||
pr_warn("Missing cpus node, bailing out\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for_each_child_of_node(cpus, cpun) {
|
||||
if (of_node_cmp(cpun->type, "cpu"))
|
||||
continue;
|
||||
/* Check for non-standard "ibm,ppc-interrupt-server#s" property
|
||||
* for thread ids on PowerPC. If it doesn't exist fallback to
|
||||
* standard "reg" property.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_PPC) &&
|
||||
__of_find_n_match_cpu_property(cpun,
|
||||
"ibm,ppc-interrupt-server#s", cpu, thread))
|
||||
return cpun;
|
||||
if (__of_find_n_match_cpu_property(cpun, "reg", cpu, thread))
|
||||
return cpun;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(of_get_cpu_node);
|
||||
|
||||
/** Checks if the given "compat" string matches one of the strings in
|
||||
* the device's "compatible" property
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue