SIM HotSwap Plugin/out HISR fail while touch in touch panel
时间:10-02
整理:3721RD
点击:
[Description]
1, touch and hold Touch Panel, or Press and holdkeys(used EINT)
2, Plug in or Plug out SIM card.
3, SIM card hot swap failure.
[Solution]
MT65*5/MT65*7 platform, AP & Modem share EINT module.
Touch and hold Touch Panel, or Press and hold keys(used EINT), Touch/keys EINT pin
trigger by AP, AP EINT ownermask EINT_MD. So modem EINT failure.
Patch: ALPS00420157
OR
modify AP side mt_eint.c/MT6577/5_eint.c as flow
alps\mediatek\platform\$(mt6577 or MT6575)\kernel\core\mt6577/5_eint.c(ICS2)
alps\mediatek\platform\$(mt6577 or mt6575)\kernel\core\mt_eint.c(JB)
/*
* mt65xx_eint_isr: EINT interrupt service routine.
* @irq: EINT IRQ number
* @dev_id:
* Return IRQ returned code.
*/
static irqreturn_t mt65xx_eint_isr(int irq, void *dev_id)
{
unsigned int index;
unsigned int status;
unsigned int domain;
/*
* NoteXXX: Need to get the wake up for 0.5 seconds when an EINT intr tirggers.
* This is used to prevent system fROM suspend such that other drivers
* or applications can have enough time to obtain their own wake lock.
* (This information is gotten from the power management owner.)
*/
tasklet_schedule(&eint_tasklet);
status = readl(EINT_STA);
domain = readl(EINT_D0EN);
dbGMSg("EINT Module - %s ISR Start\n", __func__);
dbgmsg("EINT Module - EINT_STA = 0x%x\n", status);
for (index = 0; index < EINT_MAX_CHANNEL; index++) {
if ((status & (1 << (index))) && (domain & (1 << (index)))) {
mt65xx_eint_mask(index);
if (EINT_FUNC.eint_func[index]) {
EINT_FUNC.eint_func[index]();
}
mt65xx_reg_sync_writel(1 << index, EINT_INTACK);
#if(EINT_DEBUG == 1)
status = readl(EINT_STA);
printk("EINT Module - EINT_STA after ack = 0x%x\n", status);
#endif
if (EINT_FUNC.eint_auto_umask[index]) {
mt65xx_eint_unmask(index);
}
}
}
dbgmsg("EINT Module - %s ISR END\n", __func__);
return IRQ_HANDLED;
}
1, touch and hold Touch Panel, or Press and holdkeys(used EINT)
2, Plug in or Plug out SIM card.
3, SIM card hot swap failure.
[Solution]
MT65*5/MT65*7 platform, AP & Modem share EINT module.
Touch and hold Touch Panel, or Press and hold keys(used EINT), Touch/keys EINT pin
trigger by AP, AP EINT ownermask EINT_MD. So modem EINT failure.
Patch: ALPS00420157
OR
modify AP side mt_eint.c/MT6577/5_eint.c as flow
alps\mediatek\platform\$(mt6577 or MT6575)\kernel\core\mt6577/5_eint.c(ICS2)
alps\mediatek\platform\$(mt6577 or mt6575)\kernel\core\mt_eint.c(JB)
/*
* mt65xx_eint_isr: EINT interrupt service routine.
* @irq: EINT IRQ number
* @dev_id:
* Return IRQ returned code.
*/
static irqreturn_t mt65xx_eint_isr(int irq, void *dev_id)
{
unsigned int index;
unsigned int status;
unsigned int domain;
/*
* NoteXXX: Need to get the wake up for 0.5 seconds when an EINT intr tirggers.
* This is used to prevent system fROM suspend such that other drivers
* or applications can have enough time to obtain their own wake lock.
* (This information is gotten from the power management owner.)
*/
tasklet_schedule(&eint_tasklet);
status = readl(EINT_STA);
domain = readl(EINT_D0EN);
dbGMSg("EINT Module - %s ISR Start\n", __func__);
dbgmsg("EINT Module - EINT_STA = 0x%x\n", status);
for (index = 0; index < EINT_MAX_CHANNEL; index++) {
if ((status & (1 << (index))) && (domain & (1 << (index)))) {
mt65xx_eint_mask(index);
if (EINT_FUNC.eint_func[index]) {
EINT_FUNC.eint_func[index]();
}
mt65xx_reg_sync_writel(1 << index, EINT_INTACK);
#if(EINT_DEBUG == 1)
status = readl(EINT_STA);
printk("EINT Module - EINT_STA after ack = 0x%x\n", status);
#endif
if (EINT_FUNC.eint_auto_umask[index]) {
mt65xx_eint_unmask(index);
}
}
}
dbgmsg("EINT Module - %s ISR END\n", __func__);
return IRQ_HANDLED;
}
签到
顶起来