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, &reg);
51d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts = reg;
52d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
53d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts |= reg << 8;
54d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
55d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts |= reg << 16;
56d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
57d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts |= reg << 24;
58d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya
59d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK, 1, &reg);
60d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_mask = reg;
61d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
62d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_mask |= reg << 8;
63d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
64d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_mask |= reg << 16;
65d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
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, &reg);
84d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg = irq_sts & 0xFF;
85d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts >>= 8;
86d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	if (reg)
87d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
88d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg = irq_sts & 0xFF;
89d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	irq_sts >>= 8;
90d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	if (reg)
91d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
92d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg = irq_sts & 0xFF;
93d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	if (reg)
94d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
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, &reg);
113d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg_mask = reg;
114d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK2, 1, &reg);
115d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg_mask |= reg << 8;
116d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK3, 1, &reg);
117d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	reg_mask |= reg << 16;
118d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_MSK4, 1, &reg);
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, &reg);
124d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		reg = tps65912->irq_mask >> 8 & 0xFF;
125d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_MSK2, 1, &reg);
126d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		reg = tps65912->irq_mask >> 16 & 0xFF;
127d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_MSK3, 1, &reg);
128d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		reg = tps65912->irq_mask >> 24 & 0xFF;
129d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya		tps65912->write(tps65912, TPS65912_INT_MSK4, 1, &reg);
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, &reg);
176d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->write(tps65912, TPS65912_INT_STS, 1, &reg);
177d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS2, 1, &reg);
178d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->write(tps65912, TPS65912_INT_STS2, 1, &reg);
179d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS3, 1, &reg);
180d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->write(tps65912, TPS65912_INT_STS3, 1, &reg);
181d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->read(tps65912, TPS65912_INT_STS4, 1, &reg);
182d49a0f3f14a763242b71244019d7881ee06e0658Margarita Olaya	tps65912->write(tps65912, TPS65912_INT_STS4, 1, &reg);
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