460 lines
12 KiB
C
460 lines
12 KiB
C
|
/*
|
||
|
* Copyright (c) 2007-2017 Allwinnertech Co., Ltd.
|
||
|
*
|
||
|
* This software is licensed under the terms of the GNU General Public
|
||
|
* License version 2, as published by the Free Software Foundation, and
|
||
|
* may be copied, distributed, and modified under those terms.
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* 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)
|
||
|
{
|
||
|
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. */
|
||
|
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_GPIO:
|
||
|
uk_printf(s, end - s,
|
||
|
"\n%-36s bit 0x%x \t ",
|
||
|
"CPU0_WAKEUP_GPIO ", CPU0_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_HDMI_CEC:
|
||
|
uk_printf(s, end - s, "%-36s bit 0x%x \t ",
|
||
|
"CPUS_WAKEUP_HDMI_CEC ", CPUS_WAKEUP_HDMI_CEC);
|
||
|
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:
|
||
|
uk_printf(s, end - s, "Warning: para err. \t ");
|
||
|
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);
|