static int pm8821_read_block_irq(struct pm_irq_chip *chip, int master, u8 block, u8 *bits) { int rc; spin_lock(&chip->pm_irq_lock); rc = pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_IT_STATUS(chip->masters[master], block), bits); if (rc) pr_err("Failed Reading Status rc=%d\n", rc); spin_unlock(&chip->pm_irq_lock); return rc; }
static int pm8xxx_read_block_irq(struct pm_irq_chip *chip, u8 bp, u8 *ip) { int rc; spin_lock(&chip->pm_irq_lock); rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL(chip->base_addr), bp); if (rc) { pr_err("Failed Selecting Block %d rc=%d\n", bp, rc); goto bail; } rc = pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_IT_STATUS(chip->base_addr), ip); if (rc) pr_err("Failed Reading Status rc=%d\n", rc); bail: spin_unlock(&chip->pm_irq_lock); return rc; }
int pm8xxx_get_irq_it_stat(struct pm_irq_chip *chip, int irq) { int pmirq, rc; u8 block, bits, bit; if (chip == NULL || irq < chip->irq_base || irq >= chip->irq_base + chip->num_irqs) return -EINVAL; pmirq = irq - chip->irq_base; block = pmirq / 8; bit = pmirq % 8; rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL(chip->base_addr), block); if (rc) { pr_err("Failed Selecting block irq=%d pmirq=%d blk=%d rc=%d\n", irq, pmirq, block, rc); goto bail_out; } rc = pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_IT_STATUS(chip->base_addr), &bits); if (rc) { pr_err("Failed Configuring irq=%d pmirq=%d blk=%d rc=%d\n", irq, pmirq, block, rc); goto bail_out; } rc = (bits & (1 << bit)) ? 1 : 0; bail_out: return rc; }