ab8500-core.c revision 5ac98553afe41ffb5513fa8aac6df699a70231a3
162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Copyright (C) ST-Ericsson SA 2010
362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent *
462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * License Terms: GNU General Public License v2
562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Rabin Vincent <rabin.vincent@stericsson.com>
7adceed6263887e04721b477e6504aa24789f827dMattias Wallin * Author: Mattias Wallin <mattias.wallin@stericsson.com>
862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/kernel.h>
1162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/slab.h>
1262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/init.h>
1362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/irq.h>
1406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones#include <linux/irqdomain.h>
1562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/delay.h>
1662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/interrupt.h>
1762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/module.h>
1862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/platform_device.h>
1962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/mfd/core.h>
2047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#include <linux/mfd/abx500.h>
21ee66e653ca7425bc8ffca4e00f19a8057cd14e4dLinus Walleij#include <linux/mfd/abx500/ab8500.h>
2200441b5e6b98ad6a50b5cb7f88d473e3ea1e0d75Lee Jones#include <linux/mfd/abx500/ab8500-bm.h>
23d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones#include <linux/mfd/dbx500-prcmu.h>
24549931f99e030d63a437c23943fd8dc9b7c0e41cSundar R Iyer#include <linux/regulator/ab8500.h>
256bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of.h>
266bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of_device.h>
2762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
2862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
2962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Interrupt register offsets
3062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Bank : 0x0E
3162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
3247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE1_REG		0x00
3347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE2_REG		0x01
3447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE3_REG		0x02
3547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE4_REG		0x03
3647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE5_REG		0x04
3747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE6_REG		0x05
3847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE7_REG		0x06
3947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE8_REG		0x07
40d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_SOURCE13_REG		0x0C
4147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE19_REG		0x12
4247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE20_REG		0x13
4347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE21_REG		0x14
4447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE22_REG		0x15
4547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE23_REG		0x16
4647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE24_REG		0x17
4762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
4962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * latch registers
5062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
5147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH1_REG		0x20
5247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH2_REG		0x21
5347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH3_REG		0x22
5447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH4_REG		0x23
5547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH5_REG		0x24
5647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH6_REG		0x25
5747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH7_REG		0x26
5847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH8_REG		0x27
5947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH9_REG		0x28
6047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH10_REG		0x29
6192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin#define AB8500_IT_LATCH12_REG		0x2B
62d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_LATCH13_REG		0x2C
6347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH19_REG		0x32
6447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH20_REG		0x33
6547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH21_REG		0x34
6647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH22_REG		0x35
6747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH23_REG		0x36
6847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH24_REG		0x37
6962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
7062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
7162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * mask registers
7262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
7362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
7447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK1_REG		0x40
7547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK2_REG		0x41
7647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK3_REG		0x42
7747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK4_REG		0x43
7847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK5_REG		0x44
7947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK6_REG		0x45
8047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK7_REG		0x46
8147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK8_REG		0x47
8247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK9_REG		0x48
8347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK10_REG		0x49
8447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK11_REG		0x4A
8547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK12_REG		0x4B
8647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK13_REG		0x4C
8747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK14_REG		0x4D
8847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK15_REG		0x4E
8947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK16_REG		0x4F
9047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK17_REG		0x50
9147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK18_REG		0x51
9247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK19_REG		0x52
9347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK20_REG		0x53
9447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK21_REG		0x54
9547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK22_REG		0x55
9647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK23_REG		0x56
9747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK24_REG		0x57
98a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones#define AB8500_IT_MASK25_REG		0x58
9947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/*
1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers
1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */
1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG	0x60
1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG	0x61
1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG	0x62
1063e1a498f2728476535571d270081a17fdfceaf26Lee Jones#define AB8540_IT_LATCHHIER4_REG	0x63
1077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
1087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM		3
1093e1a498f2728476535571d270081a17fdfceaf26Lee Jones#define AB8540_IT_LATCHHIER_NUM		4
1107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
11147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG			0x80
1120f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG		0x82
113e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS	0x00
11462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
115b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS		0x00
11693ff722e88530b9719cbf53be4f3197722461394Lee Jones#define AB8505_TURN_ON_STATUS_2	0x04
117b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
118f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define AB8500_CH_USBCH_STAT1_REG	0x02
119f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define VBUS_DET_DBNC100		0x02
120f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define VBUS_DET_DBNC1			0x01
121f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan
122f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic DEFINE_SPINLOCK(on_stat_lock);
123f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic u8 turn_on_stat_mask = 0xFF;
124f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic u8 turn_on_stat_set;
1256ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */
1266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO);
1276ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
128d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG			0x23
129d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT	BIT(2)
130d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
13262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
1332ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are
1342ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h
13562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent *
13662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at
13762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0.
13862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
1392ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */
14062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = {
14192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21,
14262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
14362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
144a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones/* AB9540 / AB8505 support */
145d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = {
146a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22, 23
147d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
148d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1493e1a498f2728476535571d270081a17fdfceaf26Lee Jones/* AB8540 support */
1503e1a498f2728476535571d270081a17fdfceaf26Lee Jonesstatic const int ab8540_irq_regoffset[AB8540_NUM_IRQ_REGS] = {
1513e1a498f2728476535571d270081a17fdfceaf26Lee Jones	0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22, 23,
1523e1a498f2728476535571d270081a17fdfceaf26Lee Jones	25, 26, 27, 28, 29, 30, 31,
1533e1a498f2728476535571d270081a17fdfceaf26Lee Jones};
1543e1a498f2728476535571d270081a17fdfceaf26Lee Jones
1550f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = {
1560f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8500] = "AB8500",
1570f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8505] = "AB8505",
1580f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB9540] = "AB9540",
1590f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8540] = "AB8540",
1600f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij};
1610f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
162822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)
163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
166d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
167d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
172822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data)
174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data,
178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		&mask, 1);
179d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
180d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
181d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
182d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
183d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
184822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr)
185d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
186d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
187d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data;
188d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
189d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
190d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0) {
191d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
192d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return ret;
193d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	}
194d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return (int)data;
195d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
196d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev)
19847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
1996bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	struct ab8500 *ab8500;
2006bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin
2016bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	if (!dev)
2026bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin		return -EINVAL;
2036bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	ab8500 = dev_get_drvdata(dev->parent);
2046bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	return ab8500 ? (int)ab8500->chip_id : -EINVAL;
20547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
20647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
20747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
20847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 data)
20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
21147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/*
21247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * Put the u8 bank and u8 register together into a an u16.
21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * The bank on higher 8 bits and register in lower 8 bits.
21447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * */
21547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
21662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
21762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
21862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
219392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
22047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
22162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->write(ab8500, addr, data);
22262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
22462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
22662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
22862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
22962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank,
23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 value)
23262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
233112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
23447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
236112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
237112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = set_register_interruptible(ab8500, bank, reg, value);
238112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
239112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
24062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
24162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
24347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
24647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
24747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
24947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
250392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
25162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
25262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->read(ab8500, addr);
25362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
25462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
25562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
25647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	else
25747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		*value = ret;
25862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
26062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
26162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
26362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
26462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank,
26647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
26762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
268112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
26947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
27062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
271112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
272112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = get_register_interruptible(ab8500, bank, reg, value);
273112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
274112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
27562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
27647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
27747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
27847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 bitmask, u8 bitvalues)
27962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
28062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
28147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
28247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
28347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
28462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
285392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
28662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
287bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ab8500->write_masked == NULL) {
288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		u8 data;
28962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->read(ab8500, addr);
291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0) {
292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			goto out;
295bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		}
29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
297bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (u8)ret;
298bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (~bitmask & data) | (bitmask & bitvalues);
299bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson
300bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->write(ab8500, addr, data);
301bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0)
302bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
303bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
30462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
305bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr,
306bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			data);
307bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		goto out;
308bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	}
309bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues);
310bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ret < 0)
311bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr,
312bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			ret);
31362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout:
31462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->lock);
31562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
31662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev,
31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 bank, u8 reg, u8 bitmask, u8 bitvalues)
32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
321112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
32347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
324112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
325112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret= mask_and_set_register_interruptible(ab8500, bank, reg,
326112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg						 bitmask, bitvalues);
327112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
328112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
32947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
33047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
33147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = {
33247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_chip_id = ab8500_get_chip_id,
33347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register = ab8500_get_register,
33447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register = ab8500_set_register,
33547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register_page = NULL,
33647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register_page = NULL,
33747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.mask_and_set_register = ab8500_mask_and_set_register,
33847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.event_registers_startup_state_get = NULL,
33947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.startup_irq_enabled = NULL,
3401d843a6c8c2067615fea0ff8cb62d4a5c4a6f8aeMian Yousaf Kaukab	.dump_all_banks = ab8500_dump_all_banks,
34147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin};
34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3439505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data)
34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3459505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
34662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
34762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_lock(&ab8500->irq_lock);
348112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
34962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
35062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3519505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data)
35262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3539505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
35562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3562ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
35762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 old = ab8500->oldmask[i];
35862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 new = ab8500->mask[i];
35962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int reg;
36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (new == old)
36262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
36362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3640f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
3650f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
3660f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
3670f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
3680f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
3690f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			is_ab8500_1p1_or_earlier(ab8500))
37092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
37192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
3723e1a498f2728476535571d270081a17fdfceaf26Lee Jones		if (ab8500->irq_reg_offset[i] < 0)
3733e1a498f2728476535571d270081a17fdfceaf26Lee Jones			continue;
3743e1a498f2728476535571d270081a17fdfceaf26Lee Jones
37562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->oldmask[i] = new;
37662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3772ced445e2ddf65f484a489161accddf475676965Linus Walleij		reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i];
37847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
37962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
380112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
38162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->irq_lock);
38262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
38362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3849505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data)
38562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3869505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
38706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
38862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
38962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
39062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
39162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ab8500->mask[index] |= mask;
3929c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones
3939c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	/* The AB8500 GPIOs have two interrupts each (rising & falling). */
3949c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R)
3959c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index + 2] |= mask;
3969c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R)
3979c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index + 1] |= mask;
3989c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R)
399e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		/* Here the falling IRQ is one bit lower */
400e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		ab8500->mask[index] |= (mask << 1);
40162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
40262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4039505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data)
40462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
4059505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
4069c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	unsigned int type = irqd_get_trigger_type(data);
40706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
40862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
40962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
41062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4119c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (type & IRQ_TYPE_EDGE_RISING)
4129c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index] &= ~mask;
4139c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones
4149c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	/* The AB8500 GPIOs have two interrupts each (rising & falling). */
4159c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (type & IRQ_TYPE_EDGE_FALLING) {
4169c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R)
4179c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index + 2] &= ~mask;
4189c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R)
4199c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index + 1] &= ~mask;
4209c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R)
421e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			/* Here the falling IRQ is one bit lower */
422e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			ab8500->mask[index] &= ~(mask << 1);
4239c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else
4249c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index] &= ~mask;
425e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij	} else {
4269c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		/* Satisfies the case where type is not set. */
4279c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index] &= ~mask;
428e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij	}
42962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
43062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
43140f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jonesstatic int ab8500_irq_set_type(struct irq_data *data, unsigned int type)
43240f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones{
43340f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones	return 0;
43462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
43562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
43662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = {
43762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	.name			= "ab8500",
4389505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_lock		= ab8500_irq_lock,
4399505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_sync_unlock	= ab8500_irq_sync_unlock,
4409505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_mask		= ab8500_irq_mask,
441e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath	.irq_disable		= ab8500_irq_mask,
4429505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_unmask		= ab8500_irq_unmask,
44340f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones	.irq_set_type		= ab8500_irq_set_type,
44462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
44562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4463e1a498f2728476535571d270081a17fdfceaf26Lee Jonesstatic void update_latch_offset(u8 *offset, int i)
4473e1a498f2728476535571d270081a17fdfceaf26Lee Jones{
4483e1a498f2728476535571d270081a17fdfceaf26Lee Jones	/* Fix inconsistent ITFromLatch25 bit mapping... */
4493e1a498f2728476535571d270081a17fdfceaf26Lee Jones	if (unlikely(*offset == 17))
4503e1a498f2728476535571d270081a17fdfceaf26Lee Jones			*offset = 24;
4513e1a498f2728476535571d270081a17fdfceaf26Lee Jones	/* Fix inconsistent ab8540 bit mapping... */
4523e1a498f2728476535571d270081a17fdfceaf26Lee Jones	if (unlikely(*offset == 16))
4533e1a498f2728476535571d270081a17fdfceaf26Lee Jones			*offset = 25;
4543e1a498f2728476535571d270081a17fdfceaf26Lee Jones	if ((i==3) && (*offset >= 24))
4553e1a498f2728476535571d270081a17fdfceaf26Lee Jones			*offset += 2;
4563e1a498f2728476535571d270081a17fdfceaf26Lee Jones}
4573e1a498f2728476535571d270081a17fdfceaf26Lee Jones
4587ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
4597ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int latch_offset, u8 latch_val)
4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
4617a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	int int_bit, line, i;
4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4637a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	for (i = 0; i < ab8500->mask_size; i++)
4647a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri		if (ab8500->irq_reg_offset[i] == latch_offset)
4657a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri			break;
4667ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4677a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	if (i >= ab8500->mask_size) {
4687a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri		dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
4697a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri				latch_offset);
4707a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri		return -ENXIO;
4717a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	}
4727ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4737a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	/* ignore masked out interrupts */
4747a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	latch_val &= ~ab8500->mask[i];
4757ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4767a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	while (latch_val) {
4777a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri		int_bit = __ffs(latch_val);
4787ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		line = (i << 3) + int_bit;
4797ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_val &= ~(1 << int_bit);
4807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
481e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		/*
482e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * This handles the falling edge hwirqs from the GPIO
483e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * lines. Route them back to the line registered for the
484e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * rising IRQ, as this is merely a flag for the same IRQ
485e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * in linux terms.
486e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 */
487e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line >= AB8500_INT_GPIO6F && line <= AB8500_INT_GPIO41F)
488e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line -= 16;
489e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line >= AB9540_INT_GPIO50F && line <= AB9540_INT_GPIO54F)
490e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line -= 8;
491e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line == AB8540_INT_GPIO43F || line == AB8540_INT_GPIO44F)
492e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line += 1;
493e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij
4947ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		handle_nested_irq(ab8500->irq_base + line);
4957a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri	}
4967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
4987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500,
5017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int hier_offset, u8 hier_val)
5027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
5037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int latch_bit, status;
5047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 latch_offset, latch_val;
5057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	do {
5077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_bit = __ffs(hier_val);
5087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_offset = (hier_offset << 3) + latch_bit;
5097ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5103e1a498f2728476535571d270081a17fdfceaf26Lee Jones		update_latch_offset(&latch_offset, hier_offset);
5117ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5127ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500,
5137ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_INTERRUPT,
5147ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_IT_LATCH1_REG + latch_offset,
5157ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				&latch_val);
5167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || latch_val == 0)
5177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			goto discard;
5187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_line(ab8500,
5207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				latch_offset, latch_val);
5217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
5227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			return status;
5237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard:
5247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		hier_val &= ~(1 << latch_bit);
5257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	} while (hier_val);
5267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
5287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
5297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev)
5317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
5327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	struct ab8500 *ab8500 = dev;
5337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 i;
5347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	dev_vdbg(ab8500->dev, "interrupt\n");
5367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	/*  Hierarchical interrupt version */
5383e1a498f2728476535571d270081a17fdfceaf26Lee Jones	for (i = 0; i < (ab8500->it_latchhier_num); i++) {
5397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		int status;
5407ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		u8 hier_val;
5417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
5437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			AB8500_IT_LATCHHIER1_REG + i, &hier_val);
5447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || hier_val == 0)
5457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			continue;
5467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5477ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val);
5487ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
5497ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			break;
5507ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	}
5517ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return IRQ_HANDLED;
5527ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
5537ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
55406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_map(struct irq_domain *d, unsigned int virq,
55506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				irq_hw_number_t hwirq)
55606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones{
55706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	struct ab8500 *ab8500 = d->host_data;
55806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
55906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500)
56006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -EINVAL;
56106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
56206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_data(virq, ab8500);
56306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_and_handler(virq, &ab8500_irq_chip,
56406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				handle_simple_irq);
56506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_nested_thread(virq, 1);
56662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#ifdef CONFIG_ARM
56706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	set_irq_flags(virq, IRQF_VALID);
56862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#else
56906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_noprobe(virq);
57062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#endif
57162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
57262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
57362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
57462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
57506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic struct irq_domain_ops ab8500_irq_ops = {
57606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .map    = ab8500_irq_map,
57706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .xlate  = irq_domain_xlate_twocell,
57806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones};
57906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
58006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
58162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
5822ced445e2ddf65f484a489161accddf475676965Linus Walleij	int num_irqs;
5832ced445e2ddf65f484a489161accddf475676965Linus Walleij
5843e1a498f2728476535571d270081a17fdfceaf26Lee Jones	if (is_ab8540(ab8500))
5853e1a498f2728476535571d270081a17fdfceaf26Lee Jones		num_irqs = AB8540_NR_IRQS;
5863e1a498f2728476535571d270081a17fdfceaf26Lee Jones	else if (is_ab9540(ab8500))
587d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB9540_NR_IRQS;
588a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	else if (is_ab8505(ab8500))
589a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		num_irqs = AB8505_NR_IRQS;
590d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
591d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB8500_NR_IRQS;
59262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
593f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij	/* If ->irq_base is zero this will give a linear mapping */
594f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij	ab8500->domain = irq_domain_add_simple(NULL,
595f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij			num_irqs, ab8500->irq_base,
596f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij			&ab8500_irq_ops, ab8500);
59706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
59806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500->domain) {
59906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		dev_err(ab8500->dev, "Failed to create irqdomain\n");
60006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -ENOSYS;
60106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
60206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
60306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return 0;
60462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
60562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
606112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500)
607112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{
608112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	if (atomic_read(&ab8500->transfer_ongoing))
609112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return -EINVAL;
610112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	else
611112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return 0;
612112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg}
613112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
614a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_gpadc_resources[] = {
61562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
61662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "HW_CONV_END",
61762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_HW_ADC_CONV_END,
61862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_HW_ADC_CONV_END,
61962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
62062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
62162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
62262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "SW_CONV_END",
62362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_SW_ADC_CONV_END,
62462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_SW_ADC_CONV_END,
62562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
62662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
62862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
6294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jonesstatic struct resource ab8505_gpadc_resources[] = {
630c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
631c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name	= "SW_CONV_END",
632c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.start	= AB8500_INT_GP_SW_ADC_CONV_END,
633c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.end	= AB8500_INT_GP_SW_ADC_CONV_END,
634c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.flags	= IORESOURCE_IRQ,
635c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
636c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones};
637c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones
638a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_rtc_resources[] = {
63962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
64062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "60S",
64162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_60S,
64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_60S,
64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
64462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
64562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
64662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "ALARM",
64762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_ALARM,
64862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_ALARM,
64962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
65062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
65162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
65262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
6539c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torguestatic struct resource ab8540_rtc_resources[] = {
6549c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	{
6559c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.name	= "1S",
6569c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.start	= AB8540_INT_RTC_1S,
6579c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.end	= AB8540_INT_RTC_1S,
6589c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.flags	= IORESOURCE_IRQ,
6599c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	},
6609c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	{
6619c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.name	= "ALARM",
6629c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.start	= AB8500_INT_RTC_ALARM,
6639c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.end	= AB8500_INT_RTC_ALARM,
6649c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.flags	= IORESOURCE_IRQ,
6659c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	},
6669c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue};
6679c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue
668a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_poweronkey_db_resources[] = {
66977686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
67077686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBF",
67177686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_F,
67277686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_F,
67377686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
67477686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
67577686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
67677686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBR",
67777686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_R,
67877686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_R,
67977686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
68077686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
68177686517977e77d101c8a7b397717df00a88922bSundar R Iyer};
68277686517977e77d101c8a7b397717df00a88922bSundar R Iyer
683a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_av_acc_detect_resources[] = {
684e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_F",
6866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_F,
6876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_F,
6886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
689e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
690e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_R",
6926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_R,
6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_R,
6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_F",
6986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_F,
6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_F,
7006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_R",
7046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_R,
7056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_R,
7066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_F",
7106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_F,
7116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_F,
7126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
713e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
714e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_R",
7166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_R,
7176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_R,
7186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
7216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
722a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_charger_resources[] = {
7236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
724e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CH_UNPLUG_DET",
725e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_UNPLUG_DET,
726e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_UNPLUG_DET,
727e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
728e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
729e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
730e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CHARGE_PLUG_DET",
731e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_PLUG_DET,
732e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_PLUG_DET,
733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
736e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
737e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
738e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
739e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
740e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
741e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "VBUS_DET_F",
7436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_VBUS_DET_F,
7446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_VBUS_DET_F,
745e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
746e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
747e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_LINK_STATUS",
7496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_LINK_STATUS,
7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_LINK_STATUS,
7516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
754e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_OVV",
755e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_OVV,
756e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_OVV,
757e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
758e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
759e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_R",
7616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_R,
7626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_R,
763e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
764e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
765e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_F",
7676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_F,
7686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_F,
769e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
770e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
771e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_EXT_CH_NOT_OK",
7736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_R",
7796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_R,
7806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_R,
7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_F",
7856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_F,
7866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_F,
7876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CHARGER_NOT_OKR",
791a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_USB_CHARGER_NOT_OKR,
792a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_USB_CHARGER_NOT_OKR,
7936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CH_WD_EXP",
7976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CH_WD_EXP,
7986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CH_WD_EXP,
7996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
80134c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson	{
80234c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson		.name = "VBUS_CH_DROP_END",
80334c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson		.start = AB8500_INT_VBUS_CH_DROP_END,
80434c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson		.end = AB8500_INT_VBUS_CH_DROP_END,
80534c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson		.flags = IORESOURCE_IRQ,
80634c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson	},
8076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
8086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
809a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_btemp_resources[] = {
8106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BAT_CTRL_INDB",
8126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BAT_CTRL_INDB,
8136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BAT_CTRL_INDB,
814e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
815e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
816e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
817e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_LOW",
818e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_LOW,
819e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_LOW,
820e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
821e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
822e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
823e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_HIGH",
824e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_HIGH,
825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_HIGH,
826e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
827e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
828e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8296af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_LOW_MEDIUM",
8306af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_LOW_MEDIUM,
8316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_LOW_MEDIUM,
832e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
833e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
834e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8356af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_MEDIUM_HIGH",
8366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_MEDIUM_HIGH,
8376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_MEDIUM_HIGH,
838e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
839e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
8406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
8416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
842a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_fg_resources[] = {
843e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "NCONV_ACCU",
8456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CCN_CONV_ACC,
8466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CCN_CONV_ACC,
847e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
848e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
849e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BATT_OVV",
8516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BATT_OVV,
8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BATT_OVV,
853e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
854e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
855e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8566af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_F",
8576af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_F,
8586af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_F,
8596af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_R",
8636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_R,
8646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_R,
8656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CC_INT_CALIB",
8696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CC_INT_CALIB,
8706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CC_INT_CALIB,
871e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
872e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
873a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	{
874a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.name = "CCEOC",
875a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_CCEOC,
876a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_CCEOC,
877a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.flags = IORESOURCE_IRQ,
878a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	},
879e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
880e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
881a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_chargalg_resources[] = {};
8826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
883df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS
884a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_debug_resources[] = {
885e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8866999181eecb11863b78030c68037a9f851522735Linus Walleij		.name	= "IRQ_AB8500",
8876999181eecb11863b78030c68037a9f851522735Linus Walleij		/*
8886999181eecb11863b78030c68037a9f851522735Linus Walleij		 * Number will be filled in. NOTE: this is deliberately
8896999181eecb11863b78030c68037a9f851522735Linus Walleij		 * not flagged as an IRQ in ordet to avoid remapping using
8906999181eecb11863b78030c68037a9f851522735Linus Walleij		 * the irqdomain in the MFD core, so that this IRQ passes
8916999181eecb11863b78030c68037a9f851522735Linus Walleij		 * unremapped to the debug code.
8926999181eecb11863b78030c68037a9f851522735Linus Walleij		 */
8936999181eecb11863b78030c68037a9f851522735Linus Walleij	},
8946999181eecb11863b78030c68037a9f851522735Linus Walleij	{
895e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_FIRST",
896e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
897e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
898e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
899e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
900e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
901e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_LAST",
902a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start	= AB8500_INT_XTAL32K_KO,
903a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end	= AB8500_INT_XTAL32K_KO,
904e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
905e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
906e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
907df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif
908e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
909a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_usb_resources[] = {
910e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
911e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_R",
912e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_R,
913e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_R,
914e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
915e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
916e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
917e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_F",
918e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_F,
919e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_F,
920e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
921e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
922e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
923e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_F",
924e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_F,
925e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_F,
926e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
927e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
928e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
929e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
930e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
931e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
932e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
933e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
93492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	{
93592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.name = "USB_LINK_STATUS",
93692d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.start = AB8500_INT_USB_LINK_STATUS,
93792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.end = AB8500_INT_USB_LINK_STATUS,
93892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.flags = IORESOURCE_IRQ,
93992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	},
9406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_PLUG",
9426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_PLUG,
9436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_PLUG,
9446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
9466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_UNPLUG",
9486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_UNPLUG,
9496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_UNPLUG,
9506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
952e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
953e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
954a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8505_iddet_resources[] = {
95544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
95644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyDeglitch",
95744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYDEGLITCH,
95844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYDEGLITCH,
95944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
96044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
96144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
96244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KP",
96344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KP,
96444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KP,
96544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
96644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
96744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
96844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKP",
96944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKP,
97044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKP,
97144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
97244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
97344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
97444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKR",
97544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKR,
97644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKR,
97744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
97844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
97944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
98044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyStuck",
98144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYSTUCK,
98244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYSTUCK,
98344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
98444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
985492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	{
986492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.name = "VBUS_DET_R",
987492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.start = AB8500_INT_VBUS_DET_R,
988492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.end = AB8500_INT_VBUS_DET_R,
989492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.flags = IORESOURCE_IRQ,
990492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	},
991492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	{
992492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.name = "VBUS_DET_F",
993492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.start = AB8500_INT_VBUS_DET_F,
994492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.end = AB8500_INT_VBUS_DET_F,
995492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.flags = IORESOURCE_IRQ,
996492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	},
997492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	{
998492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.name = "ID_DET_PLUGR",
999492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.start = AB8500_INT_ID_DET_PLUGR,
1000492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.end = AB8500_INT_ID_DET_PLUGR,
1001492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.flags = IORESOURCE_IRQ,
1002492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	},
1003492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	{
1004492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.name = "ID_DET_PLUGF",
1005492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.start = AB8500_INT_ID_DET_PLUGF,
1006492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.end = AB8500_INT_ID_DET_PLUGF,
1007492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones		.flags = IORESOURCE_IRQ,
1008492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones	},
100944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
101044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
1011a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_temp_resources[] = {
1012e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1013151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang		.name  = "ABX500_TEMP_WARM",
1014e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_TEMP_WARM,
1015e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end   = AB8500_INT_TEMP_WARM,
1016e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
1017e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1018e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
1019e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
10205ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8500_bm_devs[] = {
10214b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
10224b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-charger",
10234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.of_compatible = "stericsson,ab8500-charger",
10244b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_charger_resources),
10254b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_charger_resources,
10264b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.platform_data = &ab8500_bm_data,
10274b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.pdata_size = sizeof(ab8500_bm_data),
10284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
10294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
10304b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-btemp",
10314b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.of_compatible = "stericsson,ab8500-btemp",
10324b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_btemp_resources),
10334b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_btemp_resources,
10344b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.platform_data = &ab8500_bm_data,
10354b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.pdata_size = sizeof(ab8500_bm_data),
10364b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
10374b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
10384b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-fg",
10394b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.of_compatible = "stericsson,ab8500-fg",
10404b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_fg_resources),
10414b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_fg_resources,
10424b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.platform_data = &ab8500_bm_data,
10434b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.pdata_size = sizeof(ab8500_bm_data),
10444b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
10454b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
10464b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-chargalg",
10474b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.of_compatible = "stericsson,ab8500-chargalg",
10484b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
10494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_chargalg_resources,
10504b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.platform_data = &ab8500_bm_data,
10514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.pdata_size = sizeof(ab8500_bm_data),
10524b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
10534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones};
10544b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones
10555ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8500_devs[] = {
10565814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS
10575814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	{
10585814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin		.name = "ab8500-debug",
1059bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-debug",
1060e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
1061e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_debug_resources,
10625814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	},
10635814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif
106462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
1065e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-sysctrl",
1066bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-sysctrl",
1067e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1068e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
106953f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones		.name = "ab8500-ext-regulator",
107053f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones		.of_compatible = "stericsson,ab8500-ext-regulator",
107153f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	},
107253f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	{
1073e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-regulator",
1074bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-regulator",
1075e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1076e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1077916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson		.name = "abx500-clk",
1078916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson		.of_compatible = "stericsson,abx500-clk",
1079916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson	},
1080916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson	{
10814b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-gpadc",
1082955de2eab3fd89bc6d5735817710926ba5817450Lee Jones		.of_compatible = "stericsson,ab8500-gpadc",
10834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
10844b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_gpadc_resources,
10854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
10864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
108762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-rtc",
1088bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-rtc",
108962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
109062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_rtc_resources,
109162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
1092f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
10936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "ab8500-acc-det",
1094bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-acc-det",
10956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
10966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.resources = ab8500_av_acc_detect_resources,
10976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
10986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
10994b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones
1100e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-poweron-key",
1101bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-poweron-key",
1102e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
1103e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_poweronkey_db_resources,
1104e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1105e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1106f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1107bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1108f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 1,
1109f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1110f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1111f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1112bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1113f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 2,
1114f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1115f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1116f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1117bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1118f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 3,
1119f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1120bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	{
1121e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-denc",
1122bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-denc",
1123e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1124e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1125eb696c3181dd5b2266794776519120abdfe127d9Lee Jones		.name = "pinctrl-ab8500",
11264b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.of_compatible = "stericsson,ab8500-gpio",
11274b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
11284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
1129151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang		.name = "abx500-temp",
1130151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang		.of_compatible = "stericsson,abx500-temp",
1131e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
1132e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_temp_resources,
113377686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
11346ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
11354b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-usb",
1136f201f730b82393aa4969171d724025a82f7099daFabio Baltieri		.of_compatible = "stericsson,ab8500-usb",
11374b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
11384b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_usb_resources,
11396ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
11406ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
11414b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-codec",
1142fccf14ad1e4f09a4033908ead9bf3f393979d54bFabio Baltieri		.of_compatible = "stericsson,ab8500-codec",
11436ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
11446ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson};
11456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
11465ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab9540_devs[] = {
11474b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS
1148d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
11494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-debug",
11504b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
11514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_debug_resources,
1152d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
11534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif
1154d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
11554b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-sysctrl",
1156d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
115744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
115853f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones		.name = "ab8500-ext-regulator",
115953f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	},
116053f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	{
11614b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-regulator",
116244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1163c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
11649ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.name = "abx500-clk",
11659ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.of_compatible = "stericsson,abx500-clk",
11669ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	},
11679ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	{
1168c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name = "ab8500-gpadc",
1169c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.of_compatible = "stericsson,ab8500-gpadc",
1170c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
1171c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.resources = ab8500_gpadc_resources,
1172c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
11734b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
11744b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-rtc",
11754b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
11764b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_rtc_resources,
11774b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
11784b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
11794b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-acc-det",
11804b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
11814b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_av_acc_detect_resources,
11824b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
11834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
11844b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-poweron-key",
11854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
11864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_poweronkey_db_resources,
11874b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
11884b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
11894b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-pwm",
11904b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.id = 1,
11914b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
11924b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
11934b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "abx500-temp",
11944b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
11954b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_temp_resources,
11964b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
1197d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1198e64d905e28031031c52db403826cd3bfe060b181Lee Jones		.name = "pinctrl-ab9540",
1199e64d905e28031031c52db403826cd3bfe060b181Lee Jones		.of_compatible = "stericsson,ab9540-gpio",
1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab9540-usb",
1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1204d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1205d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
120644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
120744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab9540-codec",
120844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1209c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
1210c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name = "ab-iddet",
1211c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
1212c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.resources = ab8505_iddet_resources,
1213c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
121444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
121544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
1216c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones/* Device list for ab8505  */
12175ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8505_devs[] = {
12184b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS
12194b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12204b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-debug",
12214b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
12224b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_debug_resources,
12234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12244b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif
12254b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12264b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-sysctrl",
12274b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-regulator",
12304b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12314b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12329ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.name = "abx500-clk",
12339ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.of_compatible = "stericsson,abx500-clk",
12349ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	},
12359ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	{
12364b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-gpadc",
1237955de2eab3fd89bc6d5735817710926ba5817450Lee Jones		.of_compatible = "stericsson,ab8500-gpadc",
12384b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8505_gpadc_resources),
12394b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8505_gpadc_resources,
12404b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12414b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12424b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-rtc",
12434b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
12444b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_rtc_resources,
12454b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12464b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12474b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-acc-det",
12484b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
12494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_av_acc_detect_resources,
12504b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12524b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-poweron-key",
12534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
12544b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_poweronkey_db_resources,
12554b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12564b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12574b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-pwm",
12584b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.id = 1,
12594b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12604b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
1261eb696c3181dd5b2266794776519120abdfe127d9Lee Jones		.name = "pinctrl-ab8505",
12624b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12634b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12644b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-usb",
12654b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
12664b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_usb_resources,
12674b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12684b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12694b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-codec",
12704b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
1271c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
1272c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name = "ab-iddet",
1273c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
1274c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.resources = ab8505_iddet_resources,
1275c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
1276c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones};
1277c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones
12785ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_devs[] = {
12794b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS
12804b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12814b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-debug",
12824b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
12834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_debug_resources,
12844b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif
12864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12874b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-sysctrl",
12884b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12894b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
129053f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones		.name = "ab8500-ext-regulator",
129153f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	},
129253f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones	{
12934b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-regulator",
12944b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
12954b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
12969ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.name = "abx500-clk",
12979ee17676a5a36621db020c596e766fec24aae959Ulf Hansson		.of_compatible = "stericsson,abx500-clk",
12989ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	},
12999ee17676a5a36621db020c596e766fec24aae959Ulf Hansson	{
13004b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-gpadc",
1301955de2eab3fd89bc6d5735817710926ba5817450Lee Jones		.of_compatible = "stericsson,ab8500-gpadc",
13024b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8505_gpadc_resources),
13034b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8505_gpadc_resources,
13044b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
13054b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
13064b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-acc-det",
13074b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
13084b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_av_acc_detect_resources,
13094b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
13104b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
13114b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-poweron-key",
13124b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
13134b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_poweronkey_db_resources,
13144b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
13154b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
13164b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "ab8500-pwm",
13174b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.id = 1,
13184b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
13194b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	{
13204b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.name = "abx500-temp",
13214b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
13224b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones		.resources = ab8500_temp_resources,
13234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones	},
1324c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
1325eb696c3181dd5b2266794776519120abdfe127d9Lee Jones		.name = "pinctrl-ab8540",
1326c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
1327c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
1328c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name = "ab8540-usb",
1329c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1330c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.resources = ab8500_usb_resources,
1331c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
1332c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
1333c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		.name = "ab8540-codec",
1334c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	},
1335c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones	{
133644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab-iddet",
133744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
133844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.resources = ab8505_iddet_resources,
133944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1340d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1341d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
13425ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_cut1_devs[] = {
13439c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	{
13449c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.name = "ab8500-rtc",
13459c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.of_compatible = "stericsson,ab8500-rtc",
13469c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
13479c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.resources = ab8500_rtc_resources,
13489c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	},
13499c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue};
13509c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue
13515ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_cut2_devs[] = {
13529c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	{
13539c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.name = "ab8540-rtc",
13549c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.of_compatible = "stericsson,ab8540-rtc",
13559c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.num_resources = ARRAY_SIZE(ab8540_rtc_resources),
13569c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		.resources = ab8540_rtc_resources,
13579c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	},
13589c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue};
13599c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue
1360cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev,
1361cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin				struct device_attribute *attr, char *buf)
1362cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{
1363cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	struct ab8500 *ab8500;
1364cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1365cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	ab8500 = dev_get_drvdata(dev);
1366e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones
1367cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
1368cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}
1369cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1370e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/*
1371e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1372e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming
1373e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation
1374e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold
1375e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired
1376e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock
1377e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold
1378e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds
1379e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown
1380e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */
1381e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev,
1382e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin				struct device_attribute *attr, char *buf)
1383e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{
1384e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	int ret;
1385e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	u8 value;
1386e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	struct ab8500 *ab8500;
1387e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1388e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ab8500 = dev_get_drvdata(dev);
1389e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1390e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1391e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1392e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1393e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	return sprintf(buf, "%#x\n", value);
1394e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin}
1395e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1396f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan/* use mask and set to override the register turn_on_stat value */
1397f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanvoid ab8500_override_turn_on_stat(u8 mask, u8 set)
1398f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan{
1399f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	spin_lock(&on_stat_lock);
1400f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	turn_on_stat_mask = mask;
1401f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	turn_on_stat_set = set;
1402f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	spin_unlock(&on_stat_lock);
1403f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan}
1404f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan
1405b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/*
1406b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS):
1407b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat
1408b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF
1409b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF
1410b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm
1411b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet
1412b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet
1413b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect
1414b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved
1415b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */
1416b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev,
1417b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn				struct device_attribute *attr, char *buf)
1418b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{
1419b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	int ret;
1420b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	u8 value;
1421b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	struct ab8500 *ab8500;
1422b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1423b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ab8500 = dev_get_drvdata(dev);
1424b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1425b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		AB8500_TURN_ON_STATUS, &value);
1426b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	if (ret < 0)
1427b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		return ret;
1428f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan
1429f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	/*
1430f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 * In L9540, turn_on_status register is not updated correctly if
1431f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 * the device is rebooted with AC/USB charger connected. Due to
1432f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 * this, the device boots android instead of entering into charge
1433f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 * only mode. Read the AC/USB status register to detect the charger
1434f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 * presence and update the turn on status manually.
1435f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	 */
1436f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	if (is_ab9540(ab8500)) {
1437f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		spin_lock(&on_stat_lock);
1438f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		value = (value & turn_on_stat_mask) | turn_on_stat_set;
1439f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		spin_unlock(&on_stat_lock);
1440f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	}
1441f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan
1442b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	return sprintf(buf, "%#x\n", value);
1443b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn}
1444b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
144593ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic ssize_t show_turn_on_status_2(struct device *dev,
144693ff722e88530b9719cbf53be4f3197722461394Lee Jones				struct device_attribute *attr, char *buf)
144793ff722e88530b9719cbf53be4f3197722461394Lee Jones{
144893ff722e88530b9719cbf53be4f3197722461394Lee Jones	int ret;
144993ff722e88530b9719cbf53be4f3197722461394Lee Jones	u8 value;
145093ff722e88530b9719cbf53be4f3197722461394Lee Jones	struct ab8500 *ab8500;
145193ff722e88530b9719cbf53be4f3197722461394Lee Jones
145293ff722e88530b9719cbf53be4f3197722461394Lee Jones	ab8500 = dev_get_drvdata(dev);
145393ff722e88530b9719cbf53be4f3197722461394Lee Jones	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
145493ff722e88530b9719cbf53be4f3197722461394Lee Jones		AB8505_TURN_ON_STATUS_2, &value);
145593ff722e88530b9719cbf53be4f3197722461394Lee Jones	if (ret < 0)
145693ff722e88530b9719cbf53be4f3197722461394Lee Jones		return ret;
145793ff722e88530b9719cbf53be4f3197722461394Lee Jones	return sprintf(buf, "%#x\n", (value & 0x1));
145893ff722e88530b9719cbf53be4f3197722461394Lee Jones}
145993ff722e88530b9719cbf53be4f3197722461394Lee Jones
1460d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev,
1461d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				struct device_attribute *attr, char *buf)
1462d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1463d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1464d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret;
1465d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 value;
1466d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1467d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1468d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1469d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
1470d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		AB9540_MODEM_CTRL2_REG, &value);
1471d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (ret < 0)
1472d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		return ret;
1473d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1474d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return sprintf(buf, "%d\n",
1475d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			(value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0);
1476d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1477d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1478d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev,
1479d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct device_attribute *attr, const char *buf, size_t count)
1480d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1481d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1482d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret = count;
1483d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int err;
1484d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 bitvalues;
1485d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1486d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1487d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1488d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (count > 0) {
1489d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		switch (buf[0]) {
1490d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '0':
1491d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = 0;
1492d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1493d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '1':
1494d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT;
1495d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1496d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		default:
1497d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			goto exit;
1498d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		}
1499d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1500d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		err = mask_and_set_register_interruptible(ab8500,
1501d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG,
1502d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues);
1503d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		if (err)
1504d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			dev_info(ab8500->dev,
1505d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				"Failed to set DBBRSTN %c, err %#x\n",
1506d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				buf[0], err);
1507d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
1508d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1509d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit:
1510d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return ret;
1511d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1512d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1513cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
1514e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
1515b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL);
151693ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic DEVICE_ATTR(turn_on_status_2, S_IRUGO, show_turn_on_status_2, NULL);
1517d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR,
1518d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			show_ab9540_dbbrstn, store_ab9540_dbbrstn);
1519cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1520cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = {
1521cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	&dev_attr_chip_id.attr,
1522e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	&dev_attr_switch_off_status.attr,
1523b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	&dev_attr_turn_on_status.attr,
1524cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	NULL,
1525cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1526cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
152793ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic struct attribute *ab8505_sysfs_entries[] = {
152893ff722e88530b9719cbf53be4f3197722461394Lee Jones	&dev_attr_turn_on_status_2.attr,
152993ff722e88530b9719cbf53be4f3197722461394Lee Jones	NULL,
153093ff722e88530b9719cbf53be4f3197722461394Lee Jones};
153193ff722e88530b9719cbf53be4f3197722461394Lee Jones
1532d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = {
1533d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_chip_id.attr,
1534d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_switch_off_status.attr,
1535d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_turn_on_status.attr,
1536d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_dbbrstn.attr,
1537d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	NULL,
1538d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1539d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1540cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = {
1541cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	.attrs	= ab8500_sysfs_entries,
1542cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1543cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
154493ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic struct attribute_group ab8505_attr_group = {
154593ff722e88530b9719cbf53be4f3197722461394Lee Jones	.attrs	= ab8505_sysfs_entries,
154693ff722e88530b9719cbf53be4f3197722461394Lee Jones};
154793ff722e88530b9719cbf53be4f3197722461394Lee Jones
1548d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = {
1549d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	.attrs	= ab9540_sysfs_entries,
1550d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1551d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1552f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int ab8500_probe(struct platform_device *pdev)
155362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1554b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	static char *switch_off_status[] = {
1555b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Swoff bit programming",
1556b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Thermal protection activation",
1557b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Vbat lower then BattOk falling threshold",
1558b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Watchdog expired",
1559b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Non presence of 32kHz clock",
1560b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Battery level lower than power on reset threshold",
1561b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Power on key 1 pressed longer than 10 seconds",
1562b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"DB8500 thermal shutdown"};
1563abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	static char *turn_on_status[] = {
1564abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"Battery rising (Vbat)",
1565abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"Power On Key 1 dbF",
1566abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"Power On Key 2 dbF",
1567abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"RTC Alarm",
1568abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"Main Charger Detect",
1569abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"Vbus Detect (USB)",
1570abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"USB ID Detect",
1571abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		"UART Factory Mode Detect"};
1572d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev);
1573d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	const struct platform_device_id *platid = platform_get_device_id(pdev);
15746bc4a568414caab05424b702165a732177daccd0Lee Jones	enum ab8500_version version = AB8500_VERSION_UNDEFINED;
15756bc4a568414caab05424b702165a732177daccd0Lee Jones	struct device_node *np = pdev->dev.of_node;
1576d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500;
1577d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct resource *resource;
157862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
157962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
158047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 value;
158162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
15828c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500 = devm_kzalloc(&pdev->dev, sizeof *ab8500, GFP_KERNEL);
1583d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!ab8500)
1584d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return -ENOMEM;
1585d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
158662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat)
158762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->irq_base = plat->irq_base;
158862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1589d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->dev = &pdev->dev;
1590d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1591d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
15928c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	if (!resource)
15938c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return -ENODEV;
1594d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1595d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->irq = resource->start;
1596d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1597822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->read = ab8500_prcmu_read;
1598822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write = ab8500_prcmu_write;
1599822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write_masked = ab8500_prcmu_write_masked;
1600d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
160162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->lock);
160262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->irq_lock);
1603112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_set(&ab8500->transfer_ongoing, 0);
160462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1605d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_set_drvdata(pdev, ab8500);
1606d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
16076bc4a568414caab05424b702165a732177daccd0Lee Jones	if (platid)
16086bc4a568414caab05424b702165a732177daccd0Lee Jones		version = platid->driver_data;
16096bc4a568414caab05424b702165a732177daccd0Lee Jones
16100f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	if (version != AB8500_VERSION_UNDEFINED)
16110f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = version;
16120f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	else {
16130f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ret = get_register_interruptible(ab8500, AB8500_MISC,
16140f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			AB8500_IC_NAME_REG, &value);
16150f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ret < 0)
16168c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones			return ret;
16170f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
16180f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = value;
16190f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	}
16200f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
162147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = get_register_interruptible(ab8500, AB8500_MISC,
162247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		AB8500_REV_REG, &value);
162362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
16248c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
162562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
162647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ab8500->chip_id = value;
162762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
16280f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
16290f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500_version_str[ab8500->version],
16300f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id >> 4,
16310f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id & 0x0F);
16320f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
16333e1a498f2728476535571d270081a17fdfceaf26Lee Jones	/* Configure AB8540 */
16343e1a498f2728476535571d270081a17fdfceaf26Lee Jones	if (is_ab8540(ab8500)) {
16353e1a498f2728476535571d270081a17fdfceaf26Lee Jones		ab8500->mask_size = AB8540_NUM_IRQ_REGS;
16363e1a498f2728476535571d270081a17fdfceaf26Lee Jones		ab8500->irq_reg_offset = ab8540_irq_regoffset;
16373e1a498f2728476535571d270081a17fdfceaf26Lee Jones		ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM;
16383e1a498f2728476535571d270081a17fdfceaf26Lee Jones	}/* Configure AB8500 or AB9540 IRQ */
16393e1a498f2728476535571d270081a17fdfceaf26Lee Jones	else if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1640d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1641d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab9540_irq_regoffset;
16423e1a498f2728476535571d270081a17fdfceaf26Lee Jones		ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1643d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	} else {
1644d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1645d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab8500_irq_regoffset;
16463e1a498f2728476535571d270081a17fdfceaf26Lee Jones		ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM;
1647d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
16488c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
16492ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->mask)
16502ced445e2ddf65f484a489161accddf475676965Linus Walleij		return -ENOMEM;
16518c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
16528c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	if (!ab8500->oldmask)
16538c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return -ENOMEM;
16548c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones
1655e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	/*
1656e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1657e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x01 Swoff bit programming
1658e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x02 Thermal protection activation
1659e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x04 Vbat lower then BattOk falling threshold
1660e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x08 Watchdog expired
1661e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x10 Non presence of 32kHz clock
1662e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x20 Battery level lower than power on reset threshold
1663e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x40 Power on key 1 pressed longer than 10 seconds
1664e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x80 DB8500 thermal shutdown
1665e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 */
1666e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1667e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1668e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1669e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1670e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1671b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value);
1672b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1673b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	if (value) {
1674b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) {
1675b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			if (value & 1)
1676b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				printk(KERN_CONT " \"%s\"",
1677b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				       switch_off_status[i]);
1678b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			value = value >> 1;
1679b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1680b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		}
1681b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT "\n");
1682b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	} else {
1683b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT " None\n");
1684b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	}
1685abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1686abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		AB8500_TURN_ON_STATUS, &value);
1687abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	if (ret < 0)
1688abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		return ret;
1689abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value);
1690abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin
1691abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	if (value) {
1692abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		for (i = 0; i < ARRAY_SIZE(turn_on_status); i++) {
1693abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin			if (value & 1)
1694abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin				printk("\"%s\" ", turn_on_status[i]);
1695abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin			value = value >> 1;
1696abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		}
1697abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		printk("\n");
1698abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	} else {
1699abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin		printk("None\n");
1700abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin	}
1701e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
170262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat && plat->init)
170362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		plat->init(ab8500);
1704abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin
1705f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	if (is_ab9540(ab8500)) {
1706f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		ret = get_register_interruptible(ab8500, AB8500_CHARGER,
1707f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan			AB8500_CH_USBCH_STAT1_REG, &value);
1708f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		if (ret < 0)
1709f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan			return ret;
1710f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan		if ((value & VBUS_DET_DBNC1) && (value & VBUS_DET_DBNC100))
1711f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan			ab8500_override_turn_on_stat(~AB8500_POW_KEY_1_ON,
1712f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan						     AB8500_VBUS_DET);
1713f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan	}
171462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
171562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	/* Clear and mask all interrupts */
17162ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
17170f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
17180f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
17190f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
17200f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
17210f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
17220f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij				is_ab8500_1p1_or_earlier(ab8500))
172392d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
172462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
17253e1a498f2728476535571d270081a17fdfceaf26Lee Jones		if (ab8500->irq_reg_offset[i] < 0)
17263e1a498f2728476535571d270081a17fdfceaf26Lee Jones			continue;
17273e1a498f2728476535571d270081a17fdfceaf26Lee Jones
172847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		get_register_interruptible(ab8500, AB8500_INTERRUPT,
17292ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
173092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			&value);
173147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT,
17322ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
173362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
173462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
173547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
173647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	if (ret)
17378c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
173847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
17392ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++)
174062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
174162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
174206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	ret = ab8500_irq_init(ab8500, np);
174306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (ret)
17448c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
174562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1746f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak	ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL,
1747f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak			ab8500_hierarchical_irq,
1748f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak			IRQF_ONESHOT | IRQF_NO_SUSPEND,
1749f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak			"ab8500", ab8500);
1750f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak	if (ret)
1751f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak		return ret;
175262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
17536999181eecb11863b78030c68037a9f851522735Linus Walleij#if CONFIG_DEBUG_FS
17546999181eecb11863b78030c68037a9f851522735Linus Walleij	/* Pass to debugfs */
17556999181eecb11863b78030c68037a9f851522735Linus Walleij	ab8500_debug_resources[0].start = ab8500->irq;
17566999181eecb11863b78030c68037a9f851522735Linus Walleij	ab8500_debug_resources[0].end = ab8500->irq;
17576999181eecb11863b78030c68037a9f851522735Linus Walleij#endif
17586999181eecb11863b78030c68037a9f851522735Linus Walleij
1759bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (is_ab9540(ab8500))
1760bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
1761bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab9540_devs), NULL,
176255692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
17639c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	else if (is_ab8540(ab8500)) {
1764c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs,
1765c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones			      ARRAY_SIZE(ab8540_devs), NULL,
17669c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			      ab8500->irq_base, NULL);
17679c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		if (ret)
17689c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			return ret;
17699c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue
17709c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		if (is_ab8540_1p2_or_earlier(ab8500))
17719c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs,
17729c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			      ARRAY_SIZE(ab8540_cut1_devs), NULL,
17739c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			      ab8500->irq_base, NULL);
17749c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue		else /* ab8540 >= cut2 */
17759c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs,
17769c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			      ARRAY_SIZE(ab8540_cut2_devs), NULL,
17779c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue			      ab8500->irq_base, NULL);
17789c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue	} else if (is_ab8505(ab8500))
1779c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs,
1780c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones			      ARRAY_SIZE(ab8505_devs), NULL,
1781c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones			      ab8500->irq_base, ab8500->domain);
1782bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	else
1783bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
1784bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab8500_devs), NULL,
178555692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1786bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
17878c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
178844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
17896ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	if (!no_bm) {
17906ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		/* Add battery management devices */
17916ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
17926ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson				      ARRAY_SIZE(ab8500_bm_devs), NULL,
179355692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				      ab8500->irq_base, ab8500->domain);
17946ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		if (ret)
17956ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson			dev_err(ab8500->dev, "error adding bm devices\n");
17966ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	}
17976ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1798e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones	if (((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1799e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones			ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500))
1800d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1801d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab9540_attr_group);
1802d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1803d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1804d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab8500_attr_group);
180593ff722e88530b9719cbf53be4f3197722461394Lee Jones
180693ff722e88530b9719cbf53be4f3197722461394Lee Jones	if ((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
180793ff722e88530b9719cbf53be4f3197722461394Lee Jones			ab8500->chip_id >= AB8500_CUT2P0)
180893ff722e88530b9719cbf53be4f3197722461394Lee Jones		ret = sysfs_create_group(&ab8500->dev->kobj,
180993ff722e88530b9719cbf53be4f3197722461394Lee Jones					 &ab8505_attr_group);
181093ff722e88530b9719cbf53be4f3197722461394Lee Jones
1811cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	if (ret)
1812cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin		dev_err(ab8500->dev, "error creating sysfs entries\n");
181306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
181406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return ret;
181562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
181662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
18174740f73fe5388ab5d22d552d2a0dacc62418a70cBill Pembertonstatic int ab8500_remove(struct platform_device *pdev)
181862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1819d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500 = platform_get_drvdata(pdev);
1820d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1821e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones	if (((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
1822e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones			ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500))
1823d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group);
1824d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1825d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group);
182606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
182793ff722e88530b9719cbf53be4f3197722461394Lee Jones	if ((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
182893ff722e88530b9719cbf53be4f3197722461394Lee Jones			ab8500->chip_id >= AB8500_CUT2P0)
182993ff722e88530b9719cbf53be4f3197722461394Lee Jones		sysfs_remove_group(&ab8500->dev->kobj, &ab8505_attr_group);
183093ff722e88530b9719cbf53be4f3197722461394Lee Jones
183162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mfd_remove_devices(ab8500->dev);
183262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
183362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
183462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
183562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1836d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = {
1837d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8500-core", AB8500_VERSION_AB8500 },
1838d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8505-i2c", AB8500_VERSION_AB8505 },
1839d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab9540-i2c", AB8500_VERSION_AB9540 },
1840d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8540-i2c", AB8500_VERSION_AB8540 },
1841d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ }
1842d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1843d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1844d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = {
1845d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.driver = {
1846d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.name = "ab8500-core",
1847d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.owner = THIS_MODULE,
1848d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	},
1849d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.probe	= ab8500_probe,
185084449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton	.remove	= ab8500_remove,
1851d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.id_table = ab8500_id,
1852d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1853d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1854d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void)
1855d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1856d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return platform_driver_register(&ab8500_core_driver);
1857d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1858d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1859d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void)
1860d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1861d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_driver_unregister(&ab8500_core_driver);
1862d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1863ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init);
1864d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit);
1865d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1866adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
186762579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core");
186862579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2");
1869