|  | /* | 
|  | * Copyright (c) 2012 Samsung Electronics Co., Ltd. | 
|  | *		http://www.samsung.com/ | 
|  | * | 
|  | * EXYNOS PPMU header | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or modify | 
|  | * it under the terms of the GNU General Public License version 2 as | 
|  | * published by the Free Software Foundation. | 
|  | */ | 
|  |  | 
|  | #ifndef __DEVFREQ_EXYNOS_PPMU_H | 
|  | #define __DEVFREQ_EXYNOS_PPMU_H __FILE__ | 
|  |  | 
|  | #include <linux/ktime.h> | 
|  |  | 
|  | /* For PPMU Control */ | 
|  | #define PPMU_ENABLE             BIT(0) | 
|  | #define PPMU_DISABLE            0x0 | 
|  | #define PPMU_CYCLE_RESET        BIT(1) | 
|  | #define PPMU_COUNTER_RESET      BIT(2) | 
|  |  | 
|  | #define PPMU_ENABLE_COUNT0      BIT(0) | 
|  | #define PPMU_ENABLE_COUNT1      BIT(1) | 
|  | #define PPMU_ENABLE_COUNT2      BIT(2) | 
|  | #define PPMU_ENABLE_COUNT3      BIT(3) | 
|  | #define PPMU_ENABLE_CYCLE       BIT(31) | 
|  |  | 
|  | #define PPMU_CNTENS		0x10 | 
|  | #define PPMU_FLAG		0x50 | 
|  | #define PPMU_CCNT_OVERFLOW	BIT(31) | 
|  | #define PPMU_CCNT		0x100 | 
|  |  | 
|  | #define PPMU_PMCNT0		0x110 | 
|  | #define PPMU_PMCNT_OFFSET	0x10 | 
|  | #define PMCNT_OFFSET(x)		(PPMU_PMCNT0 + (PPMU_PMCNT_OFFSET * x)) | 
|  |  | 
|  | #define PPMU_BEVT0SEL		0x1000 | 
|  | #define PPMU_BEVTSEL_OFFSET	0x100 | 
|  | #define PPMU_BEVTSEL(x)		(PPMU_BEVT0SEL + (ch * PPMU_BEVTSEL_OFFSET)) | 
|  |  | 
|  | /* For Event Selection */ | 
|  | #define RD_DATA_COUNT		0x5 | 
|  | #define WR_DATA_COUNT		0x6 | 
|  | #define RDWR_DATA_COUNT		0x7 | 
|  |  | 
|  | enum ppmu_counter { | 
|  | PPMU_PMNCNT0, | 
|  | PPMU_PMCCNT1, | 
|  | PPMU_PMNCNT2, | 
|  | PPMU_PMNCNT3, | 
|  | PPMU_PMNCNT_MAX, | 
|  | }; | 
|  |  | 
|  | struct bus_opp_table { | 
|  | unsigned int idx; | 
|  | unsigned long clk; | 
|  | unsigned long volt; | 
|  | }; | 
|  |  | 
|  | struct exynos_ppmu { | 
|  | void __iomem *hw_base; | 
|  | unsigned int ccnt; | 
|  | unsigned int event[PPMU_PMNCNT_MAX]; | 
|  | unsigned int count[PPMU_PMNCNT_MAX]; | 
|  | unsigned long long ns; | 
|  | ktime_t reset_time; | 
|  | bool ccnt_overflow; | 
|  | bool count_overflow[PPMU_PMNCNT_MAX]; | 
|  | }; | 
|  |  | 
|  | void exynos_ppmu_reset(void __iomem *ppmu_base); | 
|  | void exynos_ppmu_setevent(void __iomem *ppmu_base, unsigned int ch, | 
|  | unsigned int evt); | 
|  | void exynos_ppmu_start(void __iomem *ppmu_base); | 
|  | void exynos_ppmu_stop(void __iomem *ppmu_base); | 
|  | unsigned int exynos_ppmu_read(void __iomem *ppmu_base, unsigned int ch); | 
|  | #endif /* __DEVFREQ_EXYNOS_PPMU_H */ |