ab8500-core.c revision e64d905e28031031c52db403826cd3bfe060b181
162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Copyright (C) ST-Ericsson SA 2010
362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent *
462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * License Terms: GNU General Public License v2
562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Rabin Vincent <rabin.vincent@stericsson.com>
7adceed6263887e04721b477e6504aa24789f827dMattias Wallin * Author: Mattias Wallin <mattias.wallin@stericsson.com>
862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/kernel.h>
1162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/slab.h>
1262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/init.h>
1362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/irq.h>
1406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones#include <linux/irqdomain.h>
1562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/delay.h>
1662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/interrupt.h>
1762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/module.h>
1862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/platform_device.h>
1962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/mfd/core.h>
2047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#include <linux/mfd/abx500.h>
21ee66e653ca7425bc8ffca4e00f19a8057cd14e4dLinus Walleij#include <linux/mfd/abx500/ab8500.h>
2200441b5e6b98ad6a50b5cb7f88d473e3ea1e0d75Lee Jones#include <linux/mfd/abx500/ab8500-bm.h>
23d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones#include <linux/mfd/dbx500-prcmu.h>
24549931f99e030d63a437c23943fd8dc9b7c0e41cSundar R Iyer#include <linux/regulator/ab8500.h>
256bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of.h>
266bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of_device.h>
2762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
2862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
2962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Interrupt register offsets
3062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Bank : 0x0E
3162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
3247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE1_REG		0x00
3347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE2_REG		0x01
3447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE3_REG		0x02
3547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE4_REG		0x03
3647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE5_REG		0x04
3747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE6_REG		0x05
3847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE7_REG		0x06
3947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE8_REG		0x07
40d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_SOURCE13_REG		0x0C
4147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE19_REG		0x12
4247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE20_REG		0x13
4347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE21_REG		0x14
4447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE22_REG		0x15
4547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE23_REG		0x16
4647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE24_REG		0x17
4762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
4962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * latch registers
5062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
5147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH1_REG		0x20
5247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH2_REG		0x21
5347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH3_REG		0x22
5447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH4_REG		0x23
5547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH5_REG		0x24
5647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH6_REG		0x25
5747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH7_REG		0x26
5847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH8_REG		0x27
5947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH9_REG		0x28
6047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH10_REG		0x29
6192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin#define AB8500_IT_LATCH12_REG		0x2B
62d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_LATCH13_REG		0x2C
6347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH19_REG		0x32
6447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH20_REG		0x33
6547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH21_REG		0x34
6647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH22_REG		0x35
6747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH23_REG		0x36
6847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH24_REG		0x37
6962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
7062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
7162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * mask registers
7262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
7362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
7447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK1_REG		0x40
7547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK2_REG		0x41
7647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK3_REG		0x42
7747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK4_REG		0x43
7847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK5_REG		0x44
7947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK6_REG		0x45
8047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK7_REG		0x46
8147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK8_REG		0x47
8247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK9_REG		0x48
8347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK10_REG		0x49
8447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK11_REG		0x4A
8547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK12_REG		0x4B
8647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK13_REG		0x4C
8747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK14_REG		0x4D
8847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK15_REG		0x4E
8947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK16_REG		0x4F
9047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK17_REG		0x50
9147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK18_REG		0x51
9247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK19_REG		0x52
9347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK20_REG		0x53
9447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK21_REG		0x54
9547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK22_REG		0x55
9647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK23_REG		0x56
9747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK24_REG		0x57
9847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/*
1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers
1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */
1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG	0x60
1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG	0x61
1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG	0x62
1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
1067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM		3
1077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
10847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG			0x80
1090f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG		0x82
110e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS	0x00
11162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
112b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS		0x00
113b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1146ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */
1156ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO);
1166ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
117d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG			0x23
118d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT	BIT(2)
119d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
12062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/*
12162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt
1222ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are
1232ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h
12462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent *
12562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at
12662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0.
12762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */
1282ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */
12962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = {
13092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21,
13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
13262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
133d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 support */
134d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = {
135d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24,
136d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
137d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = {
1390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8500] = "AB8500",
1400f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8505] = "AB8505",
1410f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB9540] = "AB9540",
1420f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	[AB8500_VERSION_AB8540] = "AB8540",
1430f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij};
1440f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
145822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data)
146d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
147d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
148d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
149d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
150d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
151d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
152d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
153d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
154d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
155822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask,
156d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data)
157d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
158d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
159d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
160d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data,
161d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		&mask, 1);
162d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0)
163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return ret;
165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
166d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
167822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr)
168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	int ret;
170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	u8 data;
171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
172d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1);
173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (ret < 0) {
174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		dev_err(ab8500->dev, "prcmu i2c error %d\n", ret);
175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return ret;
176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	}
177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return (int)data;
178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
179d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
18047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev)
18147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
1826bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	struct ab8500 *ab8500;
1836bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin
1846bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	if (!dev)
1856bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin		return -EINVAL;
1866bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	ab8500 = dev_get_drvdata(dev->parent);
1876bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin	return ab8500 ? (int)ab8500->chip_id : -EINVAL;
18847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
18947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
19047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank,
19147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 data)
19262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
19362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
19447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/*
19547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * Put the u8 bank and u8 register together into a an u16.
19647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * The bank on higher 8 bits and register in lower 8 bits.
19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * */
19847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
19962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
20062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data);
20162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
202392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
20347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
20462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->write(ab8500, addr, data);
20562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
20662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
20762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
20847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
21162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
21262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank,
21447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 value)
21562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
216112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
21747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
21862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
219112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
220112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = set_register_interruptible(ab8500, bank, reg, value);
221112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
222112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
22462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
22647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
22862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
22947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
23247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
233392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
23462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ret = ab8500->read(ab8500, addr);
23662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
23762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
23862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			addr, ret);
23947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	else
24047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		*value = ret;
24162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	mutex_unlock(&ab8500->lock);
24362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
24662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
24762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank,
24947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 *value)
25062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
251112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
25247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
25362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
254112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
255112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret = get_register_interruptible(ab8500, bank, reg, value);
256112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
257112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
25862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
26047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank,
26147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 reg, u8 bitmask, u8 bitvalues)
26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
26362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
26447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	/* put the u8 bank and u8 reg together into a an u16.
26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	 * bank on higher 8 bits and reg in lower */
26647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u16 addr = ((u16)bank) << 8 | reg;
26762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
268392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent	mutex_lock(&ab8500->lock);
26962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
270bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ab8500->write_masked == NULL) {
271bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		u8 data;
27262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
273bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->read(ab8500, addr);
274bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0) {
275bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to read reg %#x: %d\n",
276bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
277bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			goto out;
278bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		}
27962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
280bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (u8)ret;
281bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		data = (~bitmask & data) | (bitmask & bitvalues);
282bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson
283bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		ret = ab8500->write(ab8500, addr, data);
284bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		if (ret < 0)
285bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			dev_err(ab8500->dev, "failed to write reg %#x: %d\n",
286bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson				addr, ret);
28762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr,
289bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			data);
290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		goto out;
291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	}
292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues);
293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson	if (ret < 0)
294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson		dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr,
295bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson			ret);
29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout:
29762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->lock);
29862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return ret;
29962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
30047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
30147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev,
30247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 bank, u8 reg, u8 bitmask, u8 bitvalues)
30347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{
304112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	int ret;
30547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	struct ab8500 *ab8500 = dev_get_drvdata(dev->parent);
30647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
307112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
308112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	ret= mask_and_set_register_interruptible(ab8500, bank, reg,
309112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg						 bitmask, bitvalues);
310112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
311112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	return ret;
31247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}
31347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
31447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = {
31547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_chip_id = ab8500_get_chip_id,
31647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register = ab8500_get_register,
31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register = ab8500_set_register,
31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.get_register_page = NULL,
31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.set_register_page = NULL,
32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.mask_and_set_register = ab8500_mask_and_set_register,
32147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.event_registers_startup_state_get = NULL,
32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	.startup_irq_enabled = NULL,
32347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin};
32462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3259505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data)
32662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3279505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
32862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
32962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_lock(&ab8500->irq_lock);
330112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
33162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
33262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3339505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data)
33462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3359505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
33662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
33762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3382ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
33962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 old = ab8500->oldmask[i];
34062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		u8 new = ab8500->mask[i];
34162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int reg;
34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
34362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (new == old)
34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
34562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3460f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
3470f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
3480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
3490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
3500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
3510f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			is_ab8500_1p1_or_earlier(ab8500))
35292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
35392d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->oldmask[i] = new;
35562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3562ced445e2ddf65f484a489161accddf475676965Linus Walleij		reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i];
35747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new);
35862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
359112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_unlock(&ab8500->irq_lock);
36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
36262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3639505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data)
36462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3659505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
36606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
36762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
36862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
36962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
37062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	ab8500->mask[index] |= mask;
3719c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones
3729c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	/* The AB8500 GPIOs have two interrupts each (rising & falling). */
3739c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R)
3749c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index + 2] |= mask;
3759c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R)
3769c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index + 1] |= mask;
3779c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R)
378e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		/* Here the falling IRQ is one bit lower */
379e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		ab8500->mask[index] |= (mask << 1);
38062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
38162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3829505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data)
38362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
3849505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data);
3859c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	unsigned int type = irqd_get_trigger_type(data);
38606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	int offset = data->hwirq;
38762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int index = offset / 8;
38862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int mask = 1 << (offset % 8);
38962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
3909c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (type & IRQ_TYPE_EDGE_RISING)
3919c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index] &= ~mask;
3929c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones
3939c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	/* The AB8500 GPIOs have two interrupts each (rising & falling). */
3949c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones	if (type & IRQ_TYPE_EDGE_FALLING) {
3959c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R)
3969c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index + 2] &= ~mask;
3979c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R)
3989c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index + 1] &= ~mask;
3999c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R)
400e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			/* Here the falling IRQ is one bit lower */
401e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			ab8500->mask[index] &= ~(mask << 1);
4029c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		else
4039c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones			ab8500->mask[index] &= ~mask;
404e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij	} else {
4059c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		/* Satisfies the case where type is not set. */
4069c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones		ab8500->mask[index] &= ~mask;
407e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij	}
40862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
40962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
41040f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jonesstatic int ab8500_irq_set_type(struct irq_data *data, unsigned int type)
41140f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones{
41240f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones	return 0;
41340f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones}
41440f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones
41562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = {
41662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	.name			= "ab8500",
4179505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_lock		= ab8500_irq_lock,
4189505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_bus_sync_unlock	= ab8500_irq_sync_unlock,
4199505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_mask		= ab8500_irq_mask,
420e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath	.irq_disable		= ab8500_irq_mask,
4219505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown	.irq_unmask		= ab8500_irq_unmask,
42240f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones	.irq_set_type		= ab8500_irq_set_type,
42362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
42462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
4257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500,
4267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int latch_offset, u8 latch_val)
4277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
4287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int int_bit = __ffs(latch_val);
4297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int line, i;
4307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	do {
4327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		int_bit = __ffs(latch_val);
4337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		for (i = 0; i < ab8500->mask_size; i++)
4357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			if (ab8500->irq_reg_offset[i] == latch_offset)
4367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				break;
4377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4387ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (i >= ab8500->mask_size) {
4397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			dev_err(ab8500->dev, "Register offset 0x%2x not declared\n",
4407ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					latch_offset);
4417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			return -ENXIO;
4427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		}
4437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		line = (i << 3) + int_bit;
4457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_val &= ~(1 << int_bit);
4467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
447e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		/*
448e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * This handles the falling edge hwirqs from the GPIO
449e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * lines. Route them back to the line registered for the
450e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * rising IRQ, as this is merely a flag for the same IRQ
451e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 * in linux terms.
452e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		 */
453e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line >= AB8500_INT_GPIO6F && line <= AB8500_INT_GPIO41F)
454e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line -= 16;
455e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line >= AB9540_INT_GPIO50F && line <= AB9540_INT_GPIO54F)
456e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line -= 8;
457e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij		if (line == AB8540_INT_GPIO43F || line == AB8540_INT_GPIO44F)
458e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij			line += 1;
459e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij
4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		handle_nested_irq(ab8500->irq_base + line);
4617ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	} while (latch_val);
4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4637ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
4647ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4657ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4667ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500,
4677ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN					int hier_offset, u8 hier_val)
4687ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
4697ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	int latch_bit, status;
4707ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 latch_offset, latch_val;
4717ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4727ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	do {
4737ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_bit = __ffs(hier_val);
4747ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		latch_offset = (hier_offset << 3) + latch_bit;
4757ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4767ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		/* Fix inconsistent ITFromLatch25 bit mapping... */
4777ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (unlikely(latch_offset == 17))
4787ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			latch_offset = 24;
4797ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500,
4817ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_INTERRUPT,
4827ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				AB8500_IT_LATCH1_REG + latch_offset,
4837ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				&latch_val);
4847ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || latch_val == 0)
4857ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			goto discard;
4867ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4877ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_line(ab8500,
4887ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN				latch_offset, latch_val);
4897ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
4907ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			return status;
4917ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard:
4927ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		hier_val &= ~(1 << latch_bit);
4937ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	} while (hier_val);
4947ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4957ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return 0;
4967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
4977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
4987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev)
4997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{
5007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	struct ab8500 *ab8500 = dev;
5017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	u8 i;
5027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	dev_vdbg(ab8500->dev, "interrupt\n");
5047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	/*  Hierarchical interrupt version */
5067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	for (i = 0; i < AB8500_IT_LATCHHIER_NUM; i++) {
5077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		int status;
5087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		u8 hier_val;
5097ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
5117ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			AB8500_IT_LATCHHIER1_REG + i, &hier_val);
5127ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0 || hier_val == 0)
5137ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			continue;
5147ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
5157ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val);
5167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN		if (status < 0)
5177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN			break;
5187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	}
5197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN	return IRQ_HANDLED;
5207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN}
5217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN
52280633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones/**
52380633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * ab8500_irq_get_virq(): Map an interrupt on a chip to a virtual IRQ
52480633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones *
52580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @ab8500: ab8500_irq controller to operate on.
52680633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @irq: index of the interrupt requested in the chip IRQs
52780633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones *
52880633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * Useful for drivers to request their own IRQs.
52980633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones */
53080633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jonesstatic int ab8500_irq_get_virq(struct ab8500 *ab8500, int irq)
53180633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones{
53280633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones	if (!ab8500)
53380633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones		return -EINVAL;
53480633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones
53580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones	return irq_create_mapping(ab8500->domain, irq);
53680633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones}
53780633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones
53862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic irqreturn_t ab8500_irq(int irq, void *dev)
53962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
54062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	struct ab8500 *ab8500 = dev;
54162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
54262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
54362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	dev_vdbg(ab8500->dev, "interrupt\n");
54462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
545112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_inc(&ab8500->transfer_ongoing);
546112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
5472ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
5482ced445e2ddf65f484a489161accddf475676965Linus Walleij		int regoffset = ab8500->irq_reg_offset[i];
54962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		int status;
55047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		u8 value;
55162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
5520f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
5530f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
5540f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
5550f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
5560f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (regoffset == 11 && is_ab8500_1p1_or_earlier(ab8500))
55792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
55892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin
55947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		status = get_register_interruptible(ab8500, AB8500_INTERRUPT,
56047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			AB8500_IT_LATCH1_REG + regoffset, &value);
56147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		if (status < 0 || value == 0)
56262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			continue;
56362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
56462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		do {
56588aec4f7b67b5889ba5b4beac2d2c1400451c318Mattias Wallin			int bit = __ffs(value);
56662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent			int line = i * 8 + bit;
5670a37fc56888c37049f60aab398fddceafd33fe72Lee Jones			int virq = ab8500_irq_get_virq(ab8500, line);
56862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
5690a37fc56888c37049f60aab398fddceafd33fe72Lee Jones			handle_nested_irq(virq);
57047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin			value &= ~(1 << bit);
571112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
57247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		} while (value);
57362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
574112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_dec(&ab8500->transfer_ongoing);
57562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return IRQ_HANDLED;
57662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
57762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
57806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_map(struct irq_domain *d, unsigned int virq,
57906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				irq_hw_number_t hwirq)
58006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones{
58106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	struct ab8500 *ab8500 = d->host_data;
58206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
58306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500)
58406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -EINVAL;
58506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
58606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_data(virq, ab8500);
58706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_chip_and_handler(virq, &ab8500_irq_chip,
58806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones				handle_simple_irq);
58906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_nested_thread(virq, 1);
59062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#ifdef CONFIG_ARM
59106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	set_irq_flags(virq, IRQF_VALID);
59262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#else
59306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	irq_set_noprobe(virq);
59462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#endif
59562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
59662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
59762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
59862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
59906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic struct irq_domain_ops ab8500_irq_ops = {
60006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .map    = ab8500_irq_map,
60106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones        .xlate  = irq_domain_xlate_twocell,
60206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones};
60306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
60406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np)
60562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
6062ced445e2ddf65f484a489161accddf475676965Linus Walleij	int num_irqs;
6072ced445e2ddf65f484a489161accddf475676965Linus Walleij
608d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
609d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB9540_NR_IRQS;
610a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	else if (is_ab8505(ab8500))
611a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		num_irqs = AB8505_NR_IRQS;
612d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
613d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		num_irqs = AB8500_NR_IRQS;
61462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
615f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij	/* If ->irq_base is zero this will give a linear mapping */
616f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij	ab8500->domain = irq_domain_add_simple(NULL,
617f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij			num_irqs, ab8500->irq_base,
618f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij			&ab8500_irq_ops, ab8500);
61906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
62006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (!ab8500->domain) {
62106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		dev_err(ab8500->dev, "Failed to create irqdomain\n");
62206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones		return -ENOSYS;
62306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
62406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
62506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return 0;
62662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
628112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500)
629112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{
630112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	if (atomic_read(&ab8500->transfer_ongoing))
631112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return -EINVAL;
632112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	else
633112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg		return 0;
634112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg}
635112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg
636a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_gpadc_resources[] = {
63762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
63862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "HW_CONV_END",
63962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_HW_ADC_CONV_END,
64062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_HW_ADC_CONV_END,
64162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
64462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "SW_CONV_END",
64562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_GP_SW_ADC_CONV_END,
64662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_GP_SW_ADC_CONV_END,
64762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
64862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
64962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
65062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
651a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_rtc_resources[] = {
65262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
65362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "60S",
65462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_60S,
65562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_60S,
65662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
65762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
65862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
65962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name	= "ALARM",
66062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.start	= AB8500_INT_RTC_ALARM,
66162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.end	= AB8500_INT_RTC_ALARM,
66262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.flags	= IORESOURCE_IRQ,
66362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
66462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
66562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
666a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_poweronkey_db_resources[] = {
66777686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
66877686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBF",
66977686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_F,
67077686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_F,
67177686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
67277686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
67377686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
67477686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.name	= "ONKEY_DBR",
67577686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.start	= AB8500_INT_PON_KEY1DB_R,
67677686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.end	= AB8500_INT_PON_KEY1DB_R,
67777686517977e77d101c8a7b397717df00a88922bSundar R Iyer		.flags	= IORESOURCE_IRQ,
67877686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
67977686517977e77d101c8a7b397717df00a88922bSundar R Iyer};
68077686517977e77d101c8a7b397717df00a88922bSundar R Iyer
681a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_av_acc_detect_resources[] = {
682e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_F",
6846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_F,
6856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_F,
6866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
687e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
688e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
6896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_1DB_R",
6906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_1DB_R,
6916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_1DB_R,
6926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_F",
6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_F,
6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_F,
6986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_21DB_R",
7026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_21DB_R,
7036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_21DB_R,
7046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_F",
7086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_F,
7096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_F,
7106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
711e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
712e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .name = "ACC_DETECT_22DB_R",
7146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .start = AB8500_INT_ACC_DETECT_22DB_R,
7156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .end = AB8500_INT_ACC_DETECT_22DB_R,
7166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	       .flags = IORESOURCE_IRQ,
7176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
7196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
720a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_charger_resources[] = {
7216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
722e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CH_UNPLUG_DET",
723e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_UNPLUG_DET,
724e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_UNPLUG_DET,
725e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
726e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
727e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
728e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "MAIN_CHARGE_PLUG_DET",
729e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_MAIN_CH_PLUG_DET,
730e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_MAIN_CH_PLUG_DET,
731e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
732e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
736e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
737e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
738e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
739e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "VBUS_DET_F",
7416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_VBUS_DET_F,
7426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_VBUS_DET_F,
743e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
744e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
745e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_LINK_STATUS",
7476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_LINK_STATUS,
7486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_LINK_STATUS,
7496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
752e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_OVV",
753e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_OVV,
754e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_OVV,
755e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
756e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
757e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7586af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_R",
7596af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_R,
7606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_R,
761e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
762e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
763e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CH_TH_PROT_F",
7656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_USB_CH_TH_PROT_F,
7666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_USB_CH_TH_PROT_F,
767e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
768e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
769e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
7706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_EXT_CH_NOT_OK",
7716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_EXT_CH_NOT_OK,
7736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_R",
7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_R,
7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_R,
7796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "MAIN_CH_TH_PROT_F",
7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_MAIN_CH_TH_PROT_F,
7846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_MAIN_CH_TH_PROT_F,
7856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_CHARGER_NOT_OKR",
789a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_USB_CHARGER_NOT_OKR,
790a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_USB_CHARGER_NOT_OKR,
7916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
7946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CH_WD_EXP",
7956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CH_WD_EXP,
7966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CH_WD_EXP,
7976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
7986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
7996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
8006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
801a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_btemp_resources[] = {
8026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BAT_CTRL_INDB",
8046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BAT_CTRL_INDB,
8056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BAT_CTRL_INDB,
806e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
807e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
808e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
809e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_LOW",
810e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_LOW,
811e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_LOW,
812e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
813e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
814e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
815e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "BTEMP_HIGH",
816e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_BTEMP_HIGH,
817e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_BTEMP_HIGH,
818e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
819e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
820e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_LOW_MEDIUM",
8226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_LOW_MEDIUM,
8236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_LOW_MEDIUM,
824e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
826e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BTEMP_MEDIUM_HIGH",
8286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BTEMP_MEDIUM_HIGH,
8296af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BTEMP_MEDIUM_HIGH,
830e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
831e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
8326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij};
8336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
834a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_fg_resources[] = {
835e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "NCONV_ACCU",
8376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CCN_CONV_ACC,
8386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CCN_CONV_ACC,
839e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
840e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
841e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "BATT_OVV",
8436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_BATT_OVV,
8446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_BATT_OVV,
845e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
846e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
847e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
8486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_F",
8496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_F,
8506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_F,
8516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "LOW_BAT_R",
8556af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_LOW_BAT_R,
8566af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_LOW_BAT_R,
8576af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
8586af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
8596af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
8606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "CC_INT_CALIB",
8616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_CC_INT_CALIB,
8626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_CC_INT_CALIB,
863e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
864e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
865a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	{
866a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.name = "CCEOC",
867a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start = AB8500_INT_CCEOC,
868a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end = AB8500_INT_CCEOC,
869a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.flags = IORESOURCE_IRQ,
870a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	},
871e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
872e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
873a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_chargalg_resources[] = {};
8746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij
875df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS
876a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_debug_resources[] = {
877e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
878e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_FIRST",
879e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
880e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end	= AB8500_INT_MAIN_EXT_CH_NOT_OK,
881e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
882e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
883e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
884e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name	= "IRQ_LAST",
885a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.start	= AB8500_INT_XTAL32K_KO,
886a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson		.end	= AB8500_INT_XTAL32K_KO,
887e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags	= IORESOURCE_IRQ,
888e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
889e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
890df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif
891e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
892a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_usb_resources[] = {
893e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
894e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_R",
895e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_R,
896e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_R,
897e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
898e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
899e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
900e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ID_WAKEUP_F",
901e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_ID_WAKEUP_F,
902e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_ID_WAKEUP_F,
903e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
904e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
905e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
906e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_F",
907e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_F,
908e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_F,
909e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
910e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
911e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
912e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "VBUS_DET_R",
913e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_VBUS_DET_R,
914e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end = AB8500_INT_VBUS_DET_R,
915e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
916e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
91792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	{
91892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.name = "USB_LINK_STATUS",
91992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.start = AB8500_INT_USB_LINK_STATUS,
92092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.end = AB8500_INT_USB_LINK_STATUS,
92192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin		.flags = IORESOURCE_IRQ,
92292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin	},
9236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_PLUG",
9256af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_PLUG,
9266af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_PLUG,
9276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
9296af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
9306af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "USB_ADP_PROBE_UNPLUG",
9316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.start = AB8500_INT_ADP_PROBE_UNPLUG,
9326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.end = AB8500_INT_ADP_PROBE_UNPLUG,
9336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.flags = IORESOURCE_IRQ,
9346af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
935e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
936e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
937a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8505_iddet_resources[] = {
93844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
93944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyDeglitch",
94044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYDEGLITCH,
94144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYDEGLITCH,
94244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
94344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
94444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
94544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KP",
94644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KP,
94744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KP,
94844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
94944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
95044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
95144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKP",
95244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKP,
95344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKP,
95444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
95544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
95644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
95744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "IKR",
95844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_IKR,
95944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_IKR,
96044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
96144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
96244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
96344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name  = "KeyStuck",
96444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.start = AB8505_INT_KEYSTUCK,
96544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.end   = AB8505_INT_KEYSTUCK,
96644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.flags = IORESOURCE_IRQ,
96744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
96844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
96944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
970a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_temp_resources[] = {
971e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
972e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name  = "AB8500_TEMP_WARM",
973e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.start = AB8500_INT_TEMP_WARM,
974e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.end   = AB8500_INT_TEMP_WARM,
975e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.flags = IORESOURCE_IRQ,
976e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
977e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin};
978e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin
979a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell abx500_common_devs[] = {
9805814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS
9815814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	{
9825814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin		.name = "ab8500-debug",
983bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-debug",
984e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_debug_resources),
985e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_debug_resources,
9865814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin	},
9875814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif
98862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
989e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-sysctrl",
990bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-sysctrl",
991e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
992e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
993e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-regulator",
994bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-regulator",
995e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
996e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
997916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson		.name = "abx500-clk",
998916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson		.of_compatible = "stericsson,abx500-clk",
999916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson	},
1000916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson	{
100162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-gpadc",
1002bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-gpadc",
100362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_gpadc_resources),
100462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_gpadc_resources,
100562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
100662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	{
100762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.name = "ab8500-rtc",
1008bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-rtc",
100962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.num_resources = ARRAY_SIZE(ab8500_rtc_resources),
101062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		.resources = ab8500_rtc_resources,
101162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	},
1012f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
10136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.name = "ab8500-acc-det",
1014bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-acc-det",
10156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources),
10166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij		.resources = ab8500_av_acc_detect_resources,
10176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	},
10186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij	{
1019e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-poweron-key",
1020bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-poweron-key",
1021e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources),
1022e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_poweronkey_db_resources,
1023e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1024e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1025f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1026bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1027f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 1,
1028f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1029f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1030f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1031bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1032f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 2,
1033f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1034f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	{
1035f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.name = "ab8500-pwm",
1036bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-pwm",
1037f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy		.id = 3,
1038f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy	},
1039bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	{
1040bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.name = "ab8500-leds",
1041bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-leds",
1042bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	},
104377686517977e77d101c8a7b397717df00a88922bSundar R Iyer	{
1044e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-denc",
1045bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-denc",
1046e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	},
1047e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin	{
1048e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.name = "ab8500-temp",
1049bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-temp",
1050e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.num_resources = ARRAY_SIZE(ab8500_temp_resources),
1051e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin		.resources = ab8500_temp_resources,
105277686517977e77d101c8a7b397717df00a88922bSundar R Iyer	},
105362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent};
105462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1055a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab8500_bm_devs[] = {
10566ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10576ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-charger",
10584aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.of_compatible = "stericsson,ab8500-charger",
10596ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_charger_resources),
10606ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_charger_resources,
10614aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#ifndef CONFIG_OF
10624aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.platform_data = &ab8500_bm_data,
10634aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
10644aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#endif
10656ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10666ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10676ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-btemp",
1068bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.of_compatible = "stericsson,ab8500-btemp",
10696ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_btemp_resources),
10706ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_btemp_resources,
1071bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#ifndef CONFIG_OF
1072bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.platform_data = &ab8500_bm_data,
1073bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
1074bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#endif
10756ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10766ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10776ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-fg",
1078e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.of_compatible = "stericsson,ab8500-fg",
10796ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_fg_resources),
10806ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_fg_resources,
1081e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#ifndef CONFIG_OF
1082e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.platform_data = &ab8500_bm_data,
1083e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
1084e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#endif
10856ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10866ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	{
10876ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.name = "ab8500-chargalg",
1088a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V		.of_compatible = "stericsson,ab8500-chargalg",
10896ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.num_resources = ARRAY_SIZE(ab8500_chargalg_resources),
10906ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		.resources = ab8500_chargalg_resources,
1091a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V#ifndef CONFIG_OF
1092a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V		.platform_data = &ab8500_bm_data,
1093a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V		.pdata_size = sizeof(ab8500_bm_data),
1094a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V#endif
10956ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	},
10966ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson};
10976ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1098a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab8500_devs[] = {
1099d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
11007d56a46e876aa89dcac921d3afab5cccace15e63Lee Jones		.name = "pinctrl-ab8500",
1101bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-gpio",
1102d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1103d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1104d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab8500-usb",
1105bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		.of_compatible = "stericsson,ab8500-usb",
1106d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1107d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1108d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
110944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
111044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab8500-codec",
111181a21cddaf14bd1144c2d173add7cbdeb95a07caLee Jones		.of_compatible = "stericsson,ab8500-codec",
111244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1113d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1114d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1115a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab9540_devs[] = {
1116d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1117e64d905e28031031c52db403826cd3bfe060b181Lee Jones		.name = "pinctrl-ab9540",
1118e64d905e28031031c52db403826cd3bfe060b181Lee Jones		.of_compatible = "stericsson,ab9540-gpio",
1119d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
1120d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	{
1121d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.name = "ab9540-usb",
1122d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.num_resources = ARRAY_SIZE(ab8500_usb_resources),
1123d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		.resources = ab8500_usb_resources,
1124d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	},
112544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
112644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab9540-codec",
112744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
112844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath};
112944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
113044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath/* Device list common to ab9540 and ab8505 */
1131a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab9540_ab8505_devs[] = {
113244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	{
113344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.name = "ab-iddet",
113444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.num_resources = ARRAY_SIZE(ab8505_iddet_resources),
113544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath		.resources = ab8505_iddet_resources,
113644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath	},
1137d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1138d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1139cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev,
1140cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin				struct device_attribute *attr, char *buf)
1141cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{
1142cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	struct ab8500 *ab8500;
1143cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1144cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	ab8500 = dev_get_drvdata(dev);
1145cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL);
1146cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}
1147cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1148e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/*
1149e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1150e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming
1151e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation
1152e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold
1153e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired
1154e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock
1155e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold
1156e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds
1157e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown
1158e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */
1159e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev,
1160e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin				struct device_attribute *attr, char *buf)
1161e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{
1162e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	int ret;
1163e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	u8 value;
1164e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	struct ab8500 *ab8500;
1165e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1166e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ab8500 = dev_get_drvdata(dev);
1167e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1168e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1169e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1170e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1171e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	return sprintf(buf, "%#x\n", value);
1172e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin}
1173e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1174b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/*
1175b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS):
1176b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat
1177b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF
1178b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF
1179b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm
1180b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet
1181b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet
1182b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect
1183b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved
1184b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */
1185b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev,
1186b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn				struct device_attribute *attr, char *buf)
1187b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{
1188b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	int ret;
1189b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	u8 value;
1190b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	struct ab8500 *ab8500;
1191b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1192b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ab8500 = dev_get_drvdata(dev);
1193b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK,
1194b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		AB8500_TURN_ON_STATUS, &value);
1195b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	if (ret < 0)
1196b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn		return ret;
1197b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	return sprintf(buf, "%#x\n", value);
1198b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn}
1199b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn
1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev,
1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				struct device_attribute *attr, char *buf)
1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1204d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret;
1205d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 value;
1206d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1208d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1209d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2,
1210d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		AB9540_MODEM_CTRL2_REG, &value);
1211d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (ret < 0)
1212d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		return ret;
1213d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1214d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return sprintf(buf, "%d\n",
1215d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			(value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0);
1216d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1217d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1218d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev,
1219d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct device_attribute *attr, const char *buf, size_t count)
1220d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{
1221d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	struct ab8500 *ab8500;
1222d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int ret = count;
1223d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	int err;
1224d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	u8 bitvalues;
1225d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1226d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	ab8500 = dev_get_drvdata(dev);
1227d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1228d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (count > 0) {
1229d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		switch (buf[0]) {
1230d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '0':
1231d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = 0;
1232d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1233d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		case '1':
1234d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT;
1235d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			break;
1236d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		default:
1237d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			goto exit;
1238d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		}
1239d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1240d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		err = mask_and_set_register_interruptible(ab8500,
1241d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG,
1242d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues);
1243d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		if (err)
1244d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			dev_info(ab8500->dev,
1245d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				"Failed to set DBBRSTN %c, err %#x\n",
1246d6255529b2639de542324f314b93939b7996a7c5Linus Walleij				buf[0], err);
1247d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
1248d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1249d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit:
1250d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	return ret;
1251d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}
1252d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1253cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL);
1254e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL);
1255b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL);
1256d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR,
1257d6255529b2639de542324f314b93939b7996a7c5Linus Walleij			show_ab9540_dbbrstn, store_ab9540_dbbrstn);
1258cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1259cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = {
1260cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	&dev_attr_chip_id.attr,
1261e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	&dev_attr_switch_off_status.attr,
1262b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn	&dev_attr_turn_on_status.attr,
1263cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	NULL,
1264cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1265cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1266d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = {
1267d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_chip_id.attr,
1268d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_switch_off_status.attr,
1269d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_turn_on_status.attr,
1270d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	&dev_attr_dbbrstn.attr,
1271d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	NULL,
1272d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1273d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1274cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = {
1275cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	.attrs	= ab8500_sysfs_entries,
1276cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin};
1277cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin
1278d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = {
1279d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	.attrs	= ab9540_sysfs_entries,
1280d6255529b2639de542324f314b93939b7996a7c5Linus Walleij};
1281d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1282f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int ab8500_probe(struct platform_device *pdev)
128362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1284b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	static char *switch_off_status[] = {
1285b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Swoff bit programming",
1286b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Thermal protection activation",
1287b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Vbat lower then BattOk falling threshold",
1288b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Watchdog expired",
1289b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Non presence of 32kHz clock",
1290b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Battery level lower than power on reset threshold",
1291b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"Power on key 1 pressed longer than 10 seconds",
1292b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		"DB8500 thermal shutdown"};
1293d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev);
1294d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	const struct platform_device_id *platid = platform_get_device_id(pdev);
12956bc4a568414caab05424b702165a732177daccd0Lee Jones	enum ab8500_version version = AB8500_VERSION_UNDEFINED;
12966bc4a568414caab05424b702165a732177daccd0Lee Jones	struct device_node *np = pdev->dev.of_node;
1297d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500;
1298d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct resource *resource;
129962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int ret;
130062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	int i;
130147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	u8 value;
130262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
13038c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500 = devm_kzalloc(&pdev->dev, sizeof *ab8500, GFP_KERNEL);
1304d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	if (!ab8500)
1305d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		return -ENOMEM;
1306d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
130762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat)
130862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->irq_base = plat->irq_base;
130962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1310d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->dev = &pdev->dev;
1311d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1312d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
13138c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	if (!resource)
13148c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return -ENODEV;
1315d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1316d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	ab8500->irq = resource->start;
1317d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1318822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->read = ab8500_prcmu_read;
1319822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write = ab8500_prcmu_write;
1320822672a7b496e724f879af703693f342e2215163Lee Jones	ab8500->write_masked = ab8500_prcmu_write_masked;
1321d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
132262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->lock);
132362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mutex_init(&ab8500->irq_lock);
1324112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg	atomic_set(&ab8500->transfer_ongoing, 0);
132562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1326d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_set_drvdata(pdev, ab8500);
1327d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
13286bc4a568414caab05424b702165a732177daccd0Lee Jones	if (platid)
13296bc4a568414caab05424b702165a732177daccd0Lee Jones		version = platid->driver_data;
13306bc4a568414caab05424b702165a732177daccd0Lee Jones
13310f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	if (version != AB8500_VERSION_UNDEFINED)
13320f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = version;
13330f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	else {
13340f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ret = get_register_interruptible(ab8500, AB8500_MISC,
13350f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			AB8500_IC_NAME_REG, &value);
13360f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ret < 0)
13378c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones			return ret;
13380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
13390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		ab8500->version = value;
13400f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	}
13410f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
134247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = get_register_interruptible(ab8500, AB8500_MISC,
134347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		AB8500_REV_REG, &value);
134462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (ret < 0)
13458c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
134662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
134747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ab8500->chip_id = value;
134862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
13490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij	dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n",
13500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500_version_str[ab8500->version],
13510f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id >> 4,
13520f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij			ab8500->chip_id & 0x0F);
13530f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij
1354d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	/* Configure AB8500 or AB9540 IRQ */
1355a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson	if (is_ab9540(ab8500) || is_ab8505(ab8500)) {
1356d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB9540_NUM_IRQ_REGS;
1357d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab9540_irq_regoffset;
1358d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	} else {
1359d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->mask_size = AB8500_NUM_IRQ_REGS;
1360d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ab8500->irq_reg_offset = ab8500_irq_regoffset;
1361d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	}
13628c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
13632ced445e2ddf65f484a489161accddf475676965Linus Walleij	if (!ab8500->mask)
13642ced445e2ddf65f484a489161accddf475676965Linus Walleij		return -ENOMEM;
13658c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL);
13668c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones	if (!ab8500->oldmask)
13678c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return -ENOMEM;
13688c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones
1369e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	/*
1370e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * ab8500 has switched off due to (SWITCH_OFF_STATUS):
1371e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x01 Swoff bit programming
1372e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x02 Thermal protection activation
1373e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x04 Vbat lower then BattOk falling threshold
1374e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x08 Watchdog expired
1375e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x10 Non presence of 32kHz clock
1376e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x20 Battery level lower than power on reset threshold
1377e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x40 Power on key 1 pressed longer than 10 seconds
1378e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 * 0x80 DB8500 thermal shutdown
1379e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	 */
1380e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
1381e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	ret = get_register_interruptible(ab8500, AB8500_RTC,
1382e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		AB8500_SWITCH_OFF_STATUS, &value);
1383e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin	if (ret < 0)
1384e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin		return ret;
1385b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value);
1386b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1387b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	if (value) {
1388b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) {
1389b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			if (value & 1)
1390b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				printk(KERN_CONT " \"%s\"",
1391b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg				       switch_off_status[i]);
1392b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg			value = value >> 1;
1393b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg
1394b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		}
1395b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT "\n");
1396b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	} else {
1397b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg		printk(KERN_CONT " None\n");
1398b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg	}
1399e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin
140062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	if (plat && plat->init)
140162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		plat->init(ab8500);
140262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
140362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	/* Clear and mask all interrupts */
14042ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++) {
14050f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		/*
14060f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * Interrupt register 12 doesn't exist prior to AB8500 version
14070f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 * 2.0
14080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		 */
14090f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij		if (ab8500->irq_reg_offset[i] == 11 &&
14100f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij				is_ab8500_1p1_or_earlier(ab8500))
141192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			continue;
141262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
141347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		get_register_interruptible(ab8500, AB8500_INTERRUPT,
14142ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i],
141592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin			&value);
141647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin		set_register_interruptible(ab8500, AB8500_INTERRUPT,
14172ced445e2ddf65f484a489161accddf475676965Linus Walleij			AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff);
141862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
141962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
142047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	ret = abx500_register_ops(ab8500->dev, &ab8500_ops);
142147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin	if (ret)
14228c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
142347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin
14242ced445e2ddf65f484a489161accddf475676965Linus Walleij	for (i = 0; i < ab8500->mask_size; i++)
142562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		ab8500->mask[i] = ab8500->oldmask[i] = 0xff;
142662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
142706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	ret = ab8500_irq_init(ab8500, np);
142806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (ret)
14298c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
143062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
143106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  Activate this feature only in ab9540 */
143206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	/*  till tests are done on ab8500 1p2 or later*/
143306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	if (is_ab9540(ab8500)) {
14348c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL,
14358c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						ab8500_hierarchical_irq,
14368c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						IRQF_ONESHOT | IRQF_NO_SUSPEND,
14378c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						"ab8500", ab8500);
143806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	}
143906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	else {
14408c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL,
14418c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						ab8500_irq,
14428c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						IRQF_ONESHOT | IRQF_NO_SUSPEND,
14438c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones						"ab8500", ab8500);
144462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent		if (ret)
14458c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones			return ret;
144662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	}
144762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1448bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
1449bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones			ARRAY_SIZE(abx500_common_devs), NULL,
145055692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown			ab8500->irq_base, ab8500->domain);
1451bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
14528c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
1453d6255529b2639de542324f314b93939b7996a7c5Linus Walleij
1454bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (is_ab9540(ab8500))
1455bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
1456bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab9540_devs), NULL,
145755692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1458bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	else
1459bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
1460bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab8500_devs), NULL,
146155692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1462bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
14638c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
146444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath
1465bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (is_ab9540(ab8500) || is_ab8505(ab8500))
1466bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones		ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
1467bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones				ARRAY_SIZE(ab9540_ab8505_devs), NULL,
146855692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				ab8500->irq_base, ab8500->domain);
1469bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones	if (ret)
14708c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones		return ret;
147162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
14726ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	if (!no_bm) {
14736ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		/* Add battery management devices */
14746ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
14756ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson				      ARRAY_SIZE(ab8500_bm_devs), NULL,
147655692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown				      ab8500->irq_base, ab8500->domain);
14776ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson		if (ret)
14786ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson			dev_err(ab8500->dev, "error adding bm devices\n");
14796ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson	}
14806ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson
1481d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1482d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1483d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab9540_attr_group);
1484d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1485d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		ret = sysfs_create_group(&ab8500->dev->kobj,
1486d6255529b2639de542324f314b93939b7996a7c5Linus Walleij					&ab8500_attr_group);
1487cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin	if (ret)
1488cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin		dev_err(ab8500->dev, "error creating sysfs entries\n");
148906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
149006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones	return ret;
149162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
149262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
14934740f73fe5388ab5d22d552d2a0dacc62418a70cBill Pembertonstatic int ab8500_remove(struct platform_device *pdev)
149462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{
1495d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	struct ab8500 *ab8500 = platform_get_drvdata(pdev);
1496d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1497d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	if (is_ab9540(ab8500))
1498d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group);
1499d6255529b2639de542324f314b93939b7996a7c5Linus Walleij	else
1500d6255529b2639de542324f314b93939b7996a7c5Linus Walleij		sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group);
150106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones
150262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	mfd_remove_devices(ab8500->dev);
150362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
150462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent	return 0;
150562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}
150662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent
1507d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = {
1508d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8500-core", AB8500_VERSION_AB8500 },
1509d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8505-i2c", AB8500_VERSION_AB8505 },
1510d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab9540-i2c", AB8500_VERSION_AB9540 },
1511d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ "ab8540-i2c", AB8500_VERSION_AB8540 },
1512d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	{ }
1513d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1514d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1515d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = {
1516d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.driver = {
1517d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.name = "ab8500-core",
1518d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones		.owner = THIS_MODULE,
1519d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	},
1520d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.probe	= ab8500_probe,
152184449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton	.remove	= ab8500_remove,
1522d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	.id_table = ab8500_id,
1523d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones};
1524d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1525d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void)
1526d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1527d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	return platform_driver_register(&ab8500_core_driver);
1528d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1529d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1530d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void)
1531d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{
1532d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones	platform_driver_unregister(&ab8500_core_driver);
1533d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}
1534ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init);
1535d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit);
1536d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones
1537adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent");
153862579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core");
153962579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2");
1540