Merge commit 'v2.6.39' into 20110526
[linux-2.6.git] / arch / arm / include / asm / pmu.h
1 /*
2  *  linux/arch/arm/include/asm/pmu.h
3  *
4  *  Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  */
11
12 #ifndef __ARM_PMU_H__
13 #define __ARM_PMU_H__
14
15 #include <linux/interrupt.h>
16
17 enum arm_pmu_type {
18         ARM_PMU_DEVICE_CPU      = 0,
19         ARM_NUM_PMU_DEVICES,
20 };
21
22 /*
23  * struct arm_pmu_platdata - ARM PMU platform data
24  *
25  * @handle_irq: an optional handler which will be called from the interrupt and
26  * passed the address of the low level handler, and can be used to implement
27  * any platform specific handling before or after calling it.
28  */
29 struct arm_pmu_platdata {
30         irqreturn_t (*handle_irq)(int irq, void *dev,
31                                   irq_handler_t pmu_handler);
32 };
33
34 #ifdef CONFIG_CPU_HAS_PMU
35
36 /**
37  * reserve_pmu() - reserve the hardware performance counters
38  *
39  * Reserve the hardware performance counters in the system for exclusive use.
40  * The platform_device for the system is returned on success, ERR_PTR()
41  * encoded error on failure.
42  */
43 extern struct platform_device *
44 reserve_pmu(enum arm_pmu_type device);
45
46 /**
47  * release_pmu() - Relinquish control of the performance counters
48  *
49  * Release the performance counters and allow someone else to use them.
50  * Callers must have disabled the counters and released IRQs before calling
51  * this. The platform_device returned from reserve_pmu() must be passed as
52  * a cookie.
53  */
54 extern int
55 release_pmu(struct platform_device *pdev);
56
57 /**
58  * init_pmu() - Initialise the PMU.
59  *
60  * Initialise the system ready for PMU enabling. This should typically set the
61  * IRQ affinity and nothing else. The users (oprofile/perf events etc) will do
62  * the actual hardware initialisation.
63  */
64 extern int
65 init_pmu(enum arm_pmu_type device);
66
67 #else /* CONFIG_CPU_HAS_PMU */
68
69 #include <linux/err.h>
70
71 static inline struct platform_device *
72 reserve_pmu(enum arm_pmu_type device)
73 {
74         return ERR_PTR(-ENODEV);
75 }
76
77 static inline int
78 release_pmu(struct platform_device *pdev)
79 {
80         return -ENODEV;
81 }
82
83 static inline int
84 init_pmu(enum arm_pmu_type device)
85 {
86         return -ENODEV;
87 }
88
89 #endif /* CONFIG_CPU_HAS_PMU */
90
91 #endif /* __ARM_PMU_H__ */