// SPDX-License-Identifier: GPL-2.0+ // // max8997-irq.c - Interrupt controller support for MAX8997 // // Copyright (C) 2011 Samsung Electronics Co.Ltd // MyungJoo Ham <myungjoo.ham@samsung.com> // // This driver is based on max8998-irq.c
ret = max8997_read_reg(max8997->i2c, MAX8997_REG_INTSRC, &irq_src); if (ret < 0) {
dev_err(max8997->dev, "Failed to read interrupt source: %d\n",
ret); return IRQ_NONE;
}
if (irq_src & MAX8997_IRQSRC_PMIC) { /* PMIC INT1 ~ INT4 */
max8997_bulk_read(max8997->i2c, MAX8997_REG_INT1, 4,
&irq_reg[PMIC_INT1]);
} if (irq_src & MAX8997_IRQSRC_FUELGAUGE) { /* * TODO: FUEL GAUGE * * This is to be supported by Max17042 driver. When * an interrupt incurs here, it should be relayed to a * Max17042 device that is connected (probably by * platform-data). However, we do not have interrupt * handling in Max17042 driver currently. The Max17042 IRQ * driver should be ready to be used as a stand-alone device and * a Max8997-dependent device. Because it is not ready in * Max17042-side and it is not too critical in operating * Max8997, we do not implement this in initial releases.
*/
irq_reg[FUEL_GAUGE] = 0;
} if (irq_src & MAX8997_IRQSRC_MUIC) { /* MUIC INT1 ~ INT3 */
max8997_bulk_read(max8997->muic, MAX8997_MUIC_REG_INT1, 3,
&irq_reg[MUIC_INT1]);
} if (irq_src & MAX8997_IRQSRC_GPIO) { /* GPIO Interrupt */
u8 gpio_info[MAX8997_NUM_GPIO];
irq_reg[GPIO_LOW] = 0;
irq_reg[GPIO_HI] = 0;
max8997_bulk_read(max8997->i2c, MAX8997_REG_GPIOCNTL1,
MAX8997_NUM_GPIO, gpio_info); for (i = 0; i < MAX8997_NUM_GPIO; i++) { bool interrupt = false;
switch (gpio_info[i] & MAX8997_GPIO_INT_MASK) { case MAX8997_GPIO_INT_BOTH: if (max8997->gpio_status[i] != gpio_info[i])
interrupt = true; break; case MAX8997_GPIO_INT_RISE: if ((max8997->gpio_status[i] != gpio_info[i]) &&
(gpio_info[i] & MAX8997_GPIO_DATA_MASK))
interrupt = true; break; case MAX8997_GPIO_INT_FALL: if ((max8997->gpio_status[i] != gpio_info[i]) &&
!(gpio_info[i] & MAX8997_GPIO_DATA_MASK))
interrupt = true; break; default: break;
}
if (interrupt) { if (i < 8)
irq_reg[GPIO_LOW] |= (1 << i); else
irq_reg[GPIO_HI] |= (1 << (i - 8));
}
}
} if (irq_src & MAX8997_IRQSRC_FLASH) { /* Flash Status Interrupt */
ret = max8997_read_reg(max8997->i2c, MAX8997_REG_FLASHSTATUS,
&irq_reg[FLASH_STATUS]);
}
/* Apply masking */ for (i = 0; i < MAX8997_IRQ_GROUP_NR; i++)
irq_reg[i] &= ~max8997->irq_masks_cur[i];
/* Report */ for (i = 0; i < MAX8997_IRQ_NR; i++) { if (irq_reg[max8997_irqs[i].group] & max8997_irqs[i].mask) {
cur_irq = irq_find_mapping(max8997->irq_domain, i); if (cur_irq)
handle_nested_irq(cur_irq);
}
}
return IRQ_HANDLED;
}
int max8997_irq_resume(struct max8997_dev *max8997)
{ if (max8997->irq && max8997->irq_domain)
max8997_irq_thread(0, max8997); return 0;
}
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.