summaryrefslogtreecommitdiffstats
path: root/drivers/of/base.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 18:59:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 18:59:39 -0400
commit40031da445fb4d269af9c7c445b2adf674f171e7 (patch)
tree021df7906708e939dee9978669a5461b12ff1296 /drivers/of/base.c
parentdcaaaeac871ff73043c616db3b2f91482637801d (diff)
parentf41b83126cba53849dd2353476a7715613af648f (diff)
Merge tag 'pm+acpi-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull ACPI and power management updates from Rafael Wysocki: 1) ACPI-based PCI hotplug (ACPIPHP) subsystem rework and introduction of Intel Thunderbolt support on systems that use ACPI for signalling Thunderbolt hotplug events. This also should make ACPIPHP work in some cases in which it was known to have problems. From Rafael J Wysocki, Mika Westerberg and Kirill A Shutemov. 2) ACPI core code cleanups and dock station support cleanups from Jiang Liu and Rafael J Wysocki. 3) Fixes for locking problems related to ACPI device hotplug from Rafael J Wysocki. 4) ACPICA update to version 20130725 includig fixes, cleanups, support for more than 256 GPEs per GPE block and a change to make the ACPI PM Timer optional (we've seen systems without the PM Timer in the field already). One of the fixes, related to the DeRefOf operator, is necessary to prevent some Windows 8 oriented AML from causing problems to happen. From Bob Moore, Lv Zheng, and Jung-uk Kim. 5) Removal of the old and long deprecated /proc/acpi/event interface and related driver changes from Thomas Renninger. 6) ACPI and Xen changes to make the reduced hardware sleep work with the latter from Ben Guthro. 7) ACPI video driver cleanups and a blacklist of systems that should not tell the BIOS that they are compatible with Windows 8 (or ACPI backlight and possibly other things will not work on them). From Felipe Contreras. 8) Assorted ACPI fixes and cleanups from Aaron Lu, Hanjun Guo, Kuppuswamy Sathyanarayanan, Lan Tianyu, Sachin Kamat, Tang Chen, Toshi Kani, and Wei Yongjun. 9) cpufreq ondemand governor target frequency selection change to reduce oscillations between min and max frequencies (essentially, it causes the governor to choose target frequencies proportional to load) from Stratos Karafotis. 10) cpufreq fixes allowing sysfs attributes file permissions to be preserved over suspend/resume cycles Srivatsa S Bhat. 11) Removal of Device Tree parsing for CPU device nodes from multiple cpufreq drivers that required some changes related to of_get_cpu_node() to be made in a few architectures and in the driver core. From Sudeep KarkadaNagesha. 12) cpufreq core fixes and cleanups related to mutual exclusion and driver module references from Viresh Kumar, Lukasz Majewski and Rafael J Wysocki. 13) Assorted cpufreq fixes and cleanups from Amit Daniel Kachhap, Bartlomiej Zolnierkiewicz, Hanjun Guo, Jingoo Han, Joseph Lo, Julia Lawall, Li Zhong, Mark Brown, Sascha Hauer, Stephen Boyd, Stratos Karafotis, and Viresh Kumar. 14) Fixes to prevent race conditions in coupled cpuidle from happening from Colin Cross. 15) cpuidle core fixes and cleanups from Daniel Lezcano and Tuukka Tikkanen. 16) Assorted cpuidle fixes and cleanups from Daniel Lezcano, Geert Uytterhoeven, Jingoo Han, Julia Lawall, Linus Walleij, and Sahara. 17) System sleep tracing changes from Todd E Brandt and Shuah Khan. 18) PNP subsystem conversion to using struct dev_pm_ops for power management from Shuah Khan. * tag 'pm+acpi-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (217 commits) cpufreq: Don't use smp_processor_id() in preemptible context cpuidle: coupled: fix race condition between pokes and safe state cpuidle: coupled: abort idle if pokes are pending cpuidle: coupled: disable interrupts after entering safe state ACPI / hotplug: Remove containers synchronously driver core / ACPI: Avoid device hot remove locking issues cpufreq: governor: Fix typos in comments cpufreq: governors: Remove duplicate check of target freq in supported range cpufreq: Fix timer/workqueue corruption due to double queueing ACPI / EC: Add ASUSTEK L4R to quirk list in order to validate ECDT ACPI / thermal: Add check of "_TZD" availability and evaluating result cpufreq: imx6q: Fix clock enable balance ACPI: blacklist win8 OSI for buggy laptops cpufreq: tegra: fix the wrong clock name cpuidle: Change struct menu_device field types cpuidle: Add a comment warning about possible overflow cpuidle: Fix variable domains in get_typical_interval() cpuidle: Fix menu_device->intervals type cpuidle: CodingStyle: Break up multiple assignments on single line cpuidle: Check called function parameter in get_typical_interval() ...
Diffstat (limited to 'drivers/of/base.c')
-rw-r--r--drivers/of/base.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 1c3c79c79742..e486e416d5a0 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -18,6 +18,7 @@
18 * 2 of the License, or (at your option) any later version. 18 * 2 of the License, or (at your option) any later version.
19 */ 19 */
20#include <linux/ctype.h> 20#include <linux/ctype.h>
21#include <linux/cpu.h>
21#include <linux/module.h> 22#include <linux/module.h>
22#include <linux/of.h> 23#include <linux/of.h>
23#include <linux/spinlock.h> 24#include <linux/spinlock.h>
@@ -231,6 +232,100 @@ const void *of_get_property(const struct device_node *np, const char *name,
231} 232}
232EXPORT_SYMBOL(of_get_property); 233EXPORT_SYMBOL(of_get_property);
233 234
235/*
236 * arch_match_cpu_phys_id - Match the given logical CPU and physical id
237 *
238 * @cpu: logical cpu index of a core/thread
239 * @phys_id: physical identifier of a core/thread
240 *
241 * CPU logical to physical index mapping is architecture specific.
242 * However this __weak function provides a default match of physical
243 * id to logical cpu index. phys_id provided here is usually values read
244 * from the device tree which must match the hardware internal registers.
245 *
246 * Returns true if the physical identifier and the logical cpu index
247 * correspond to the same core/thread, false otherwise.
248 */
249bool __weak arch_match_cpu_phys_id(int cpu, u64 phys_id)
250{
251 return (u32)phys_id == cpu;
252}
253
254/**
255 * Checks if the given "prop_name" property holds the physical id of the
256 * core/thread corresponding to the logical cpu 'cpu'. If 'thread' is not
257 * NULL, local thread number within the core is returned in it.
258 */
259static bool __of_find_n_match_cpu_property(struct device_node *cpun,
260 const char *prop_name, int cpu, unsigned int *thread)
261{
262 const __be32 *cell;
263 int ac, prop_len, tid;
264 u64 hwid;
265
266 ac = of_n_addr_cells(cpun);
267 cell = of_get_property(cpun, prop_name, &prop_len);
268 if (!cell)
269 return false;
270 prop_len /= sizeof(*cell);
271 for (tid = 0; tid < prop_len; tid++) {
272 hwid = of_read_number(cell, ac);
273 if (arch_match_cpu_phys_id(cpu, hwid)) {
274 if (thread)
275 *thread = tid;
276 return true;
277 }
278 cell += ac;
279 }
280 return false;
281}
282
283/**
284 * of_get_cpu_node - Get device node associated with the given logical CPU
285 *
286 * @cpu: CPU number(logical index) for which device node is required
287 * @thread: if not NULL, local thread number within the physical core is
288 * returned
289 *
290 * The main purpose of this function is to retrieve the device node for the
291 * given logical CPU index. It should be used to initialize the of_node in
292 * cpu device. Once of_node in cpu device is populated, all the further
293 * references can use that instead.
294 *
295 * CPU logical to physical index mapping is architecture specific and is built
296 * before booting secondary cores. This function uses arch_match_cpu_phys_id
297 * which can be overridden by architecture specific implementation.
298 *
299 * Returns a node pointer for the logical cpu if found, else NULL.
300 */
301struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
302{
303 struct device_node *cpun, *cpus;
304
305 cpus = of_find_node_by_path("/cpus");
306 if (!cpus) {
307 pr_warn("Missing cpus node, bailing out\n");
308 return NULL;
309 }
310
311 for_each_child_of_node(cpus, cpun) {
312 if (of_node_cmp(cpun->type, "cpu"))
313 continue;
314 /* Check for non-standard "ibm,ppc-interrupt-server#s" property
315 * for thread ids on PowerPC. If it doesn't exist fallback to
316 * standard "reg" property.
317 */
318 if (IS_ENABLED(CONFIG_PPC) &&
319 __of_find_n_match_cpu_property(cpun,
320 "ibm,ppc-interrupt-server#s", cpu, thread))
321 return cpun;
322 if (__of_find_n_match_cpu_property(cpun, "reg", cpu, thread))
323 return cpun;
324 }
325 return NULL;
326}
327EXPORT_SYMBOL(of_get_cpu_node);
328
234/** Checks if the given "compat" string matches one of the strings in 329/** Checks if the given "compat" string matches one of the strings in
235 * the device's "compatible" property 330 * the device's "compatible" property
236 */ 331 */