ab8500-core.c revision 4aef72dbb2e8997e627dd94ae2b9109dc09fffaa
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>
22d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones#include <linux/mfd/dbx500-prcmu.h>
23549931f99e030d63a437c23943fd8dc9b7c0e41cSundar R Iyer#include <linux/regulator/ab8500.h>
246bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of.h>
256bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of_device.h>
2662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
2762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
2862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Interrupt register offsets
2962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Bank : 0x0E
3062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
3147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE1_REG		0x00
3247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE2_REG		0x01
3347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE3_REG		0x02
3447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE4_REG		0x03
3547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE5_REG		0x04
3647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE6_REG		0x05
3747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE7_REG		0x06
3847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE8_REG		0x07
39d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_SOURCE13_REG		0x0C
4047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE19_REG		0x12
4147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE20_REG		0x13
4247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE21_REG		0x14
4347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE22_REG		0x15
4447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE23_REG		0x16
4547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE24_REG		0x17
4662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
4862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * latch registers
4962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
5047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH1_REG		0x20
5147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH2_REG		0x21
5247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH3_REG		0x22
5347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH4_REG		0x23
5447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH5_REG		0x24
5547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH6_REG		0x25
5647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH7_REG		0x26
5747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH8_REG		0x27
5847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH9_REG		0x28
5947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH10_REG		0x29
6092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin#define AB8500_IT_LATCH12_REG		0x2B
61d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_LATCH13_REG		0x2C
6247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH19_REG		0x32
6347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH20_REG		0x33
6447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH21_REG		0x34
6547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH22_REG		0x35
6647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH23_REG		0x36
6747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH24_REG		0x37
6862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
6962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
7062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * mask registers
7162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
7262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
7347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK1_REG		0x40
7447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK2_REG		0x41
7547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK3_REG		0x42
7647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK4_REG		0x43
7747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK5_REG		0x44
7847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK6_REG		0x45
7947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK7_REG		0x46
8047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK8_REG		0x47
8147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK9_REG		0x48
8247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK10_REG		0x49
8347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK11_REG		0x4A
8447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK12_REG		0x4B
8547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK13_REG		0x4C
8647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK14_REG		0x4D
8747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK15_REG		0x4E
8847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK16_REG		0x4F
8947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK17_REG		0x50
9047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK18_REG		0x51
9147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK19_REG		0x52
9247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK20_REG		0x53
9347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK21_REG		0x54
9447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK22_REG		0x55
9547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK23_REG		0x56
9647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK24_REG		0x57
9747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/*
997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers
1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */
1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG	0x60
1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG	0x61
1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG	0x62
1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM		3
1067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
10747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG			0x80
1080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG		0x82
109e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS	0x00
11062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
111b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS		0x00
112b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1136ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */
1146ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO);
1156ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
116d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG			0x23
117d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT	BIT(2)
118d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
11962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
12062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
1212ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are
1222ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h
12362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent *
12462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at
12562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0.
12662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
1272ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */
12862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = {
12992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21,
13062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
132d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 support */
133d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = {
134d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24,
135d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
136d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1370f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = {
1380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8500] = "AB8500",
1390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8505] = "AB8505",
1400f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB9540] = "AB9540",
1410f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8540] = "AB8540",
1420f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij};
1430f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
144822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)
145d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
146d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
147d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
148d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
149d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
150d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
151d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
152d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
153d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
154822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
155d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data)
156d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
157d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
158d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
159d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data,
160d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		&mask, 1);
161d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
162d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
166822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr)
167d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data;
170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
172d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0) {
173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return ret;
175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	}
176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return (int)data;
177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
17947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev)
18047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
1816bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	struct ab8500 *ab8500;
1826bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin
1836bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	if (!dev)
1846bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin		return -EINVAL;
1856bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	ab8500 = dev_get_drvdata(dev->parent);
1866bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	return ab8500 ? (int)ab8500->chip_id : -EINVAL;
18747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
18847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
18947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
19047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 data)
19162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
19262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
19347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/*
19447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * Put the u8 bank and u8 register together into a an u16.
19547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * The bank on higher 8 bits and register in lower 8 bits.
19647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * */
19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
19862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
19962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
20062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
201392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
20247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
20362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->write(ab8500, addr, data);
20462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
20562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
20662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
20747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
20862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
21162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
21247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank,
21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 value)
21462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
215112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
21647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
21762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
218112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
219112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = set_register_interruptible(ab8500, bank, reg, value);
220112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
221112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
22262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
22447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
22662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
22847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
22947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
232392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
23362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
23462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->read(ab8500, addr);
23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
23662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
23762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
23847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	else
23947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		*value = ret;
24062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
24262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
24362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
24662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank,
24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
24962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
250112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
25147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
25262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
253112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
254112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = get_register_interruptible(ab8500, bank, reg, value);
255112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
256112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
25762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
25847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
26047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 bitmask, u8 bitvalues)
26162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
26347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
26447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
26662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
267392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
26862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
269bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ab8500->write_masked == NULL) {
270bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		u8 data;
27162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
272bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->read(ab8500, addr);
273bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0) {
274bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
275bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
276bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			goto out;
277bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		}
27862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
279bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (u8)ret;
280bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (~bitmask & data) | (bitmask & bitvalues);
281bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson
282bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->write(ab8500, addr, data);
283bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0)
284bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
285bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
28662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
287bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr,
288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			data);
289bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		goto out;
290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	}
291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues);
292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ret < 0)
293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr,
294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			ret);
29562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout:
29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->lock);
29762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
29862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
29947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
30047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev,
30147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 bank, u8 reg, u8 bitmask, u8 bitvalues)
30247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
303112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
30447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
30547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
306112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
307112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret= mask_and_set_register_interruptible(ab8500, bank, reg,
308112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg						 bitmask, bitvalues);
309112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
310112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
31147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
31247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
31347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = {
31447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_chip_id = ab8500_get_chip_id,
31547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register = ab8500_get_register,
31647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register = ab8500_set_register,
31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register_page = NULL,
31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register_page = NULL,
31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.mask_and_set_register = ab8500_mask_and_set_register,
32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.event_registers_startup_state_get = NULL,
32147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.startup_irq_enabled = NULL,
32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin};
32362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3249505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data)
32562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3269505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
32762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
32862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_lock(&ab8500->irq_lock);
329112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
33062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
33162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3329505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data)
33362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3349505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
33562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
33662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3372ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
33862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 old = ab8500->oldmask[i];
33962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 new = ab8500->mask[i];
34062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int reg;
34162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (new == old)
34362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3450f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
3460f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
3470f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
3480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
3490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
3500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			is_ab8500_1p1_or_earlier(ab8500))
35192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
35292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
35362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->oldmask[i] = new;
35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3552ced445e2ddf65f484a489161accddf475676965Linus Walleij		reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i];
35647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
35762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
358112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
35962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->irq_lock);
36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3629505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data)
36362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3649505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
36506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
36662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
36762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
36862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
36962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ab8500->mask[index] |= mask;
37062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
37162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3729505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data)
37362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3749505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
37506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
37662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
37762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
37862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
37962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ab8500->mask[index] &= ~mask;
38062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
38162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
38262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = {
38362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	.name			= "ab8500",
3849505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_lock		= ab8500_irq_lock,
3859505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_sync_unlock	= ab8500_irq_sync_unlock,
3869505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_mask		= ab8500_irq_mask,
387e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath	.irq_disable		= ab8500_irq_mask,
3889505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_unmask		= ab8500_irq_unmask,
38962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
39062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3917ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
3927ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int latch_offset, u8 latch_val)
3937ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
3947ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int int_bit = __ffs(latch_val);
3957ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int line, i;
3967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
3977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	do {
3987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		int_bit = __ffs(latch_val);
3997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		for (i = 0; i < ab8500->mask_size; i++)
4017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			if (ab8500->irq_reg_offset[i] == latch_offset)
4027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				break;
4037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (i >= ab8500->mask_size) {
4057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
4067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					latch_offset);
4077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			return -ENXIO;
4087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		}
4097ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		line = (i << 3) + int_bit;
4117ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_val &= ~(1 << int_bit);
4127ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4137ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		handle_nested_irq(ab8500->irq_base + line);
4147ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	} while (latch_val);
4157ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
4177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500,
4207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int hier_offset, u8 hier_val)
4217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
4227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int latch_bit, status;
4237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 latch_offset, latch_val;
4247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	do {
4267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_bit = __ffs(hier_val);
4277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_offset = (hier_offset << 3) + latch_bit;
4287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		/* Fix inconsistent ITFromLatch25 bit mapping... */
4307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (unlikely(latch_offset == 17))
4317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			latch_offset = 24;
4327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500,
4347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_INTERRUPT,
4357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_IT_LATCH1_REG + latch_offset,
4367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				&latch_val);
4377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || latch_val == 0)
4387ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			goto discard;
4397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4407ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_line(ab8500,
4417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				latch_offset, latch_val);
4427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
4437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			return status;
4447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard:
4457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		hier_val &= ~(1 << latch_bit);
4467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	} while (hier_val);
4477ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4487ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
4497ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4507ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4517ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev)
4527ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
4537ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	struct ab8500 *ab8500 = dev;
4547ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 i;
4557ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4567ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	dev_vdbg(ab8500->dev, "interrupt\n");
4577ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4587ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	/*  Hierarchical interrupt version */
4597ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	for (i = 0; i < AB8500_IT_LATCHHIER_NUM; i++) {
4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		int status;
4617ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		u8 hier_val;
4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4637ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
4647ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			AB8500_IT_LATCHHIER1_REG + i, &hier_val);
4657ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || hier_val == 0)
4667ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			continue;
4677ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4687ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val);
4697ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
4707ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			break;
4717ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	}
4727ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return IRQ_HANDLED;
4737ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4747ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
47580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones/**
47680633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * ab8500_irq_get_virq(): Map an interrupt on a chip to a virtual IRQ
47780633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones *
47880633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @ab8500: ab8500_irq controller to operate on.
47980633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @irq: index of the interrupt requested in the chip IRQs
48080633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones *
48180633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * Useful for drivers to request their own IRQs.
48280633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones */
48380633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jonesstatic int ab8500_irq_get_virq(struct ab8500 *ab8500, int irq)
48480633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones{
48580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones	if (!ab8500)
48680633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones		return -EINVAL;
48780633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones
48880633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones	return irq_create_mapping(ab8500->domain, irq);
48980633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones}
49080633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones
49162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic irqreturn_t ab8500_irq(int irq, void *dev)
49262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
49362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	struct ab8500 *ab8500 = dev;
49462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
49562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
49662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "interrupt\n");
49762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
498112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
499112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
5002ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
5012ced445e2ddf65f484a489161accddf475676965Linus Walleij		int regoffset = ab8500->irq_reg_offset[i];
50262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int status;
50347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		u8 value;
50462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
5050f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
5060f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
5070f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
5080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
5090f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (regoffset == 11 && is_ab8500_1p1_or_earlier(ab8500))
51092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
51192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
51247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
51347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			AB8500_IT_LATCH1_REG + regoffset, &value);
51447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		if (status < 0 || value == 0)
51562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
51662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
51762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		do {
51888aec4f7b67b5889ba5b4beac2d2c1400451c318Mattias Wallin			int bit = __ffs(value);
51962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			int line = i * 8 + bit;
5200a37fc56888c37049f60aab398fddceafd33fe72Lee Jones			int virq = ab8500_irq_get_virq(ab8500, line);
52162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
5220a37fc56888c37049f60aab398fddceafd33fe72Lee Jones			handle_nested_irq(virq);
52347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			value &= ~(1 << bit);
524112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
52547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		} while (value);
52662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
527112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
52862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return IRQ_HANDLED;
52962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
53062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
53106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_map(struct irq_domain *d, unsigned int virq,
53206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				irq_hw_number_t hwirq)
53306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones{
53406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	struct ab8500 *ab8500 = d->host_data;
53506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
53606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500)
53706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -EINVAL;
53806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
53906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_data(virq, ab8500);
54006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_and_handler(virq, &ab8500_irq_chip,
54106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				handle_simple_irq);
54206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_nested_thread(virq, 1);
54362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#ifdef CONFIG_ARM
54406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	set_irq_flags(virq, IRQF_VALID);
54562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#else
54606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_noprobe(virq);
54762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#endif
54862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
54962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
55062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
55162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
55206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic struct irq_domain_ops ab8500_irq_ops = {
55306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .map    = ab8500_irq_map,
55406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .xlate  = irq_domain_xlate_twocell,
55506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones};
55606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
55706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
55862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
5592ced445e2ddf65f484a489161accddf475676965Linus Walleij	int num_irqs;
5602ced445e2ddf65f484a489161accddf475676965Linus Walleij
561d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
562d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB9540_NR_IRQS;
563a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	else if (is_ab8505(ab8500))
564a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		num_irqs = AB8505_NR_IRQS;
565d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
566d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB8500_NR_IRQS;
56762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
56806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (ab8500->irq_base) {
56906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ab8500->domain = irq_domain_add_legacy(
57006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones			NULL, num_irqs, ab8500->irq_base,
57106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones			0, &ab8500_irq_ops, ab8500);
57206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
57306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	else {
57406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ab8500->domain = irq_domain_add_linear(
57506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones			np, num_irqs, &ab8500_irq_ops, ab8500);
57662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
57706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
57806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500->domain) {
57906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		dev_err(ab8500->dev, "Failed to create irqdomain\n");
58006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -ENOSYS;
58106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
58206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
58306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return 0;
58462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
58562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
586112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500)
587112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{
588112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	if (atomic_read(&ab8500->transfer_ongoing))
589112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return -EINVAL;
590112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	else
591112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return 0;
592112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg}
593112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
594d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB8500 GPIO Resources */
5955cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_gpio_resources[] = {
5960cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu	{
5970cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu		.name	= "GPIO_INT6",
5980cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu		.start	= AB8500_INT_GPIO6R,
5990cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu		.end	= AB8500_INT_GPIO41F,
6000cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu		.flags	= IORESOURCE_IRQ,
6010cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu	}
6020cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu};
6030cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu
604d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 GPIO Resources */
605d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct resource __devinitdata ab9540_gpio_resources[] = {
606d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
607d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name	= "GPIO_INT6",
608d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.start	= AB8500_INT_GPIO6R,
609d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.end	= AB8500_INT_GPIO41F,
610d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.flags	= IORESOURCE_IRQ,
611d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
612d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
613d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name	= "GPIO_INT14",
614d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.start	= AB9540_INT_GPIO50R,
615d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.end	= AB9540_INT_GPIO54R,
616d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.flags	= IORESOURCE_IRQ,
617d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
618d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
619d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name	= "GPIO_INT15",
620d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.start	= AB9540_INT_GPIO50F,
621d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.end	= AB9540_INT_GPIO54F,
622d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.flags	= IORESOURCE_IRQ,
623d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
624d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
625d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
6265cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_gpadc_resources[] = {
62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
62862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "HW_CONV_END",
62962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_HW_ADC_CONV_END,
63062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_HW_ADC_CONV_END,
63162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
63262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
63362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
63462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "SW_CONV_END",
63562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_SW_ADC_CONV_END,
63662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_SW_ADC_CONV_END,
63762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
63862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
63962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
64062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
6415cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_rtc_resources[] = {
64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "60S",
64462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_60S,
64562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_60S,
64662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
64762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
64862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
64962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "ALARM",
65062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_ALARM,
65162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_ALARM,
65262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
65362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
65462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
65562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
6565cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_poweronkey_db_resources[] = {
65777686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
65877686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBF",
65977686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_F,
66077686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_F,
66177686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
66277686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
66377686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
66477686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBR",
66577686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_R,
66677686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_R,
66777686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
66877686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
66977686517977e77d101c8a7b397717df00a88922bSundar R Iyer};
67077686517977e77d101c8a7b397717df00a88922bSundar R Iyer
6716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_av_acc_detect_resources[] = {
672e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_F",
6746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_F,
6756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_F,
6766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
677e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
678e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_R",
6806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_R,
6816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_R,
6826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
6846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
6856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_F",
6866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_F,
6876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_F,
6886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
6906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
6916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_R",
6926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_R,
6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_R,
6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_F",
6986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_F,
6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_F,
7006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
701e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
702e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_R",
7046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_R,
7056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_R,
7066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
7096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
7106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_charger_resources[] = {
7116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
712e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CH_UNPLUG_DET",
713e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_UNPLUG_DET,
714e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_UNPLUG_DET,
715e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
716e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
717e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
718e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CHARGE_PLUG_DET",
719e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_PLUG_DET,
720e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_PLUG_DET,
721e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
722e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
723e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
724e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
725e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
726e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
727e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
728e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
729e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7306af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "VBUS_DET_F",
7316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_VBUS_DET_F,
7326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_VBUS_DET_F,
733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_LINK_STATUS",
7376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_LINK_STATUS,
7386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_LINK_STATUS,
7396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
742e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_OVV",
743e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_OVV,
744e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_OVV,
745e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
746e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
747e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_R",
7496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_R,
7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_R,
751e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
752e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
753e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_F",
7556af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_F,
7566af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_F,
757e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
758e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
759e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_EXT_CH_NOT_OK",
7616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_R",
7676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_R,
7686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_R,
7696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_F",
7736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_F,
7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_F,
7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CHARGER_NOT_OKR",
779a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_USB_CHARGER_NOT_OKR,
780a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_USB_CHARGER_NOT_OKR,
7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CH_WD_EXP",
7856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CH_WD_EXP,
7866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CH_WD_EXP,
7876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
7906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
7916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_btemp_resources[] = {
7926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BAT_CTRL_INDB",
7946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BAT_CTRL_INDB,
7956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BAT_CTRL_INDB,
796e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
797e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
798e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
799e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_LOW",
800e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_LOW,
801e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_LOW,
802e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
803e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
804e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
805e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_HIGH",
806e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_HIGH,
807e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_HIGH,
808e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
809e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
810e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_LOW_MEDIUM",
8126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_LOW_MEDIUM,
8136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_LOW_MEDIUM,
814e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
815e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
816e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_MEDIUM_HIGH",
8186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_MEDIUM_HIGH,
8196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_MEDIUM_HIGH,
820e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
821e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
8226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
8236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
8246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_fg_resources[] = {
825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8266af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "NCONV_ACCU",
8276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CCN_CONV_ACC,
8286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CCN_CONV_ACC,
829e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
830e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
831e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BATT_OVV",
8336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BATT_OVV,
8346af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BATT_OVV,
835e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
836e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
837e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_F",
8396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_F,
8406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_F,
8416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_R",
8456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_R,
8466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_R,
8476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CC_INT_CALIB",
8516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CC_INT_CALIB,
8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CC_INT_CALIB,
853e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
854e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
855a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	{
856a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.name = "CCEOC",
857a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_CCEOC,
858a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_CCEOC,
859a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.flags = IORESOURCE_IRQ,
860a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	},
861e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
862e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
8636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_chargalg_resources[] = {};
8646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
865df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS
8665cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_debug_resources[] = {
867e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
868e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_FIRST",
869e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
870e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
871e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
872e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
873e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
874e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_LAST",
875a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start	= AB8500_INT_XTAL32K_KO,
876a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end	= AB8500_INT_XTAL32K_KO,
877e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
878e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
879e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
880df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif
881e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
8825cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_usb_resources[] = {
883e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
884e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_R",
885e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_R,
886e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_R,
887e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
888e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
889e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
890e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_F",
891e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_F,
892e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_F,
893e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
894e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
895e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
896e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_F",
897e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_F,
898e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_F,
899e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
900e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
901e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
902e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
903e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
904e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
905e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
906e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
90792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	{
90892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.name = "USB_LINK_STATUS",
90992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.start = AB8500_INT_USB_LINK_STATUS,
91092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.end = AB8500_INT_USB_LINK_STATUS,
91192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.flags = IORESOURCE_IRQ,
91292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	},
9136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_PLUG",
9156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_PLUG,
9166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_PLUG,
9176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
9196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_UNPLUG",
9216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_UNPLUG,
9226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_UNPLUG,
9236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
925e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
926e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
92744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimathstatic struct resource __devinitdata ab8505_iddet_resources[] = {
92844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
92944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyDeglitch",
93044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYDEGLITCH,
93144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYDEGLITCH,
93244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
93344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
93444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
93544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KP",
93644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KP,
93744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KP,
93844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
93944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
94044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
94144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKP",
94244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKP,
94344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKP,
94444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
94544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
94644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
94744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKR",
94844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKR,
94944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKR,
95044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
95144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
95244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
95344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyStuck",
95444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYSTUCK,
95544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYSTUCK,
95644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
95744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
95844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
95944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
9605cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_temp_resources[] = {
961e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
962e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name  = "AB8500_TEMP_WARM",
963e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_TEMP_WARM,
964e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end   = AB8500_INT_TEMP_WARM,
965e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
966e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
967e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
968e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
969d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata abx500_common_devs[] = {
9705814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS
9715814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	{
9725814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin		.name = "ab8500-debug",
973bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-debug",
974e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
975e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_debug_resources,
9765814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	},
9775814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif
97862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
979e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-sysctrl",
980bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-sysctrl",
981e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
982e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
983e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-regulator",
984bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-regulator",
985e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
986e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
98762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-gpadc",
988bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-gpadc",
98962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
99062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_gpadc_resources,
99162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
99262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
99362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-rtc",
994bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-rtc",
99562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
99662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_rtc_resources,
99762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
998f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
9996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "ab8500-acc-det",
1000bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-acc-det",
10016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
10026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.resources = ab8500_av_acc_detect_resources,
10036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
10046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
1005e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-poweron-key",
1006bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-poweron-key",
1007e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
1008e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_poweronkey_db_resources,
1009e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1010e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1011f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1012bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1013f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 1,
1014f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1015f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1016f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1017bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1018f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 2,
1019f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1020f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1021f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1022bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1023f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 3,
1024f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1025bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	{
1026bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.name = "ab8500-leds",
1027bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-leds",
1028bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	},
102977686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
1030e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-denc",
1031bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-denc",
1032e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1033e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1034e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-temp",
1035bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-temp",
1036e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
1037e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_temp_resources,
103877686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
103962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
104062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
10416ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic struct mfd_cell __devinitdata ab8500_bm_devs[] = {
10426ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10436ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-charger",
10444aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.of_compatible = "stericsson,ab8500-charger",
10456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_charger_resources),
10466ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_charger_resources,
10474aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#ifndef CONFIG_OF
10484aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.platform_data = &ab8500_bm_data,
10494aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
10504aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#endif
10516ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10526ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10536ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-btemp",
1054bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.of_compatible = "stericsson,ab8500-btemp",
10556ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_btemp_resources),
10566ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_btemp_resources,
1057bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#ifndef CONFIG_OF
1058bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.platform_data = &ab8500_bm_data,
1059bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
1060bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#endif
10616ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10626ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10636ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-fg",
1064e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.of_compatible = "stericsson,ab8500-fg",
10656ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_fg_resources),
10666ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_fg_resources,
1067e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#ifndef CONFIG_OF
1068e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.platform_data = &ab8500_bm_data,
1069e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
1070e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#endif
10716ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10726ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10736ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-chargalg",
10746ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
10756ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_chargalg_resources,
10766ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10776ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson};
10786ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1079d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab8500_devs[] = {
1080d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1081d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-gpio",
1082bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-gpio",
1083d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_gpio_resources),
1084d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_gpio_resources,
1085d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1086d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1087d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-usb",
1088bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-usb",
1089d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1090d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1091d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
109244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
109344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab8500-codec",
109481a21cddaf14bd1144c2d173add7cbdeb95a07caLee Jones		.of_compatible = "stericsson,ab8500-codec",
109544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1096d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1097d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1098d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab9540_devs[] = {
1099d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1100d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-gpio",
1101d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab9540_gpio_resources),
1102d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab9540_gpio_resources,
1103d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1104d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1105d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab9540-usb",
1106d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1107d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1108d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
110944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
111044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab9540-codec",
111144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
111244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
111344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
111444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath/* Device list common to ab9540 and ab8505 */
111544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimathstatic struct mfd_cell __devinitdata ab9540_ab8505_devs[] = {
111644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
111744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab-iddet",
111844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
111944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.resources = ab8505_iddet_resources,
112044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1121d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1122d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1123cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev,
1124cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin				struct device_attribute *attr, char *buf)
1125cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{
1126cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	struct ab8500 *ab8500;
1127cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1128cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	ab8500 = dev_get_drvdata(dev);
1129cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
1130cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}
1131cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1132e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/*
1133e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1134e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming
1135e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation
1136e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold
1137e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired
1138e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock
1139e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold
1140e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds
1141e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown
1142e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */
1143e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev,
1144e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin				struct device_attribute *attr, char *buf)
1145e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{
1146e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	int ret;
1147e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	u8 value;
1148e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	struct ab8500 *ab8500;
1149e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1150e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ab8500 = dev_get_drvdata(dev);
1151e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1152e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1153e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1154e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1155e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	return sprintf(buf, "%#x\n", value);
1156e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin}
1157e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1158b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/*
1159b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS):
1160b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat
1161b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF
1162b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF
1163b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm
1164b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet
1165b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet
1166b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect
1167b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved
1168b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */
1169b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev,
1170b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn				struct device_attribute *attr, char *buf)
1171b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{
1172b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	int ret;
1173b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	u8 value;
1174b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	struct ab8500 *ab8500;
1175b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1176b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ab8500 = dev_get_drvdata(dev);
1177b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1178b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		AB8500_TURN_ON_STATUS, &value);
1179b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	if (ret < 0)
1180b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		return ret;
1181b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	return sprintf(buf, "%#x\n", value);
1182b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn}
1183b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1184d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev,
1185d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				struct device_attribute *attr, char *buf)
1186d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1187d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1188d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret;
1189d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 value;
1190d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1191d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1192d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1193d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
1194d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		AB9540_MODEM_CTRL2_REG, &value);
1195d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (ret < 0)
1196d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		return ret;
1197d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1198d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return sprintf(buf, "%d\n",
1199d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			(value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0);
1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev,
1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct device_attribute *attr, const char *buf, size_t count)
1204d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1205d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1206d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret = count;
1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int err;
1208d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 bitvalues;
1209d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1210d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1211d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1212d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (count > 0) {
1213d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		switch (buf[0]) {
1214d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '0':
1215d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = 0;
1216d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1217d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '1':
1218d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT;
1219d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1220d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		default:
1221d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			goto exit;
1222d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		}
1223d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1224d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		err = mask_and_set_register_interruptible(ab8500,
1225d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG,
1226d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues);
1227d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		if (err)
1228d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			dev_info(ab8500->dev,
1229d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				"Failed to set DBBRSTN %c, err %#x\n",
1230d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				buf[0], err);
1231d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
1232d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1233d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit:
1234d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return ret;
1235d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1236d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1237cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
1238e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
1239b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL);
1240d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR,
1241d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			show_ab9540_dbbrstn, store_ab9540_dbbrstn);
1242cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1243cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = {
1244cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	&dev_attr_chip_id.attr,
1245e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	&dev_attr_switch_off_status.attr,
1246b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	&dev_attr_turn_on_status.attr,
1247cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	NULL,
1248cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1249cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1250d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = {
1251d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_chip_id.attr,
1252d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_switch_off_status.attr,
1253d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_turn_on_status.attr,
1254d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_dbbrstn.attr,
1255d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	NULL,
1256d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1257d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1258cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = {
1259cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	.attrs	= ab8500_sysfs_entries,
1260cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1261cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1262d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = {
1263d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	.attrs	= ab9540_sysfs_entries,
1264d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1265d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1266d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devinit ab8500_probe(struct platform_device *pdev)
126762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1268b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	static char *switch_off_status[] = {
1269b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Swoff bit programming",
1270b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Thermal protection activation",
1271b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Vbat lower then BattOk falling threshold",
1272b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Watchdog expired",
1273b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Non presence of 32kHz clock",
1274b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Battery level lower than power on reset threshold",
1275b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Power on key 1 pressed longer than 10 seconds",
1276b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"DB8500 thermal shutdown"};
1277d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev);
1278d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	const struct platform_device_id *platid = platform_get_device_id(pdev);
12796bc4a568414caab05424b702165a732177daccd0Lee Jones	enum ab8500_version version = AB8500_VERSION_UNDEFINED;
12806bc4a568414caab05424b702165a732177daccd0Lee Jones	struct device_node *np = pdev->dev.of_node;
1281d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500;
1282d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct resource *resource;
128362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
128462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
128547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 value;
128662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1287d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL);
1288d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!ab8500)
1289d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return -ENOMEM;
1290d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
129162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat)
129262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->irq_base = plat->irq_base;
129362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1294d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->dev = &pdev->dev;
1295d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1296d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1297d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!resource) {
1298d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		ret = -ENODEV;
1299d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		goto out_free_ab8500;
1300d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	}
1301d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1302d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->irq = resource->start;
1303d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1304822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->read = ab8500_prcmu_read;
1305822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write = ab8500_prcmu_write;
1306822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write_masked = ab8500_prcmu_write_masked;
1307d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
130862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->lock);
130962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->irq_lock);
1310112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_set(&ab8500->transfer_ongoing, 0);
131162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1312d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_set_drvdata(pdev, ab8500);
1313d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
13146bc4a568414caab05424b702165a732177daccd0Lee Jones	if (platid)
13156bc4a568414caab05424b702165a732177daccd0Lee Jones		version = platid->driver_data;
13166bc4a568414caab05424b702165a732177daccd0Lee Jones
13170f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	if (version != AB8500_VERSION_UNDEFINED)
13180f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = version;
13190f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	else {
13200f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ret = get_register_interruptible(ab8500, AB8500_MISC,
13210f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			AB8500_IC_NAME_REG, &value);
13220f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ret < 0)
1323d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones			goto out_free_ab8500;
13240f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
13250f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = value;
13260f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	}
13270f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
132847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = get_register_interruptible(ab8500, AB8500_MISC,
132947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		AB8500_REV_REG, &value);
133062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
1331d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		goto out_free_ab8500;
133262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
133347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ab8500->chip_id = value;
133462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
13350f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
13360f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500_version_str[ab8500->version],
13370f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id >> 4,
13380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id & 0x0F);
13390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
1340d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	/* Configure AB8500 or AB9540 IRQ */
1341a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1342d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1343d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab9540_irq_regoffset;
1344d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	} else {
1345d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1346d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab8500_irq_regoffset;
1347d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
13482ced445e2ddf65f484a489161accddf475676965Linus Walleij	ab8500->mask = kzalloc(ab8500->mask_size, GFP_KERNEL);
13492ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->mask)
13502ced445e2ddf65f484a489161accddf475676965Linus Walleij		return -ENOMEM;
13512ced445e2ddf65f484a489161accddf475676965Linus Walleij	ab8500->oldmask = kzalloc(ab8500->mask_size, GFP_KERNEL);
13522ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->oldmask) {
13532ced445e2ddf65f484a489161accddf475676965Linus Walleij		ret = -ENOMEM;
13542ced445e2ddf65f484a489161accddf475676965Linus Walleij		goto out_freemask;
13552ced445e2ddf65f484a489161accddf475676965Linus Walleij	}
1356e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	/*
1357e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1358e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x01 Swoff bit programming
1359e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x02 Thermal protection activation
1360e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x04 Vbat lower then BattOk falling threshold
1361e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x08 Watchdog expired
1362e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x10 Non presence of 32kHz clock
1363e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x20 Battery level lower than power on reset threshold
1364e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x40 Power on key 1 pressed longer than 10 seconds
1365e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x80 DB8500 thermal shutdown
1366e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 */
1367e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1368e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1369e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1370e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1371e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1372b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value);
1373b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1374b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	if (value) {
1375b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) {
1376b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			if (value & 1)
1377b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				printk(KERN_CONT " \"%s\"",
1378b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				       switch_off_status[i]);
1379b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			value = value >> 1;
1380b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1381b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		}
1382b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT "\n");
1383b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	} else {
1384b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT " None\n");
1385b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	}
1386e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
138762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat && plat->init)
138862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		plat->init(ab8500);
138962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
139062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	/* Clear and mask all interrupts */
13912ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
13920f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
13930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
13940f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
13950f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
13960f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
13970f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij				is_ab8500_1p1_or_earlier(ab8500))
139892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
139962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
140047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		get_register_interruptible(ab8500, AB8500_INTERRUPT,
14012ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
140292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			&value);
140347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT,
14042ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
140562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
140662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
140747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
140847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	if (ret)
14092ced445e2ddf65f484a489161accddf475676965Linus Walleij		goto out_freeoldmask;
141047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
14112ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++)
141262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
141362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
141406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	ret = ab8500_irq_init(ab8500, np);
141506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (ret)
141606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		goto out_freeoldmask;
141762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
141806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  Activate this feature only in ab9540 */
141906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  till tests are done on ab8500 1p2 or later*/
142006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (is_ab9540(ab8500)) {
142106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ret = request_threaded_irq(ab8500->irq, NULL,
14227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					ab8500_hierarchical_irq,
14237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					IRQF_ONESHOT | IRQF_NO_SUSPEND,
14247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					"ab8500", ab8500);
142506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
142606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	else {
142706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ret = request_threaded_irq(ab8500->irq, NULL,
14287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					ab8500_irq,
14297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					IRQF_ONESHOT | IRQF_NO_SUSPEND,
14307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					"ab8500", ab8500);
143162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (ret)
143206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones			goto out_freeoldmask;
143362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
143462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1435bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
1436bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones			ARRAY_SIZE(abx500_common_devs), NULL,
143755692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown			ab8500->irq_base, ab8500->domain);
1438bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
1439bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		goto out_freeirq;
1440d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1441bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (is_ab9540(ab8500))
1442bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
1443bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab9540_devs), NULL,
144455692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1445bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	else
1446bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
1447bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab8500_devs), NULL,
144855692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1449bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
1450bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		goto out_freeirq;
145144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
1452bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (is_ab9540(ab8500) || is_ab8505(ab8500))
1453bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
1454bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab9540_ab8505_devs), NULL,
145555692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1456bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
1457bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		goto out_freeirq;
145862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
14596ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	if (!no_bm) {
14606ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		/* Add battery management devices */
14616ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
14626ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson				      ARRAY_SIZE(ab8500_bm_devs), NULL,
146355692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				      ab8500->irq_base, ab8500->domain);
14646ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		if (ret)
14656ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson			dev_err(ab8500->dev, "error adding bm devices\n");
14666ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	}
14676ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1468d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1469d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1470d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab9540_attr_group);
1471d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1472d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1473d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab8500_attr_group);
1474cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	if (ret)
1475cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin		dev_err(ab8500->dev, "error creating sysfs entries\n");
147606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
147706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return ret;
147862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
147962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout_freeirq:
148006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	free_irq(ab8500->irq, ab8500);
14812ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freeoldmask:
14822ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->oldmask);
14832ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freemask:
14842ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->mask);
1485d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesout_free_ab8500:
1486d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	kfree(ab8500);
14876d95b7fdd0bd2e28ef651da6863d75edca4c2acaLinus Walleij
148862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
148962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
149062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1491d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devexit ab8500_remove(struct platform_device *pdev)
149262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1493d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500 = platform_get_drvdata(pdev);
1494d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1495d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1496d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group);
1497d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1498d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group);
149906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
150062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mfd_remove_devices(ab8500->dev);
150106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	free_irq(ab8500->irq, ab8500);
150206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
15032ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->oldmask);
15042ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->mask);
1505d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	kfree(ab8500);
150662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
150762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
150862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
150962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1510d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = {
1511d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8500-core", AB8500_VERSION_AB8500 },
1512d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8505-i2c", AB8500_VERSION_AB8505 },
1513d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab9540-i2c", AB8500_VERSION_AB9540 },
1514d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8540-i2c", AB8500_VERSION_AB8540 },
1515d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ }
1516d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1517d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1518d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = {
1519d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.driver = {
1520d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.name = "ab8500-core",
1521d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.owner = THIS_MODULE,
1522d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	},
1523d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.probe	= ab8500_probe,
1524d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.remove	= __devexit_p(ab8500_remove),
1525d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.id_table = ab8500_id,
1526d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1527d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1528d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void)
1529d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1530d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return platform_driver_register(&ab8500_core_driver);
1531d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1532d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1533d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void)
1534d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1535d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_driver_unregister(&ab8500_core_driver);
1536d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1537ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init);
1538d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit);
1539d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1540adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
154162579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core");
154262579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2");
1543