summaryrefslogtreecommitdiff
path: root/drivers/platform/sprd/aux_debug.c
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
committerYuval Adam <_@yuv.al>2017-08-30 08:25:59 +0000
commit8e4bff4cab0ddac6060645b0715210484d02ff40 (patch)
tree3a5c3024371a04692a3a6d9974d001cdff8ebf84 /drivers/platform/sprd/aux_debug.c
Initial file dump from open source releaseHEADmaster
Diffstat (limited to 'drivers/platform/sprd/aux_debug.c')
-rwxr-xr-xdrivers/platform/sprd/aux_debug.c148
1 files changed, 148 insertions, 0 deletions
diff --git a/drivers/platform/sprd/aux_debug.c b/drivers/platform/sprd/aux_debug.c
new file mode 100755
index 00000000..ac65a71e
--- /dev/null
+++ b/drivers/platform/sprd/aux_debug.c
@@ -0,0 +1,148 @@
+#include <linux/init.h>
+#include <linux/suspend.h>
+#include <linux/kobject.h>
+#include <linux/fs.h>
+#include <linux/io.h>
+#include <linux/errno.h>
+#include <linux/mm.h>
+#include <linux/io.h>
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/wakelock.h>
+#include <linux/module.h>
+#include <linux/kthread.h>
+#include <mach/common.h>
+#include <mach/hardware.h>
+#include <mach/sci.h>
+#include <linux/earlysuspend.h>
+#include <mach/sci_glb_regs.h>
+#include <mach/adi.h>
+#include <linux/random.h>
+#include <asm/hardware/cache-l2x0.h>
+#include <asm/cacheflush.h>
+#include <asm/suspend.h>
+#include <linux/vmalloc.h>
+#include <linux/printk.h>
+#include <linux/timer.h>
+#include <linux/jiffies.h>
+
+enum aux_clk_src_e
+{
+ aux_clk_32k = 0,
+ aux_clk_26m_rf0 = 1,
+ aux_clk_26m_rf1 = 2,
+ aux_clk_48m = 3,
+ aux_clk_52m = 4,
+ aux_clk_51_2m = 5,
+ aux_clk_37_5m = 6,
+ aux_clk_40m_wifipll1 = 7,
+ aux_clk_66m = 8,
+ aux_clk_40m_wifipll2 = 9,
+ aux_clk_max = 10,
+};
+
+static char clk_menu[10][16]=
+{
+ "32k",
+ "26m rf0",
+ "26m rf1",
+ "48m tdpll",
+ "52m cpll",
+ "51_2m wpll",
+ "37_5m mpll",
+ "40m wifipll1",
+ "66m dpll",
+ "40m wifipll2"
+};
+
+struct aux_cfg_info
+{
+ struct dentry *debug_aux_dir;
+ char (*ptr_menu)[16];
+ volatile u32 aux_ena;
+ volatile u32 aux_sel;
+ volatile u32 aux_pin;
+ volatile u32 magic_header;
+ volatile u32 is_init_cfg;
+ volatile u32 cur_sel;
+ volatile u32 magic_ender;
+};
+
+static struct aux_cfg_info clk_cfg_info =
+{
+ 0x00000000, /*debug_aux_dir*/
+ clk_menu, /*clk_meum*/
+ 0x00000000, /*aux_ena*/
+ 0x00000000, /*aux_sel*/
+ 0x00000000, /*aux_pin*/
+ 0x5a5aa5a5, /*magic_header*/
+ 0x00000000, /*is_init_cfg*/
+ 0x6c657300, /*cur_sel*/
+ 0xa5a55a5a /*magic_ender*/
+};
+
+static void aux_clk_config(u32 clk_sel)
+{
+ u32 reg_val;
+
+ if(clk_sel < aux_clk_max){
+ /*select pin function to func 0*/
+ reg_val = sci_glb_read(clk_cfg_info.aux_pin,-1UL);
+ reg_val &= ~(0x3 << 4);
+ sci_glb_write(clk_cfg_info.aux_pin,reg_val,-1UL);
+ /*enable aux clock*/
+ sci_glb_set(clk_cfg_info.aux_ena,0x1 << 2);
+ /*select aux clock source*/
+ sci_glb_set(clk_cfg_info.aux_sel,clk_sel);
+ }
+}
+
+static int debugfs_aux_clk_sel_get(void *data, u64 * val)
+{
+ *val = clk_cfg_info.cur_sel & 0xf;
+
+ return 0;
+}
+static int debugfs_aux_clk_sel_set(void *data, u64 val)
+{
+ clk_cfg_info.cur_sel &= ~0xf;
+ clk_cfg_info.cur_sel |= val;
+
+ aux_clk_config(clk_cfg_info.cur_sel & 0xf);
+
+ return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(fops_aux_clk_ops,
+ debugfs_aux_clk_sel_get, debugfs_aux_clk_sel_set, "%llu\n");
+
+static void aux_debugfs_create(void)
+{
+ clk_cfg_info.debug_aux_dir = debugfs_create_dir("aux_dir", NULL);
+ if (IS_ERR_OR_NULL(clk_cfg_info.debug_aux_dir)) {
+ pr_err("%s return %p\n", __FUNCTION__, clk_cfg_info.debug_aux_dir);
+ }
+ debugfs_create_file("aux", S_IRUGO | S_IWUGO,
+ clk_cfg_info.debug_aux_dir, &clk_cfg_info.cur_sel, &fops_aux_clk_ops);
+}
+
+static int __init aux_debug_init(void)
+{
+ clk_cfg_info.aux_sel = REG_AON_APB_AON_CGM_CFG;
+ clk_cfg_info.aux_ena = REG_AON_APB_APB_EB1;
+ clk_cfg_info.aux_pin = SPRD_PIN_BASE + 0x2ec;
+
+ aux_debugfs_create();
+
+ if(clk_cfg_info.is_init_cfg)
+ aux_clk_config(clk_cfg_info.cur_sel & 0xf);
+
+ return 0;
+}
+
+static void __exit aux_debug_exit(void)
+{
+ debugfs_remove_recursive(clk_cfg_info.debug_aux_dir);
+}
+module_init(aux_debug_init);
+module_exit(aux_debug_exit);