1d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya/* 2d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * tps65912-irq.c -- TI TPS6591x 3d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * 4d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * Copyright 2011 Texas Instruments Inc. 5d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * 6d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * Author: Margarita Olaya <magi@slimlogic.co.uk> 7d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * 8d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * This program is free software; you can redistribute it and/or modify it 9d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * under the terms of the GNU General Public License as published by the 10d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * Free Software Foundation; either version 2 of the License, or (at your 11d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * option) any later version. 12d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * 13d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * This driver is based on wm8350 implementation. 14d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya */ 15d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 16d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/kernel.h> 17d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/module.h> 18d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/init.h> 19d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/bug.h> 20d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/device.h> 21d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/interrupt.h> 22d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/irq.h> 23d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/gpio.h> 24d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#include <linux/mfd/tps65912.h> 25d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 26d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic inline int irq_to_tps65912_irq(struct tps65912 *tps65912, 27d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya int irq) 28d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 29d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return irq - tps65912->irq_base; 30d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 31d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 32d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya/* 33d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * This is a threaded IRQ handler so can access I2C/SPI. Since the 34d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * IRQ handler explicitly clears the IRQ it handles the IRQ line 35d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * will be reasserted and the physical IRQ will be handled again if 36d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * another interrupt is asserted while we run - in the normal course 37d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * of events this is a rare occurrence so we save I2C/SPI reads. We're 38d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * also assuming that it's rare to get lots of interrupts firing 39d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * simultaneously so try to minimise I/O. 40d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya */ 41d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic irqreturn_t tps65912_irq(int irq, void *irq_data) 42d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 43d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912 *tps65912 = irq_data; 44d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u32 irq_sts; 45d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u32 irq_mask; 46d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u8 reg; 47d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya int i; 48d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 49d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 50d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS, 1, ®); 51d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts = reg; 52d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS2, 1, ®); 53d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts |= reg << 8; 54d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS3, 1, ®); 55d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts |= reg << 16; 56d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS4, 1, ®); 57d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts |= reg << 24; 58d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 59d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK, 1, ®); 60d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_mask = reg; 61d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK2, 1, ®); 62d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_mask |= reg << 8; 63d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK3, 1, ®); 64d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_mask |= reg << 16; 65d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK4, 1, ®); 66d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_mask |= reg << 24; 67d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 68d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts &= ~irq_mask; 69d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (!irq_sts) 70d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return IRQ_NONE; 71d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 72d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya for (i = 0; i < tps65912->irq_num; i++) { 73d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (!(irq_sts & (1 << i))) 74d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya continue; 75d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 76d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya handle_nested_irq(tps65912->irq_base + i); 77d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya } 78d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 79d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya /* Write the STS register back to clear IRQs we handled */ 80d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = irq_sts & 0xFF; 81d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts >>= 8; 82d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (reg) 83d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS, 1, ®); 84d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = irq_sts & 0xFF; 85d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts >>= 8; 86d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (reg) 87d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS2, 1, ®); 88d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = irq_sts & 0xFF; 89d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_sts >>= 8; 90d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (reg) 91d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS3, 1, ®); 92d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = irq_sts & 0xFF; 93d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (reg) 94d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS4, 1, ®); 95d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 96d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return IRQ_HANDLED; 97d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 98d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 99d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic void tps65912_irq_lock(struct irq_data *data) 100d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 101d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data); 102d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 103d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya mutex_lock(&tps65912->irq_lock); 104d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 105d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 106d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic void tps65912_irq_sync_unlock(struct irq_data *data) 107d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 108d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data); 109d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u32 reg_mask; 110d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u8 reg; 111d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 112d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK, 1, ®); 113d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg_mask = reg; 114d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK2, 1, ®); 115d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg_mask |= reg << 8; 116d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK3, 1, ®); 117d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg_mask |= reg << 16; 118d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_MSK4, 1, ®); 119d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg_mask |= reg << 24; 120d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 121d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (tps65912->irq_mask != reg_mask) { 122d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = tps65912->irq_mask & 0xFF; 123d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_MSK, 1, ®); 124d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = tps65912->irq_mask >> 8 & 0xFF; 125d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_MSK2, 1, ®); 126d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = tps65912->irq_mask >> 16 & 0xFF; 127d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_MSK3, 1, ®); 128d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya reg = tps65912->irq_mask >> 24 & 0xFF; 129d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_MSK4, 1, ®); 130d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya } 131d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 132d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya mutex_unlock(&tps65912->irq_lock); 133d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 134d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 135d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic void tps65912_irq_enable(struct irq_data *data) 136d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 137d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data); 138d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 139d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->irq_mask &= ~(1 << irq_to_tps65912_irq(tps65912, data->irq)); 140d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 141d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 142d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic void tps65912_irq_disable(struct irq_data *data) 143d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 144d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912 *tps65912 = irq_data_get_irq_chip_data(data); 145d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 146d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->irq_mask |= (1 << irq_to_tps65912_irq(tps65912, data->irq)); 147d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 148d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 149d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayastatic struct irq_chip tps65912_irq_chip = { 150d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya .name = "tps65912", 151d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya .irq_bus_lock = tps65912_irq_lock, 152d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya .irq_bus_sync_unlock = tps65912_irq_sync_unlock, 153d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya .irq_disable = tps65912_irq_disable, 154d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya .irq_enable = tps65912_irq_enable, 155d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya}; 156d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 157d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayaint tps65912_irq_init(struct tps65912 *tps65912, int irq, 158d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya struct tps65912_platform_data *pdata) 159d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 160d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya int ret, cur_irq; 161d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya int flags = IRQF_ONESHOT; 162d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya u8 reg; 163d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 164d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (!irq) { 165d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya dev_warn(tps65912->dev, "No interrupt support, no core IRQ\n"); 166d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return 0; 167d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya } 168d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 169d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (!pdata || !pdata->irq_base) { 170d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya dev_warn(tps65912->dev, "No interrupt support, no IRQ base\n"); 171d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return 0; 172d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya } 173d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 174d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya /* Clear unattended interrupts */ 175d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS, 1, ®); 176d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS, 1, ®); 177d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS2, 1, ®); 178d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS2, 1, ®); 179d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS3, 1, ®); 180d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS3, 1, ®); 181d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->read(tps65912, TPS65912_INT_STS4, 1, ®); 182d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->write(tps65912, TPS65912_INT_STS4, 1, ®); 183d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 184d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya /* Mask top level interrupts */ 185d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->irq_mask = 0xFFFFFFFF; 186d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 187d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya mutex_init(&tps65912->irq_lock); 188d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->chip_irq = irq; 189d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->irq_base = pdata->irq_base; 190d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 191d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya tps65912->irq_num = TPS65912_NUM_IRQ; 192d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 193d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya /* Register with genirq */ 194d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya for (cur_irq = tps65912->irq_base; 195d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya cur_irq < tps65912->irq_num + tps65912->irq_base; 196d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya cur_irq++) { 197d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_set_chip_data(cur_irq, tps65912); 198d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_set_chip_and_handler(cur_irq, &tps65912_irq_chip, 199d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya handle_edge_irq); 200d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_set_nested_thread(cur_irq, 1); 201d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya /* ARM needs us to explicitly flag the IRQ as valid 202d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya * and will set them noprobe when we do so. */ 203d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#ifdef CONFIG_ARM 204d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya set_irq_flags(cur_irq, IRQF_VALID); 205d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#else 206d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_set_noprobe(cur_irq); 207d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya#endif 208d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya } 209d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 210d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya ret = request_threaded_irq(irq, NULL, tps65912_irq, flags, 211d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya "tps65912", tps65912); 212d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 213d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW); 214d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya if (ret != 0) 215d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya dev_err(tps65912->dev, "Failed to request IRQ: %d\n", ret); 216d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 217d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return ret; 218d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 219d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya 220d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olayaint tps65912_irq_exit(struct tps65912 *tps65912) 221d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya{ 222d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya free_irq(tps65912->chip_irq, tps65912); 223d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya return 0; 224d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya} 225