diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-12-05 23:20:17 +0000 | 
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2011-12-05 23:20:17 +0000 | 
| commit | 742eaa6a6e356a16788ce6530271de89bc4f8fb5 (patch) | |
| tree | 12fc040daab06ac796c61c1d92bfad9bb054d1c1 /arch/arm/kernel/perf_event.c | |
| parent | ba8bb18a03f8c7508565c385576a5431a4ad804a (diff) | |
| parent | ae72fd588a2b302222769b44775912b83f0785eb (diff) | |
| download | olio-linux-3.10-742eaa6a6e356a16788ce6530271de89bc4f8fb5.tar.xz olio-linux-3.10-742eaa6a6e356a16788ce6530271de89bc4f8fb5.zip  | |
Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/will/linux into devel-stable
Conflicts:
	arch/arm/common/gic.c
	arch/arm/plat-omap/include/plat/common.h
Diffstat (limited to 'arch/arm/kernel/perf_event.c')
| -rw-r--r-- | arch/arm/kernel/perf_event.c | 30 | 
1 files changed, 19 insertions, 11 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 24e2347be6b..172101ac97d 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -59,8 +59,7 @@ armpmu_get_pmu_id(void)  }  EXPORT_SYMBOL_GPL(armpmu_get_pmu_id); -int -armpmu_get_max_events(void) +int perf_num_counters(void)  {  	int max_events = 0; @@ -69,12 +68,6 @@ armpmu_get_max_events(void)  	return max_events;  } -EXPORT_SYMBOL_GPL(armpmu_get_max_events); - -int perf_num_counters(void) -{ -	return armpmu_get_max_events(); -}  EXPORT_SYMBOL_GPL(perf_num_counters);  #define HW_OP_UNSUPPORTED		0xFFFF @@ -343,8 +336,14 @@ validate_group(struct perf_event *event)  {  	struct perf_event *sibling, *leader = event->group_leader;  	struct pmu_hw_events fake_pmu; +	DECLARE_BITMAP(fake_used_mask, ARMPMU_MAX_HWEVENTS); -	memset(&fake_pmu, 0, sizeof(fake_pmu)); +	/* +	 * Initialise the fake PMU. We only need to populate the +	 * used_mask for the purposes of validation. +	 */ +	memset(fake_used_mask, 0, sizeof(fake_used_mask)); +	fake_pmu.used_mask = fake_used_mask;  	if (!validate_event(&fake_pmu, leader))  		return -ENOSPC; @@ -374,6 +373,8 @@ armpmu_release_hardware(struct arm_pmu *armpmu)  {  	int i, irq, irqs;  	struct platform_device *pmu_device = armpmu->plat_device; +	struct arm_pmu_platdata *plat = +		dev_get_platdata(&pmu_device->dev);  	irqs = min(pmu_device->num_resources, num_possible_cpus()); @@ -381,8 +382,11 @@ armpmu_release_hardware(struct arm_pmu *armpmu)  		if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))  			continue;  		irq = platform_get_irq(pmu_device, i); -		if (irq >= 0) +		if (irq >= 0) { +			if (plat && plat->disable_irq) +				plat->disable_irq(irq);  			free_irq(irq, armpmu); +		}  	}  	release_pmu(armpmu->type); @@ -396,6 +400,9 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)  	int i, err, irq, irqs;  	struct platform_device *pmu_device = armpmu->plat_device; +	if (!pmu_device) +		return -ENODEV; +  	err = reserve_pmu(armpmu->type);  	if (err) {  		pr_warning("unable to reserve pmu\n"); @@ -439,7 +446,8 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)  				irq);  			armpmu_release_hardware(armpmu);  			return err; -		} +		} else if (plat && plat->enable_irq) +			plat->enable_irq(irq);  		cpumask_set_cpu(i, &armpmu->active_irqs);  	}  |