[ARM] msm: Add item argument to smsm_change_state and smsm_get_state
The new protocol require writing to two state fields, and reading several fields. Signed-off-by: Arve Hjønnevåg <arve@android.com> Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
This commit is contained in:
parent
5b0f5a3f60
commit
283794100d
2 changed files with 50 additions and 38 deletions
|
@ -49,16 +49,13 @@ static int msm_smd_debug_mask;
|
||||||
struct shared_info
|
struct shared_info
|
||||||
{
|
{
|
||||||
int ready;
|
int ready;
|
||||||
unsigned state_apps;
|
unsigned state;
|
||||||
unsigned state_modem;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned dummy_state_apps;
|
static unsigned dummy_state[SMSM_STATE_COUNT];
|
||||||
static unsigned dummy_state_modem;
|
|
||||||
|
|
||||||
static struct shared_info smd_info = {
|
static struct shared_info smd_info = {
|
||||||
.state_apps = (unsigned) &dummy_state_apps,
|
.state = (unsigned) &dummy_state,
|
||||||
.state_modem = (unsigned) &dummy_state_modem,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module_param_named(debug_mask, msm_smd_debug_mask,
|
module_param_named(debug_mask, msm_smd_debug_mask,
|
||||||
|
@ -115,9 +112,14 @@ static void handle_modem_crash(void)
|
||||||
|
|
||||||
extern int (*msm_check_for_modem_crash)(void);
|
extern int (*msm_check_for_modem_crash)(void);
|
||||||
|
|
||||||
|
uint32_t raw_smsm_get_state(enum smsm_state_item item)
|
||||||
|
{
|
||||||
|
return readl(smd_info.state + item * 4);
|
||||||
|
}
|
||||||
|
|
||||||
static int check_for_modem_crash(void)
|
static int check_for_modem_crash(void)
|
||||||
{
|
{
|
||||||
if (readl(smd_info.state_modem) & SMSM_RESET) {
|
if (raw_smsm_get_state(SMSM_STATE_MODEM) & SMSM_RESET) {
|
||||||
handle_modem_crash();
|
handle_modem_crash();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -978,8 +980,8 @@ static irqreturn_t smsm_irq_handler(int irq, void *data)
|
||||||
|
|
||||||
spin_lock_irqsave(&smem_lock, flags);
|
spin_lock_irqsave(&smem_lock, flags);
|
||||||
|
|
||||||
apps = readl(smd_info.state_apps);
|
apps = raw_smsm_get_state(SMSM_STATE_APPS);
|
||||||
modm = readl(smd_info.state_modem);
|
modm = raw_smsm_get_state(SMSM_STATE_MODEM);
|
||||||
|
|
||||||
if (msm_smd_debug_mask & MSM_SMSM_DEBUG)
|
if (msm_smd_debug_mask & MSM_SMSM_DEBUG)
|
||||||
pr_info("<SM %08x %08x>\n", apps, modm);
|
pr_info("<SM %08x %08x>\n", apps, modm);
|
||||||
|
@ -992,24 +994,26 @@ static irqreturn_t smsm_irq_handler(int irq, void *data)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smsm_change_state(uint32_t clear_mask, uint32_t set_mask)
|
int smsm_change_state(enum smsm_state_item item,
|
||||||
|
uint32_t clear_mask, uint32_t set_mask)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned state;
|
unsigned state;
|
||||||
|
unsigned addr = smd_info.state + item * 4;
|
||||||
|
|
||||||
if (!smd_info.ready)
|
if (!smd_info.ready)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
spin_lock_irqsave(&smem_lock, flags);
|
spin_lock_irqsave(&smem_lock, flags);
|
||||||
|
|
||||||
if (readl(smd_info.state_modem) & SMSM_RESET)
|
if (raw_smsm_get_state(SMSM_STATE_MODEM) & SMSM_RESET)
|
||||||
handle_modem_crash();
|
handle_modem_crash();
|
||||||
|
|
||||||
state = (readl(smd_info.state_apps) & ~clear_mask) | set_mask;
|
state = (readl(addr) & ~clear_mask) | set_mask;
|
||||||
writel(state, smd_info.state_apps);
|
writel(state, addr);
|
||||||
|
|
||||||
if (msm_smd_debug_mask & MSM_SMSM_DEBUG)
|
if (msm_smd_debug_mask & MSM_SMSM_DEBUG)
|
||||||
pr_info("smsm_change_state %x\n", state);
|
pr_info("smsm_change_state %d %x\n", item, state);
|
||||||
notify_other_smsm();
|
notify_other_smsm();
|
||||||
|
|
||||||
spin_unlock_irqrestore(&smem_lock, flags);
|
spin_unlock_irqrestore(&smem_lock, flags);
|
||||||
|
@ -1017,16 +1021,16 @@ int smsm_change_state(uint32_t clear_mask, uint32_t set_mask)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t smsm_get_state(void)
|
uint32_t smsm_get_state(enum smsm_state_item item)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
uint32_t rv;
|
uint32_t rv;
|
||||||
|
|
||||||
spin_lock_irqsave(&smem_lock, flags);
|
spin_lock_irqsave(&smem_lock, flags);
|
||||||
|
|
||||||
rv = readl(smd_info.state_modem);
|
rv = readl(smd_info.state + item * 4);
|
||||||
|
|
||||||
if (rv & SMSM_RESET)
|
if (item == SMSM_STATE_MODEM && (rv & SMSM_RESET))
|
||||||
handle_modem_crash();
|
handle_modem_crash();
|
||||||
|
|
||||||
spin_unlock_irqrestore(&smem_lock, flags);
|
spin_unlock_irqrestore(&smem_lock, flags);
|
||||||
|
@ -1145,14 +1149,8 @@ int smd_core_init(void)
|
||||||
unsigned size;
|
unsigned size;
|
||||||
void *state;
|
void *state;
|
||||||
state = smem_item(SMEM_SMSM_SHARED_STATE, &size);
|
state = smem_item(SMEM_SMSM_SHARED_STATE, &size);
|
||||||
if (size == SMSM_V1_SIZE) {
|
if (size == SMSM_V1_SIZE || size == SMSM_V2_SIZE) {
|
||||||
smd_info.state_apps = state + SMSM_V1_STATE_APPS;
|
smd_info.state = (unsigned)state;
|
||||||
smd_info.state_modem = state + SMSM_V1_STATE_MODEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (size == SMSM_V2_SIZE) {
|
|
||||||
smd_info.state_apps = state + SMSM_V2_STATE_APPS;
|
|
||||||
smd_info.state_modem = state + SMSM_V2_STATE_MODEM;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1181,8 +1179,8 @@ int smd_core_init(void)
|
||||||
do_smd_probe();
|
do_smd_probe();
|
||||||
|
|
||||||
/* indicate that we're up and running */
|
/* indicate that we're up and running */
|
||||||
writel(SMSM_INIT | SMSM_SMDINIT | SMSM_RPCINIT, smd_info.state_apps);
|
smsm_change_state(SMSM_STATE_APPS,
|
||||||
notify_other_smsm();
|
~0, SMSM_INIT | SMSM_SMDINIT | SMSM_RPCINIT);
|
||||||
|
|
||||||
pr_info("smd_core_init() done\n");
|
pr_info("smd_core_init() done\n");
|
||||||
|
|
||||||
|
@ -1227,13 +1225,13 @@ static int debug_read_stat(char *buf, int max)
|
||||||
|
|
||||||
msg = smem_find(ID_DIAG_ERR_MSG, SZ_DIAG_ERR_MSG);
|
msg = smem_find(ID_DIAG_ERR_MSG, SZ_DIAG_ERR_MSG);
|
||||||
|
|
||||||
if (readl(smd_info.state_modem) & SMSM_RESET)
|
if (raw_smsm_get_state(SMSM_STATE_MODEM) & SMSM_RESET)
|
||||||
i += scnprintf(buf + i, max - i,
|
i += scnprintf(buf + i, max - i,
|
||||||
"smsm: ARM9 HAS CRASHED\n");
|
"smsm: ARM9 HAS CRASHED\n");
|
||||||
|
|
||||||
i += scnprintf(buf + i, max - i, "smsm: a9: %08x a11: %08x\n",
|
i += scnprintf(buf + i, max - i, "smsm: a9: %08x a11: %08x\n",
|
||||||
readl(smd_info.state_modem),
|
raw_smsm_get_state(SMSM_STATE_MODEM),
|
||||||
readl(smd_info.state_apps));
|
raw_smsm_get_state(SMSM_STATE_APPS));
|
||||||
|
|
||||||
if (msg) {
|
if (msg) {
|
||||||
msg[SZ_DIAG_ERR_MSG - 1] = 0;
|
msg[SZ_DIAG_ERR_MSG - 1] = 0;
|
||||||
|
|
|
@ -59,13 +59,7 @@ struct smem_shared
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SMSM_V1_SIZE (sizeof(unsigned) * 8)
|
#define SMSM_V1_SIZE (sizeof(unsigned) * 8)
|
||||||
#define SMSM_V1_STATE_APPS 0x0000
|
|
||||||
#define SMSM_V1_STATE_MODEM 0x0004
|
|
||||||
#define SMSM_V1_STATE_DSP 0x0008
|
|
||||||
|
|
||||||
#define SMSM_V2_SIZE (sizeof(unsigned) * 4)
|
#define SMSM_V2_SIZE (sizeof(unsigned) * 4)
|
||||||
#define SMSM_V2_STATE_APPS 0x0004
|
|
||||||
#define SMSM_V2_STATE_MODEM 0x000C
|
|
||||||
|
|
||||||
struct smsm_interrupt_info
|
struct smsm_interrupt_info
|
||||||
{
|
{
|
||||||
|
@ -113,9 +107,29 @@ struct smsm_interrupt_info
|
||||||
#define SMSM_WKUP_REASON_ALARM 0x00000010
|
#define SMSM_WKUP_REASON_ALARM 0x00000010
|
||||||
#define SMSM_WKUP_REASON_RESET 0x00000020
|
#define SMSM_WKUP_REASON_RESET 0x00000020
|
||||||
|
|
||||||
|
#ifndef CONFIG_ARCH_MSM_SCORPION
|
||||||
|
enum smsm_state_item {
|
||||||
|
SMSM_STATE_APPS = 1,
|
||||||
|
SMSM_STATE_MODEM = 3,
|
||||||
|
SMSM_STATE_COUNT,
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
enum smsm_state_item {
|
||||||
|
SMSM_STATE_APPS,
|
||||||
|
SMSM_STATE_MODEM,
|
||||||
|
SMSM_STATE_HEXAGON,
|
||||||
|
SMSM_STATE_APPS_DEM,
|
||||||
|
SMSM_STATE_MODEM_DEM,
|
||||||
|
SMSM_STATE_QDSP6_DEM,
|
||||||
|
SMSM_STATE_POWER_MASTER_DEM,
|
||||||
|
SMSM_STATE_TIME_MASTER_DEM,
|
||||||
|
SMSM_STATE_COUNT,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
void *smem_alloc(unsigned id, unsigned size);
|
void *smem_alloc(unsigned id, unsigned size);
|
||||||
int smsm_change_state(uint32_t clear_mask, uint32_t set_mask);
|
int smsm_change_state(enum smsm_state_item item, uint32_t clear_mask, uint32_t set_mask);
|
||||||
uint32_t smsm_get_state(void);
|
uint32_t smsm_get_state(enum smsm_state_item item);
|
||||||
int smsm_set_sleep_duration(uint32_t delay);
|
int smsm_set_sleep_duration(uint32_t delay);
|
||||||
int smsm_set_interrupt_info(struct smsm_interrupt_info *info);
|
int smsm_set_interrupt_info(struct smsm_interrupt_info *info);
|
||||||
void smsm_print_sleep_info(void);
|
void smsm_print_sleep_info(void);
|
||||||
|
|
Loading…
Add table
Reference in a new issue