这个功能在于检查功耗问题的办法之一,需要检查系统功耗问题,但是由于没有硬件的帮忙,所以只能自己搞下,搞了几天都看不出来到底是那个外围设备以及GPIO或者PMIC的问题,我曾经在系统正常状态下把PMIC的所有寄存器打出来和GPIO状态都打出来过,与BASE版本的值进行的对比,但是都没有发现问题,经过老郭和宋哥两个大牛指点,在系统进入SUSPEND的时候,在syscore的时候注册了一个回调函数,由于在系统走suspend的时候,syscore已经相当靠后了,所以可以把在系统在S3状态的时候PMIC寄存器值和GPIO值打印出来
总结下检查电流的小方法:
拔外围器件,查看电流变化
检查GPIO的状态是否正确
检查PMIC寄存器的状态是否正常
在这些方法中需要对照电路图看看供电电路,如果有硬件team帮忙可以逐个排查每路电路的电压。
这个patch放在gpiolib.c
-
+static void gpiolib_dbg_show_1(struct gpio_chip *chip)
-
+{
-
+ unsigned i;
-
+ unsigned gpio = chip->base;
-
+ struct gpio_desc *gdesc = &gpio_desc[gpio];
-
+ int is_out;
-
+
-
+ for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) {
-
+ is_out = test_bit(FLAG_IS_OUT, &gdesc->flags);
-
+ printk(" gpio-%-3d (%-20.20s) %s %s",
-
+ gpio, gdesc->label,
-
+ is_out ? "out" : "in ",
-
+ chip->get
-
+ ? (chip->get(chip, i) ? "hi" : "lo")
-
+ : "? ");
-
+ printk("\n");
-
+ }
-
+}
-
+
-
+void dump_gpio(void)
-
+{
-
+ struct gpio_chip *chip = NULL;
-
+ unsigned gpio;
-
+ int started = 0;
-
+
-
+ /* REVISIT this isn
这个patch随便放吧
-
+#include <linux/module.h>
-
+#include <linux/kernel.h>
-
+#include <linux/slab.h>
-
+#include <linux/io.h>
-
+#include <linux/uaccess.h>
-
+#include <linux/device.h>
-
+#include <linux/delay.h>
-
+#include <linux/fs.h>
-
+#include <linux/debugfs.h>
-
+#include <linux/rpmsg.h>
-
+#include <asm/intel_scu_pmic.h>
-
+#include <asm/intel_scu_ipc.h>
-
+#include <asm/intel_mid_rpmsg.h>
-
+#include <asm/intel_mid_remoteproc.h>
-
+#include <linux/syscore_ops.h>
-
+
-
+#define IPC_WWBUF_SIZE 20
-
+#define IPC_RWBUF_SIZE 20
-
+
-
+#define IPCMSG_PCNTRL 0xFF
-
+
-
+#define IPC_CMD_PCNTRL_W 0
-
+#define IPC_CMD_PCNTRL_R 1
-
+#define IPC_CMD_PCNTRL_M 2
-
+static void dump_reg(vold)
-
+{
-
+ int ret;
-
+ u16 i;
-
+ u8 data;
-
+ for (i = 0; i < 0xff; i++) {
-
+ ret = intel_scu_ipc_ioread8(i,
-
+ &data);
-
+ printk("reg 0x%x = 0x%x\n",i,data);
-
+
-
+ if (ret) {
-
+ printk(".........reg read error!");
-
+ }
-
+
-
+ }
-
+}
-
+
-
+extern void dump_gpio(void);
-
+static int dump_suspend(void)
-
+{
-
+ dump_gpio();
-
+ dump_reg();
-
+ return 0;
-
+}
-
+
-
+static int dump_resume(void)
-
+{
-
+ return 0;
-
+}
-
+static struct syscore_ops dump_pmic_ops = {
-
+ .suspend = dump_suspend,
-
+ .resume = dump_resume,
-
+};
-
+static int __init pmic_dump_init(void)
-
+{
-
+ register_syscore_ops(&dump_pmic_ops);
-
+ return 0;
-
+}
-
+
-
+module_init(pmic_dump_init);
-
+
-
+
注意使用的是register_syscore_ops()函数惊醒的注册,具体何时调用请参考suspend.c的suspend_enter()函数。
阅读(4797) | 评论(0) | 转发(0) |