1 #include <linux/kernel.h>
2 #include <linux/device.h>
3 #include <linux/module.h>
4 #include <linux/platform_device.h>
5 #include <linux/kallsyms.h>
8 #include <asm/cacheflush.h>
9 #include <asm/outercache.h>
10 #include <asm/system.h>
11 #include <asm/delay.h>
12 #include <mach/mt_reg_base.h>
13 #include <mach/mt_clkmgr.h>
14 #include <mach/mt_freqhopping.h>
15 #include <mach/emi_bwl.h>
16 #include <mach/mt_typedefs.h>
17 #include <mach/memory.h>
19 #define DRAMC_WRITE_REG(val,offset) do{ \
20 (*(volatile unsigned int *)(DRAMC0_BASE + (offset))) = (unsigned int)(val); \
21 (*(volatile unsigned int *)(DDRPHY_BASE + (offset))) = (unsigned int)(val); \
22 (*(volatile unsigned int *)(DRAMC_NAO_BASE + (offset))) = (unsigned int)(val); \
26 static DEFINE_SPINLOCK(lock
);
28 __attribute__ ((__section__ (".sram.func"))) int sram_set_dram(int clk
)
32 DRAMC_WRITE_REG( 0x778844D5 , 0x0 );
33 DRAMC_WRITE_REG( 0xC0064301 , 0x7C );
34 DRAMC_WRITE_REG( 0x9F0C8CA0 , 0x44 );
35 DRAMC_WRITE_REG( 0x03406348 , 0x8 );
36 DRAMC_WRITE_REG( 0x11662742 , 0x1DC);
37 DRAMC_WRITE_REG( 0x01001010 , 0x1E8);
38 DRAMC_WRITE_REG( 0x17000000 , 0xFC );
43 static void enable_gpu(void)
45 enable_clock(MT_CG_MFG_HYD
, "MFG");
46 enable_clock(MT_CG_MFG_G3D
, "MFG");
47 enable_clock(MT_CG_MFG_MEM
, "MFG");
48 enable_clock(MT_CG_MFG_AXI
, "MFG");
50 static void disable_gpu(void)
52 disable_clock(MT_CG_MFG_AXI
, "MFG");
53 disable_clock(MT_CG_MFG_MEM
, "MFG");
54 disable_clock(MT_CG_MFG_G3D
, "MFG");
55 disable_clock(MT_CG_MFG_HYD
, "MFG");
57 static ssize_t
dram_overclock_show(struct device_driver
*driver
, char *buf
)
59 return snprintf(buf
, PAGE_SIZE
, "%d,%d\n",get_ddr_type(), mt_fh_get_dramc());
61 static ssize_t
dram_overclock_store(struct device_driver
*driver
, const char *buf
, size_t count
)
65 clk
= simple_strtol(buf
, 0, 10);
66 dram_clk
= mt_fh_get_dramc();
68 printk(KERN_ERR
"dram_clk:%d, is equal to user inpu clk:%d\n", dram_clk
, clk
);
72 ret
= sram_set_dram(clk
);
74 printk(KERN_ERR
"dram overclock in sram failed:%d, clk:%d\n", ret
, clk
);
76 ret
= mt_fh_dram_overclock(clk
);
78 printk(KERN_ERR
"dram overclock failed:%d, clk:%d\n", ret
, clk
);
79 printk(KERN_INFO
"In %s pass, dram_clk:%d, clk:%d\n", __func__
, dram_clk
, clk
);
82 extern unsigned int RESERVED_MEM_SIZE_FOR_TEST_3D
;
83 extern unsigned int FB_SIZE_EXTERN
;
84 extern unsigned int get_max_DRAM_size (void);
85 static ssize_t
ftm_dram_3d_show(struct device_driver
*driver
, char *buf
)
87 unsigned int pa_3d_base
= PHYS_OFFSET
+ get_max_DRAM_size() - RESERVED_MEM_SIZE_FOR_TEST_3D
- FB_SIZE_EXTERN
;
88 return snprintf(buf
, PAGE_SIZE
, "%u\n", pa_3d_base
);
90 static ssize_t
ftm_dram_3d_store(struct device_driver
*driver
, const char *buf
, size_t count
)
94 static ssize_t
ftm_dram_mtcmos_show(struct device_driver
*driver
, char *buf
)
98 static ssize_t
ftm_dram_mtcmos_store(struct device_driver
*driver
, const char *buf
, size_t count
)
101 enable
= simple_strtol(buf
, 0, 10);
104 printk(KERN_INFO
"enable in %s, enable:%d\n", __func__
, enable
);
105 } else if(enable
== 0) {
107 printk(KERN_INFO
"enable in %s, disable:%d\n", __func__
, enable
);
109 printk(KERN_ERR
"dram overclock failed:%s, enable:%d\n", __func__
, enable
);
113 DRIVER_ATTR(emi_clk_test
, 0664, dram_overclock_show
, dram_overclock_store
);
114 DRIVER_ATTR(emi_clk_3d_test
, 0664, ftm_dram_3d_show
, ftm_dram_3d_store
);
115 DRIVER_ATTR(emi_clk_mtcmos_test
, 0664, ftm_dram_mtcmos_show
, ftm_dram_mtcmos_store
);
117 static struct device_driver dram_overclock_drv
=
119 .name
= "emi_clk_test",
120 .bus
= &platform_bus_type
,
121 .owner
= THIS_MODULE
,
124 extern char __ssram_text
, _sram_start
, __esram_text
;
125 int __init
dram_overclock_init(void)
128 unsigned char * dst
= &__ssram_text
;
129 unsigned char * src
= &_sram_start
;
131 ret
= driver_register(&dram_overclock_drv
);
133 printk(KERN_ERR
"fail to create the dram_overclock driver\n");
136 ret
= driver_create_file(&dram_overclock_drv
, &driver_attr_emi_clk_test
);
138 printk(KERN_ERR
"fail to create the dram_overclock sysfs files\n");
141 ret
= driver_create_file(&dram_overclock_drv
, &driver_attr_emi_clk_3d_test
);
143 printk(KERN_ERR
"fail to create the ftm_dram_3d_drv sysfs files\n");
146 ret
= driver_create_file(&dram_overclock_drv
, &driver_attr_emi_clk_mtcmos_test
);
148 printk(KERN_ERR
"fail to create the ftm_dram_mtcmos_drv sysfs files\n");
152 for (dst
= &__ssram_text
; dst
< (unsigned char *)&__esram_text
; dst
++,src
++) {
159 arch_initcall(dram_overclock_init
);