1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/kernel.h>
4 #include <linux/proc_fs.h>
5 #include <linux/spinlock.h>
6 #include <linux/kthread.h>
7 #include <linux/hrtimer.h>
8 #include <linux/ktime.h>
9 #include <linux/interrupt.h>
10 #include <linux/syscore_ops.h>
11 #include <linux/platform_device.h>
12 #include <linux/kobject.h>
13 #include <linux/string.h>
15 #include "mach/mt_reg_base.h"
16 #include "mach/mt_typedefs.h"
18 #include "mach/irqs.h"
19 #include "mach/mt_ptp.h"
20 #include "mach/mt_cpufreq.h"
21 #include "mach/mt_thermal.h"
22 #include "mach/mt_spm_idle.h"
23 #include "mach/mt_pmic_wrap.h"
24 #include "mach/mt_clkmgr.h"
26 #include "mach/mtk_rtc_hal.h"
27 #include "mach/mt_rtc_hw.h"
28 #include "mach/mt_dcm.h"
32 volatile unsigned int ptp_data
[3] = {0xffffffff, 0, 0};
34 volatile unsigned int ptp_data
[3] = {0, 0, 0};
38 static unsigned int val_0
= 0x00000000;
39 static unsigned int val_1
= 0x00000000;
40 static unsigned int val_2
= 0x00000000;
41 static unsigned int val_3
= 0x00000000;
45 static unsigned int val_0
= 0x142B1607;
46 static unsigned int val_1
= 0xB0AAAAAA;
47 static unsigned int val_2
= 0x00000000;
48 static unsigned int val_3
= 0x20EA0588;
52 static unsigned int val_0
= 0x14052707;
53 static unsigned int val_1
= 0xB0AAAAAA;
54 static unsigned int val_2
= 0x00000000;
55 static unsigned int val_3
= 0x20EA0588;
59 static unsigned int val_0
= 0x14182A07;
60 static unsigned int val_1
= 0xB0AAAAAA;
61 static unsigned int val_2
= 0x00000000;
62 static unsigned int val_3
= 0x205B0588;
66 static unsigned int val_0
= 0x14E43D07;
67 static unsigned int val_1
= 0xB0AAAAAA;
68 static unsigned int val_2
= 0x00000000;
69 static unsigned int val_3
= 0x205B0588;
72 #define ptp_attr(_name) \
73 static struct kobj_attribute _name##_attr = { \
75 .name = __stringify(_name), \
78 .show = _name##_show, \
79 .store = _name##_store, \
82 static unsigned char freq_0
, freq_1
, freq_2
, freq_3
;
83 static unsigned char freq_4
, freq_5
, freq_6
, freq_7
;
85 static unsigned int ptp_level
;
87 static unsigned int ptp_array_size
= 0;
89 static unsigned int ptp_volt_0
, ptp_volt_1
, ptp_volt_2
, ptp_volt_3
;
90 static unsigned int ptp_volt_4
, ptp_volt_5
, ptp_volt_6
, ptp_volt_7
;
92 static unsigned int ptp_init2_volt_0
, ptp_init2_volt_1
, ptp_init2_volt_2
, ptp_init2_volt_3
;
93 static unsigned int ptp_init2_volt_4
, ptp_init2_volt_5
, ptp_init2_volt_6
, ptp_init2_volt_7
;
95 static unsigned int ptp_dcvoffset
= 0;
96 static unsigned int ptp_agevoffset
= 0;
98 static unsigned int ptpod_pmic_volt
[8] = {0x30, 0x30, 0x30, 0x30, 0x30, 0,0,0};
100 /* Extern function */
101 extern int mt_irq_mask_all(struct mtk_irq_mask
*mask
);
102 extern int mt_irq_mask_restore(struct mtk_irq_mask
*mask
);
104 extern unsigned int get_devinfo_with_index(unsigned int index
);
106 extern void mt_fh_popod_save(void);
107 extern void mt_fh_popod_restore(void);
109 extern unsigned int mt_cpufreq_max_frequency_by_DVS(unsigned int num
);
110 extern void mt_cpufreq_return_default_DVS_by_ptpod(void);
111 extern unsigned int mt_cpufreq_voltage_set_by_ptpod(unsigned int pmic_volt
[], unsigned int array_size
);
112 extern unsigned int mt_cpufreq_cur_vproc(void);
114 static struct hrtimer mt_ptp_log_timer
;
115 struct task_struct
*mt_ptp_log_thread
= NULL
;
116 static DECLARE_WAIT_QUEUE_HEAD(mt_ptp_log_timer_waiter
);
118 static int mt_ptp_log_timer_flag
= 0;
119 static int mt_ptp_log_period_s
= 2;
120 static int mt_ptp_log_period_ns
= 0;
122 static struct hrtimer mt_ptp_volt_timer
;
123 struct task_struct
*mt_ptp_volt_thread
= NULL
;
124 static DECLARE_WAIT_QUEUE_HEAD(mt_ptp_volt_timer_waiter
);
126 static int mt_ptp_volt_timer_flag
= 0;
127 static int mt_ptp_volt_period_s
= 0;
128 static int mt_ptp_volt_period_ns
= 10000;
130 static int mt_ptp_offset
= 0;
133 static int mt_ptp_enable
= 1;
135 static int mt_ptp_enable
= 0;
138 static unsigned int ptp_trasnfer_to_volt(unsigned int value
)
140 return (((value
* 625) / 100) + 700); // (700mv + n * 6.25mv)
143 enum hrtimer_restart
mt_ptp_log_timer_func(struct hrtimer
*timer
)
145 mt_ptp_log_timer_flag
= 1; wake_up_interruptible(&mt_ptp_log_timer_waiter
);
146 return HRTIMER_NORESTART
;
149 int mt_ptp_log_thread_handler(void *unused
)
153 ktime_t ktime
= ktime_set(mt_ptp_log_period_s
, mt_ptp_log_period_ns
);
155 wait_event_interruptible(mt_ptp_log_timer_waiter
, mt_ptp_log_timer_flag
!= 0);
156 mt_ptp_log_timer_flag
= 0;
158 ptp_notice("PTP_LOG: (%d) - (%d, %d, %d, %d, %d, %d, %d, %d) - (%d, %d, %d, %d, %d, %d, %d, %d)\n", \
159 mtktscpu_get_cpu_temp(), \
160 ptp_trasnfer_to_volt(ptpod_pmic_volt
[0]), \
161 ptp_trasnfer_to_volt(ptpod_pmic_volt
[1]), \
162 ptp_trasnfer_to_volt(ptpod_pmic_volt
[2]), \
163 ptp_trasnfer_to_volt(ptpod_pmic_volt
[3]), \
164 ptp_trasnfer_to_volt(ptpod_pmic_volt
[4]), \
165 ptp_trasnfer_to_volt(ptpod_pmic_volt
[5]), \
166 ptp_trasnfer_to_volt(ptpod_pmic_volt
[6]), \
167 ptp_trasnfer_to_volt(ptpod_pmic_volt
[7]), \
168 mt_cpufreq_max_frequency_by_DVS(0), \
169 mt_cpufreq_max_frequency_by_DVS(1), \
170 mt_cpufreq_max_frequency_by_DVS(2), \
171 mt_cpufreq_max_frequency_by_DVS(3), \
172 mt_cpufreq_max_frequency_by_DVS(4), \
173 mt_cpufreq_max_frequency_by_DVS(5), \
174 mt_cpufreq_max_frequency_by_DVS(6), \
175 mt_cpufreq_max_frequency_by_DVS(7));
177 hrtimer_start(&mt_ptp_log_timer
, ktime
, HRTIMER_MODE_REL
);
178 } while (!kthread_should_stop());
183 enum hrtimer_restart
mt_ptp_volt_timer_func(struct hrtimer
*timer
)
185 mt_ptp_volt_timer_flag
= 1; wake_up_interruptible(&mt_ptp_volt_timer_waiter
);
186 return HRTIMER_NORESTART
;
189 int mt_ptp_volt_thread_handler(void *unused
)
193 ktime_set(mt_ptp_volt_period_s
, mt_ptp_volt_period_ns
);
195 wait_event_interruptible(mt_ptp_volt_timer_waiter
, mt_ptp_volt_timer_flag
!= 0);
196 mt_ptp_volt_timer_flag
= 0;
198 mt_cpufreq_voltage_set_by_ptpod(ptpod_pmic_volt
, ptp_array_size
);
200 } while (!kthread_should_stop());
205 unsigned int PTP_get_ptp_level(void)
207 #if defined(CONFIG_MTK_FORCE_CPU_27T)
210 unsigned int spd_bin_resv
= 0, segment
= 0, ret
= 0;
212 segment
= (get_devinfo_with_index(15) >> 31) & 0x1; //M_HW_RES4
215 spd_bin_resv
= get_devinfo_with_index(15) & 0xFFFF; //M_HW_RES4
219 spd_bin_resv
= (get_devinfo_with_index(15) >> 16) & 0x7FFF; //M_HW_RES4
222 ptp_notice("spd_bin_resv(%d), M_HW_RES4(0x%x), M_HW2_RES2(0x%x)\n", spd_bin_resv
,
223 get_devinfo_with_index(15), get_devinfo_with_index(24));
227 if(spd_bin_resv
== 0x1000)
229 else if(spd_bin_resv
== 0x1001)
231 else if(spd_bin_resv
== 0x1003)
236 else if(spd_bin_resv
!= 0)
238 if(spd_bin_resv
== 0x1000)
239 ret
= 3; // 1.5G, 8127T
240 else if(spd_bin_resv
== 0x1001)
241 ret
= 0; // 1.3G, 8127
242 else if(spd_bin_resv
== 0x1003)
243 ret
= 0; // 1.3G, 8117
249 spd_bin_resv
= get_devinfo_with_index(24) & 0x7; //M_HW2_RES2
250 switch (spd_bin_resv
)
285 static void PTP_Initialization_01(PTP_INIT_T
* ptp_init_val
)
287 unsigned int temp_i
, temp_filter
, temp_value
;
289 // config PTP register
290 ptp_write(PTP_DESCHAR
, ((((ptp_init_val
->BDES
)<<8) & 0xff00) | ((ptp_init_val
->MDES
) & 0xff)));
291 ptp_write(PTP_TEMPCHAR
, ((((ptp_init_val
->VCO
)<<16) & 0xff0000) | (((ptp_init_val
->MTDES
)<<8) & 0xff00) | ((ptp_init_val
->DVTFIXED
) & 0xff)));
292 ptp_write(PTP_DETCHAR
, ((((ptp_init_val
->DCBDET
)<<8) & 0xff00) | ((ptp_init_val
->DCMDET
) & 0xff)));
293 ptp_write(PTP_AGECHAR
, ((((ptp_init_val
->AGEDELTA
)<<8) & 0xff00) | ((ptp_init_val
->AGEM
) & 0xff)));
294 ptp_write(PTP_DCCONFIG
, ((ptp_init_val
->DCCONFIG
)));
295 ptp_write(PTP_AGECONFIG
, ((ptp_init_val
->AGECONFIG
)));
297 if (ptp_init_val
->AGEM
== 0x0)
299 ptp_write(PTP_RUNCONFIG
, 0x80000000);
305 for (temp_i
= 0 ; temp_i
< 24 ; temp_i
+= 2)
307 temp_filter
= 0x3 << temp_i
;
309 if (((ptp_init_val
->AGECONFIG
) & temp_filter
) == 0x0)
311 temp_value
|= (0x1 << temp_i
);
315 temp_value
|= ((ptp_init_val
->AGECONFIG
) & temp_filter
);
318 ptp_write(PTP_RUNCONFIG
, temp_value
);
321 ptp_write(PTP_FREQPCT30
, ((((ptp_init_val
->FREQPCT3
) << 24)&0xff000000) | (((ptp_init_val
->FREQPCT2
) << 16) & 0xff0000) | (((ptp_init_val
->FREQPCT1
) << 8) & 0xff00) | ((ptp_init_val
->FREQPCT0
) & 0xff)));
322 ptp_write(PTP_FREQPCT74
, ((((ptp_init_val
->FREQPCT7
) << 24)&0xff000000) | (((ptp_init_val
->FREQPCT6
) << 16) & 0xff0000) | (((ptp_init_val
->FREQPCT5
) << 8) & 0xff00) | ((ptp_init_val
->FREQPCT4
) & 0xff)));
324 ptp_write(PTP_LIMITVALS
, ((((ptp_init_val
->VMAX
) << 24) & 0xff000000) | (((ptp_init_val
->VMIN
) << 16) & 0xff0000) | (((ptp_init_val
->DTHI
) << 8) & 0xff00) | ((ptp_init_val
->DTLO
) & 0xff)));
325 ptp_write(PTP_VBOOT
, (((ptp_init_val
->VBOOT
) & 0xff)));
326 ptp_write(PTP_DETWINDOW
, (((ptp_init_val
->DETWINDOW
) & 0xffff)));
327 ptp_write(PTP_PTPCONFIG
, (((ptp_init_val
->DETMAX
) & 0xffff)));
329 // clear all pending PTP interrupt & config PTPINTEN
330 ptp_write(PTP_PTPINTSTS
, 0xffffffff);
332 ptp_write(PTP_PTPINTEN
, 0x00005f01);
334 // enable PTP INIT measurement
335 ptp_write(PTP_PTPEN
, 0x00000001);
338 static void PTP_Initialization_02(PTP_INIT_T
* ptp_init_val
)
340 unsigned int temp_i
, temp_filter
, temp_value
;
342 // config PTP register
343 ptp_write(PTP_DESCHAR
, ((((ptp_init_val
->BDES
)<<8) & 0xff00) | ((ptp_init_val
->MDES
) & 0xff)));
344 ptp_write(PTP_TEMPCHAR
, ((((ptp_init_val
->VCO
)<<16) & 0xff0000) | (((ptp_init_val
->MTDES
)<<8) & 0xff00) | ((ptp_init_val
->DVTFIXED
) & 0xff)));
345 ptp_write(PTP_DETCHAR
, ((((ptp_init_val
->DCBDET
)<<8) & 0xff00) | ((ptp_init_val
->DCMDET
) & 0xff)));
346 ptp_write(PTP_AGECHAR
, ((((ptp_init_val
->AGEDELTA
)<<8) & 0xff00) | ((ptp_init_val
->AGEM
) & 0xff)));
347 ptp_write(PTP_DCCONFIG
, ((ptp_init_val
->DCCONFIG
)));
348 ptp_write(PTP_AGECONFIG
, ((ptp_init_val
->AGECONFIG
)));
350 if (ptp_init_val
->AGEM
== 0x0)
352 ptp_write(PTP_RUNCONFIG
, 0x80000000);
358 for (temp_i
= 0 ; temp_i
< 24 ; temp_i
+= 2 )
360 temp_filter
= 0x3 << temp_i
;
362 if( ((ptp_init_val
->AGECONFIG
) & temp_filter
) == 0x0 )
364 temp_value
|= (0x1 << temp_i
);
368 temp_value
|= ((ptp_init_val
->AGECONFIG
) & temp_filter
);
372 ptp_write(PTP_RUNCONFIG
, temp_value
);
375 ptp_write(PTP_FREQPCT30
, ((((ptp_init_val
->FREQPCT3
)<<24)&0xff000000) | (((ptp_init_val
->FREQPCT2
)<<16)&0xff0000) | (((ptp_init_val
->FREQPCT1
)<<8)&0xff00) | ((ptp_init_val
->FREQPCT0
) & 0xff)));
376 ptp_write(PTP_FREQPCT74
, ((((ptp_init_val
->FREQPCT7
)<<24)&0xff000000) | (((ptp_init_val
->FREQPCT6
)<<16)&0xff0000) | (((ptp_init_val
->FREQPCT5
)<<8)&0xff00) | ((ptp_init_val
->FREQPCT4
) & 0xff)));
378 ptp_write(PTP_LIMITVALS
, ((((ptp_init_val
->VMAX
)<<24)&0xff000000) | (((ptp_init_val
->VMIN
)<<16)&0xff0000) | (((ptp_init_val
->DTHI
)<<8)&0xff00) | ((ptp_init_val
->DTLO
) & 0xff)));
379 ptp_write(PTP_VBOOT
, (((ptp_init_val
->VBOOT
)&0xff)));
380 ptp_write(PTP_DETWINDOW
, (((ptp_init_val
->DETWINDOW
)&0xffff)));
381 ptp_write(PTP_PTPCONFIG
, (((ptp_init_val
->DETMAX
)&0xffff)));
383 // clear all pending PTP interrupt & config PTPINTEN
384 ptp_write(PTP_PTPINTSTS
, 0xffffffff);
386 ptp_write(PTP_PTPINTEN
, 0x00005f01);
388 ptp_write(PTP_INIT2VALS
, ((((ptp_init_val
->AGEVOFFSETIN
)<<16) & 0xffff0000) | ((ptp_init_val
->DCVOFFSETIN
) & 0xffff)));
390 // enable PTP INIT measurement
391 ptp_write(PTP_PTPEN
, 0x00000005);
394 static void PTP_Monitor_Mode(PTP_INIT_T
* ptp_init_val
)
396 unsigned int temp_i
, temp_filter
, temp_value
;
398 // config PTP register
399 ptp_write(PTP_DESCHAR
, ((((ptp_init_val
->BDES
)<<8) & 0xff00) | ((ptp_init_val
->MDES
) & 0xff)));
400 ptp_write(PTP_TEMPCHAR
, ((((ptp_init_val
->VCO
)<<16) & 0xff0000) | (((ptp_init_val
->MTDES
)<<8) & 0xff00) | ((ptp_init_val
->DVTFIXED
) & 0xff)));
401 ptp_write(PTP_DETCHAR
, ((((ptp_init_val
->DCBDET
)<<8) & 0xff00) | ((ptp_init_val
->DCMDET
) & 0xff)));
402 ptp_write(PTP_AGECHAR
, ((((ptp_init_val
->AGEDELTA
)<<8) & 0xff00) | ((ptp_init_val
->AGEM
) & 0xff)));
403 ptp_write(PTP_DCCONFIG
, ((ptp_init_val
->DCCONFIG
)));
404 ptp_write(PTP_AGECONFIG
, ((ptp_init_val
->AGECONFIG
)));
405 ptp_write(PTP_TSCALCS
, ((((ptp_init_val
->BTS
)<<12) & 0xfff000) | ((ptp_init_val
->MTS
) & 0xfff)));
407 if (ptp_init_val
->AGEM
== 0x0)
409 ptp_write(PTP_RUNCONFIG
, 0x80000000);
415 for (temp_i
= 0 ; temp_i
< 24 ; temp_i
+= 2 )
417 temp_filter
= 0x3 << temp_i
;
419 if( ((ptp_init_val
->AGECONFIG
) & temp_filter
) == 0x0 )
421 temp_value
|= (0x1 << temp_i
);
425 temp_value
|= ((ptp_init_val
->AGECONFIG
) & temp_filter
);
429 ptp_write(PTP_RUNCONFIG
, temp_value
);
432 ptp_write(PTP_FREQPCT30
, ((((ptp_init_val
->FREQPCT3
)<<24)&0xff000000) | (((ptp_init_val
->FREQPCT2
)<<16)&0xff0000) | (((ptp_init_val
->FREQPCT1
)<<8)&0xff00) | ((ptp_init_val
->FREQPCT0
) & 0xff)));
433 ptp_write(PTP_FREQPCT74
, ((((ptp_init_val
->FREQPCT7
)<<24)&0xff000000) | (((ptp_init_val
->FREQPCT6
)<<16)&0xff0000) | (((ptp_init_val
->FREQPCT5
)<<8)&0xff00) | ((ptp_init_val
->FREQPCT4
) & 0xff)));
435 ptp_write(PTP_LIMITVALS
, ((((ptp_init_val
->VMAX
)<<24)&0xff000000) | (((ptp_init_val
->VMIN
)<<16)&0xff0000) | (((ptp_init_val
->DTHI
)<<8)&0xff00) | ((ptp_init_val
->DTLO
) & 0xff)));
436 ptp_write(PTP_VBOOT
, (((ptp_init_val
->VBOOT
)&0xff)));
437 ptp_write(PTP_DETWINDOW
, (((ptp_init_val
->DETWINDOW
)&0xffff)));
438 ptp_write(PTP_PTPCONFIG
, (((ptp_init_val
->DETMAX
)&0xffff)));
440 // clear all pending PTP interrupt & config PTPINTEN
441 ptp_write(PTP_PTPINTSTS
, 0xffffffff);
443 ptp_write(PTP_PTPINTEN
, 0x00FF0000);
445 // enable PTP monitor mode
446 ptp_write(PTP_PTPEN
, 0x00000002);
449 unsigned int PTP_INIT_01(void)
451 PTP_INIT_T ptp_init_value
;
453 ptp_data
[0] = 0xffffffff;
455 ptp_notice("PTP_INIT_01() start (ptp_level = 0x%x).\n", ptp_level
);
457 ptp_init_value
.PTPINITEN
= (val_0
) & 0x1;
458 ptp_init_value
.PTPMONEN
= (val_0
>> 1) & 0x1;
459 ptp_init_value
.MDES
= (val_0
>> 8) & 0xff;
460 ptp_init_value
.BDES
= (val_0
>> 16) & 0xff;
461 ptp_init_value
.DCMDET
= (val_0
>> 24) & 0xff;
463 ptp_init_value
.DCCONFIG
= (val_1
) & 0xffffff;
464 ptp_init_value
.DCBDET
= (val_1
>> 24) & 0xff;
466 ptp_init_value
.AGECONFIG
= (val_2
) & 0xffffff;
467 ptp_init_value
.AGEM
= (val_2
>> 24) & 0xff;
469 ptp_init_value
.AGEDELTA
= (val_3
) & 0xff;
470 ptp_init_value
.DVTFIXED
= (val_3
>> 8) & 0xff;
471 ptp_init_value
.MTDES
= (val_3
>> 16) & 0xff;
472 ptp_init_value
.VCO
= (val_3
>> 24) & 0xff;
474 ptp_init_value
.FREQPCT0
= freq_0
;
475 ptp_init_value
.FREQPCT1
= freq_1
;
476 ptp_init_value
.FREQPCT2
= freq_2
;
477 ptp_init_value
.FREQPCT3
= freq_3
;
478 ptp_init_value
.FREQPCT4
= freq_4
;
479 ptp_init_value
.FREQPCT5
= freq_5
;
480 ptp_init_value
.FREQPCT6
= freq_6
;
481 ptp_init_value
.FREQPCT7
= freq_7
;
483 ptp_init_value
.DETWINDOW
= 0xa28; // 100 us, This is the PTP Detector sampling time as represented in cycles of bclk_ck during INIT. 52 MHz
484 ptp_init_value
.VMAX
= 0x60; // 1.3v (700mv + n * 6.25mv)
486 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
487 ptp_init_value
.VMIN
= 0x38; // 1.05v (700mv + n * 6.25mv)
489 ptp_init_value
.VMIN
= 0x48; // 1.15v (700mv + n * 6.25mv)
492 ptp_init_value
.DTHI
= 0x01; // positive
493 ptp_init_value
.DTLO
= 0xfe; // negative (2¡¦s compliment)
494 ptp_init_value
.VBOOT
= 0x48; // 1.15v (700mv + n * 6.25mv)
495 ptp_init_value
.DETMAX
= 0xffff; // This timeout value is in cycles of bclk_ck.
497 if (ptp_init_value
.PTPINITEN
== 0x0)
499 ptp_notice("PTPINITEN = 0x%x \n", ptp_init_value
.PTPINITEN
);
504 ptp_notice("PTPINITEN = 0x%x\n", ptp_init_value
.PTPINITEN
);
505 ptp_notice("PTPMONEN = 0x%x\n", ptp_init_value
.PTPMONEN
);
506 ptp_notice("MDES = 0x%x\n", ptp_init_value
.MDES
);
507 ptp_notice("BDES = 0x%x\n", ptp_init_value
.BDES
);
508 ptp_notice("DCMDET = 0x%x\n", ptp_init_value
.DCMDET
);
509 ptp_notice("DCCONFIG = 0x%x\n", ptp_init_value
.DCCONFIG
);
510 ptp_notice("DCBDET = 0x%x\n", ptp_init_value
.DCBDET
);
511 ptp_notice("AGECONFIG = 0x%x\n", ptp_init_value
.AGECONFIG
);
512 ptp_notice("AGEM = 0x%x\n", ptp_init_value
.AGEM
);
513 ptp_notice("AGEDELTA = 0x%x\n", ptp_init_value
.AGEDELTA
);
514 ptp_notice("DVTFIXED = 0x%x\n", ptp_init_value
.DVTFIXED
);
515 ptp_notice("MTDES = 0x%x\n", ptp_init_value
.MTDES
);
516 ptp_notice("VCO = 0x%x\n", ptp_init_value
.VCO
);
517 ptp_notice("FREQPCT0 = %d\n", ptp_init_value
.FREQPCT0
);
518 ptp_notice("FREQPCT1 = %d\n", ptp_init_value
.FREQPCT1
);
519 ptp_notice("FREQPCT2 = %d\n", ptp_init_value
.FREQPCT2
);
520 ptp_notice("FREQPCT3 = %d\n", ptp_init_value
.FREQPCT3
);
521 ptp_notice("FREQPCT4 = %d\n", ptp_init_value
.FREQPCT4
);
522 ptp_notice("FREQPCT5 = %d\n", ptp_init_value
.FREQPCT5
);
523 ptp_notice("FREQPCT6 = %d\n", ptp_init_value
.FREQPCT6
);
524 ptp_notice("FREQPCT7 = %d\n", ptp_init_value
.FREQPCT7
);
526 bus_dcm_disable(); //make sure bus dcm disable for PTP init 01
527 mt_fh_popod_save(); // disable frequency hopping (main PLL)
528 mt_cpufreq_disable_by_ptpod(); // disable DVFS and set vproc = 1.15v (1 GHz)
530 PTP_Initialization_01(&ptp_init_value
);
535 unsigned int PTP_INIT_02(void)
537 PTP_INIT_T ptp_init_value
;
539 ptp_data
[0] = 0xffffffff;
541 ptp_notice("PTP_INIT_02() start (ptp_level = 0x%x).\n", ptp_level
);
543 ptp_init_value
.PTPINITEN
= (val_0
) & 0x1;
544 ptp_init_value
.PTPMONEN
= (val_0
>> 1) & 0x1;
545 ptp_init_value
.MDES
= (val_0
>> 8) & 0xff;
546 ptp_init_value
.BDES
= (val_0
>> 16) & 0xff;
547 ptp_init_value
.DCMDET
= (val_0
>> 24) & 0xff;
549 ptp_init_value
.DCCONFIG
= (val_1
) & 0xffffff;
550 ptp_init_value
.DCBDET
= (val_1
>> 24) & 0xff;
552 ptp_init_value
.AGECONFIG
= (val_2
) & 0xffffff;
553 ptp_init_value
.AGEM
= (val_2
>> 24) & 0xff;
555 ptp_init_value
.AGEDELTA
= (val_3
) & 0xff;
556 ptp_init_value
.DVTFIXED
= (val_3
>> 8) & 0xff;
557 ptp_init_value
.MTDES
= (val_3
>> 16) & 0xff;
558 ptp_init_value
.VCO
= (val_3
>> 24) & 0xff;
560 ptp_init_value
.FREQPCT0
= freq_0
;
561 ptp_init_value
.FREQPCT1
= freq_1
;
562 ptp_init_value
.FREQPCT2
= freq_2
;
563 ptp_init_value
.FREQPCT3
= freq_3
;
564 ptp_init_value
.FREQPCT4
= freq_4
;
565 ptp_init_value
.FREQPCT5
= freq_5
;
566 ptp_init_value
.FREQPCT6
= freq_6
;
567 ptp_init_value
.FREQPCT7
= freq_7
;
569 ptp_init_value
.DETWINDOW
= 0xa28; // 100 us, This is the PTP Detector sampling time as represented in cycles of bclk_ck during INIT. 52 MHz
570 ptp_init_value
.VMAX
= 0x60; // 1.3v (700mv + n * 6.25mv)
572 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
573 ptp_init_value
.VMIN
= 0x38; // 1.05v (700mv + n * 6.25mv)
575 ptp_init_value
.VMIN
= 0x48; // 1.15v (700mv + n * 6.25mv)
578 ptp_init_value
.DTHI
= 0x01; // positive
579 ptp_init_value
.DTLO
= 0xfe; // negative (2¡¦s compliment)
580 ptp_init_value
.VBOOT
= 0x48; // 1.15v (700mv + n * 6.25mv)
581 ptp_init_value
.DETMAX
= 0xffff; // This timeout value is in cycles of bclk_ck.
583 ptp_init_value
.DCVOFFSETIN
= ptp_dcvoffset
;
584 ptp_init_value
.AGEVOFFSETIN
= ptp_agevoffset
;
586 ptp_notice("DCVOFFSETIN = 0x%x \n", ptp_init_value
.DCVOFFSETIN
);
587 ptp_notice("AGEVOFFSETIN = 0x%x \n", ptp_init_value
.AGEVOFFSETIN
);
589 if (ptp_init_value
.PTPINITEN
== 0x0)
591 ptp_notice("PTPINITEN = 0x%x \n", ptp_init_value
.PTPINITEN
);
596 ptp_isr_info("PTPINITEN = 0x%x\n", ptp_init_value
.PTPINITEN
);
597 ptp_isr_info("PTPMONEN = 0x%x\n", ptp_init_value
.PTPMONEN
);
598 ptp_isr_info("MDES = 0x%x\n", ptp_init_value
.MDES
);
599 ptp_isr_info("BDES = 0x%x\n", ptp_init_value
.BDES
);
600 ptp_isr_info("DCMDET = 0x%x\n", ptp_init_value
.DCMDET
);
601 ptp_isr_info("DCCONFIG = 0x%x\n", ptp_init_value
.DCCONFIG
);
602 ptp_isr_info("DCBDET = 0x%x\n", ptp_init_value
.DCBDET
);
603 ptp_isr_info("AGECONFIG = 0x%x\n", ptp_init_value
.AGECONFIG
);
604 ptp_isr_info("AGEM = 0x%x\n", ptp_init_value
.AGEM
);
605 ptp_isr_info("AGEDELTA = 0x%x\n", ptp_init_value
.AGEDELTA
);
606 ptp_isr_info("DVTFIXED = 0x%x\n", ptp_init_value
.DVTFIXED
);
607 ptp_isr_info("MTDES = 0x%x\n", ptp_init_value
.MTDES
);
608 ptp_isr_info("VCO = 0x%x\n", ptp_init_value
.VCO
);
609 ptp_isr_info("DCVOFFSETIN = 0x%x\n", ptp_init_value
.DCVOFFSETIN
);
610 ptp_isr_info("AGEVOFFSETIN = 0x%x\n", ptp_init_value
.AGEVOFFSETIN
);
611 ptp_isr_info("FREQPCT0 = %d\n", ptp_init_value
.FREQPCT0
);
612 ptp_isr_info("FREQPCT1 = %d\n", ptp_init_value
.FREQPCT1
);
613 ptp_isr_info("FREQPCT2 = %d\n", ptp_init_value
.FREQPCT2
);
614 ptp_isr_info("FREQPCT3 = %d\n", ptp_init_value
.FREQPCT3
);
615 ptp_isr_info("FREQPCT4 = %d\n", ptp_init_value
.FREQPCT4
);
616 ptp_isr_info("FREQPCT5 = %d\n", ptp_init_value
.FREQPCT5
);
617 ptp_isr_info("FREQPCT6 = %d\n", ptp_init_value
.FREQPCT6
);
618 ptp_isr_info("FREQPCT7 = %d\n", ptp_init_value
.FREQPCT7
);
620 PTP_Initialization_02(&ptp_init_value
);
625 unsigned int PTP_MON_MODE(void)
627 PTP_INIT_T ptp_init_value
;
628 struct TS_PTPOD ts_info
;
630 ptp_notice("PTP_MON_MODE() start (ptp_level = 0x%x).\n", ptp_level
);
632 ptp_init_value
.PTPINITEN
= (val_0
) & 0x1;
633 ptp_init_value
.PTPMONEN
= (val_0
>> 1) & 0x1;
634 ptp_init_value
.ADC_CALI_EN
= (val_0
>> 2) & 0x1;
635 ptp_init_value
.MDES
= (val_0
>> 8) & 0xff;
636 ptp_init_value
.BDES
= (val_0
>> 16) & 0xff;
637 ptp_init_value
.DCMDET
= (val_0
>> 24) & 0xff;
639 ptp_init_value
.DCCONFIG
= (val_1
) & 0xffffff;
640 ptp_init_value
.DCBDET
= (val_1
>> 24) & 0xff;
642 ptp_init_value
.AGECONFIG
= (val_2
) & 0xffffff;
643 ptp_init_value
.AGEM
= (val_2
>> 24) & 0xff;
645 ptp_init_value
.AGEDELTA
= (val_3
) & 0xff;
646 ptp_init_value
.DVTFIXED
= (val_3
>> 8) & 0xff;
647 ptp_init_value
.MTDES
= (val_3
>> 16) & 0xff;
648 ptp_init_value
.VCO
= (val_3
>> 24) & 0xff;
650 get_thermal_slope_intercept(&ts_info
);
651 ptp_init_value
.MTS
= ts_info
.ts_MTS
;
652 ptp_init_value
.BTS
= ts_info
.ts_BTS
;
654 ptp_init_value
.FREQPCT0
= freq_0
;
655 ptp_init_value
.FREQPCT1
= freq_1
;
656 ptp_init_value
.FREQPCT2
= freq_2
;
657 ptp_init_value
.FREQPCT3
= freq_3
;
658 ptp_init_value
.FREQPCT4
= freq_4
;
659 ptp_init_value
.FREQPCT5
= freq_5
;
660 ptp_init_value
.FREQPCT6
= freq_6
;
661 ptp_init_value
.FREQPCT7
= freq_7
;
663 ptp_init_value
.DETWINDOW
= 0xa28; // 100 us, This is the PTP Detector sampling time as represented in cycles of bclk_ck during INIT. 52 MHz
664 ptp_init_value
.VMAX
= 0x60; // 1.3v (700mv + n * 6.25mv)
666 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
667 ptp_init_value
.VMIN
= 0x38; // 1.05v (700mv + n * 6.25mv)
669 ptp_init_value
.VMIN
= 0x48; // 1.15v (700mv + n * 6.25mv)
672 ptp_init_value
.DTHI
= 0x01; // positive
673 ptp_init_value
.DTLO
= 0xfe; // negative (2¡¦s compliment)
674 ptp_init_value
.VBOOT
= 0x48; // 1.15v (700mv + n * 6.25mv)
675 ptp_init_value
.DETMAX
= 0xffff; // This timeout value is in cycles of bclk_ck.
677 if( (ptp_init_value
.PTPINITEN
== 0x0) || (ptp_init_value
.PTPMONEN
== 0x0) )
679 ptp_notice("PTPINITEN = 0x%x, PTPMONEN = 0x%x, ADC_CALI_EN = 0x%x \n", ptp_init_value
.PTPINITEN
, ptp_init_value
.PTPMONEN
, ptp_init_value
.ADC_CALI_EN
);
683 ptp_isr_info("PTPINITEN = 0x%x\n", ptp_init_value
.PTPINITEN
);
684 ptp_isr_info("PTPMONEN = 0x%x\n", ptp_init_value
.PTPMONEN
);
685 ptp_isr_info("MDES = 0x%x\n", ptp_init_value
.MDES
);
686 ptp_isr_info("BDES = 0x%x\n", ptp_init_value
.BDES
);
687 ptp_isr_info("DCMDET = 0x%x\n", ptp_init_value
.DCMDET
);
688 ptp_isr_info("DCCONFIG = 0x%x\n", ptp_init_value
.DCCONFIG
);
689 ptp_isr_info("DCBDET = 0x%x\n", ptp_init_value
.DCBDET
);
690 ptp_isr_info("AGECONFIG = 0x%x\n", ptp_init_value
.AGECONFIG
);
691 ptp_isr_info("AGEM = 0x%x\n", ptp_init_value
.AGEM
);
692 ptp_isr_info("AGEDELTA = 0x%x\n", ptp_init_value
.AGEDELTA
);
693 ptp_isr_info("DVTFIXED = 0x%x\n", ptp_init_value
.DVTFIXED
);
694 ptp_isr_info("MTDES = 0x%x\n", ptp_init_value
.MTDES
);
695 ptp_isr_info("VCO = 0x%x\n", ptp_init_value
.VCO
);
696 ptp_isr_info("MTS = 0x%x\n", ptp_init_value
.MTS
);
697 ptp_isr_info("BTS = 0x%x\n", ptp_init_value
.BTS
);
698 ptp_isr_info("FREQPCT0 = %d\n", ptp_init_value
.FREQPCT0
);
699 ptp_isr_info("FREQPCT1 = %d\n", ptp_init_value
.FREQPCT1
);
700 ptp_isr_info("FREQPCT2 = %d\n", ptp_init_value
.FREQPCT2
);
701 ptp_isr_info("FREQPCT3 = %d\n", ptp_init_value
.FREQPCT3
);
702 ptp_isr_info("FREQPCT4 = %d\n", ptp_init_value
.FREQPCT4
);
703 ptp_isr_info("FREQPCT5 = %d\n", ptp_init_value
.FREQPCT5
);
704 ptp_isr_info("FREQPCT6 = %d\n", ptp_init_value
.FREQPCT6
);
705 ptp_isr_info("FREQPCT7 = %d\n", ptp_init_value
.FREQPCT7
);
707 PTP_Monitor_Mode(&ptp_init_value
);
712 static void PTP_set_ptp_volt(void)
716 ktime_t ktime
= ktime_set(mt_ptp_volt_period_s
, mt_ptp_volt_period_ns
);
722 ptpod_pmic_volt
[0] = ptp_volt_0
+ mt_ptp_offset
;
723 if (ptpod_pmic_volt
[0] > 0x60)
725 ptpod_pmic_volt
[0] = 0x60;
729 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
730 if (ptpod_pmic_volt
[0] < 0x38)
732 ptpod_pmic_volt
[0] = 0x38;
735 if (ptpod_pmic_volt
[0] < 0x48)
737 ptpod_pmic_volt
[0] = 0x48;
746 ptpod_pmic_volt
[1] = ptp_volt_1
+ mt_ptp_offset
;
747 if (ptpod_pmic_volt
[1] > 0x60)
749 ptpod_pmic_volt
[1] = 0x60;
753 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
754 if (ptpod_pmic_volt
[1] < 0x38)
756 ptpod_pmic_volt
[1] = 0x38;
759 if (ptpod_pmic_volt
[1] < 0x48)
761 ptpod_pmic_volt
[1] = 0x48;
770 ptpod_pmic_volt
[2] = ptp_volt_2
+ mt_ptp_offset
;
771 if (ptpod_pmic_volt
[2] > 0x60)
773 ptpod_pmic_volt
[2] = 0x60;
777 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
778 if (ptpod_pmic_volt
[2] < 0x38)
780 ptpod_pmic_volt
[2] = 0x38;
783 if (ptpod_pmic_volt
[2] < 0x48)
785 ptpod_pmic_volt
[2] = 0x48;
794 ptpod_pmic_volt
[3] = ptp_volt_3
+ mt_ptp_offset
;
795 if (ptpod_pmic_volt
[3] > 0x60)
797 ptpod_pmic_volt
[3] = 0x60;
801 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
802 if (ptpod_pmic_volt
[3] < 0x38)
804 ptpod_pmic_volt
[3] = 0x38;
807 if (ptpod_pmic_volt
[3] < 0x48)
809 ptpod_pmic_volt
[3] = 0x48;
818 ptpod_pmic_volt
[4] = ptp_volt_4
+ mt_ptp_offset
;
819 if (ptpod_pmic_volt
[4] > 0x60)
821 ptpod_pmic_volt
[4] = 0x60;
825 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
826 if (ptpod_pmic_volt
[4] < 0x38)
828 ptpod_pmic_volt
[4] = 0x38;
831 if (ptpod_pmic_volt
[4] < 0x48)
833 ptpod_pmic_volt
[4] = 0x48;
842 ptpod_pmic_volt
[5] = ptp_volt_5
+ mt_ptp_offset
;
843 if (ptpod_pmic_volt
[5] > 0x60)
845 ptpod_pmic_volt
[5] = 0x60;
849 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
850 if (ptpod_pmic_volt
[5] < 0x38)
852 ptpod_pmic_volt
[5] = 0x38;
855 if (ptpod_pmic_volt
[5] < 0x48)
857 ptpod_pmic_volt
[5] = 0x48;
866 ptpod_pmic_volt
[6] = ptp_volt_6
+ mt_ptp_offset
;
867 if (ptpod_pmic_volt
[6] > 0x60)
869 ptpod_pmic_volt
[6] = 0x60;
873 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
874 if (ptpod_pmic_volt
[6] < 0x38)
876 ptpod_pmic_volt
[6] = 0x38;
879 if (ptpod_pmic_volt
[6] < 0x48)
881 ptpod_pmic_volt
[6] = 0x48;
890 ptpod_pmic_volt
[7] = ptp_volt_7
+ mt_ptp_offset
;
891 if (ptpod_pmic_volt
[7] > 0x60)
893 ptpod_pmic_volt
[7] = 0x60;
897 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
898 if (ptpod_pmic_volt
[7] < 0x38)
900 ptpod_pmic_volt
[7] = 0x38;
903 if (ptpod_pmic_volt
[7] < 0x48)
905 ptpod_pmic_volt
[7] = 0x48;
912 hrtimer_start(&mt_ptp_volt_timer
, ktime
, HRTIMER_MODE_REL
);
917 void mt_ptp_reg_dump(void)
919 ptp_isr_info("DUMP PTP_DESCHAR = 0x%x\n", DRV_Reg32(PTP_DESCHAR
));
920 ptp_isr_info("DUMP PTP_TEMPCHAR = 0x%x\n", DRV_Reg32(PTP_TEMPCHAR
));
921 ptp_isr_info("DUMP PTP_DETCHAR = 0x%x\n", DRV_Reg32(PTP_DETCHAR
));
922 ptp_isr_info("DUMP PTP_AGECHAR = 0x%x\n", DRV_Reg32(PTP_AGECHAR
));
923 ptp_isr_info("DUMP PTP_DCCONFIG = 0x%x\n", DRV_Reg32(PTP_DCCONFIG
));
924 ptp_isr_info("DUMP PTP_AGECONFIG = 0x%x\n", DRV_Reg32(PTP_AGECONFIG
));
925 ptp_isr_info("DUMP PTP_FREQPCT30 = 0x%x\n", DRV_Reg32(PTP_FREQPCT30
));
926 ptp_isr_info("DUMP PTP_FREQPCT74 = 0x%x\n", DRV_Reg32(PTP_FREQPCT74
));
927 ptp_isr_info("DUMP PTP_LIMITVALS = 0x%x\n", DRV_Reg32(PTP_LIMITVALS
));
928 ptp_isr_info("DUMP PTP_VBOOT = 0x%x\n", DRV_Reg32(PTP_VBOOT
));
929 ptp_isr_info("DUMP PTP_DETWINDOW = 0x%x\n", DRV_Reg32(PTP_DETWINDOW
));
930 ptp_isr_info("DUMP PTP_PTPCONFIG = 0x%x\n", DRV_Reg32(PTP_PTPCONFIG
));
931 ptp_isr_info("DUMP PTP_TSCALCS = 0x%x\n", DRV_Reg32(PTP_TSCALCS
));
932 ptp_isr_info("DUMP PTP_RUNCONFIG = 0x%x\n", DRV_Reg32(PTP_RUNCONFIG
));
933 ptp_isr_info("DUMP PTP_PTPEN = 0x%x\n", DRV_Reg32(PTP_PTPEN
));
934 ptp_isr_info("DUMP PTP_INIT2VALS = 0x%x\n", DRV_Reg32(PTP_INIT2VALS
));
935 ptp_isr_info("DUMP PTP_DCVALUES = 0x%x\n", DRV_Reg32(PTP_DCVALUES
));
936 ptp_isr_info("DUMP PTP_AGEVALUES = 0x%x\n", DRV_Reg32(PTP_AGEVALUES
));
937 ptp_isr_info("DUMP PTP_VOP30 = 0x%x\n", DRV_Reg32(PTP_VOP30
));
938 ptp_isr_info("DUMP PTP_VOP74 = 0x%x\n", DRV_Reg32(PTP_VOP74
));
939 ptp_isr_info("DUMP PTP_TEMP = 0x%x\n", DRV_Reg32(PTP_TEMP
));
940 ptp_isr_info("DUMP PTP_PTPINTSTS = 0x%x\n", DRV_Reg32(PTP_PTPINTSTS
));
941 ptp_isr_info("DUMP PTP_PTPINTSTSRAW = 0x%x\n", DRV_Reg32(PTP_PTPINTSTSRAW
));
942 ptp_isr_info("DUMP PTP_PTPINTEN = 0x%x\n", DRV_Reg32(PTP_PTPINTEN
));
943 ptp_isr_info("DUMP PTP_SMSTATE0 = 0x%x\n", DRV_Reg32(PTP_SMSTATE0
));
944 ptp_isr_info("DUMP PTP_SMSTATE1 = 0x%x\n", DRV_Reg32(PTP_SMSTATE1
));
946 ptp_isr_info("DUMP PTP_TEMPMONCTL0 = 0x%x\n", DRV_Reg32(PTP_TEMPMONCTL0
));
947 ptp_isr_info("DUMP PTP_TEMPMONCTL1 = 0x%x\n", DRV_Reg32(PTP_TEMPMONCTL1
));
948 ptp_isr_info("DUMP PTP_TEMPMONCTL2 = 0x%x\n", DRV_Reg32(PTP_TEMPMONCTL2
));
949 ptp_isr_info("DUMP PTP_TEMPMONINT = 0x%x\n", DRV_Reg32(PTP_TEMPMONINT
));
950 ptp_isr_info("DUMP PTP_TEMPMONINTSTS = 0x%x\n", DRV_Reg32(PTP_TEMPMONINTSTS
));
951 ptp_isr_info("DUMP PTP_TEMPMONIDET0 = 0x%x\n", DRV_Reg32(PTP_TEMPMONIDET0
));
952 ptp_isr_info("DUMP PTP_TEMPMONIDET1 = 0x%x\n", DRV_Reg32(PTP_TEMPMONIDET1
));
953 ptp_isr_info("DUMP PTP_TEMPMONIDET2 = 0x%x\n", DRV_Reg32(PTP_TEMPMONIDET2
));
954 ptp_isr_info("DUMP PTP_TEMPH2NTHRE = 0x%x\n", DRV_Reg32(PTP_TEMPH2NTHRE
));
955 ptp_isr_info("DUMP PTP_TEMPHTHRE = 0x%x\n", DRV_Reg32(PTP_TEMPHTHRE
));
956 ptp_isr_info("DUMP PTP_TEMPCTHRE = 0x%x\n", DRV_Reg32(PTP_TEMPCTHRE
));
957 ptp_isr_info("DUMP PTP_TEMPOFFSETH = 0x%x\n", DRV_Reg32(PTP_TEMPOFFSETH
));
958 ptp_isr_info("DUMP PTP_TEMPOFFSETL = 0x%x\n", DRV_Reg32(PTP_TEMPOFFSETL
));
959 ptp_isr_info("DUMP PTP_TEMPMSRCTL0 = 0x%x\n", DRV_Reg32(PTP_TEMPMSRCTL0
));
960 ptp_isr_info("DUMP PTP_TEMPMSRCTL1 = 0x%x\n", DRV_Reg32(PTP_TEMPMSRCTL1
));
961 ptp_isr_info("DUMP PTP_TEMPAHBPOLL = 0x%x\n", DRV_Reg32(PTP_TEMPAHBPOLL
));
962 ptp_isr_info("DUMP PTP_TEMPAHBTO = 0x%x\n", DRV_Reg32(PTP_TEMPAHBTO
));
963 ptp_isr_info("DUMP PTP_TEMPADCPNP0 = 0x%x\n", DRV_Reg32(PTP_TEMPADCPNP0
));
964 ptp_isr_info("DUMP PTP_TEMPADCPNP1 = 0x%x\n", DRV_Reg32(PTP_TEMPADCPNP1
));
965 ptp_isr_info("DUMP PTP_TEMPADCPNP2 = 0x%x\n", DRV_Reg32(PTP_TEMPADCPNP2
));
966 ptp_isr_info("DUMP PTP_TEMPADCMUX = 0x%x\n", DRV_Reg32(PTP_TEMPADCMUX
));
967 ptp_isr_info("DUMP PTP_TEMPADCEXT = 0x%x\n", DRV_Reg32(PTP_TEMPADCEXT
));
968 ptp_isr_info("DUMP PTP_TEMPADCEXT1 = 0x%x\n", DRV_Reg32(PTP_TEMPADCEXT1
));
969 ptp_isr_info("DUMP PTP_TEMPADCEN = 0x%x\n", DRV_Reg32(PTP_TEMPADCEN
));
970 ptp_isr_info("DUMP PTP_TEMPPNPMUXADDR = 0x%x\n", DRV_Reg32(PTP_TEMPPNPMUXADDR
));
971 ptp_isr_info("DUMP PTP_TEMPADCMUXADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCMUXADDR
));
972 ptp_isr_info("DUMP PTP_TEMPADCEXTADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCEXTADDR
));
973 ptp_isr_info("DUMP PTP_TEMPADCEXT1ADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCEXT1ADDR
));
974 ptp_isr_info("DUMP PTP_TEMPADCENADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCENADDR
));
975 ptp_isr_info("DUMP PTP_TEMPADCVALIDADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCVALIDADDR
));
976 ptp_isr_info("DUMP PTP_TEMPADCVOLTADDR = 0x%x\n", DRV_Reg32(PTP_TEMPADCVOLTADDR
));
977 ptp_isr_info("DUMP PTP_TEMPRDCTRL = 0x%x\n", DRV_Reg32(PTP_TEMPRDCTRL
));
978 ptp_isr_info("DUMP PTP_TEMPADCVALIDMASK = 0x%x\n", DRV_Reg32(PTP_TEMPADCVALIDMASK
));
979 ptp_isr_info("DUMP PTP_TEMPADCVOLTAGESHIFT = 0x%x\n", DRV_Reg32(PTP_TEMPADCVOLTAGESHIFT
));
980 ptp_isr_info("DUMP PTP_TEMPADCWRITECTRL = 0x%x\n", DRV_Reg32(PTP_TEMPADCWRITECTRL
));
981 ptp_isr_info("DUMP PTP_TEMPMSR0 = 0x%x\n", DRV_Reg32(PTP_TEMPMSR0
));
982 ptp_isr_info("DUMP PTP_TEMPMSR1 = 0x%x\n", DRV_Reg32(PTP_TEMPMSR1
));
983 ptp_isr_info("DUMP PTP_TEMPMSR2 = 0x%x\n", DRV_Reg32(PTP_TEMPMSR2
));
984 ptp_isr_info("DUMP PTP_TEMPIMMD0 = 0x%x\n", DRV_Reg32(PTP_TEMPIMMD0
));
985 ptp_isr_info("DUMP PTP_TEMPIMMD1 = 0x%x\n", DRV_Reg32(PTP_TEMPIMMD1
));
986 ptp_isr_info("DUMP PTP_TEMPIMMD2 = 0x%x\n", DRV_Reg32(PTP_TEMPIMMD2
));
987 ptp_isr_info("DUMP PTP_TEMPPROTCTL = 0x%x\n", DRV_Reg32(PTP_TEMPPROTCTL
));
988 ptp_isr_info("DUMP PTP_TEMPPROTTA = 0x%x\n", DRV_Reg32(PTP_TEMPPROTTA
));
989 ptp_isr_info("DUMP PTP_TEMPPROTTB = 0x%x\n", DRV_Reg32(PTP_TEMPPROTTB
));
990 ptp_isr_info("DUMP PTP_TEMPPROTTC = 0x%x\n", DRV_Reg32(PTP_TEMPPROTTC
));
991 ptp_isr_info("DUMP PTP_TEMPSPARE0 = 0x%x\n", DRV_Reg32(PTP_TEMPSPARE0
));
994 irqreturn_t
mt_ptp_isr(int irq
, void *dev_id
)
996 unsigned int PTPINTSTS
, temp
, temp_0
, temp_ptpen
;
1002 PTPINTSTS
= ptp_read(PTP_PTPINTSTS
);
1003 temp_ptpen
= ptp_read(PTP_PTPEN
);
1005 ptp_isr_info("PTPINTSTS = 0x%x\n", PTPINTSTS
);
1006 ptp_isr_info("PTP_PTPEN = 0x%x\n", temp_ptpen
);
1008 ptp_data
[1] = ptp_read(0xf100b240);
1009 ptp_data
[2] = ptp_read(0xf100b27c);
1011 ptp_isr_info("*(0x1100b240) = 0x%x\n", ptp_data
[1]);
1012 ptp_isr_info("*(0x1100b27c) = 0x%x\n", ptp_data
[2]);
1016 if (PTPINTSTS
== 0x1) // PTP init1 or init2
1018 if ((temp_ptpen
& 0x7) == 0x1) // PTP init1
1020 // Read & store 16 bit values DCVALUES.DCVOFFSET and AGEVALUES.AGEVOFFSET for later use in INIT2 procedure
1021 ptp_dcvoffset
= ~(ptp_read(PTP_DCVALUES
) & 0xffff) + 1; // hw bug, workaround
1022 ptp_agevoffset
= ptp_read(PTP_AGEVALUES
) & 0xffff;
1024 // Set PTPEN.PTPINITEN/PTPEN.PTPINIT2EN = 0x0 & Clear PTP INIT interrupt PTPINTSTS = 0x00000001
1025 ptp_write(PTP_PTPEN
, 0x0);
1026 ptp_write(PTP_PTPINTSTS
, 0x1);
1028 mt_cpufreq_enable_by_ptpod(); // enable DVFS
1029 mt_fh_popod_restore(); // enable frequency hopping (main PLL)
1033 else if ((temp_ptpen
& 0x7) == 0x5) // PTP init2
1035 temp
= ptp_read(PTP_VOP30
); // read ptp_volt_0 ~ ptp_volt_3
1036 ptp_volt_0
= temp
& 0xff;
1037 ptp_volt_1
= (temp
>>8) & 0xff;
1038 ptp_volt_2
= (temp
>>16) & 0xff;
1039 ptp_volt_3
= (temp
>>24) & 0xff;
1041 temp
= ptp_read(PTP_VOP74
); // read ptp_volt_4 ~ ptp_volt_7
1042 ptp_volt_4
= temp
& 0xff;
1043 ptp_volt_5
= (temp
>>8) & 0xff;
1044 ptp_volt_6
= (temp
>>16) & 0xff;
1045 ptp_volt_7
= (temp
>>24) & 0xff;
1047 // save ptp_init2_volt_0 ~ ptp_init2_volt_7
1048 ptp_init2_volt_0
= ptp_volt_0
;
1049 ptp_init2_volt_1
= ptp_volt_1
;
1050 ptp_init2_volt_2
= ptp_volt_2
;
1051 ptp_init2_volt_3
= ptp_volt_3
;
1052 ptp_init2_volt_4
= ptp_volt_4
;
1053 ptp_init2_volt_5
= ptp_volt_5
;
1054 ptp_init2_volt_6
= ptp_volt_6
;
1055 ptp_init2_volt_7
= ptp_volt_7
;
1057 ptp_isr_info("ptp_volt_0 = 0x%x\n", ptp_volt_0
);
1058 ptp_isr_info("ptp_volt_1 = 0x%x\n", ptp_volt_1
);
1059 ptp_isr_info("ptp_volt_2 = 0x%x\n", ptp_volt_2
);
1060 ptp_isr_info("ptp_volt_3 = 0x%x\n", ptp_volt_3
);
1061 ptp_isr_info("ptp_volt_4 = 0x%x\n", ptp_volt_4
);
1062 ptp_isr_info("ptp_volt_5 = 0x%x\n", ptp_volt_5
);
1063 ptp_isr_info("ptp_volt_6 = 0x%x\n", ptp_volt_6
);
1064 ptp_isr_info("ptp_volt_7 = 0x%x\n", ptp_volt_7
);
1065 ptp_isr_info("ptp_level = 0x%x\n", ptp_level
);
1069 // Set PTPEN.PTPINITEN/PTPEN.PTPINIT2EN = 0x0 & Clear PTP INIT interrupt PTPINTSTS = 0x00000001
1070 ptp_write(PTP_PTPEN
, 0x0);
1071 ptp_write(PTP_PTPINTSTS
, 0x1);
1074 else // error : init1 or init2 , but enable setting is wrong.
1076 ptp_isr_info("====================================================\n");
1077 ptp_isr_info("PTP error_0 (0x%x) : PTPINTSTS = 0x%x\n", temp_ptpen
, PTPINTSTS
);
1078 ptp_isr_info("PTP_SMSTATE0 (0x%x) = 0x%x\n", PTP_SMSTATE0
, ptp_read(PTP_SMSTATE0
));
1079 ptp_isr_info("PTP_SMSTATE1 (0x%x) = 0x%x\n", PTP_SMSTATE1
, ptp_read(PTP_SMSTATE1
));
1080 ptp_isr_info("====================================================\n");
1083 ptp_write(PTP_PTPEN
, 0x0);
1085 // Clear PTP interrupt PTPINTSTS
1086 ptp_write(PTP_PTPINTSTS
, 0x00ffffff);
1088 // restore default DVFS table (PMIC)
1089 mt_cpufreq_return_default_DVS_by_ptpod();
1092 else if ((PTPINTSTS
& 0x00ff0000) != 0x0) // PTP Monitor mode
1094 // check if thermal sensor init completed?
1095 temp_0
= (ptp_read(PTP_TEMP
) & 0xff);
1097 if ((temp_0
> 0x4b) && (temp_0
< 0xd3))
1099 ptp_isr_info("thermal sensor init has not been completed. (temp_0 = 0x%x)\n", temp_0
);
1103 temp
= ptp_read(PTP_VOP30
); // read ptp_volt_0 ~ ptp_volt_3
1104 ptp_volt_0
= temp
& 0xff;
1105 ptp_volt_1
= (temp
>>8) & 0xff;
1106 ptp_volt_2
= (temp
>>16) & 0xff;
1107 ptp_volt_3
= (temp
>>24) & 0xff;
1109 temp
= ptp_read(PTP_VOP74
); // read ptp_volt_3 ~ ptp_volt_7
1110 ptp_volt_4
= temp
& 0xff;
1111 ptp_volt_5
= (temp
>>8) & 0xff;
1112 ptp_volt_6
= (temp
>>16) & 0xff;
1113 ptp_volt_7
= (temp
>>24) & 0xff;
1115 ptp_isr_info("ptp_volt_0 = 0x%x\n", ptp_volt_0
);
1116 ptp_isr_info("ptp_volt_1 = 0x%x\n", ptp_volt_1
);
1117 ptp_isr_info("ptp_volt_2 = 0x%x\n", ptp_volt_2
);
1118 ptp_isr_info("ptp_volt_3 = 0x%x\n", ptp_volt_3
);
1119 ptp_isr_info("ptp_volt_4 = 0x%x\n", ptp_volt_4
);
1120 ptp_isr_info("ptp_volt_5 = 0x%x\n", ptp_volt_5
);
1121 ptp_isr_info("ptp_volt_6 = 0x%x\n", ptp_volt_6
);
1122 ptp_isr_info("ptp_volt_7 = 0x%x\n", ptp_volt_7
);
1123 ptp_isr_info("ptp_level = 0x%x\n", ptp_level
);
1124 ptp_isr_info("ISR : TEMPSPARE1 = 0x%x\n", ptp_read(TEMPSPARE1
));
1129 // Clear PTP INIT interrupt PTPINTSTS = 0x00ff0000
1130 ptp_write(PTP_PTPINTSTS
, 0x00ff0000);
1132 else // PTP error handler
1134 if (((temp_ptpen
& 0x7) == 0x1) || ((temp_ptpen
& 0x7) == 0x5)) // init 1 || init 2 error handler
1136 ptp_isr_info("====================================================\n");
1137 ptp_isr_info("PTP error_1 error_2 (0x%x) : PTPINTSTS = 0x%x\n", temp_ptpen
, PTPINTSTS
);
1138 ptp_isr_info("PTP_SMSTATE0 (0x%x) = 0x%x\n", PTP_SMSTATE0
, ptp_read(PTP_SMSTATE0
));
1139 ptp_isr_info("PTP_SMSTATE1 (0x%x) = 0x%x\n", PTP_SMSTATE1
, ptp_read(PTP_SMSTATE1
));
1140 ptp_isr_info("====================================================\n");
1143 ptp_write(PTP_PTPEN
, 0x0);
1145 // Clear PTP interrupt PTPINTSTS
1146 ptp_write(PTP_PTPINTSTS
, 0x00ffffff);
1148 // restore default DVFS table (PMIC)
1149 mt_cpufreq_return_default_DVS_by_ptpod();
1151 else // PTP Monitor mode error handler
1153 ptp_isr_info("====================================================\n");
1154 ptp_isr_info("PTP error_m (0x%x) : PTPINTSTS = 0x%x\n", temp_ptpen
, PTPINTSTS
);
1155 ptp_isr_info("PTP_SMSTATE0 (0x%x) = 0x%x\n", PTP_SMSTATE0
, ptp_read(PTP_SMSTATE0
));
1156 ptp_isr_info("PTP_SMSTATE1 (0x%x) = 0x%x\n", PTP_SMSTATE1
, ptp_read(PTP_SMSTATE1
));
1157 ptp_isr_info("PTP_TEMP (0x%x) = 0x%x\n", PTP_TEMP
, ptp_read(PTP_TEMP
) );
1158 ptp_isr_info("PTP_TEMPMSR0 (0x%x) = 0x%x\n", PTP_TEMPMSR0
, ptp_read(PTP_TEMPMSR0
));
1159 ptp_isr_info("PTP_TEMPMSR1 (0x%x) = 0x%x\n", PTP_TEMPMSR1
, ptp_read(PTP_TEMPMSR1
));
1160 ptp_isr_info("PTP_TEMPMSR2 (0x%x) = 0x%x\n", PTP_TEMPMSR2
, ptp_read(PTP_TEMPMSR2
));
1161 ptp_isr_info("PTP_TEMPMONCTL0 (0x%x) = 0x%x\n", PTP_TEMPMONCTL0
, ptp_read(PTP_TEMPMONCTL0
));
1162 ptp_isr_info("PTP_TEMPMSRCTL1 (0x%x) = 0x%x\n", PTP_TEMPMSRCTL1
, ptp_read(PTP_TEMPMSRCTL1
));
1163 ptp_isr_info("====================================================\n");
1166 ptp_write(PTP_PTPEN
, 0x0);
1168 // Clear PTP interrupt PTPINTSTS
1169 ptp_write(PTP_PTPINTSTS
, 0x00ffffff);
1171 // set init2 value to DVFS table (PMIC)
1172 ptp_volt_0
= ptp_init2_volt_0
;
1173 ptp_volt_1
= ptp_init2_volt_1
;
1174 ptp_volt_2
= ptp_init2_volt_2
;
1175 ptp_volt_3
= ptp_init2_volt_3
;
1176 ptp_volt_4
= ptp_init2_volt_4
;
1177 ptp_volt_5
= ptp_init2_volt_5
;
1178 ptp_volt_6
= ptp_init2_volt_6
;
1179 ptp_volt_7
= ptp_init2_volt_7
;
1187 unsigned int PTP_INIT_01_API(void)
1189 /* only for CPU stress */
1191 PTP_INIT_T ptp_init_value
;
1193 unsigned int ptp_counter
= 0;
1195 ptp_notice("PTP_INIT_01_API() start.\n");
1197 ptp_data
[0] = 0xffffffff;
1198 ptp_data
[1] = 0xffffffff;
1199 ptp_data
[2] = 0xffffffff;
1202 ptp_write(PTP_PTPEN
, 0x0);
1204 ptp_init_value
.PTPINITEN
= (val_0
) & 0x1;
1205 ptp_init_value
.PTPMONEN
= (val_0
>> 1) & 0x1;
1206 ptp_init_value
.MDES
= (val_0
>> 8) & 0xff;
1207 ptp_init_value
.BDES
= (val_0
>> 16) & 0xff;
1208 ptp_init_value
.DCMDET
= (val_0
>> 24) & 0xff;
1210 ptp_init_value
.DCCONFIG
= (val_1
) & 0xffffff;
1211 ptp_init_value
.DCBDET
= (val_1
>> 24) & 0xff;
1213 ptp_init_value
.AGECONFIG
= (val_2
) & 0xffffff;
1214 ptp_init_value
.AGEM
= (val_2
>> 24) & 0xff;
1216 //ptp_init_value.AGEDELTA = (val_3) & 0xff;
1217 ptp_init_value
.AGEDELTA
= 0x88;
1218 ptp_init_value
.DVTFIXED
= (val_3
>> 8) & 0xff;
1219 ptp_init_value
.MTDES
= (val_3
>> 16) & 0xff;
1220 ptp_init_value
.VCO
= (val_3
>> 24) & 0xff;
1222 // Get DVFS frequency table
1223 freq_0
= (u8
)(mt_cpufreq_max_frequency_by_DVS(0) / 13000); // max freq 1300 x 100%
1224 freq_1
= (u8
)(mt_cpufreq_max_frequency_by_DVS(1) / 13000);
1225 freq_2
= (u8
)(mt_cpufreq_max_frequency_by_DVS(2) / 13000);
1226 freq_3
= (u8
)(mt_cpufreq_max_frequency_by_DVS(3) / 13000);
1227 freq_4
= (u8
)(mt_cpufreq_max_frequency_by_DVS(4) / 13000);
1228 freq_5
= (u8
)(mt_cpufreq_max_frequency_by_DVS(5) / 13000);
1229 freq_6
= (u8
)(mt_cpufreq_max_frequency_by_DVS(6) / 13000);
1230 freq_7
= (u8
)(mt_cpufreq_max_frequency_by_DVS(7) / 13000);
1232 ptp_init_value
.FREQPCT0
= freq_0
;
1233 ptp_init_value
.FREQPCT1
= freq_1
;
1234 ptp_init_value
.FREQPCT2
= freq_2
;
1235 ptp_init_value
.FREQPCT3
= freq_3
;
1236 ptp_init_value
.FREQPCT4
= freq_4
;
1237 ptp_init_value
.FREQPCT5
= freq_5
;
1238 ptp_init_value
.FREQPCT6
= freq_6
;
1239 ptp_init_value
.FREQPCT7
= freq_7
;
1241 ptp_init_value
.DETWINDOW
= 0xa28; // 100 us, This is the PTP Detector sampling time as represented in cycles of bclk_ck during INIT. 52 MHz
1242 ptp_init_value
.VMAX
= 0x60; // 1.3v (700mv + n * 6.25mv)
1244 #if (defined(IS_VCORE_USE_6333VCORE) || defined(CONFIG_MTK_PMIC_MT6397)) && !defined(MTK_DVFS_DISABLE_LOW_VOLTAGE_SUPPORT)
1245 ptp_init_value
.VMIN
= 0x38; // 1.05v (700mv + n * 6.25mv)
1247 ptp_init_value
.VMIN
= 0x48; // 1.15v (700mv + n * 6.25mv)
1250 ptp_init_value
.DTHI
= 0x01; // positive
1251 ptp_init_value
.DTLO
= 0xfe; // negative (2¡¦s compliment)
1252 ptp_init_value
.VBOOT
= 0x48; // 1.15v (700mv + n * 6.25mv)
1253 ptp_init_value
.DETMAX
= 0xffff; // This timeout value is in cycles of bclk_ck.
1255 if (ptp_init_value
.PTPINITEN
== 0x0)
1257 ptp_notice("PTPINITEN = 0x%x \n", ptp_init_value
.PTPINITEN
);
1264 ret
= request_irq(MT_PTP_FSM_IRQ_ID
, mt_ptp_isr
, IRQF_TRIGGER_LOW
, "ptp", NULL
);
1267 ptp_notice("PTP IRQ register failed (%d)\n", ret
);
1270 ptp_notice("Set PTP IRQ OK.\n");
1273 PTP_Initialization_01(&ptp_init_value
);
1279 if (ptp_counter
>= 0xffffff)
1281 ptp_notice("ptp_counter = 0x%x \n", ptp_counter
);
1285 if (ptp_data
[0] == 0)
1291 return ((unsigned int)(&ptp_data
[1]));
1295 static int ptp_probe(struct platform_device
*pdev
)
1298 u32 rdata
= 0, test_mode
= 0;
1300 if (pwrap_read((u32
)RTC_AL_DOM
, &rdata
) == 0)
1302 rdata
= (rdata
>> 8) & 0x7;
1303 ptp_notice("rdata = 0x%x \n", rdata
);
1309 #if PTP_GET_REAL_VAL
1312 val_0
= get_devinfo_with_index(16);
1313 val_1
= get_devinfo_with_index(17);
1314 val_2
= get_devinfo_with_index(18);
1315 val_3
= get_devinfo_with_index(19);
1319 if ((val_0
& 0x1) == 0x0)
1321 ptp_notice("PTPINITEN = 0x%x \n", (val_0
& 0x1));
1325 // enable thermal CG
1326 enable_clock(MT_CG_PERI_THERM
, "PTPOD");
1329 ret
= request_irq(MT_PTP_FSM_IRQ_ID
, mt_ptp_isr
, IRQF_TRIGGER_LOW
, "ptp", NULL
);
1332 ptp_notice("PTP IRQ register failed (%d)\n", ret
);
1336 ptp_notice("Set PTP IRQ OK.\n");
1338 // get DVFS frequency table
1339 freq_0
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(0) / 13000); // max freq 1300 x 100%
1343 freq_1
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(1) / 13000);
1347 freq_2
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(2) / 13000);
1351 freq_3
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(3) / 13000);
1355 freq_4
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(4) / 13000);
1359 freq_5
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(5) / 13000);
1363 freq_6
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(6) / 13000);
1367 freq_7
= (unsigned char)(mt_cpufreq_max_frequency_by_DVS(7) / 13000);
1371 ptp_level
= PTP_get_ptp_level();
1373 mt_ptp_volt_thread
= kthread_run(mt_ptp_volt_thread_handler
, 0, "ptp volt");
1374 if (IS_ERR(mt_ptp_volt_thread
))
1376 printk("[%s]: failed to create ptp volt thread\n", __FUNCTION__
);
1384 static int ptp_suspend(struct platform_device
*dev
, pm_message_t state
)
1387 kthread_stop(mt_ptp_volt_thread);
1393 static int ptp_resume(struct platform_device
*pdev
)
1396 mt_ptp_volt_thread = kthread_run(mt_ptp_volt_thread_handler, 0, "ptp volt");
1397 if (IS_ERR(mt_ptp_volt_thread))
1399 printk("[%s]: failed to create ptp volt thread\n", __FUNCTION__);
1405 if((val_0
& 0x1) == 0x0)
1407 ptp_notice("PTPINITEN = 0x%x \n", (val_0
& 0x1));
1416 static struct platform_driver ptp_driver
= {
1420 .suspend
= ptp_suspend
,
1421 .resume
= ptp_resume
,
1427 int ptp_opp_num(void)
1433 if (mt_cpufreq_max_frequency_by_DVS(num
) == 0)
1440 EXPORT_SYMBOL(ptp_opp_num
);
1442 void ptp_opp_freq(unsigned int *freq
)
1448 if (mt_cpufreq_max_frequency_by_DVS(i
) == 0)
1450 freq
[i
] = mt_cpufreq_max_frequency_by_DVS(i
);
1454 EXPORT_SYMBOL(ptp_opp_freq
);
1456 void ptp_opp_status(unsigned int *temp
, unsigned int *volt
)
1460 *temp
= mtktscpu_get_cpu_temp();
1464 if (mt_cpufreq_max_frequency_by_DVS(i
) == 0)
1466 volt
[i
] = ptp_trasnfer_to_volt(ptpod_pmic_volt
[i
]);
1470 EXPORT_SYMBOL(ptp_opp_status
);
1472 void ptp_disable(void)
1474 unsigned long flags
;
1477 local_irq_save(flags
);
1480 ptp_write(PTP_PTPEN
, 0x0);
1482 // Clear PTP interrupt PTPINTSTS
1483 ptp_write(PTP_PTPINTSTS
, 0x00ffffff);
1485 // restore default DVFS table (PMIC)
1486 mt_cpufreq_return_default_DVS_by_ptpod();
1490 ptp_notice("Disable PTP-OD done.\n");
1492 // Un-Mask ARM i bit
1493 local_irq_restore(flags
);
1496 /***************************
1497 * return current PTP stauts
1498 ****************************/
1499 int ptp_status(void)
1503 if (ptp_read(PTP_PTPEN
) != 0)
1511 /***************************
1512 * show current PTP offset
1513 ****************************/
1514 static ssize_t
ptp_offset_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1519 p
+= sprintf(p
, "mt_ptp_offset = %d\n", mt_ptp_offset
);
1525 /************************************
1526 * set PTP offset by sysfs interface
1527 *************************************/
1528 static ssize_t
ptp_offset_store(struct kobject
*kobj
,
1529 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1533 if (sscanf(buf
, "%d", &offset
) == 1)
1535 mt_ptp_offset
= offset
;
1540 ptp_notice("bad argument_1!! argument should be \"0\"\n");
1546 ptp_attr(ptp_offset
);
1548 /***************************
1549 * show current PTP status
1550 ****************************/
1551 static ssize_t
ptp_debug_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1556 if (ptp_read(PTP_PTPEN
) != 0)
1557 p
+= sprintf(p
, "PTP enabled (ptp_level = 0x%x)\n", ptp_level
);
1559 p
+= sprintf(p
, "PTP disabled (ptp_level = 0x%x)\n", ptp_level
);
1565 /************************************
1566 * set PTP stauts by sysfs interface
1567 *************************************/
1568 static ssize_t
ptp_debug_store(struct kobject
*kobj
,
1569 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1573 if (sscanf(buf
, "%d", &enabled
) == 1)
1577 ptp_disable(); // Disable PTP and restore default DVFS table (PMIC)
1581 ptp_notice("bad argument_0!! argument should be \"0\"\n");
1586 ptp_notice("bad argument_1!! argument should be \"0\"\n");
1592 ptp_attr(ptp_debug
);
1594 /***************************
1595 * show current PTP data
1596 ****************************/
1597 static ssize_t
ptp_dump_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1602 p
+= sprintf(p
, "(0x%x, 0x%x, 0x%x, 0x%x)\n", val_0
, val_1
, val_2
, val_3
);
1608 /************************************
1609 * set PTP data by sysfs interface
1610 *************************************/
1611 static ssize_t
ptp_dump_store(struct kobject
*kobj
,
1612 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1619 /***********************
1620 * show current voltage
1621 ************************/
1622 static ssize_t
ptp_cur_volt_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1628 // rdata = mt_cpufreq_cur_vproc(); //mask till dvfs driver ready
1632 p
+= sprintf(p
, "current voltage: (%d)\n", rdata
);
1636 p
+= sprintf(p
, "read current voltage fail\n");
1643 /************************************
1644 * set current voltage by sysfs interface
1645 *************************************/
1646 static ssize_t
ptp_cur_volt_store(struct kobject
*kobj
,
1647 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1652 ptp_attr(ptp_cur_volt
);
1654 /**************************
1655 * show current PTP status
1656 ***************************/
1657 static ssize_t
ptp_status_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1662 p
+= sprintf(p
, "PTP_LOG: (%d) - (%d, %d, %d, %d, %d, %d, %d, %d) - (%d, %d, %d, %d, %d, %d, %d, %d)\n", \
1663 mtktscpu_get_cpu_temp(), \
1664 ptp_trasnfer_to_volt(ptpod_pmic_volt
[0]), \
1665 ptp_trasnfer_to_volt(ptpod_pmic_volt
[1]), \
1666 ptp_trasnfer_to_volt(ptpod_pmic_volt
[2]), \
1667 ptp_trasnfer_to_volt(ptpod_pmic_volt
[3]), \
1668 ptp_trasnfer_to_volt(ptpod_pmic_volt
[4]), \
1669 ptp_trasnfer_to_volt(ptpod_pmic_volt
[5]), \
1670 ptp_trasnfer_to_volt(ptpod_pmic_volt
[6]), \
1671 ptp_trasnfer_to_volt(ptpod_pmic_volt
[7]), \
1672 mt_cpufreq_max_frequency_by_DVS(0), \
1673 mt_cpufreq_max_frequency_by_DVS(1), \
1674 mt_cpufreq_max_frequency_by_DVS(2), \
1675 mt_cpufreq_max_frequency_by_DVS(3), \
1676 mt_cpufreq_max_frequency_by_DVS(4), \
1677 mt_cpufreq_max_frequency_by_DVS(5), \
1678 mt_cpufreq_max_frequency_by_DVS(6), \
1679 mt_cpufreq_max_frequency_by_DVS(7));
1685 /************************************
1686 * set current PTP status by sysfs interface
1687 *************************************/
1688 static ssize_t
ptp_status_store(struct kobject
*kobj
,
1689 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1694 ptp_attr(ptp_status
);
1696 /***************************
1697 * show PTP log enable
1698 ****************************/
1699 static ssize_t
ptp_log_en_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
1704 /***************************************
1705 * set PTP log enable by sysfs interface
1706 ****************************************/
1707 static ssize_t
ptp_log_en_store(struct kobject
*kobj
,
1708 struct kobj_attribute
*attr
, const char *buf
, size_t n
)
1711 ktime_t ktime
= ktime_set(mt_ptp_log_period_s
, mt_ptp_log_period_ns
);
1713 if (sscanf(buf
, "%d", &enabled
) == 1)
1717 ptp_notice("ptp log enabled.\n");
1718 mt_ptp_log_thread
= kthread_run(mt_ptp_log_thread_handler
, 0, "ptp logging");
1719 if (IS_ERR(mt_ptp_log_thread
))
1721 printk("[%s]: failed to create ptp logging thread\n", __FUNCTION__
);
1723 hrtimer_start(&mt_ptp_log_timer
, ktime
, HRTIMER_MODE_REL
);
1725 else if (enabled
== 0)
1727 kthread_stop(mt_ptp_log_thread
);
1728 hrtimer_cancel(&mt_ptp_log_timer
);
1732 ptp_notice("ptp log disabled.\n");
1733 ptp_notice("bad argument!! argument should be \"0\" or \"1\"\n");
1738 ptp_notice("bad argument!! argument should be \"0\" or \"1\"\n");
1744 ptp_attr(ptp_log_en
);
1746 struct kobject
*ptp_kobj
;
1747 EXPORT_SYMBOL_GPL(ptp_kobj
);
1749 static struct attribute
*g
[] = {
1750 &ptp_offset_attr
.attr
,
1751 &ptp_debug_attr
.attr
,
1752 &ptp_dump_attr
.attr
,
1753 &ptp_cur_volt_attr
.attr
,
1754 &ptp_status_attr
.attr
,
1755 &ptp_log_en_attr
.attr
,
1759 static struct attribute_group attr_group
= {
1763 static int __init
ptp_init(void)
1769 hrtimer_init(&mt_ptp_log_timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
1770 mt_ptp_log_timer
.function
= mt_ptp_log_timer_func
;
1772 hrtimer_init(&mt_ptp_volt_timer
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
1773 mt_ptp_volt_timer
.function
= mt_ptp_volt_timer_func
;
1775 ptp_kobj
= kobject_create_and_add("ptp", NULL
);
1777 ptp_notice("[%s]: ptp_kobj create failed\n", __func__
);
1780 err
= sysfs_create_group(ptp_kobj
, &attr_group
);
1782 ptp_notice("[%s]: ptp_kobj->attr_group create failed\n", __func__
);
1785 err
= platform_driver_register(&ptp_driver
);
1789 ptp_notice("PTP driver callback register failed..\n");
1796 static void __exit
ptp_exit(void)
1798 ptp_notice("PTP de-initialization\n");
1801 late_initcall(ptp_init
);
1804 MODULE_DESCRIPTION("MediaTek PTPOD Driver v0.2");
1805 MODULE_LICENSE("GPL");