zte's code,first commit
Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v2/debug.c b/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v2/debug.c
new file mode 100644
index 0000000..9a0edfb
--- /dev/null
+++ b/ap/os/linux/linux-3.4.x/arch/arm/mach-zx297520v2/debug.c
@@ -0,0 +1,266 @@
+/*
+ * linux/arch/arm/mach-zx297520v2/debug.c
+ *
+ * Copyright (C) 2015 ZTE-TSP
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/clockchips.h>
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/syscore_ops.h>
+#include <linux/gpio.h>
+
+#include <asm/mach/time.h>
+
+#include <mach/timex.h>
+#include <mach/iomap.h>
+#include <mach/debug.h>
+#include <mach/irqs.h>
+#include <mach/gpio.h>
+
+#include <linux/ramdump/ramdump.h>
+
+#define CONFIG_USE_DEBUG_LED 0
+/*
+ * we use sysfs to test&debug some system funcs
+ *
+ */
+struct kobject *zx_root_kobj;
+struct kobject *zx_test_kobj;
+
+extern int __init zx_clk_test_init(void);
+extern int __init zx_dma_test_init(void);
+extern int __init zx_icp_test_init(void);
+
+/*
+ * test led helper interface
+ *
+ */
+#if CONFIG_USE_DEBUG_LED
+static void test_led_init(void)
+{
+ int ret;
+
+ ret = gpio_request(ZX29_GPIO_16, "gpio16_led");
+ if (ret)
+ {
+ pr_info("gpio16_led gpio request error.\n");
+ return ;
+ }
+
+ zx29_gpio_config(ZX29_GPIO_16, 0); /*GPIO*/
+ gpio_direction_output(ZX29_GPIO_16, GPIO_LOW);
+}
+static void test_led_on(void)
+{
+ gpio_direction_output(ZX29_GPIO_16, GPIO_HIGH);
+}
+static void test_led_off(void)
+{
+ gpio_direction_output(ZX29_GPIO_16, GPIO_LOW);
+}
+#else
+static void test_led_init(void){}
+static void test_led_on(void){}
+static void test_led_off(void){}
+#endif
+
+
+/*=============================================================================
+ *======== /sys/zte/test/timer ==============================================
+ *=============================================================================
+ */
+static ssize_t timer_show(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf)
+{
+ char *s = buf;
+
+ s += sprintf(s, "%s\n", "[TEST]Test will light on/off led every 5s~");
+
+ return (s - buf);
+}
+
+/*echo 1 > /sys/zte/test/timer*/
+static struct timer_list test_timer;
+static unsigned long test_timer_count = 0;
+static void test_timer_expired(unsigned long data)
+{
+ mod_timer(&test_timer, jiffies + msecs_to_jiffies(5*1000));
+
+ pr_info("[TEST]Test timer arrived:%lu \n", ++test_timer_count);
+
+ if(test_timer_count&1)
+ test_led_on();
+ else
+ test_led_off();
+}
+
+static ssize_t timer_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t n)
+{
+ int error = 0;
+ long temp;
+// BUG();
+ if(strict_strtol(buf, 0, &temp))
+ error = -EINVAL;
+
+ if(temp == 1)
+ {
+ mod_timer(&test_timer, jiffies + msecs_to_jiffies(5*1000));
+ }
+ else
+ {
+ del_timer(&test_timer);
+ test_timer_count = 0;
+ }
+
+ return error ? error : n;
+}
+
+zte_attr(timer);
+
+/*=============================================================================
+ *======== /sys/zte/test/timer ==============================================
+ *=============================================================================
+ */
+/*echo 0xXXXXXXXX > /sys/zte/test/reg_read*/
+static ssize_t reg_read_show(struct kobject *kobj, struct kobj_attribute *attr,
+ char *buf)
+{
+ char *s = buf;
+
+// s += sprintf(s, "%s\n", "[TEST]Read register[0xXXXXXXXX] value~");
+ s += sprintf(s, "reg[0xf8b0002c]=%x, reg[0xf8801010]=%x, reg[0xf880100c]=%x \n", \
+ ioread32((void __iomem *)0xf8b0002c), ioread32((void __iomem *)0xf8801010), \
+ ioread32((void __iomem *)0xf880100c));
+
+ return (s - buf);
+}
+
+static ssize_t reg_read_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t n)
+{
+ int error = 0;
+ unsigned long temp;
+
+ if(strict_strtol(buf, 16, (long *)&temp))
+ error = -EINVAL;
+
+ pr_info("reg[%x]=%x", temp, ioread32((void __iomem *)temp));
+
+ return error ? error : n;
+}
+
+zte_attr(reg_read);
+
+/*test group*/
+static struct attribute * g[] =
+{
+ &timer_attr.attr,
+ ®_read_attr.attr,
+ NULL,
+};
+
+
+static struct attribute_group zte_test_attr_group =
+{
+ .attrs = g,
+};
+
+/**
+ * 1¡¢create sysfs "/sys/zte/test"
+ * 2¡¢call other debug modules
+ */
+static int __init zx_test_init(void)
+{
+ int ret;
+
+ zx_test_kobj = kobject_create_and_add("test", zx_root_kobj);
+ if (!zx_test_kobj)
+ return -ENOMEM;
+
+ ret = sysfs_create_group(zx_test_kobj, &zte_test_attr_group);
+ if (ret)
+ {
+ pr_info("[DEBUG] sysfs_create_group ret %d\n", ret);
+ return ret;
+ }
+
+ setup_timer(&test_timer, test_timer_expired, 0);
+
+ test_led_init();
+
+ pr_info("[DEBUG] create test sysfs interface OK.\n");
+ return 0;
+}
+
+static void sys_ramdump_config(void)
+{
+ ramdump_ram_conf_table_add("pcu_reg",0x13a000,0x7e0,ZX_PCU_BASE,0,0);
+ ramdump_ram_conf_table_add("soc_sys_reg",0x140000,0x620,ZX_SOC_SYS_BASE,0,0);
+ ramdump_ram_conf_table_add("std_crm_reg",0x1306000,0x4a0,ZX_MATRIX_CRM_BASE,0,0);
+ ramdump_ram_conf_table_add("lsp_crm_reg",0x1400000,0x150,ZX_LSP_CRPM_BASE,0,0);
+ ramdump_ram_conf_table_add("top_crm_reg",0x13b000,0x4b0,ZX_TOP_CRM_BASE,0,0);
+ ramdump_ram_conf_table_add("ICP_reg",0x1302000,0x920,ZX_ICP_BASE,0,0);
+ ramdump_ram_conf_table_add("IRAM1_reg",0x100000,0x10000,ZX_IRAM1_BASE,0,0);
+ ramdump_ram_conf_table_add("DMA_reg",0x1301000,0x1000,ZX_DMA_PS_BASE,0,0);
+
+ ramdump_ram_conf_table_add("RM_TIMER0_reg",0x142000,0x20,ZX_RM_TIMER0_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_TIMER1_reg",0x143000,0x20,ZX_AP_TIMER1_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_TIMER2_reg",0x144000,0x20,ZX_AP_TIMER2_BASE,0,0);
+ ramdump_ram_conf_table_add("RM_TIMER1_reg",0x145000,0x20,ZX_RM_TIMER1_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_TIMER3_reg",0x146000,0x20,ZX_AP_TIMER3_BASE,0,0);
+ ramdump_ram_conf_table_add("PS_TIMER1_reg",0x138000,0x20,ZX_PS_TIMER1_BASE,0,0);
+ ramdump_ram_conf_table_add("PS_TIMER2_reg",0x139000,0x20,ZX_PS_TIMER2_BASE,0,0);
+ ramdump_ram_conf_table_add("PS_TIMER0_reg",0x1401000,0x20,ZX_PS_TIMER0_BASE,0,0);
+ ramdump_ram_conf_table_add("PS_RM_TIMER_reg",0x140B000,0x20,ZX_PS_RM_TIMER_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_TIMER0_reg",0x140F000,0x20,ZX_AP_TIMER0_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_TIMER4_reg",0x1411000,0x20,ZX_AP_TIMER4_BASE,0,0);
+ ramdump_ram_conf_table_add("AP_reg",0x800000,0x2000,0XF8000000,0,0);
+
+}
+
+/**
+ * 1¡¢create sysfs "/sys/zte"
+ * 2¡¢call other debug modules
+ */
+static int __init zx_debug_init(void)
+{
+ pr_info("[DEBUG] create zte sysfs interface OK.\n");
+ zx_root_kobj = kobject_create_and_add("zte", NULL);
+ if (!zx_root_kobj)
+ return -ENOMEM;
+
+
+ zx_test_init();
+
+ zx_clk_test_init();
+
+#ifdef CONFIG_ZX29_DMA
+ zx_dma_test_init();
+#endif
+
+#ifdef CONFIG_RPM_ZX29
+ zx_icp_test_init();
+#endif
+ sys_ramdump_config( );
+
+ return 0;
+}
+
+late_initcall(zx_debug_init);
+