OSHW-DEIMOS/SOFTWARE/A64-TERES/linux-a64/drivers/soc/allwinner/pm/aw_pm.c
2017-11-07 10:16:49 +02:00

281 lines
11 KiB
C
Executable File

/* kernel/power/userscenelock.c
*
* Copyright (C) 2013-2014 allwinner.
*
* By : yanggq
* Version : v1.0
* Date : 2014-7-27 09:08
*/
#include <linux/ctype.h>
#include <linux/module.h>
#include "linux/power/aw_pm.h"
#include "pm.h"
unsigned int parse_bitmap_en = 0x0;
unsigned int show_gpio_config(char *s, unsigned int size)
{
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
s = NULL;
}else{
end = s + size;
}
uk_printf(s, end - s, "\t SUNXI_BANK_SIZE bit 0x%x \n", SUNXI_BANK_SIZE);
uk_printf(s, end - s, "\t SUNXI_PA_BASE bit 0x%x \n", SUNXI_PA_BASE );
uk_printf(s, end - s, "\t SUNXI_PB_BASE bit 0x%x \n", SUNXI_PB_BASE );
uk_printf(s, end - s, "\t SUNXI_PC_BASE bit 0x%x \n", SUNXI_PC_BASE );
uk_printf(s, end - s, "\t SUNXI_PD_BASE bit 0x%x \n", SUNXI_PD_BASE );
uk_printf(s, end - s, "\t SUNXI_PE_BASE bit 0x%x \n", SUNXI_PE_BASE );
uk_printf(s, end - s, "\t SUNXI_PF_BASE bit 0x%x \n", SUNXI_PF_BASE );
uk_printf(s, end - s, "\t SUNXI_PG_BASE bit 0x%x \n", SUNXI_PG_BASE );
uk_printf(s, end - s, "\t SUNXI_PH_BASE bit 0x%x \n", SUNXI_PH_BASE );
uk_printf(s, end - s, "\t SUNXI_PI_BASE bit 0x%x \n", SUNXI_PI_BASE );
uk_printf(s, end - s, "\t SUNXI_PJ_BASE bit 0x%x \n", SUNXI_PJ_BASE );
uk_printf(s, end - s, "\t SUNXI_PK_BASE bit 0x%x \n", SUNXI_PK_BASE );
uk_printf(s, end - s, "\t SUNXI_PL_BASE bit 0x%x \n", SUNXI_PL_BASE );
uk_printf(s, end - s, "\t SUNXI_PM_BASE bit 0x%x \n", SUNXI_PM_BASE );
uk_printf(s, end - s, "\t SUNXI_PN_BASE bit 0x%x \n", SUNXI_PN_BASE );
uk_printf(s, end - s, "\t SUNXI_PO_BASE bit 0x%x \n", SUNXI_PO_BASE );
uk_printf(s, end - s, "\t AXP_PIN_BASE bit 0x%x \n", AXP_PIN_BASE );
return (s - start);
}
static unsigned int parse_bitmap(char *s, unsigned int size, unsigned int bitmap)
{
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
if(!(parse_bitmap_en & DEBUG_WAKEUP_GPIO_MAP))
return 0;
s = NULL;
}else{
end = s + size;
}
switch(bitmap){
case 1<<0 : uk_printf(s, end - s, "\t\tport 0. \n"); break;
case 1<<1 : uk_printf(s, end - s, "\t\tport 1. \n"); break;
case 1<<2 : uk_printf(s, end - s, "\t\tport 2. \n"); break;
case 1<<3 : uk_printf(s, end - s, "\t\tport 3. \n"); break;
case 1<<4 : uk_printf(s, end - s, "\t\tport 4. \n"); break;
case 1<<5 : uk_printf(s, end - s, "\t\tport 5. \n"); break;
case 1<<6 : uk_printf(s, end - s, "\t\tport 6. \n"); break;
case 1<<7 : uk_printf(s, end - s, "\t\tport 7. \n"); break;
case 1<<8 : uk_printf(s, end - s, "\t\tport 8. \n"); break;
case 1<<9 : uk_printf(s, end - s, "\t\tport 9. \n"); break;
case 1<<10 : uk_printf(s, end - s, "\t\tport 10. \n"); break;
case 1<<11 : uk_printf(s, end - s, "\t\tport 11. \n"); break;
default: break;
}
return (s - start);
}
static unsigned int parse_group_bitmap(char *s, unsigned int size, unsigned int group_bitmap)
{
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
if(!(parse_bitmap_en & DEBUG_WAKEUP_GPIO_GROUP_MAP))
return 0;
s = NULL;
}else{
end = s + size;
}
switch(group_bitmap){
case 1<<0 : uk_printf(s, end - s, "\t\tgroup 'A'. \n"); break;
case 1<<1 : uk_printf(s, end - s, "\t\tgroup 'B'. \n"); break;
case 1<<2 : uk_printf(s, end - s, "\t\tgroup 'C'. \n"); break;
case 1<<3 : uk_printf(s, end - s, "\t\tgroup 'D'. \n"); break;
case 1<<4 : uk_printf(s, end - s, "\t\tgroup 'E'. \n"); break;
case 1<<5 : uk_printf(s, end - s, "\t\tgroup 'F'. \n"); break;
case 1<<6 : uk_printf(s, end - s, "\t\tgroup 'G'. \n"); break;
case 1<<7 : uk_printf(s, end - s, "\t\tgroup 'H'. \n"); break;
case 1<<8 : uk_printf(s, end - s, "\t\tgroup 'I'. \n"); break;
case 1<<9 : uk_printf(s, end - s, "\t\tgroup 'J'. \n"); break;
case 1<<10 : uk_printf(s, end - s, "\t\tgroup 'K'. \n"); break;
case 1<<11 : uk_printf(s, end - s, "\t\tgroup 'L'. \n"); break;
default: break;
}
return (s - start);
}
unsigned int parse_wakeup_event(char *s, unsigned int size, unsigned int event, event_cpu_id_e cpu_id)
{
int i = 0;
int count = 0;
int counted = 0;
unsigned int bit_event = 0;
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
if(!(parse_bitmap_en & DEBUG_WAKEUP_SRC)){
return 0;
}
s = NULL;
}else{
end = s + size;
}
uk_printf(s, end - s, "WAKEUP_SRC is as follow: \n");
//for cpus parse.
if(CPUS_ID == cpu_id){
for(i=0; i<32; i++){
bit_event = (1<<i & event);
switch(bit_event){
case 0 : break;
case CPU0_WAKEUP_MSGBOX : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_MSGBOX ", CPU0_WAKEUP_MSGBOX ); count++; break;
case CPU0_WAKEUP_KEY : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_KEY ", CPU0_WAKEUP_KEY ); count++; break;
case CPUS_WAKEUP_LOWBATT : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_LOWBATT ", CPUS_WAKEUP_LOWBATT ); count++; break;
case CPUS_WAKEUP_USB : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_USB ", CPUS_WAKEUP_USB ); count++; break;
//case CPUS_WAKEUP_AC : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_AC ", CPUS_WAKEUP_AC ); count++; break;
case CPUS_WAKEUP_ASCEND : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_ASCEND ", CPUS_WAKEUP_ASCEND ); count++; break;
case CPUS_WAKEUP_DESCEND : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_DESCEND ", CPUS_WAKEUP_DESCEND ); count++; break;
case CPUS_WAKEUP_SHORT_KEY : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_SHORT_KEY", CPUS_WAKEUP_SHORT_KEY); count++; break;
case CPUS_WAKEUP_LONG_KEY : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_LONG_KEY ", CPUS_WAKEUP_LONG_KEY ); count++; break;
case CPUS_WAKEUP_IR : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_IR ", CPUS_WAKEUP_IR ); count++; break;
case CPUS_WAKEUP_ALM0 : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_ALM0 ", CPUS_WAKEUP_ALM0 ); count++; break;
case CPUS_WAKEUP_ALM1 : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_ALM1 ", CPUS_WAKEUP_ALM1 ); count++; break;
case CPUS_WAKEUP_TIMEOUT : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_TIMEOUT ", CPUS_WAKEUP_TIMEOUT ); count++; break;
case CPUS_WAKEUP_GPIO :
uk_printf(s, end - s, "\n%-36s bit 0x%x \t ", "CPUS_WAKEUP_GPIO ", CPUS_WAKEUP_GPIO );
uk_printf(s, end - s, "\n\twant to know gpio config & suspended status detail? \n\t\tcat /sys/power/aw_pm/debug_mask for help.\n");
count++;
break;
case CPUS_WAKEUP_USBMOUSE : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_USBMOUSE ", CPUS_WAKEUP_USBMOUSE ); count++; break;
case CPUS_WAKEUP_LRADC : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_LRADC ", CPUS_WAKEUP_LRADC ); count++; break;
case CPUS_WAKEUP_CODEC : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_CODEC ", CPUS_WAKEUP_CODEC ); count++; break;
case CPUS_WAKEUP_BAT_TEMP : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_BAT_TEMP ", CPUS_WAKEUP_BAT_TEMP ); count++; break;
case CPUS_WAKEUP_FULLBATT : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_FULLBATT ", CPUS_WAKEUP_FULLBATT ); count++; break;
case CPUS_WAKEUP_HMIC : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_HMIC ", CPUS_WAKEUP_HMIC ); count++; break;
case CPUS_WAKEUP_POWER_EXP : uk_printf(s, end -s, "%-36s bit 0x%x \t ", "CPUS_WAKEUP_POWER_EXP", CPUS_WAKEUP_POWER_EXP); count++; break;
default: break;
}
if(counted != count && 0 == count%2){
counted = count;
uk_printf(s, end-s, "\n");
}
}
}else if(CPU0_ID == cpu_id){ //for cpu0 wakeup src parse.
for(i=0; i<32; i++){
bit_event = (1<<i & event);
switch(bit_event){
case 0 : break;
case CPU0_WAKEUP_MSGBOX : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_MSGBOX ", CPU0_WAKEUP_MSGBOX ); count++; break;
case CPU0_WAKEUP_KEY : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_KEY ", CPU0_WAKEUP_KEY ); count++; break;
case CPU0_WAKEUP_EXINT : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_EXINT ", CPU0_WAKEUP_EXINT ); count++; break;
case CPU0_WAKEUP_IR : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_IR ", CPU0_WAKEUP_IR ); count++; break;
case CPU0_WAKEUP_ALARM : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_ALARM ", CPU0_WAKEUP_ALARM ); count++; break;
case CPU0_WAKEUP_USB : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_USB ", CPU0_WAKEUP_USB ); count++; break;
case CPU0_WAKEUP_TIMEOUT : uk_printf(s, end - s, "%-36s bit 0x%x \t ", "CPU0_WAKEUP_TIMEOUT", CPU0_WAKEUP_TIMEOUT); count++; break;
case CPU0_WAKEUP_PIO :
uk_printf(s, end - s, "\n%-36s bit 0x%x \t ", "CPU0_WAKEUP_PIO ", CPU0_WAKEUP_PIO );
uk_printf(s, end - s, "\n\twant to know gpio config & suspended status detail? \n\t\tcat /sys/power/aw_pm/debug_mask for help.\n");
count++;
break;
default: break;
}
if(counted != count && 0 == count%2){
counted = count;
uk_printf(s, end-s, "\n");
}
}
}
uk_printf(s, end-s, "\n");
return (s - start);
}
unsigned int parse_wakeup_gpio_map(char *s, unsigned int size, unsigned int gpio_map)
{
int i = 0;
unsigned int bit_event = 0;
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
if(!(parse_bitmap_en & DEBUG_WAKEUP_GPIO_MAP))
return 0;
s = NULL;
}else{
end = s + size;
}
uk_printf(s, end - s, "%s", "WAKEUP_GPIO,for cpus:pl,pm, and axp, is as follow: \n");
for(i=0; i<32; i++){
bit_event = (1<<i & gpio_map);
if(0 != bit_event){
if(bit_event <= WAKEUP_GPIO_PL(GPIO_PL_MAX_NUM)){
uk_printf(s, end - s, "\tWAKEUP_GPIO_PL ");
s += parse_bitmap(s, end - s, bit_event);
}
else if(bit_event <= WAKEUP_GPIO_PM(GPIO_PM_MAX_NUM)){
uk_printf(s, end - s, "\tWAKEUP_GPIO_PM ");
s += parse_bitmap(s, end - s, bit_event>>(GPIO_PL_MAX_NUM + 1));
}else if(bit_event <= WAKEUP_GPIO_AXP(GPIO_AXP_MAX_NUM)){
uk_printf(s, end - s, "\tWAKEUP_GPIO_AXP ");
s += parse_bitmap(s, end - s, bit_event>>(GPIO_PL_MAX_NUM + 1 + GPIO_PM_MAX_NUM + 1));
}else {
uk_printf(s, end - s, "parse err.\n");
}
}
}
return (s - start);
}
unsigned int parse_wakeup_gpio_group_map(char *s, unsigned int size, unsigned int group_map)
{
int i = 0;
unsigned int bit_event = 0;
char *start = s;
char *end = NULL;
if(NULL == s || 0 == size){
//buffer is empty
if(!(parse_bitmap_en & DEBUG_WAKEUP_GPIO_GROUP_MAP))
return 0;
s = NULL;
}else{
end = s + size;
}
uk_printf(s, end - s, "WAKEUP_GPIO,for cpux:pa,pb,pc,pd,.., is as follow: \n");
for(i=0; i<32; i++){
bit_event = (1<<i & group_map);
if(0 != bit_event){
uk_printf(s, end - s, "\tWAKEUP_GPIO_GROUP: ");
s += parse_group_bitmap(s, end - s, bit_event);
}
}
return (s - start);
}
module_param_named(parse_bitmap_en, parse_bitmap_en, uint, S_IRUGO | S_IWUSR);