ab8500-core.c revision b04c530c78464a02963adeed6b6e458535d7cd8f
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 1233d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devinit ab8500_probe(struct platform_device *pdev) 123462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1235b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg static char *switch_off_status[] = { 1236b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Swoff bit programming", 1237b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Thermal protection activation", 1238b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Vbat lower then BattOk falling threshold", 1239b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Watchdog expired", 1240b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Non presence of 32kHz clock", 1241b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Battery level lower than power on reset threshold", 1242b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Power on key 1 pressed longer than 10 seconds", 1243b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "DB8500 thermal shutdown"}; 1244d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev); 1245d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones const struct platform_device_id *platid = platform_get_device_id(pdev); 12466bc4a568414caab05424b702165a732177daccd0Lee Jones enum ab8500_version version = AB8500_VERSION_UNDEFINED; 12476bc4a568414caab05424b702165a732177daccd0Lee Jones struct device_node *np = pdev->dev.of_node; 1248d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500; 1249d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct resource *resource; 125062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 125162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 125247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 125362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1254d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500 = kzalloc(sizeof *ab8500, GFP_KERNEL); 1255d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!ab8500) 1256d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return -ENOMEM; 1257d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 125862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat) 125962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->irq_base = plat->irq_base; 126062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1261d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->dev = &pdev->dev; 1262d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1263d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1264d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!resource) { 1265d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = -ENODEV; 1266d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 1267d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones } 1268d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1269d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->irq = resource->start; 1270d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1271822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->read = ab8500_prcmu_read; 1272822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write = ab8500_prcmu_write; 1273822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write_masked = ab8500_prcmu_write_masked; 1274d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 127562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->lock); 127662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->irq_lock); 1277112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_set(&ab8500->transfer_ongoing, 0); 127862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1279d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_set_drvdata(pdev, ab8500); 1280d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 12816bc4a568414caab05424b702165a732177daccd0Lee Jones if (platid) 12826bc4a568414caab05424b702165a732177daccd0Lee Jones version = platid->driver_data; 12836bc4a568414caab05424b702165a732177daccd0Lee Jones 12840f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (version != AB8500_VERSION_UNDEFINED) 12850f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = version; 12860f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij else { 12870f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ret = get_register_interruptible(ab8500, AB8500_MISC, 12880f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij AB8500_IC_NAME_REG, &value); 12890f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ret < 0) 1290d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 12910f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 12920f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = value; 12930f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij } 12940f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 129547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = get_register_interruptible(ab8500, AB8500_MISC, 129647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_REV_REG, &value); 129762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 1298d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones goto out_free_ab8500; 129962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 130047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ab8500->chip_id = value; 130162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 13020f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", 13030f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500_version_str[ab8500->version], 13040f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id >> 4, 13050f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id & 0x0F); 13060f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 1307d6255529b2639de542324f314b93939b7996a7c5Linus Walleij /* Configure AB8500 or AB9540 IRQ */ 1308a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson if (is_ab9540(ab8500) || is_ab8505(ab8500)) { 1309d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB9540_NUM_IRQ_REGS; 1310d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab9540_irq_regoffset; 1311d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } else { 1312d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB8500_NUM_IRQ_REGS; 1313d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab8500_irq_regoffset; 1314d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 13152ced445e2ddf65f484a489161accddf475676965Linus Walleij ab8500->mask = kzalloc(ab8500->mask_size, GFP_KERNEL); 13162ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->mask) 13172ced445e2ddf65f484a489161accddf475676965Linus Walleij return -ENOMEM; 13182ced445e2ddf65f484a489161accddf475676965Linus Walleij ab8500->oldmask = kzalloc(ab8500->mask_size, GFP_KERNEL); 13192ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->oldmask) { 13202ced445e2ddf65f484a489161accddf475676965Linus Walleij ret = -ENOMEM; 13212ced445e2ddf65f484a489161accddf475676965Linus Walleij goto out_freemask; 13222ced445e2ddf65f484a489161accddf475676965Linus Walleij } 1323e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin /* 1324e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1325e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1326e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1327e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1328e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1329e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1330e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1331e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1332e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1333e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1334e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1335e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1336e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1337e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1338e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1339b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value); 1340b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1341b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value) { 1342b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) { 1343b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value & 1) 1344b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT " \"%s\"", 1345b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg switch_off_status[i]); 1346b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg value = value >> 1; 1347b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1348b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 1349b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT "\n"); 1350b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } else { 1351b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT " None\n"); 1352b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 1353e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 135462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat && plat->init) 135562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent plat->init(ab8500); 135662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 135762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent /* Clear and mask all interrupts */ 13582ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 13590f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 13600f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 13610f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 13620f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 13630f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 13640f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 136592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 136662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 136747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin get_register_interruptible(ab8500, AB8500_INTERRUPT, 13682ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], 136992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin &value); 137047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, 13712ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); 137262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 137362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 137447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = abx500_register_ops(ab8500->dev, &ab8500_ops); 137547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (ret) 13762ced445e2ddf65f484a489161accddf475676965Linus Walleij goto out_freeoldmask; 137747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 13782ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) 137962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[i] = ab8500->oldmask[i] = 0xff; 138062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 138106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = ab8500_irq_init(ab8500, np); 138206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (ret) 138306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones goto out_freeoldmask; 138462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 138506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* Activate this feature only in ab9540 */ 138606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* till tests are done on ab8500 1p2 or later*/ 138706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (is_ab9540(ab8500)) { 138806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = request_threaded_irq(ab8500->irq, NULL, 13897ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN ab8500_hierarchical_irq, 13907ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN IRQF_ONESHOT | IRQF_NO_SUSPEND, 13917ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN "ab8500", ab8500); 139206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 139306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones else { 139406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = request_threaded_irq(ab8500->irq, NULL, 13957ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN ab8500_irq, 13967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN IRQF_ONESHOT | IRQF_NO_SUSPEND, 13977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN "ab8500", ab8500); 139862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret) 139906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones goto out_freeoldmask; 140062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 140162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 14026bc4a568414caab05424b702165a732177daccd0Lee Jones if (!np) { 14036bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, 14046bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(abx500_common_devs), NULL, 14056bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 1406d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 14076bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 14086bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 140944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 14106bc4a568414caab05424b702165a732177daccd0Lee Jones if (is_ab9540(ab8500)) 14116bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, 14126bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab9540_devs), NULL, 14136bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14146bc4a568414caab05424b702165a732177daccd0Lee Jones else 14156bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, 14166bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab8500_devs), NULL, 14176bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14186bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 14196bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 142044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 14216bc4a568414caab05424b702165a732177daccd0Lee Jones if (is_ab9540(ab8500) || is_ab8505(ab8500)) 14226bc4a568414caab05424b702165a732177daccd0Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, 14236bc4a568414caab05424b702165a732177daccd0Lee Jones ARRAY_SIZE(ab9540_ab8505_devs), NULL, 14246bc4a568414caab05424b702165a732177daccd0Lee Jones ab8500->irq_base); 14256bc4a568414caab05424b702165a732177daccd0Lee Jones if (ret) 14266bc4a568414caab05424b702165a732177daccd0Lee Jones goto out_freeirq; 14276bc4a568414caab05424b702165a732177daccd0Lee Jones } 142862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 14296ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (!no_bm) { 14306ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson /* Add battery management devices */ 14316ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, 14326ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ARRAY_SIZE(ab8500_bm_devs), NULL, 14336ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ab8500->irq_base); 14346ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (ret) 14356ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson dev_err(ab8500->dev, "error adding bm devices\n"); 14366ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson } 14376ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1438d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1439d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1440d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab9540_attr_group); 1441d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1442d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1443d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab8500_attr_group); 1444cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin if (ret) 1445cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin dev_err(ab8500->dev, "error creating sysfs entries\n"); 144606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 144706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return ret; 144862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 144962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout_freeirq: 145006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones free_irq(ab8500->irq, ab8500); 14512ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freeoldmask: 14522ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->oldmask); 14532ced445e2ddf65f484a489161accddf475676965Linus Walleijout_freemask: 14542ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->mask); 1455d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesout_free_ab8500: 1456d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones kfree(ab8500); 14576d95b7fdd0bd2e28ef651da6863d75edca4c2acaLinus Walleij 145862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 145962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 146062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1461d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __devexit ab8500_remove(struct platform_device *pdev) 146262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1463d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500 = platform_get_drvdata(pdev); 1464d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1465d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1466d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group); 1467d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1468d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group); 146906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 147062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mfd_remove_devices(ab8500->dev); 147106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones free_irq(ab8500->irq, ab8500); 147206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 14732ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->oldmask); 14742ced445e2ddf65f484a489161accddf475676965Linus Walleij kfree(ab8500->mask); 1475d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones kfree(ab8500); 147662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 147762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 147862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 147962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1480d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = { 1481d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8500-core", AB8500_VERSION_AB8500 }, 1482d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8505-i2c", AB8500_VERSION_AB8505 }, 1483d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab9540-i2c", AB8500_VERSION_AB9540 }, 1484d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8540-i2c", AB8500_VERSION_AB8540 }, 1485d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { } 1486d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1487d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1488d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = { 1489d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .driver = { 1490d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .name = "ab8500-core", 1491d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .owner = THIS_MODULE, 1492d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones }, 1493d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .probe = ab8500_probe, 1494d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .remove = __devexit_p(ab8500_remove), 1495d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .id_table = ab8500_id, 1496d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1497d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1498d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void) 1499d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1500d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return platform_driver_register(&ab8500_core_driver); 1501d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1502d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1503d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void) 1504d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1505d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_driver_unregister(&ab8500_core_driver); 1506d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1507ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init); 1508d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit); 1509d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1510adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent"); 151162579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core"); 151262579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2"); 1513