staticbool stmfx_reg_volatile(struct device *dev, unsignedint reg)
{ switch (reg) { case STMFX_REG_SYS_CTRL: case STMFX_REG_IRQ_SRC_EN: case STMFX_REG_IRQ_PENDING: case STMFX_REG_IRQ_GPI_PENDING1: case STMFX_REG_IRQ_GPI_PENDING2: case STMFX_REG_IRQ_GPI_PENDING3: case STMFX_REG_GPIO_STATE1: case STMFX_REG_GPIO_STATE2: case STMFX_REG_GPIO_STATE3: case STMFX_REG_IRQ_GPI_SRC1: case STMFX_REG_IRQ_GPI_SRC2: case STMFX_REG_IRQ_GPI_SRC3: case STMFX_REG_GPO_SET1: case STMFX_REG_GPO_SET2: case STMFX_REG_GPO_SET3: case STMFX_REG_GPO_CLR1: case STMFX_REG_GPO_CLR2: case STMFX_REG_GPO_CLR3: returntrue; default: returnfalse;
}
}
if (func & STMFX_FUNC_TS)
mask |= STMFX_REG_SYS_CTRL_TS_EN;
if (func & STMFX_FUNC_IDD)
mask |= STMFX_REG_SYS_CTRL_IDD_EN;
return mask;
}
int stmfx_function_enable(struct stmfx *stmfx, u32 func)
{
u32 sys_ctrl;
u8 mask; int ret;
ret = regmap_read(stmfx->map, STMFX_REG_SYS_CTRL, &sys_ctrl); if (ret) return ret;
/* * IDD and TS have priority in STMFX FW, so if IDD and TS are enabled, * ALTGPIO function is disabled by STMFX FW. If IDD or TS is enabled, * the number of aGPIO available decreases. To avoid GPIO management * disturbance, abort IDD or TS function enable in this case.
*/ if (((func & STMFX_FUNC_IDD) || (func & STMFX_FUNC_TS)) &&
(sys_ctrl & STMFX_REG_SYS_CTRL_ALTGPIO_EN)) {
dev_err(stmfx->dev, "ALTGPIO function already enabled\n"); return -EBUSY;
}
/* If TS is enabled, aGPIO[3:0] cannot be used */ if ((func & STMFX_FUNC_ALTGPIO_LOW) &&
(sys_ctrl & STMFX_REG_SYS_CTRL_TS_EN)) {
dev_err(stmfx->dev, "TS in use, aGPIO[3:0] unavailable\n"); return -EBUSY;
}
/* If IDD is enabled, aGPIO[7:4] cannot be used */ if ((func & STMFX_FUNC_ALTGPIO_HIGH) &&
(sys_ctrl & STMFX_REG_SYS_CTRL_IDD_EN)) {
dev_err(stmfx->dev, "IDD in use, aGPIO[7:4] unavailable\n"); return -EBUSY;
}
static irqreturn_t stmfx_irq_handler(int irq, void *data)
{ struct stmfx *stmfx = data; unsignedlong bits;
u32 pending, ack; int n, ret;
ret = regmap_read(stmfx->map, STMFX_REG_IRQ_PENDING, &pending); if (ret) return IRQ_NONE;
/* * There is no ACK for GPIO, MFX_REG_IRQ_PENDING_GPIO is a logical OR * of MFX_REG_IRQ_GPI _PENDING1/_PENDING2/_PENDING3
*/
ack = pending & ~BIT(STMFX_REG_IRQ_SRC_EN_GPIO); if (ack) {
ret = regmap_write(stmfx->map, STMFX_REG_IRQ_ACK, ack); if (ret) return IRQ_NONE;
}
if (stmfx->vdd) {
ret = regulator_enable(stmfx->vdd); if (ret) {
dev_err(stmfx->dev, "VDD enable failed: %d\n", ret); return ret;
}
}
/* Reset STMFX - supply has been stopped during suspend */
ret = stmfx_chip_reset(stmfx); if (ret) {
dev_err(stmfx->dev, "Failed to reset chip: %d\n", ret); return ret;
}
ret = regmap_raw_write(stmfx->map, STMFX_REG_SYS_CTRL,
&stmfx->bkp_sysctrl, sizeof(stmfx->bkp_sysctrl)); if (ret) return ret;
ret = regmap_raw_write(stmfx->map, STMFX_REG_IRQ_OUT_PIN,
&stmfx->bkp_irqoutpin, sizeof(stmfx->bkp_irqoutpin)); if (ret) return ret;
ret = regmap_raw_write(stmfx->map, STMFX_REG_IRQ_SRC_EN,
&stmfx->irq_src, sizeof(stmfx->irq_src)); if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.