ab8500-core.c revision 822672a7b496e724f879af703693f342e2215163
162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Copyright (C) ST-Ericsson SA 2010 362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * 462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * License Terms: GNU General Public License v2 562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> 662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Rabin Vincent <rabin.vincent@stericsson.com> 7adceed6263887e04721b477e6504aa24789f827dMattias Wallin * Author: Mattias Wallin <mattias.wallin@stericsson.com> 862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/kernel.h> 1162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/slab.h> 1262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/init.h> 1362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/irq.h> 1406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones#include <linux/irqdomain.h> 1562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/delay.h> 1662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/interrupt.h> 1762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/module.h> 1862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/platform_device.h> 1962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/mfd/core.h> 2047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#include <linux/mfd/abx500.h> 21ee66e653ca7425bc8ffca4e00f19a8057cd14e4dLinus Walleij#include <linux/mfd/abx500/ab8500.h> 22d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones#include <linux/mfd/dbx500-prcmu.h> 23549931f99e030d63a437c23943fd8dc9b7c0e41cSundar R Iyer#include <linux/regulator/ab8500.h> 246bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of.h> 256bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of_device.h> 2662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 2762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 2862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Interrupt register offsets 2962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Bank : 0x0E 3062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 3147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE1_REG 0x00 3247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE2_REG 0x01 3347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE3_REG 0x02 3447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE4_REG 0x03 3547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE5_REG 0x04 3647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE6_REG 0x05 3747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE7_REG 0x06 3847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE8_REG 0x07 39d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_SOURCE13_REG 0x0C 4047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE19_REG 0x12 4147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE20_REG 0x13 4247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE21_REG 0x14 4347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE22_REG 0x15 4447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE23_REG 0x16 4547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE24_REG 0x17 4662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 4862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * latch registers 4962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 5047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH1_REG 0x20 5147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH2_REG 0x21 5247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH3_REG 0x22 5347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH4_REG 0x23 5447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH5_REG 0x24 5547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH6_REG 0x25 5647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH7_REG 0x26 5747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH8_REG 0x27 5847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH9_REG 0x28 5947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH10_REG 0x29 6092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin#define AB8500_IT_LATCH12_REG 0x2B 61d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_LATCH13_REG 0x2C 6247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH19_REG 0x32 6347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH20_REG 0x33 6447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH21_REG 0x34 6547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH22_REG 0x35 6647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH23_REG 0x36 6747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH24_REG 0x37 6862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 6962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 7062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * mask registers 7162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 7262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 7347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK1_REG 0x40 7447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK2_REG 0x41 7547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK3_REG 0x42 7647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK4_REG 0x43 7747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK5_REG 0x44 7847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK6_REG 0x45 7947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK7_REG 0x46 8047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK8_REG 0x47 8147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK9_REG 0x48 8247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK10_REG 0x49 8347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK11_REG 0x4A 8447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK12_REG 0x4B 8547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK13_REG 0x4C 8647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK14_REG 0x4D 8747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK15_REG 0x4E 8847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK16_REG 0x4F 8947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK17_REG 0x50 9047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK18_REG 0x51 9147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK19_REG 0x52 9247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK20_REG 0x53 9347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK21_REG 0x54 9447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK22_REG 0x55 9547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK23_REG 0x56 9647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK24_REG 0x57 9747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/* 997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers 1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */ 1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG 0x60 1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG 0x61 1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG 0x62 1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM 3 1067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 10747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG 0x80 1080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG 0x82 109e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS 0x00 11062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 111b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS 0x00 112b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1136ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */ 1146ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO); 1156ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 116d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG 0x23 117d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT BIT(2) 118d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 11962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 12062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt 1212ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are 1222ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h 12362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * 12462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at 12562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0. 12662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 1272ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */ 12862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = { 12992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 13062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 132d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 support */ 133d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = { 134d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24, 135d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 136d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1370f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = { 1380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8500] = "AB8500", 1390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8505] = "AB8505", 1400f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB9540] = "AB9540", 1410f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8540] = "AB8540", 1420f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij}; 1430f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 144822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data) 145d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 146d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 147d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 148d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 149d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 150d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 151d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 152d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 153d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 154822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask, 155d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data) 156d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 157d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 158d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 159d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 160d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones &mask, 1); 161d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 162d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 166822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr) 167d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data; 170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 172d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) { 173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones } 176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return (int)data; 177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 17947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev) 18047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 1816bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin struct ab8500 *ab8500; 1826bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin 1836bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin if (!dev) 1846bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return -EINVAL; 1856bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin ab8500 = dev_get_drvdata(dev->parent); 1866bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return ab8500 ? (int)ab8500->chip_id : -EINVAL; 18747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 18847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 18947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank, 19047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 data) 19162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 19262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 19347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* 19447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * Put the u8 bank and u8 register together into a an u16. 19547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * The bank on higher 8 bits and register in lower 8 bits. 19647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * */ 19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 19862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 19962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data); 20062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 201392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 20247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 20362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->write(ab8500, addr, data); 20462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 20562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 20662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 20747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 20862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 21162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 21247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank, 21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 value) 21462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 215112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 21647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 21762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 218112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 219112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = set_register_interruptible(ab8500, bank, reg, value); 220112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 221112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 22262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 22447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank, 22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 22662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 22847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 22947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 232392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 23362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 23462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->read(ab8500, addr); 23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 23662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 23762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 23847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin else 23947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin *value = ret; 24062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 24262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret); 24362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 24662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank, 24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 24962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 250112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 25147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 25262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 253112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 254112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = get_register_interruptible(ab8500, bank, reg, value); 255112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 256112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 25762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 25847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank, 26047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 bitmask, u8 bitvalues) 26162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 26347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 26447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 26662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 267392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 26862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 269bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ab8500->write_masked == NULL) { 270bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson u8 data; 27162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 272bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->read(ab8500, addr); 273bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) { 274bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 275bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 276bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 277bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 27862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 279bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (u8)ret; 280bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (~bitmask & data) | (bitmask & bitvalues); 281bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson 282bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write(ab8500, addr, data); 283bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 284bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 285bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 28662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 287bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr, 288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data); 289bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues); 292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr, 294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret); 29562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout: 29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->lock); 29762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 29862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 29947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 30047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev, 30147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 bank, u8 reg, u8 bitmask, u8 bitvalues) 30247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 303112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 30447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 30547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 306112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 307112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret= mask_and_set_register_interruptible(ab8500, bank, reg, 308112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg bitmask, bitvalues); 309112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 310112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 31147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 31247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 31347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = { 31447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_chip_id = ab8500_get_chip_id, 31547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register = ab8500_get_register, 31647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register = ab8500_set_register, 31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register_page = NULL, 31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register_page = NULL, 31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .mask_and_set_register = ab8500_mask_and_set_register, 32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .event_registers_startup_state_get = NULL, 32147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .startup_irq_enabled = NULL, 32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}; 32362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3249505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data) 32562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3269505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 32762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 32862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_lock(&ab8500->irq_lock); 329112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 33062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 33162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3329505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data) 33362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3349505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 33562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 33662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3372ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 33862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 old = ab8500->oldmask[i]; 33962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 new = ab8500->mask[i]; 34062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int reg; 34162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (new == old) 34362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent continue; 34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3450f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 3460f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 3470f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 3480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 3490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 3500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 35192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 35292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 35362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->oldmask[i] = new; 35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3552ced445e2ddf65f484a489161accddf475676965Linus Walleij reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i]; 35647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new); 35762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 358112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 35962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->irq_lock); 36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3629505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data) 36362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3649505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 36506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 36662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 36762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 36862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 36962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[index] |= mask; 37062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 37162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3729505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data) 37362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3749505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 37506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 37662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 37762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 37862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 37962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[index] &= ~mask; 38062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 38162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 38262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = { 38362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500", 3849505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_lock = ab8500_irq_lock, 3859505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_sync_unlock = ab8500_irq_sync_unlock, 3869505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_mask = ab8500_irq_mask, 387e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath .irq_disable = ab8500_irq_mask, 3889505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_unmask = ab8500_irq_unmask, 38962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 39062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3917ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500, 3927ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_offset, u8 latch_val) 3937ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 3947ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int int_bit = __ffs(latch_val); 3957ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int line, i; 3967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 3977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN do { 3987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int_bit = __ffs(latch_val); 3997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN for (i = 0; i < ab8500->mask_size; i++) 4017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (ab8500->irq_reg_offset[i] == latch_offset) 4027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN break; 4037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (i >= ab8500->mask_size) { 4057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN dev_err(ab8500->dev, "Register offset 0x%2x not declared\n", 4067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset); 4077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return -ENXIO; 4087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } 4097ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN line = (i << 3) + int_bit; 4117ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_val &= ~(1 << int_bit); 4127ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4137ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN handle_nested_irq(ab8500->irq_base + line); 4147ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } while (latch_val); 4157ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 4177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500, 4207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int hier_offset, u8 hier_val) 4217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_bit, status; 4237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 latch_offset, latch_val; 4247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN do { 4267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_bit = __ffs(hier_val); 4277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset = (hier_offset << 3) + latch_bit; 4287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN /* Fix inconsistent ITFromLatch25 bit mapping... */ 4307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (unlikely(latch_offset == 17)) 4317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset = 24; 4327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, 4347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_INTERRUPT, 4357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCH1_REG + latch_offset, 4367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN &latch_val); 4377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || latch_val == 0) 4387ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN goto discard; 4397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4407ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_line(ab8500, 4417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset, latch_val); 4427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 4437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return status; 4447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard: 4457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN hier_val &= ~(1 << latch_bit); 4467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } while (hier_val); 4477ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4487ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 4497ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4507ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4517ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev) 4527ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4537ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN struct ab8500 *ab8500 = dev; 4547ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 i; 4557ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4567ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN dev_vdbg(ab8500->dev, "interrupt\n"); 4577ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4587ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN /* Hierarchical interrupt version */ 4597ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN for (i = 0; i < AB8500_IT_LATCHHIER_NUM; i++) { 4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int status; 4617ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 hier_val; 4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4637ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, AB8500_INTERRUPT, 4647ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCHHIER1_REG + i, &hier_val); 4657ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || hier_val == 0) 4667ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN continue; 4677ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4687ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val); 4697ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 4707ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN break; 4717ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } 4727ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return IRQ_HANDLED; 4737ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4747ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 47562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic irqreturn_t ab8500_irq(int irq, void *dev) 47662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 47762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent struct ab8500 *ab8500 = dev; 47862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 47962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 48062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "interrupt\n"); 48162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 482112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 483112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 4842ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 4852ced445e2ddf65f484a489161accddf475676965Linus Walleij int regoffset = ab8500->irq_reg_offset[i]; 48662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int status; 48747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 48862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4890f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 4900f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 4910f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 4920f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 4930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (regoffset == 11 && is_ab8500_1p1_or_earlier(ab8500)) 49492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 49592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 49647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin status = get_register_interruptible(ab8500, AB8500_INTERRUPT, 49747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_IT_LATCH1_REG + regoffset, &value); 49847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (status < 0 || value == 0) 49962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent continue; 50062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 50162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent do { 50288aec4f7b67b5889ba5b4beac2d2c1400451c318Mattias Wallin int bit = __ffs(value); 50362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int line = i * 8 + bit; 50462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 50562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent handle_nested_irq(ab8500->irq_base + line); 50647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin value &= ~(1 << bit); 507112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 50847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin } while (value); 50962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 510112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 51162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return IRQ_HANDLED; 51262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 51362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 51406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones/** 51506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * ab8500_irq_get_virq(): Map an interrupt on a chip to a virtual IRQ 51606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * 51706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * @ab8500: ab8500_irq controller to operate on. 51806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * @irq: index of the interrupt requested in the chip IRQs 51906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * 52006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones * Useful for drivers to request their own IRQs. 52106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones */ 52206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesint ab8500_irq_get_virq(struct ab8500 *ab8500, int irq) 52362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 52406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500) 52506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -EINVAL; 52662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 52706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return irq_create_mapping(ab8500->domain, irq); 52806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones} 52906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee JonesEXPORT_SYMBOL_GPL(ab8500_irq_get_virq); 5302ced445e2ddf65f484a489161accddf475676965Linus Walleij 53106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_map(struct irq_domain *d, unsigned int virq, 53206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_hw_number_t hwirq) 53306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones{ 53406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones struct ab8500 *ab8500 = d->host_data; 53506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 53606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500) 53706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -EINVAL; 53806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 53906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_chip_data(virq, ab8500); 54006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_chip_and_handler(virq, &ab8500_irq_chip, 54106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones handle_simple_irq); 54206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_nested_thread(virq, 1); 54362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#ifdef CONFIG_ARM 54406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones set_irq_flags(virq, IRQF_VALID); 54562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#else 54606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_noprobe(virq); 54762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#endif 54862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 54962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 55062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 55162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 55206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic struct irq_domain_ops ab8500_irq_ops = { 55306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones .map = ab8500_irq_map, 55406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones .xlate = irq_domain_xlate_twocell, 55506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones}; 55606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 55706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np) 55862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 5592ced445e2ddf65f484a489161accddf475676965Linus Walleij int num_irqs; 5602ced445e2ddf65f484a489161accddf475676965Linus Walleij 561d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 562d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB9540_NR_IRQS; 563a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson else if (is_ab8505(ab8500)) 564a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson num_irqs = AB8505_NR_IRQS; 565d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 566d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB8500_NR_IRQS; 56762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 56806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (ab8500->irq_base) { 56906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ab8500->domain = irq_domain_add_legacy( 57006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones NULL, num_irqs, ab8500->irq_base, 57106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 0, &ab8500_irq_ops, ab8500); 57206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 57306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones else { 57406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ab8500->domain = irq_domain_add_linear( 57506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones np, num_irqs, &ab8500_irq_ops, ab8500); 57662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 57706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 57806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500->domain) { 57906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones dev_err(ab8500->dev, "Failed to create irqdomain\n"); 58006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -ENOSYS; 58106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 58206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 58306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return 0; 58462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 58562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 586112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500) 587112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{ 588112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg if (atomic_read(&ab8500->transfer_ongoing)) 589112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return -EINVAL; 590112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg else 591112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return 0; 592112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg} 593112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 594d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB8500 GPIO Resources */ 5955cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_gpio_resources[] = { 5960cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu { 5970cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu .name = "GPIO_INT6", 5980cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu .start = AB8500_INT_GPIO6R, 5990cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu .end = AB8500_INT_GPIO41F, 6000cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu .flags = IORESOURCE_IRQ, 6010cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu } 6020cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu}; 6030cb3fcd72cc3e6dd88f0e769746d294e5e6bafa9Bibek Basu 604d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 GPIO Resources */ 605d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct resource __devinitdata ab9540_gpio_resources[] = { 606d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 607d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "GPIO_INT6", 608d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .start = AB8500_INT_GPIO6R, 609d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .end = AB8500_INT_GPIO41F, 610d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .flags = IORESOURCE_IRQ, 611d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 612d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 613d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "GPIO_INT14", 614d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .start = AB9540_INT_GPIO50R, 615d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .end = AB9540_INT_GPIO54R, 616d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .flags = IORESOURCE_IRQ, 617d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 618d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 619d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "GPIO_INT15", 620d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .start = AB9540_INT_GPIO50F, 621d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .end = AB9540_INT_GPIO54F, 622d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .flags = IORESOURCE_IRQ, 623d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 624d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 625d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 6265cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_gpadc_resources[] = { 62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 62862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "HW_CONV_END", 62962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_HW_ADC_CONV_END, 63062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_HW_ADC_CONV_END, 63162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 63262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 63362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 63462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "SW_CONV_END", 63562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_SW_ADC_CONV_END, 63662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_SW_ADC_CONV_END, 63762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 63862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 63962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 64062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 6415cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_rtc_resources[] = { 64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "60S", 64462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_60S, 64562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_60S, 64662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 64762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 64862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 64962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ALARM", 65062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_ALARM, 65162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_ALARM, 65262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 65362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 65462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 65562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 6565cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_poweronkey_db_resources[] = { 65777686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 65877686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBF", 65977686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_F, 66077686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_F, 66177686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 66277686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 66377686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 66477686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBR", 66577686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_R, 66677686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_R, 66777686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 66877686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 66977686517977e77d101c8a7b397717df00a88922bSundar R Iyer}; 67077686517977e77d101c8a7b397717df00a88922bSundar R Iyer 6716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_av_acc_detect_resources[] = { 672e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_F", 6746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_F, 6756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_F, 6766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 677e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 678e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_R", 6806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_R, 6816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_R, 6826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_F", 6866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_F, 6876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_F, 6886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_R", 6926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_R, 6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_R, 6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_F", 6986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_F, 6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_F, 7006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 701e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 702e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_R", 7046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_R, 7056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_R, 7066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 7096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 7106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_charger_resources[] = { 7116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 712e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CH_UNPLUG_DET", 713e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_UNPLUG_DET, 714e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_UNPLUG_DET, 715e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 716e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 717e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 718e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CHARGE_PLUG_DET", 719e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_PLUG_DET, 720e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_PLUG_DET, 721e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 722e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 723e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 724e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 725e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 726e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 727e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 728e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 729e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7306af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "VBUS_DET_F", 7316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_VBUS_DET_F, 7326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_VBUS_DET_F, 733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_LINK_STATUS", 7376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_LINK_STATUS, 7386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_LINK_STATUS, 7396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 742e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_OVV", 743e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_OVV, 744e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_OVV, 745e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 746e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 747e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_R", 7496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_R, 7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_R, 751e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 752e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 753e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_F", 7556af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_F, 7566af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_F, 757e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 758e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 759e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_EXT_CH_NOT_OK", 7616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_R", 7676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_R, 7686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_R, 7696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_F", 7736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_F, 7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_F, 7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CHARGER_NOT_OKR", 779a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_USB_CHARGER_NOT_OKR, 780a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_USB_CHARGER_NOT_OKR, 7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CH_WD_EXP", 7856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CH_WD_EXP, 7866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CH_WD_EXP, 7876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 7906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 7916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_btemp_resources[] = { 7926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BAT_CTRL_INDB", 7946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BAT_CTRL_INDB, 7956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BAT_CTRL_INDB, 796e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 797e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 798e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 799e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_LOW", 800e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_LOW, 801e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_LOW, 802e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 803e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 804e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 805e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_HIGH", 806e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_HIGH, 807e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_HIGH, 808e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 809e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 810e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_LOW_MEDIUM", 8126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_LOW_MEDIUM, 8136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_LOW_MEDIUM, 814e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 815e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 816e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_MEDIUM_HIGH", 8186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_MEDIUM_HIGH, 8196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_MEDIUM_HIGH, 820e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 821e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 8226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 8236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 8246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_fg_resources[] = { 825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8266af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "NCONV_ACCU", 8276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CCN_CONV_ACC, 8286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CCN_CONV_ACC, 829e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 830e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 831e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BATT_OVV", 8336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BATT_OVV, 8346af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BATT_OVV, 835e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 836e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 837e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_F", 8396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_F, 8406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_F, 8416af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_R", 8456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_R, 8466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_R, 8476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CC_INT_CALIB", 8516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CC_INT_CALIB, 8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CC_INT_CALIB, 853e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 854e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 855a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson { 856a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .name = "CCEOC", 857a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_CCEOC, 858a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_CCEOC, 859a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .flags = IORESOURCE_IRQ, 860a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson }, 861e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 862e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 8636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleijstatic struct resource __devinitdata ab8500_chargalg_resources[] = {}; 8646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 865df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS 8665cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_debug_resources[] = { 867e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 868e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_FIRST", 869e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 870e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 871e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 872e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 873e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 874e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_LAST", 875a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_XTAL32K_KO, 876a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_XTAL32K_KO, 877e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 878e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 879e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 880df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif 881e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 8825cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_usb_resources[] = { 883e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 884e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_R", 885e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_R, 886e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_R, 887e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 888e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 889e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 890e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_F", 891e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_F, 892e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_F, 893e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 894e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 895e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 896e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_F", 897e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_F, 898e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_F, 899e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 900e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 901e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 902e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 903e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 904e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 905e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 906e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 90792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin { 90892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .name = "USB_LINK_STATUS", 90992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .start = AB8500_INT_USB_LINK_STATUS, 91092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .end = AB8500_INT_USB_LINK_STATUS, 91192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .flags = IORESOURCE_IRQ, 91292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin }, 9136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_PLUG", 9156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_PLUG, 9166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_PLUG, 9176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 9196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_UNPLUG", 9216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_UNPLUG, 9226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_UNPLUG, 9236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 925e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 926e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 92744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimathstatic struct resource __devinitdata ab8505_iddet_resources[] = { 92844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 92944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyDeglitch", 93044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYDEGLITCH, 93144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYDEGLITCH, 93244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 93344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 93444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 93544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KP", 93644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KP, 93744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KP, 93844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 93944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 94044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 94144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKP", 94244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKP, 94344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKP, 94444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 94544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 94644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 94744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKR", 94844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKR, 94944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKR, 95044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 95144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 95244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 95344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyStuck", 95444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYSTUCK, 95544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYSTUCK, 95644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 95744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 95844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 95944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 9605cef8df5e335a5bc9147c5cafdce348981f5c5b5Robert Rosengrenstatic struct resource __devinitdata ab8500_temp_resources[] = { 961e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 962e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "AB8500_TEMP_WARM", 963e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_TEMP_WARM, 964e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_TEMP_WARM, 965e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 966e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 967e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 968e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 969d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata abx500_common_devs[] = { 9705814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS 9715814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin { 9725814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin .name = "ab8500-debug", 973e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_debug_resources), 974e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_debug_resources, 9755814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin }, 9765814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif 97762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 978e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-sysctrl", 979e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 980e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 981e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-regulator", 982e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 983e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 98462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500-gpadc", 98562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), 98662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .resources = ab8500_gpadc_resources, 98762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 98862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 98962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500-rtc", 99062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 99162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .resources = ab8500_rtc_resources, 99262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 993f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 9946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ab8500-acc-det", 9956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 9966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .resources = ab8500_av_acc_detect_resources, 9976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 9986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 999e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-poweron-key", 1000e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 1001e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_poweronkey_db_resources, 1002e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1003e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1004f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1005f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 1, 1006f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1007f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1008f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1009f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 2, 1010f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1011f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1012f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1013f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 3, 1014f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1015e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { .name = "ab8500-leds", }, 101677686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 1017e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-denc", 1018e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1019e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1020e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-temp", 1021e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_temp_resources), 1022e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_temp_resources, 102377686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 102462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 102562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 10266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic struct mfd_cell __devinitdata ab8500_bm_devs[] = { 10276ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10286ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-charger", 10296ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_charger_resources), 10306ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_charger_resources, 10316ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10326ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10336ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-btemp", 10346ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_btemp_resources), 10356ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_btemp_resources, 10366ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10376ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10386ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-fg", 10396ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_fg_resources), 10406ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_fg_resources, 10416ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10426ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10436ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-chargalg", 10446ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_chargalg_resources), 10456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_chargalg_resources, 10466ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10476ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson}; 10486ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1049d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab8500_devs[] = { 1050d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1051d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-gpio", 1052d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_gpio_resources), 1053d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_gpio_resources, 1054d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 1055d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1056d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-usb", 1057d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1058d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_usb_resources, 1059d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 106044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 106144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab8500-codec", 106244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1063d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1064d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1065d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct mfd_cell __devinitdata ab9540_devs[] = { 1066d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1067d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-gpio", 1068d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab9540_gpio_resources), 1069d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab9540_gpio_resources, 1070d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 1071d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1072d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab9540-usb", 1073d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1074d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_usb_resources, 1075d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 107644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 107744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab9540-codec", 107844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 107944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 108044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 108144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath/* Device list common to ab9540 and ab8505 */ 108244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimathstatic struct mfd_cell __devinitdata ab9540_ab8505_devs[] = { 108344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 108444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab-iddet", 108544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .num_resources = ARRAY_SIZE(ab8505_iddet_resources), 108644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .resources = ab8505_iddet_resources, 108744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1088d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1089d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1090cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev, 1091cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct device_attribute *attr, char *buf) 1092cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{ 1093cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct ab8500 *ab8500; 1094cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1095cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin ab8500 = dev_get_drvdata(dev); 1096cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); 1097cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin} 1098cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1099e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/* 1100e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1101e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1102e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1103e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1104e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1105e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1106e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1107e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1108e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1109e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1110e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev, 1111e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct device_attribute *attr, char *buf) 1112e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{ 1113e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin int ret; 1114e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin u8 value; 1115e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct ab8500 *ab8500; 1116e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1117e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ab8500 = dev_get_drvdata(dev); 1118e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1119e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1120e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1121e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1122e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return sprintf(buf, "%#x\n", value); 1123e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin} 1124e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1125b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/* 1126b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS): 1127b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat 1128b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF 1129b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF 1130b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm 1131b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet 1132b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet 1133b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect 1134b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved 1135b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */ 1136b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev, 1137b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct device_attribute *attr, char *buf) 1138b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{ 1139b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn int ret; 1140b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn u8 value; 1141b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct ab8500 *ab8500; 1142b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1143b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ab8500 = dev_get_drvdata(dev); 1144b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, 1145b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn AB8500_TURN_ON_STATUS, &value); 1146b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn if (ret < 0) 1147b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return ret; 1148b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return sprintf(buf, "%#x\n", value); 1149b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn} 1150b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1151d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev, 1152d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, char *buf) 1153d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1154d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1155d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret; 1156d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 value; 1157d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1158d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1159d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1160d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2, 1161d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_REG, &value); 1162d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (ret < 0) 1163d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1164d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1165d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return sprintf(buf, "%d\n", 1166d6255529b2639de542324f314b93939b7996a7c5Linus Walleij (value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0); 1167d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1168d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1169d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev, 1170d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, const char *buf, size_t count) 1171d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1172d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1173d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret = count; 1174d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int err; 1175d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 bitvalues; 1176d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1177d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1178d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1179d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (count > 0) { 1180d6255529b2639de542324f314b93939b7996a7c5Linus Walleij switch (buf[0]) { 1181d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '0': 1182d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = 0; 1183d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1184d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '1': 1185d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT; 1186d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1187d6255529b2639de542324f314b93939b7996a7c5Linus Walleij default: 1188d6255529b2639de542324f314b93939b7996a7c5Linus Walleij goto exit; 1189d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1190d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1191d6255529b2639de542324f314b93939b7996a7c5Linus Walleij err = mask_and_set_register_interruptible(ab8500, 1192d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG, 1193d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues); 1194d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (err) 1195d6255529b2639de542324f314b93939b7996a7c5Linus Walleij dev_info(ab8500->dev, 1196d6255529b2639de542324f314b93939b7996a7c5Linus Walleij "Failed to set DBBRSTN %c, err %#x\n", 1197d6255529b2639de542324f314b93939b7996a7c5Linus Walleij buf[0], err); 1198d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1199d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit: 1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1204cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL); 1205e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL); 1206b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL); 1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR, 1208d6255529b2639de542324f314b93939b7996a7c5Linus Walleij show_ab9540_dbbrstn, store_ab9540_dbbrstn); 1209cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1210cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = { 1211cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin &dev_attr_chip_id.attr, 1212e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin &dev_attr_switch_off_status.attr, 1213b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn &dev_attr_turn_on_status.attr, 1214cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin NULL, 1215cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1216cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1217d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = { 1218d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_chip_id.attr, 1219d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_switch_off_status.attr, 1220d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_turn_on_status.attr, 1221d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_dbbrstn.attr, 1222d6255529b2639de542324f314b93939b7996a7c5Linus Walleij NULL, 1223d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1224d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1225cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = { 1226cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin .attrs = ab8500_sysfs_entries, 1227cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1228cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1229d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = { 1230d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .attrs = ab9540_sysfs_entries, 1231d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1232d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 12336bc4a568414caab05424b702165a732177daccd0Lee Jonesstatic const struct of_device_id ab8500_match[] = { 12346bc4a568414caab05424b702165a732177daccd0Lee Jones { 12356bc4a568414caab05424b702165a732177daccd0Lee Jones .compatible = "stericsson,ab8500", 12366bc4a568414caab05424b702165a732177daccd0Lee Jones .data = (void *)AB8500_VERSION_AB8500, 12376bc4a568414caab05424b702165a732177daccd0Lee Jones }, 12386bc4a568414caab05424b702165a732177daccd0Lee Jones {}, 12396bc4a568414caab05424b702165a732177daccd0Lee Jones}; 12406bc4a568414caab05424b702165a732177daccd0Lee Jones 1241d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devinit ab8500_probe(struct platform_device *pdev) 124262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1243d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev); 1244d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones const struct platform_device_id *platid = platform_get_device_id(pdev); 12456bc4a568414caab05424b702165a732177daccd0Lee Jones enum ab8500_version version = AB8500_VERSION_UNDEFINED; 12466bc4a568414caab05424b702165a732177daccd0Lee Jones struct device_node *np = pdev->dev.of_node; 1247d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500; 1248d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct resource *resource; 124962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 125062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 125147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 125262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1253d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL); 1254d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!ab8500) 1255d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return -ENOMEM; 1256d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 125762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat) 125862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->irq_base = plat->irq_base; 125962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1260d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->dev = &pdev->dev; 1261d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1262d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1263d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!resource) { 1264d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = -ENODEV; 1265d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 1266d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones } 1267d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1268d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->irq = resource->start; 1269d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1270822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->read = ab8500_prcmu_read; 1271822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write = ab8500_prcmu_write; 1272822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write_masked = ab8500_prcmu_write_masked; 1273d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 127462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->lock); 127562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->irq_lock); 1276112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_set(&ab8500->transfer_ongoing, 0); 127762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1278d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_set_drvdata(pdev, ab8500); 1279d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 12806bc4a568414caab05424b702165a732177daccd0Lee Jones if (platid) 12816bc4a568414caab05424b702165a732177daccd0Lee Jones version = platid->driver_data; 12826bc4a568414caab05424b702165a732177daccd0Lee Jones else if (np) 12836bc4a568414caab05424b702165a732177daccd0Lee Jones version = (unsigned int) 12846bc4a568414caab05424b702165a732177daccd0Lee Jones of_match_device(ab8500_match, &pdev->dev)->data; 12856bc4a568414caab05424b702165a732177daccd0Lee Jones 12860f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (version != AB8500_VERSION_UNDEFINED) 12870f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = version; 12880f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij else { 12890f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ret = get_register_interruptible(ab8500, AB8500_MISC, 12900f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij AB8500_IC_NAME_REG, &value); 12910f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ret < 0) 1292d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 12930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 12940f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = value; 12950f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij } 12960f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 129747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = get_register_interruptible(ab8500, AB8500_MISC, 129847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_REV_REG, &value); 129962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 1300d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 130162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 130247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ab8500->chip_id = value; 130362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 13040f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", 13050f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500_version_str[ab8500->version], 13060f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id >> 4, 13070f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id & 0x0F); 13080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 1309d6255529b2639de542324f314b93939b7996a7c5Linus Walleij /* Configure AB8500 or AB9540 IRQ */ 1310a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson if (is_ab9540(ab8500) || is_ab8505(ab8500)) { 1311d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB9540_NUM_IRQ_REGS; 1312d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab9540_irq_regoffset; 1313d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } else { 1314d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB8500_NUM_IRQ_REGS; 1315d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab8500_irq_regoffset; 1316d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 13172ced445e2ddf65f484a489161accddf475676965Linus Walleij ab8500->mask = kzalloc(ab8500->mask_size, GFP_KERNEL); 13182ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->mask) 13192ced445e2ddf65f484a489161accddf475676965Linus Walleij return -ENOMEM; 13202ced445e2ddf65f484a489161accddf475676965Linus Walleij ab8500->oldmask = kzalloc(ab8500->mask_size, GFP_KERNEL); 13212ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->oldmask) { 13222ced445e2ddf65f484a489161accddf475676965Linus Walleij ret = -ENOMEM; 13232ced445e2ddf65f484a489161accddf475676965Linus Walleij goto out_freemask; 13242ced445e2ddf65f484a489161accddf475676965Linus Walleij } 1325e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin /* 1326e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1327e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1328e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1329e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1330e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1331e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1332e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1333e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1334e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1335e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1336e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1337e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1338e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1339e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1340e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 134106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones dev_info(ab8500->dev, "switch off status: %#x\n", value); 1342e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 134362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat && plat->init) 134462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent plat->init(ab8500); 134562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 134662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent /* Clear and mask all interrupts */ 13472ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 13480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 13490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 13500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 13510f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 13520f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 13530f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 135492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 135562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 135647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin get_register_interruptible(ab8500, AB8500_INTERRUPT, 13572ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], 135892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin &value); 135947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, 13602ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); 136162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 136262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 136347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = abx500_register_ops(ab8500->dev, &ab8500_ops); 136447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (ret) 13652ced445e2ddf65f484a489161accddf475676965Linus Walleij goto out_freeoldmask; 136647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 13672ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) 136862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[i] = ab8500->oldmask[i] = 0xff; 136962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 137006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = ab8500_irq_init(ab8500, np); 137106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (ret) 137206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones goto out_freeoldmask; 137362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 137406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* Activate this feature only in ab9540 */ 137506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* till tests are done on ab8500 1p2 or later*/ 137606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (is_ab9540(ab8500)) { 137706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = request_threaded_irq(ab8500->irq, NULL, 13787ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN ab8500_hierarchical_irq, 13797ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN IRQF_ONESHOT | IRQF_NO_SUSPEND, 13807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN "ab8500", ab8500); 138106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 138206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones else { 138306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = request_threaded_irq(ab8500->irq, NULL, 13847ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN ab8500_irq, 13857ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN IRQF_ONESHOT | IRQF_NO_SUSPEND, 13867ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN "ab8500", ab8500); 138762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret) 138806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones goto out_freeoldmask; 138962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 139062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 13916bc4a568414caab05424b702165a732177daccd0Lee Jones if (!np) { 13926bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, 13936bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(abx500_common_devs), NULL, 13946bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 1395d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 13966bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 13976bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 139844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 13996bc4a568414caab05424b702165a732177daccd0Lee Jones if (is_ab9540(ab8500)) 14006bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, 14016bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab9540_devs), NULL, 14026bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14036bc4a568414caab05424b702165a732177daccd0Lee Jones else 14046bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, 14056bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab8500_devs), NULL, 14066bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14076bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 14086bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 140944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 14106bc4a568414caab05424b702165a732177daccd0Lee Jones if (is_ab9540(ab8500) || is_ab8505(ab8500)) 14116bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, 14126bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab9540_ab8505_devs), NULL, 14136bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14146bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 14156bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 14166bc4a568414caab05424b702165a732177daccd0Lee Jones } 141762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 14186ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (!no_bm) { 14196ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson /* Add battery management devices */ 14206ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, 14216ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ARRAY_SIZE(ab8500_bm_devs), NULL, 14226ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ab8500->irq_base); 14236ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (ret) 14246ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson dev_err(ab8500->dev, "error adding bm devices\n"); 14256ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson } 14266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1427d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1428d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1429d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab9540_attr_group); 1430d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1431d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1432d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab8500_attr_group); 1433cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin if (ret) 1434cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin dev_err(ab8500->dev, "error creating sysfs entries\n"); 143506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 143606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return ret; 143762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 143862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout_freeirq: 143906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones free_irq(ab8500->irq, ab8500); 14402ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freeoldmask: 14412ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->oldmask); 14422ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freemask: 14432ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->mask); 1444d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesout_free_ab8500: 1445d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones kfree(ab8500); 14466d95b7fdd0bd2e28ef651da6863d75edca4c2acaLinus Walleij 144762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 144862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 144962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1450d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devexit ab8500_remove(struct platform_device *pdev) 145162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1452d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500 = platform_get_drvdata(pdev); 1453d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1454d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1455d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group); 1456d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1457d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group); 145806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 145962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mfd_remove_devices(ab8500->dev); 146006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones free_irq(ab8500->irq, ab8500); 146106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 14622ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->oldmask); 14632ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->mask); 1464d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones kfree(ab8500); 146562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 146662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 146762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 146862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1469d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = { 1470d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8500-core", AB8500_VERSION_AB8500 }, 1471d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8505-i2c", AB8500_VERSION_AB8505 }, 1472d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab9540-i2c", AB8500_VERSION_AB9540 }, 1473d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8540-i2c", AB8500_VERSION_AB8540 }, 1474d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { } 1475d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1476d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1477d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = { 1478d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .driver = { 1479d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .name = "ab8500-core", 1480d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .owner = THIS_MODULE, 14816bc4a568414caab05424b702165a732177daccd0Lee Jones .of_match_table = ab8500_match, 1482d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones }, 1483d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .probe = ab8500_probe, 1484d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .remove = __devexit_p(ab8500_remove), 1485d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .id_table = ab8500_id, 1486d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1487d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1488d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void) 1489d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1490d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return platform_driver_register(&ab8500_core_driver); 1491d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1492d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1493d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void) 1494d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1495d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_driver_unregister(&ab8500_core_driver); 1496d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1497d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesarch_initcall(ab8500_core_init); 1498d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit); 1499d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1500adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent"); 150162579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core"); 150262579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2"); 1503