ab8500-core.c revision 822672a7b496e724f879af703693f342e2215163
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
47562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic irqreturn_t ab8500_irq(int irq, void *dev)
47662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
47762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	struct ab8500 *ab8500 = dev;
47862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
47962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
48062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "interrupt\n");
48162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
482112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
483112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
4842ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
4852ced445e2ddf65f484a489161accddf475676965Linus Walleij		int regoffset = ab8500->irq_reg_offset[i];
48662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int status;
48747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		u8 value;
48862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4890f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
4900f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
4910f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
4920f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
4930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (regoffset == 11 && is_ab8500_1p1_or_earlier(ab8500))
49492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
49592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
49647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
49747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			AB8500_IT_LATCH1_REG + regoffset, &value);
49847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		if (status < 0 || value == 0)
49962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
50062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
50162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		do {
50288aec4f7b67b5889ba5b4beac2d2c1400451c318Mattias Wallin			int bit = __ffs(value);
50362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			int line = i * 8 + bit;
50462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
50562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			handle_nested_irq(ab8500->irq_base + line);
50647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			value &= ~(1 << bit);
507112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
50847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		} while (value);
50962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
510112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
51162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return IRQ_HANDLED;
51262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
51362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
51406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones/**
51506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * ab8500_irq_get_virq(): Map an interrupt on a chip to a virtual IRQ
51606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones *
51706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * @ab8500: ab8500_irq controller to operate on.
51806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * @irq: index of the interrupt requested in the chip IRQs
51906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones *
52006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * Useful for drivers to request their own IRQs.
52106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones */
52206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesint ab8500_irq_get_virq(struct ab8500 *ab8500, int irq)
52362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
52406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500)
52506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -EINVAL;
52662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
52706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return irq_create_mapping(ab8500->domain, irq);
52806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones}
52906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee JonesEXPORT_SYMBOL_GPL(ab8500_irq_get_virq);
5302ced445e2ddf65f484a489161accddf475676965Linus Walleij
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",
973e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
974e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_debug_resources,
9755814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	},
9765814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif
97762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
978e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-sysctrl",
979e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
980e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
981e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-regulator",
982e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
983e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
98462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-gpadc",
98562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
98662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_gpadc_resources,
98762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
98862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
98962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-rtc",
99062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
99162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_rtc_resources,
99262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
993f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
9946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "ab8500-acc-det",
9956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
9966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.resources = ab8500_av_acc_detect_resources,
9976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
9986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
999e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-poweron-key",
1000e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
1001e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_poweronkey_db_resources,
1002e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1003e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1004f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1005f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 1,
1006f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1007f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1008f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1009f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 2,
1010f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1011f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1012f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1013f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 3,
1014f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1015e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{ .name = "ab8500-leds", },
101677686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
1017e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-denc",
1018e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1019e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1020e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-temp",
1021e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
1022e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_temp_resources,
102377686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
102462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
102562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
10266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic struct mfd_cell __devinitdata ab8500_bm_devs[] = {
10276ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10286ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-charger",
10296ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_charger_resources),
10306ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_charger_resources,
10316ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10326ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10336ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-btemp",
10346ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_btemp_resources),
10356ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_btemp_resources,
10366ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10376ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10386ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-fg",
10396ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_fg_resources),
10406ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_fg_resources,
10416ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10426ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10436ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-chargalg",
10446ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
10456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_chargalg_resources,
10466ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10476ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson};
10486ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1049d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab8500_devs[] = {
1050d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1051d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-gpio",
1052d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_gpio_resources),
1053d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_gpio_resources,
1054d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1055d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1056d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-usb",
1057d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1058d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1059d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
106044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
106144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab8500-codec",
106244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1063d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1064d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1065d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab9540_devs[] = {
1066d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1067d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-gpio",
1068d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab9540_gpio_resources),
1069d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab9540_gpio_resources,
1070d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1071d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1072d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab9540-usb",
1073d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1074d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1075d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
107644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
107744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab9540-codec",
107844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
107944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
108044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
108144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath/* Device list common to ab9540 and ab8505 */
108244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimathstatic struct mfd_cell __devinitdata ab9540_ab8505_devs[] = {
108344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
108444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab-iddet",
108544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
108644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.resources = ab8505_iddet_resources,
108744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1088d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1089d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1090cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev,
1091cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin				struct device_attribute *attr, char *buf)
1092cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{
1093cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	struct ab8500 *ab8500;
1094cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1095cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	ab8500 = dev_get_drvdata(dev);
1096cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
1097cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}
1098cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1099e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/*
1100e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1101e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming
1102e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation
1103e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold
1104e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired
1105e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock
1106e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold
1107e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds
1108e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown
1109e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */
1110e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev,
1111e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin				struct device_attribute *attr, char *buf)
1112e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{
1113e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	int ret;
1114e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	u8 value;
1115e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	struct ab8500 *ab8500;
1116e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1117e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ab8500 = dev_get_drvdata(dev);
1118e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1119e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1120e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1121e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1122e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	return sprintf(buf, "%#x\n", value);
1123e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin}
1124e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1125b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/*
1126b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS):
1127b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat
1128b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF
1129b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF
1130b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm
1131b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet
1132b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet
1133b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect
1134b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved
1135b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */
1136b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev,
1137b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn				struct device_attribute *attr, char *buf)
1138b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{
1139b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	int ret;
1140b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	u8 value;
1141b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	struct ab8500 *ab8500;
1142b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1143b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ab8500 = dev_get_drvdata(dev);
1144b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1145b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		AB8500_TURN_ON_STATUS, &value);
1146b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	if (ret < 0)
1147b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		return ret;
1148b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	return sprintf(buf, "%#x\n", value);
1149b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn}
1150b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1151d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev,
1152d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				struct device_attribute *attr, char *buf)
1153d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1154d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1155d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret;
1156d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 value;
1157d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1158d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1159d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1160d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
1161d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		AB9540_MODEM_CTRL2_REG, &value);
1162d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (ret < 0)
1163d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		return ret;
1164d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1165d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return sprintf(buf, "%d\n",
1166d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			(value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0);
1167d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1168d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1169d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev,
1170d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct device_attribute *attr, const char *buf, size_t count)
1171d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1172d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1173d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret = count;
1174d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int err;
1175d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 bitvalues;
1176d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1177d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1178d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1179d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (count > 0) {
1180d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		switch (buf[0]) {
1181d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '0':
1182d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = 0;
1183d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1184d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '1':
1185d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT;
1186d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1187d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		default:
1188d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			goto exit;
1189d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		}
1190d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1191d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		err = mask_and_set_register_interruptible(ab8500,
1192d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG,
1193d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues);
1194d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		if (err)
1195d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			dev_info(ab8500->dev,
1196d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				"Failed to set DBBRSTN %c, err %#x\n",
1197d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				buf[0], err);
1198d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
1199d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit:
1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return ret;
1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1204cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
1205e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
1206b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL);
1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR,
1208d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			show_ab9540_dbbrstn, store_ab9540_dbbrstn);
1209cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1210cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = {
1211cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	&dev_attr_chip_id.attr,
1212e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	&dev_attr_switch_off_status.attr,
1213b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	&dev_attr_turn_on_status.attr,
1214cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	NULL,
1215cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1216cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1217d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = {
1218d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_chip_id.attr,
1219d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_switch_off_status.attr,
1220d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_turn_on_status.attr,
1221d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_dbbrstn.attr,
1222d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	NULL,
1223d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1224d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1225cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = {
1226cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	.attrs	= ab8500_sysfs_entries,
1227cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1228cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1229d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = {
1230d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	.attrs	= ab9540_sysfs_entries,
1231d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1232d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
12336bc4a568414caab05424b702165a732177daccd0Lee Jonesstatic const struct of_device_id ab8500_match[] = {
12346bc4a568414caab05424b702165a732177daccd0Lee Jones	{
12356bc4a568414caab05424b702165a732177daccd0Lee Jones		.compatible = "stericsson,ab8500",
12366bc4a568414caab05424b702165a732177daccd0Lee Jones		.data = (void *)AB8500_VERSION_AB8500,
12376bc4a568414caab05424b702165a732177daccd0Lee Jones	},
12386bc4a568414caab05424b702165a732177daccd0Lee Jones	{},
12396bc4a568414caab05424b702165a732177daccd0Lee Jones};
12406bc4a568414caab05424b702165a732177daccd0Lee Jones
1241d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devinit ab8500_probe(struct platform_device *pdev)
124262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1243d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev);
1244d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	const struct platform_device_id *platid = platform_get_device_id(pdev);
12456bc4a568414caab05424b702165a732177daccd0Lee Jones	enum ab8500_version version = AB8500_VERSION_UNDEFINED;
12466bc4a568414caab05424b702165a732177daccd0Lee Jones	struct device_node *np = pdev->dev.of_node;
1247d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500;
1248d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct resource *resource;
124962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
125062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
125147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 value;
125262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1253d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL);
1254d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!ab8500)
1255d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return -ENOMEM;
1256d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
125762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat)
125862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->irq_base = plat->irq_base;
125962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1260d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->dev = &pdev->dev;
1261d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1262d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
1263d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!resource) {
1264d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		ret = -ENODEV;
1265d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		goto out_free_ab8500;
1266d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	}
1267d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1268d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->irq = resource->start;
1269d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1270822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->read = ab8500_prcmu_read;
1271822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write = ab8500_prcmu_write;
1272822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write_masked = ab8500_prcmu_write_masked;
1273d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
127462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->lock);
127562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->irq_lock);
1276112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_set(&ab8500->transfer_ongoing, 0);
127762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1278d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_set_drvdata(pdev, ab8500);
1279d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
12806bc4a568414caab05424b702165a732177daccd0Lee Jones	if (platid)
12816bc4a568414caab05424b702165a732177daccd0Lee Jones		version = platid->driver_data;
12826bc4a568414caab05424b702165a732177daccd0Lee Jones	else if (np)
12836bc4a568414caab05424b702165a732177daccd0Lee Jones		version = (unsigned int)
12846bc4a568414caab05424b702165a732177daccd0Lee Jones			of_match_device(ab8500_match, &pdev->dev)->data;
12856bc4a568414caab05424b702165a732177daccd0Lee Jones
12860f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	if (version != AB8500_VERSION_UNDEFINED)
12870f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = version;
12880f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	else {
12890f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ret = get_register_interruptible(ab8500, AB8500_MISC,
12900f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			AB8500_IC_NAME_REG, &value);
12910f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ret < 0)
1292d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones			goto out_free_ab8500;
12930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
12940f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = value;
12950f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	}
12960f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
129747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = get_register_interruptible(ab8500, AB8500_MISC,
129847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		AB8500_REV_REG, &value);
129962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
1300d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		goto out_free_ab8500;
130162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
130247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ab8500->chip_id = value;
130362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
13040f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
13050f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500_version_str[ab8500->version],
13060f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id >> 4,
13070f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id & 0x0F);
13080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
1309d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	/* Configure AB8500 or AB9540 IRQ */
1310a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1311d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1312d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab9540_irq_regoffset;
1313d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	} else {
1314d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1315d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab8500_irq_regoffset;
1316d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
13172ced445e2ddf65f484a489161accddf475676965Linus Walleij	ab8500->mask = kzalloc(ab8500->mask_size, GFP_KERNEL);
13182ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->mask)
13192ced445e2ddf65f484a489161accddf475676965Linus Walleij		return -ENOMEM;
13202ced445e2ddf65f484a489161accddf475676965Linus Walleij	ab8500->oldmask = kzalloc(ab8500->mask_size, GFP_KERNEL);
13212ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->oldmask) {
13222ced445e2ddf65f484a489161accddf475676965Linus Walleij		ret = -ENOMEM;
13232ced445e2ddf65f484a489161accddf475676965Linus Walleij		goto out_freemask;
13242ced445e2ddf65f484a489161accddf475676965Linus Walleij	}
1325e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	/*
1326e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1327e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x01 Swoff bit programming
1328e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x02 Thermal protection activation
1329e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x04 Vbat lower then BattOk falling threshold
1330e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x08 Watchdog expired
1331e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x10 Non presence of 32kHz clock
1332e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x20 Battery level lower than power on reset threshold
1333e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x40 Power on key 1 pressed longer than 10 seconds
1334e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x80 DB8500 thermal shutdown
1335e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 */
1336e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1337e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1338e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1339e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1340e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
134106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	dev_info(ab8500->dev, "switch off status: %#x\n", value);
1342e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
134362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat && plat->init)
134462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		plat->init(ab8500);
134562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
134662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	/* Clear and mask all interrupts */
13472ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
13480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
13490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
13500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
13510f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
13520f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
13530f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij				is_ab8500_1p1_or_earlier(ab8500))
135492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
135562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
135647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		get_register_interruptible(ab8500, AB8500_INTERRUPT,
13572ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
135892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			&value);
135947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT,
13602ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
136162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
136262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
136347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
136447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	if (ret)
13652ced445e2ddf65f484a489161accddf475676965Linus Walleij		goto out_freeoldmask;
136647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
13672ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++)
136862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
136962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
137006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	ret = ab8500_irq_init(ab8500, np);
137106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (ret)
137206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		goto out_freeoldmask;
137362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
137406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  Activate this feature only in ab9540 */
137506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  till tests are done on ab8500 1p2 or later*/
137606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (is_ab9540(ab8500)) {
137706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ret = request_threaded_irq(ab8500->irq, NULL,
13787ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					ab8500_hierarchical_irq,
13797ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					IRQF_ONESHOT | IRQF_NO_SUSPEND,
13807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					"ab8500", ab8500);
138106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
138206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	else {
138306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		ret = request_threaded_irq(ab8500->irq, NULL,
13847ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					ab8500_irq,
13857ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					IRQF_ONESHOT | IRQF_NO_SUSPEND,
13867ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					"ab8500", ab8500);
138762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (ret)
138806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones			goto out_freeoldmask;
138962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
139062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
13916bc4a568414caab05424b702165a732177daccd0Lee Jones	if (!np) {
13926bc4a568414caab05424b702165a732177daccd0Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
13936bc4a568414caab05424b702165a732177daccd0Lee Jones				ARRAY_SIZE(abx500_common_devs), NULL,
13946bc4a568414caab05424b702165a732177daccd0Lee Jones				ab8500->irq_base);
1395d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
13966bc4a568414caab05424b702165a732177daccd0Lee Jones		if (ret)
13976bc4a568414caab05424b702165a732177daccd0Lee Jones			goto out_freeirq;
139844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
13996bc4a568414caab05424b702165a732177daccd0Lee Jones		if (is_ab9540(ab8500))
14006bc4a568414caab05424b702165a732177daccd0Lee Jones			ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
14016bc4a568414caab05424b702165a732177daccd0Lee Jones					ARRAY_SIZE(ab9540_devs), NULL,
14026bc4a568414caab05424b702165a732177daccd0Lee Jones					ab8500->irq_base);
14036bc4a568414caab05424b702165a732177daccd0Lee Jones		else
14046bc4a568414caab05424b702165a732177daccd0Lee Jones			ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
14056bc4a568414caab05424b702165a732177daccd0Lee Jones					ARRAY_SIZE(ab8500_devs), NULL,
14066bc4a568414caab05424b702165a732177daccd0Lee Jones					ab8500->irq_base);
14076bc4a568414caab05424b702165a732177daccd0Lee Jones		if (ret)
14086bc4a568414caab05424b702165a732177daccd0Lee Jones			goto out_freeirq;
140944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
14106bc4a568414caab05424b702165a732177daccd0Lee Jones		if (is_ab9540(ab8500) || is_ab8505(ab8500))
14116bc4a568414caab05424b702165a732177daccd0Lee Jones			ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
14126bc4a568414caab05424b702165a732177daccd0Lee Jones					ARRAY_SIZE(ab9540_ab8505_devs), NULL,
14136bc4a568414caab05424b702165a732177daccd0Lee Jones					ab8500->irq_base);
14146bc4a568414caab05424b702165a732177daccd0Lee Jones		if (ret)
14156bc4a568414caab05424b702165a732177daccd0Lee Jones			goto out_freeirq;
14166bc4a568414caab05424b702165a732177daccd0Lee Jones	}
141762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
14186ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	if (!no_bm) {
14196ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		/* Add battery management devices */
14206ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
14216ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson				      ARRAY_SIZE(ab8500_bm_devs), NULL,
14226ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson				      ab8500->irq_base);
14236ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		if (ret)
14246ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson			dev_err(ab8500->dev, "error adding bm devices\n");
14256ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	}
14266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1427d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1428d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1429d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab9540_attr_group);
1430d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1431d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1432d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab8500_attr_group);
1433cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	if (ret)
1434cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin		dev_err(ab8500->dev, "error creating sysfs entries\n");
143506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
143606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return ret;
143762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
143862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout_freeirq:
143906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	free_irq(ab8500->irq, ab8500);
14402ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freeoldmask:
14412ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->oldmask);
14422ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freemask:
14432ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->mask);
1444d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesout_free_ab8500:
1445d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	kfree(ab8500);
14466d95b7fdd0bd2e28ef651da6863d75edca4c2acaLinus Walleij
144762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
144862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
144962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1450d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devexit ab8500_remove(struct platform_device *pdev)
145162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1452d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500 = platform_get_drvdata(pdev);
1453d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1454d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1455d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group);
1456d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1457d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group);
145806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
145962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mfd_remove_devices(ab8500->dev);
146006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	free_irq(ab8500->irq, ab8500);
146106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
14622ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->oldmask);
14632ced445e2ddf65f484a489161accddf475676965Linus Walleij	kfree(ab8500->mask);
1464d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	kfree(ab8500);
146562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
146662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
146762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
146862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1469d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = {
1470d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8500-core", AB8500_VERSION_AB8500 },
1471d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8505-i2c", AB8500_VERSION_AB8505 },
1472d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab9540-i2c", AB8500_VERSION_AB9540 },
1473d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8540-i2c", AB8500_VERSION_AB8540 },
1474d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ }
1475d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1476d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1477d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = {
1478d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.driver = {
1479d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.name = "ab8500-core",
1480d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.owner = THIS_MODULE,
14816bc4a568414caab05424b702165a732177daccd0Lee Jones		.of_match_table = ab8500_match,
1482d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	},
1483d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.probe	= ab8500_probe,
1484d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.remove	= __devexit_p(ab8500_remove),
1485d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.id_table = ab8500_id,
1486d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1487d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1488d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void)
1489d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1490d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return platform_driver_register(&ab8500_core_driver);
1491d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1492d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1493d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void)
1494d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1495d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_driver_unregister(&ab8500_core_driver);
1496d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1497d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesarch_initcall(ab8500_core_init);
1498d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit);
1499d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1500adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
150162579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core");
150262579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2");
1503