ab8500-core.c revision 9c677b9b74d4314ed7f222bf802d6d1e7585eb65
162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Copyright (C) ST-Ericsson SA 2010 362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * 462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * License Terms: GNU General Public License v2 562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> 662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Author: Rabin Vincent <rabin.vincent@stericsson.com> 7adceed6263887e04721b477e6504aa24789f827dMattias Wallin * Author: Mattias Wallin <mattias.wallin@stericsson.com> 862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/kernel.h> 1162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/slab.h> 1262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/init.h> 1362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/irq.h> 1406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones#include <linux/irqdomain.h> 1562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/delay.h> 1662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/interrupt.h> 1762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/module.h> 1862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/platform_device.h> 1962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#include <linux/mfd/core.h> 2047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#include <linux/mfd/abx500.h> 21ee66e653ca7425bc8ffca4e00f19a8057cd14e4dLinus Walleij#include <linux/mfd/abx500/ab8500.h> 2200441b5e6b98ad6a50b5cb7f88d473e3ea1e0d75Lee Jones#include <linux/mfd/abx500/ab8500-bm.h> 23d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones#include <linux/mfd/dbx500-prcmu.h> 24549931f99e030d63a437c23943fd8dc9b7c0e41cSundar R Iyer#include <linux/regulator/ab8500.h> 256bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of.h> 266bc4a568414caab05424b702165a732177daccd0Lee Jones#include <linux/of_device.h> 2762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 2862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 2962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Interrupt register offsets 3062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Bank : 0x0E 3162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 3247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE1_REG 0x00 3347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE2_REG 0x01 3447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE3_REG 0x02 3547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE4_REG 0x03 3647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE5_REG 0x04 3747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE6_REG 0x05 3847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE7_REG 0x06 3947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE8_REG 0x07 40d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_SOURCE13_REG 0x0C 4147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE19_REG 0x12 4247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE20_REG 0x13 4347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE21_REG 0x14 4447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE22_REG 0x15 4547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE23_REG 0x16 4647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_SOURCE24_REG 0x17 4762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 4962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * latch registers 5062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 5147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH1_REG 0x20 5247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH2_REG 0x21 5347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH3_REG 0x22 5447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH4_REG 0x23 5547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH5_REG 0x24 5647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH6_REG 0x25 5747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH7_REG 0x26 5847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH8_REG 0x27 5947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH9_REG 0x28 6047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH10_REG 0x29 6192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin#define AB8500_IT_LATCH12_REG 0x2B 62d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_IT_LATCH13_REG 0x2C 6347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH19_REG 0x32 6447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH20_REG 0x33 6547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH21_REG 0x34 6647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH22_REG 0x35 6747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH23_REG 0x36 6847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_LATCH24_REG 0x37 6962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 7062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 7162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * mask registers 7262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 7362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 7447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK1_REG 0x40 7547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK2_REG 0x41 7647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK3_REG 0x42 7747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK4_REG 0x43 7847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK5_REG 0x44 7947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK6_REG 0x45 8047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK7_REG 0x46 8147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK8_REG 0x47 8247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK9_REG 0x48 8347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK10_REG 0x49 8447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK11_REG 0x4A 8547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK12_REG 0x4B 8647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK13_REG 0x4C 8747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK14_REG 0x4D 8847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK15_REG 0x4E 8947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK16_REG 0x4F 9047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK17_REG 0x50 9147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK18_REG 0x51 9247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK19_REG 0x52 9347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK20_REG 0x53 9447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK21_REG 0x54 9547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK22_REG 0x55 9647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK23_REG 0x56 9747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_IT_MASK24_REG 0x57 9847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/* 1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers 1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */ 1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG 0x60 1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG 0x61 1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG 0x62 1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 1067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM 3 1077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 10847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG 0x80 1090f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG 0x82 110e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS 0x00 11162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 112b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS 0x00 113b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1146ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */ 1156ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO); 1166ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 117d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG 0x23 118d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT BIT(2) 119d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 12062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 12162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt 1222ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are 1232ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h 12462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * 12562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at 12662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0. 12762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 1282ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */ 12962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = { 13092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 13262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 133d6255529b2639de542324f314b93939b7996a7c5Linus Walleij/* AB9540 support */ 134d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = { 135d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24, 136d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 137d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1380f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = { 1390f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8500] = "AB8500", 1400f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8505] = "AB8505", 1410f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB9540] = "AB9540", 1420f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8540] = "AB8540", 1430f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij}; 1440f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 145822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data) 146d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 147d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 148d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 149d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 150d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 151d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 152d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 153d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 154d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 155822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask, 156d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data) 157d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 158d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 159d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 160d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 161d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones &mask, 1); 162d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 166d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 167822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr) 168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data; 171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 172d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) { 174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones } 177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return (int)data; 178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 179d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 18047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev) 18147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 1826bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin struct ab8500 *ab8500; 1836bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin 1846bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin if (!dev) 1856bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return -EINVAL; 1866bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin ab8500 = dev_get_drvdata(dev->parent); 1876bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return ab8500 ? (int)ab8500->chip_id : -EINVAL; 18847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 18947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 19047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank, 19147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 data) 19262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 19362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 19447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* 19547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * Put the u8 bank and u8 register together into a an u16. 19647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * The bank on higher 8 bits and register in lower 8 bits. 19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * */ 19847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 19962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 20062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data); 20162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 202392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 20347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 20462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->write(ab8500, addr, data); 20562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 20662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 20762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 20847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 21162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 21262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank, 21447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 value) 21562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 216112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 21747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 21862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 219112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 220112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = set_register_interruptible(ab8500, bank, reg, value); 221112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 222112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 22462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank, 22647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 22862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 22947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 23247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 233392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 23462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->read(ab8500, addr); 23662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 23762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 23862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 23947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin else 24047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin *value = ret; 24162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 24362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret); 24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 24662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 24762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank, 24947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 25062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 251112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 25247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 25362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 254112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 255112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = get_register_interruptible(ab8500, bank, reg, value); 256112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 257112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 25862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 26047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank, 26147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 bitmask, u8 bitvalues) 26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 26362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 26447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 26647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 26762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 268392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 26962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 270bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ab8500->write_masked == NULL) { 271bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson u8 data; 27262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 273bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->read(ab8500, addr); 274bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) { 275bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 276bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 277bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 278bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 27962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 280bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (u8)ret; 281bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (~bitmask & data) | (bitmask & bitvalues); 282bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson 283bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write(ab8500, addr, data); 284bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 285bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 286bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 28762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr, 289bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data); 290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues); 293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr, 295bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret); 29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout: 29762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->lock); 29862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 29962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 30047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 30147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev, 30247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 bank, u8 reg, u8 bitmask, u8 bitvalues) 30347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 304112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 30547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 30647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 307112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 308112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret= mask_and_set_register_interruptible(ab8500, bank, reg, 309112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg bitmask, bitvalues); 310112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 311112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 31247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 31347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 31447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = { 31547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_chip_id = ab8500_get_chip_id, 31647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register = ab8500_get_register, 31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register = ab8500_set_register, 31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register_page = NULL, 31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register_page = NULL, 32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .mask_and_set_register = ab8500_mask_and_set_register, 32147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .event_registers_startup_state_get = NULL, 32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .startup_irq_enabled = NULL, 32347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}; 32462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3259505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data) 32662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3279505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 32862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 32962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_lock(&ab8500->irq_lock); 330112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 33162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 33262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3339505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data) 33462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3359505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 33662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 33762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3382ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 33962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 old = ab8500->oldmask[i]; 34062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 new = ab8500->mask[i]; 34162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int reg; 34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 34362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (new == old) 34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent continue; 34562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3460f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 3470f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 3480f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 3490f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 3500f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 3510f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 35292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 35392d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->oldmask[i] = new; 35562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3562ced445e2ddf65f484a489161accddf475676965Linus Walleij reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i]; 35747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new); 35862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 359112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->irq_lock); 36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 36262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3639505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data) 36462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3659505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 36606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 36762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 36862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 36962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 37062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[index] |= mask; 3719c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones 3729c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* The AB8500 GPIOs have two interrupts each (rising & falling). */ 3739c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R) 3749c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 2] |= mask; 3759c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R) 3769c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 1] |= mask; 3779c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R) 3789c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] |= (mask >> 1); 37962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 38062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3819505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data) 38262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3839505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 3849c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones unsigned int type = irqd_get_trigger_type(data); 38506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 38662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 38762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 38862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3899c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (type & IRQ_TYPE_EDGE_RISING) 3909c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 3919c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones 3929c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* The AB8500 GPIOs have two interrupts each (rising & falling). */ 3939c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (type & IRQ_TYPE_EDGE_FALLING) { 3949c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R) 3959c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 2] &= ~mask; 3969c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones else if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R) 3979c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 1] &= ~mask; 3989c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones else if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R) 3999c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~(mask >> 1); 4009c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones else 4019c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 4029c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones } else 4039c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* Satisfies the case where type is not set. */ 4049c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 40562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 40662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 40762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = { 40862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500", 4099505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_lock = ab8500_irq_lock, 4109505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_sync_unlock = ab8500_irq_sync_unlock, 4119505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_mask = ab8500_irq_mask, 412e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath .irq_disable = ab8500_irq_mask, 4139505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_unmask = ab8500_irq_unmask, 41462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 41562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500, 4177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_offset, u8 latch_val) 4187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int int_bit = __ffs(latch_val); 4207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int line, i; 4217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN do { 4237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int_bit = __ffs(latch_val); 4247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN for (i = 0; i < ab8500->mask_size; i++) 4267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (ab8500->irq_reg_offset[i] == latch_offset) 4277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN break; 4287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (i >= ab8500->mask_size) { 4307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN dev_err(ab8500->dev, "Register offset 0x%2x not declared\n", 4317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset); 4327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return -ENXIO; 4337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } 4347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN line = (i << 3) + int_bit; 4367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_val &= ~(1 << int_bit); 4377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4387ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN handle_nested_irq(ab8500->irq_base + line); 4397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } while (latch_val); 4407ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 4427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500, 4457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int hier_offset, u8 hier_val) 4467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4477ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_bit, status; 4487ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 latch_offset, latch_val; 4497ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4507ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN do { 4517ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_bit = __ffs(hier_val); 4527ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset = (hier_offset << 3) + latch_bit; 4537ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4547ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN /* Fix inconsistent ITFromLatch25 bit mapping... */ 4557ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (unlikely(latch_offset == 17)) 4567ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset = 24; 4577ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4587ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, 4597ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_INTERRUPT, 4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCH1_REG + latch_offset, 4617ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN &latch_val); 4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || latch_val == 0) 4637ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN goto discard; 4647ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4657ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_line(ab8500, 4667ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset, latch_val); 4677ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 4687ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return status; 4697ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard: 4707ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN hier_val &= ~(1 << latch_bit); 4717ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } while (hier_val); 4727ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4737ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 4747ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4757ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4767ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev) 4777ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4787ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN struct ab8500 *ab8500 = dev; 4797ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 i; 4807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4817ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN dev_vdbg(ab8500->dev, "interrupt\n"); 4827ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4837ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN /* Hierarchical interrupt version */ 4847ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN for (i = 0; i < AB8500_IT_LATCHHIER_NUM; i++) { 4857ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int status; 4867ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 hier_val; 4877ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4887ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, AB8500_INTERRUPT, 4897ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCHHIER1_REG + i, &hier_val); 4907ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || hier_val == 0) 4917ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN continue; 4927ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4937ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val); 4947ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 4957ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN break; 4967ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } 4977ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return IRQ_HANDLED; 4987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 4997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 50080633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones/** 50180633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * ab8500_irq_get_virq(): Map an interrupt on a chip to a virtual IRQ 50280633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * 50380633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @ab8500: ab8500_irq controller to operate on. 50480633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * @irq: index of the interrupt requested in the chip IRQs 50580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * 50680633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones * Useful for drivers to request their own IRQs. 50780633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones */ 50880633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jonesstatic int ab8500_irq_get_virq(struct ab8500 *ab8500, int irq) 50980633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones{ 51080633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones if (!ab8500) 51180633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones return -EINVAL; 51280633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones 51380633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones return irq_create_mapping(ab8500->domain, irq); 51480633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones} 51580633f05b0dbf5819ef28f626f2f0b7c885d1f88Lee Jones 51662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic irqreturn_t ab8500_irq(int irq, void *dev) 51762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 51862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent struct ab8500 *ab8500 = dev; 51962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 52062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 52162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "interrupt\n"); 52262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 523112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 524112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 5252ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 5262ced445e2ddf65f484a489161accddf475676965Linus Walleij int regoffset = ab8500->irq_reg_offset[i]; 52762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int status; 52847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 52962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 5300f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 5310f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 5320f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 5330f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 5340f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (regoffset == 11 && is_ab8500_1p1_or_earlier(ab8500)) 53592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 53692d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 53747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin status = get_register_interruptible(ab8500, AB8500_INTERRUPT, 53847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_IT_LATCH1_REG + regoffset, &value); 53947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (status < 0 || value == 0) 54062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent continue; 54162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 54262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent do { 54388aec4f7b67b5889ba5b4beac2d2c1400451c318Mattias Wallin int bit = __ffs(value); 54462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int line = i * 8 + bit; 5450a37fc56888c37049f60aab398fddceafd33fe72Lee Jones int virq = ab8500_irq_get_virq(ab8500, line); 54662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 5470a37fc56888c37049f60aab398fddceafd33fe72Lee Jones handle_nested_irq(virq); 54847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin value &= ~(1 << bit); 549112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 55047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin } while (value); 55162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 552112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 55362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return IRQ_HANDLED; 55462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 55562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 55606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_map(struct irq_domain *d, unsigned int virq, 55706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_hw_number_t hwirq) 55806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones{ 55906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones struct ab8500 *ab8500 = d->host_data; 56006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 56106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500) 56206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -EINVAL; 56306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 56406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_chip_data(virq, ab8500); 56506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_chip_and_handler(virq, &ab8500_irq_chip, 56606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones handle_simple_irq); 56706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_nested_thread(virq, 1); 56862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#ifdef CONFIG_ARM 56906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones set_irq_flags(virq, IRQF_VALID); 57062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#else 57106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones irq_set_noprobe(virq); 57262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent#endif 57362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 57462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 57562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 57662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 57706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic struct irq_domain_ops ab8500_irq_ops = { 57806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones .map = ab8500_irq_map, 57906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones .xlate = irq_domain_xlate_twocell, 58006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones}; 58106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 58206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jonesstatic int ab8500_irq_init(struct ab8500 *ab8500, struct device_node *np) 58362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 5842ced445e2ddf65f484a489161accddf475676965Linus Walleij int num_irqs; 5852ced445e2ddf65f484a489161accddf475676965Linus Walleij 586d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 587d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB9540_NR_IRQS; 588a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson else if (is_ab8505(ab8500)) 589a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson num_irqs = AB8505_NR_IRQS; 590d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 591d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB8500_NR_IRQS; 59262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 593f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij /* If ->irq_base is zero this will give a linear mapping */ 594f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij ab8500->domain = irq_domain_add_simple(NULL, 595f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij num_irqs, ab8500->irq_base, 596f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij &ab8500_irq_ops, ab8500); 59706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 59806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500->domain) { 59906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones dev_err(ab8500->dev, "Failed to create irqdomain\n"); 60006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -ENOSYS; 60106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 60206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 60306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return 0; 60462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 60562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 606112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500) 607112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{ 608112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg if (atomic_read(&ab8500->transfer_ongoing)) 609112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return -EINVAL; 610112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg else 611112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return 0; 612112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg} 613112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 614a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_gpadc_resources[] = { 61562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 61662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "HW_CONV_END", 61762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_HW_ADC_CONV_END, 61862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_HW_ADC_CONV_END, 61962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 62062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 62162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 62262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "SW_CONV_END", 62362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_SW_ADC_CONV_END, 62462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_SW_ADC_CONV_END, 62562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 62662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 62862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 629a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_rtc_resources[] = { 63062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 63162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "60S", 63262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_60S, 63362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_60S, 63462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 63562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 63662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 63762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ALARM", 63862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_ALARM, 63962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_ALARM, 64062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 64162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 644a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_poweronkey_db_resources[] = { 64577686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 64677686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBF", 64777686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_F, 64877686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_F, 64977686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 65077686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 65177686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 65277686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBR", 65377686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_R, 65477686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_R, 65577686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 65677686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 65777686517977e77d101c8a7b397717df00a88922bSundar R Iyer}; 65877686517977e77d101c8a7b397717df00a88922bSundar R Iyer 659a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_av_acc_detect_resources[] = { 660e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_F", 6626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_F, 6636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_F, 6646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 665e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 666e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_R", 6686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_R, 6696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_R, 6706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_F", 6746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_F, 6756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_F, 6766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_R", 6806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_R, 6816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_R, 6826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_F", 6866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_F, 6876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_F, 6886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 689e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 690e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_R", 6926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_R, 6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_R, 6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 698a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_charger_resources[] = { 6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 700e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CH_UNPLUG_DET", 701e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_UNPLUG_DET, 702e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_UNPLUG_DET, 703e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 704e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 705e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 706e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CHARGE_PLUG_DET", 707e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_PLUG_DET, 708e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_PLUG_DET, 709e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 710e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 711e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 712e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 713e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 714e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 715e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 716e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 717e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "VBUS_DET_F", 7196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_VBUS_DET_F, 7206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_VBUS_DET_F, 721e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 722e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 723e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7246af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_LINK_STATUS", 7256af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_LINK_STATUS, 7266af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_LINK_STATUS, 7276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7296af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 730e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_OVV", 731e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_OVV, 732e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_OVV, 733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_R", 7376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_R, 7386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_R, 739e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 740e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 741e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_F", 7436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_F, 7446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_F, 745e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 746e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 747e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_EXT_CH_NOT_OK", 7496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_R", 7556af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_R, 7566af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_R, 7576af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7586af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7596af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_F", 7616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_F, 7626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_F, 7636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CHARGER_NOT_OKR", 767a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_USB_CHARGER_NOT_OKR, 768a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_USB_CHARGER_NOT_OKR, 7696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CH_WD_EXP", 7736af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CH_WD_EXP, 7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CH_WD_EXP, 7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 779a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_btemp_resources[] = { 7806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BAT_CTRL_INDB", 7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BAT_CTRL_INDB, 7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BAT_CTRL_INDB, 784e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 785e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 786e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 787e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_LOW", 788e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_LOW, 789e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_LOW, 790e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 791e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 792e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 793e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_HIGH", 794e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_HIGH, 795e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_HIGH, 796e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 797e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 798e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_LOW_MEDIUM", 8006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_LOW_MEDIUM, 8016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_LOW_MEDIUM, 802e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 803e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 804e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_MEDIUM_HIGH", 8066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_MEDIUM_HIGH, 8076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_MEDIUM_HIGH, 808e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 809e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 8106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 8116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 812a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_fg_resources[] = { 813e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "NCONV_ACCU", 8156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CCN_CONV_ACC, 8166af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CCN_CONV_ACC, 817e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 818e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 819e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BATT_OVV", 8216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BATT_OVV, 8226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BATT_OVV, 823e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 824e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8266af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_F", 8276af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_F, 8286af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_F, 8296af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8306af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_R", 8336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_R, 8346af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_R, 8356af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8366af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CC_INT_CALIB", 8396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CC_INT_CALIB, 8406af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CC_INT_CALIB, 841e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 842e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 843a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson { 844a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .name = "CCEOC", 845a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_CCEOC, 846a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_CCEOC, 847a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .flags = IORESOURCE_IRQ, 848a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson }, 849e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 850e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 851a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_chargalg_resources[] = {}; 8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 853df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS 854a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_debug_resources[] = { 855e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 856e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_FIRST", 857e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 858e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 859e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 860e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 861e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 862e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_LAST", 863a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_XTAL32K_KO, 864a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_XTAL32K_KO, 865e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 866e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 867e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 868df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif 869e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 870a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_usb_resources[] = { 871e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 872e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_R", 873e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_R, 874e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_R, 875e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 876e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 877e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 878e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_F", 879e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_F, 880e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_F, 881e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 882e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 883e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 884e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_F", 885e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_F, 886e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_F, 887e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 888e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 889e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 890e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 891e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 892e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 893e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 894e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 89592d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin { 89692d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .name = "USB_LINK_STATUS", 89792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .start = AB8500_INT_USB_LINK_STATUS, 89892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .end = AB8500_INT_USB_LINK_STATUS, 89992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .flags = IORESOURCE_IRQ, 90092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin }, 9016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_PLUG", 9036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_PLUG, 9046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_PLUG, 9056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 9076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_UNPLUG", 9096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_UNPLUG, 9106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_UNPLUG, 9116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 913e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 914e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 915a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8505_iddet_resources[] = { 91644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 91744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyDeglitch", 91844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYDEGLITCH, 91944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYDEGLITCH, 92044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 92144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 92244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 92344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KP", 92444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KP, 92544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KP, 92644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 92744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 92844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 92944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKP", 93044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKP, 93144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKP, 93244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 93344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 93444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 93544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKR", 93644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKR, 93744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKR, 93844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 93944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 94044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 94144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyStuck", 94244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYSTUCK, 94344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYSTUCK, 94444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 94544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 94644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 94744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 948a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_temp_resources[] = { 949e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 950e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "AB8500_TEMP_WARM", 951e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_TEMP_WARM, 952e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_TEMP_WARM, 953e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 954e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 955e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 956e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 957a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell abx500_common_devs[] = { 9585814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS 9595814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin { 9605814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin .name = "ab8500-debug", 961bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-debug", 962e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_debug_resources), 963e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_debug_resources, 9645814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin }, 9655814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif 96662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 967e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-sysctrl", 968bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-sysctrl", 969e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 970e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 971e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-regulator", 972bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-regulator", 973e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 974e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 975916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson .name = "abx500-clk", 976916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson .of_compatible = "stericsson,abx500-clk", 977916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson }, 978916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson { 97962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500-gpadc", 980bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-gpadc", 98162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), 98262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .resources = ab8500_gpadc_resources, 98362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 98462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 98562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500-rtc", 986bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-rtc", 98762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 98862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .resources = ab8500_rtc_resources, 98962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 990f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 9916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ab8500-acc-det", 992bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-acc-det", 9936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 9946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .resources = ab8500_av_acc_detect_resources, 9956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 9966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 997e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-poweron-key", 998bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-poweron-key", 999e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 1000e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_poweronkey_db_resources, 1001e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1002e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1003f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1004bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1005f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 1, 1006f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1007f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1008f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1009bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1010f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 2, 1011f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1012f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1013f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1014bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1015f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 3, 1016f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1017bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones { 1018bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .name = "ab8500-leds", 1019bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-leds", 1020bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones }, 102177686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 1022e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-denc", 1023bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-denc", 1024e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1025e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1026e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-temp", 1027bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-temp", 1028e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_temp_resources), 1029e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_temp_resources, 103077686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 103162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 103262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1033a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab8500_bm_devs[] = { 10346ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10356ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-charger", 10364aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V .of_compatible = "stericsson,ab8500-charger", 10376ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_charger_resources), 10386ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_charger_resources, 10394aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#ifndef CONFIG_OF 10404aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V .platform_data = &ab8500_bm_data, 10414aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V .pdata_size = sizeof(ab8500_bm_data), 10424aef72dbb2e8997e627dd94ae2b9109dc09fffaaRajanikanth H.V#endif 10436ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10446ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-btemp", 1046bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V .of_compatible = "stericsson,ab8500-btemp", 10476ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_btemp_resources), 10486ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_btemp_resources, 1049bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#ifndef CONFIG_OF 1050bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V .platform_data = &ab8500_bm_data, 1051bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V .pdata_size = sizeof(ab8500_bm_data), 1052bd9e8ab2d58d2183aa723bf0eb8e07d4362b4975Rajanikanth H.V#endif 10536ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10546ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10556ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-fg", 1056e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V .of_compatible = "stericsson,ab8500-fg", 10576ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_fg_resources), 10586ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_fg_resources, 1059e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#ifndef CONFIG_OF 1060e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V .platform_data = &ab8500_bm_data, 1061e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V .pdata_size = sizeof(ab8500_bm_data), 1062e0f1abeba5c2d8a2183566717d99294fd1a29c2eRajanikanth H.V#endif 10636ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10646ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 10656ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .name = "ab8500-chargalg", 1066a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V .of_compatible = "stericsson,ab8500-chargalg", 10676ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .num_resources = ARRAY_SIZE(ab8500_chargalg_resources), 10686ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson .resources = ab8500_chargalg_resources, 1069a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V#ifndef CONFIG_OF 1070a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V .platform_data = &ab8500_bm_data, 1071a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V .pdata_size = sizeof(ab8500_bm_data), 1072a12810ab9fcf0c9fd5e50b5e350a3ffbeaa571beRajanikanth H.V#endif 10736ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 10746ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson}; 10756ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1076a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab8500_devs[] = { 1077d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1078d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-gpio", 1079bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-gpio", 1080d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 1081d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1082d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-usb", 1083bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-usb", 1084d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1085d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_usb_resources, 1086d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 108744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 108844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab8500-codec", 108981a21cddaf14bd1144c2d173add7cbdeb95a07caLee Jones .of_compatible = "stericsson,ab8500-codec", 109044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1091d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1092d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1093a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab9540_devs[] = { 1094d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1095d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab8500-gpio", 1096d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 1097d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1098d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab9540-usb", 1099d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1100d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_usb_resources, 1101d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 110244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 110344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab9540-codec", 110444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 110544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 110644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 110744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath/* Device list common to ab9540 and ab8505 */ 1108a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct mfd_cell ab9540_ab8505_devs[] = { 110944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 111044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab-iddet", 111144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .num_resources = ARRAY_SIZE(ab8505_iddet_resources), 111244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .resources = ab8505_iddet_resources, 111344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1114d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1115d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1116cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev, 1117cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct device_attribute *attr, char *buf) 1118cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{ 1119cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct ab8500 *ab8500; 1120cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1121cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin ab8500 = dev_get_drvdata(dev); 1122cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); 1123cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin} 1124cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1125e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/* 1126e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1127e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1128e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1129e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1130e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1131e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1132e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1133e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1134e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1135e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1136e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev, 1137e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct device_attribute *attr, char *buf) 1138e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{ 1139e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin int ret; 1140e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin u8 value; 1141e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct ab8500 *ab8500; 1142e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1143e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ab8500 = dev_get_drvdata(dev); 1144e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1145e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1146e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1147e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1148e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return sprintf(buf, "%#x\n", value); 1149e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin} 1150e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1151b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/* 1152b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS): 1153b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat 1154b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF 1155b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF 1156b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm 1157b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet 1158b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet 1159b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect 1160b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved 1161b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */ 1162b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev, 1163b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct device_attribute *attr, char *buf) 1164b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{ 1165b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn int ret; 1166b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn u8 value; 1167b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct ab8500 *ab8500; 1168b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1169b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ab8500 = dev_get_drvdata(dev); 1170b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, 1171b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn AB8500_TURN_ON_STATUS, &value); 1172b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn if (ret < 0) 1173b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return ret; 1174b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return sprintf(buf, "%#x\n", value); 1175b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn} 1176b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1177d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev, 1178d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, char *buf) 1179d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1180d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1181d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret; 1182d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 value; 1183d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1184d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1185d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1186d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2, 1187d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_REG, &value); 1188d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (ret < 0) 1189d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1190d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1191d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return sprintf(buf, "%d\n", 1192d6255529b2639de542324f314b93939b7996a7c5Linus Walleij (value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0); 1193d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1194d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1195d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev, 1196d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, const char *buf, size_t count) 1197d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1198d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1199d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret = count; 1200d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int err; 1201d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 bitvalues; 1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1204d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1205d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (count > 0) { 1206d6255529b2639de542324f314b93939b7996a7c5Linus Walleij switch (buf[0]) { 1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '0': 1208d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = 0; 1209d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1210d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '1': 1211d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT; 1212d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1213d6255529b2639de542324f314b93939b7996a7c5Linus Walleij default: 1214d6255529b2639de542324f314b93939b7996a7c5Linus Walleij goto exit; 1215d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1216d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1217d6255529b2639de542324f314b93939b7996a7c5Linus Walleij err = mask_and_set_register_interruptible(ab8500, 1218d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG, 1219d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues); 1220d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (err) 1221d6255529b2639de542324f314b93939b7996a7c5Linus Walleij dev_info(ab8500->dev, 1222d6255529b2639de542324f314b93939b7996a7c5Linus Walleij "Failed to set DBBRSTN %c, err %#x\n", 1223d6255529b2639de542324f314b93939b7996a7c5Linus Walleij buf[0], err); 1224d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1225d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1226d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit: 1227d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1228d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1229d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1230cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL); 1231e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL); 1232b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL); 1233d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR, 1234d6255529b2639de542324f314b93939b7996a7c5Linus Walleij show_ab9540_dbbrstn, store_ab9540_dbbrstn); 1235cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1236cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = { 1237cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin &dev_attr_chip_id.attr, 1238e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin &dev_attr_switch_off_status.attr, 1239b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn &dev_attr_turn_on_status.attr, 1240cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin NULL, 1241cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1242cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1243d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = { 1244d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_chip_id.attr, 1245d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_switch_off_status.attr, 1246d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_turn_on_status.attr, 1247d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_dbbrstn.attr, 1248d6255529b2639de542324f314b93939b7996a7c5Linus Walleij NULL, 1249d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1250d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1251cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = { 1252cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin .attrs = ab8500_sysfs_entries, 1253cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1254cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1255d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = { 1256d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .attrs = ab9540_sysfs_entries, 1257d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1258d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1259f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int ab8500_probe(struct platform_device *pdev) 126062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1261b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg static char *switch_off_status[] = { 1262b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Swoff bit programming", 1263b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Thermal protection activation", 1264b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Vbat lower then BattOk falling threshold", 1265b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Watchdog expired", 1266b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Non presence of 32kHz clock", 1267b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Battery level lower than power on reset threshold", 1268b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Power on key 1 pressed longer than 10 seconds", 1269b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "DB8500 thermal shutdown"}; 1270d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev); 1271d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones const struct platform_device_id *platid = platform_get_device_id(pdev); 12726bc4a568414caab05424b702165a732177daccd0Lee Jones enum ab8500_version version = AB8500_VERSION_UNDEFINED; 12736bc4a568414caab05424b702165a732177daccd0Lee Jones struct device_node *np = pdev->dev.of_node; 1274d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500; 1275d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct resource *resource; 127662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 127762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 127847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 127962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 12808c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ab8500 = devm_kzalloc(&pdev->dev, sizeof *ab8500, GFP_KERNEL); 1281d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!ab8500) 1282d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return -ENOMEM; 1283d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 128462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat) 128562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->irq_base = plat->irq_base; 128662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1287d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->dev = &pdev->dev; 1288d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1289d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 12908c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones if (!resource) 12918c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return -ENODEV; 1292d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1293d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->irq = resource->start; 1294d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1295822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->read = ab8500_prcmu_read; 1296822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write = ab8500_prcmu_write; 1297822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write_masked = ab8500_prcmu_write_masked; 1298d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 129962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->lock); 130062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->irq_lock); 1301112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_set(&ab8500->transfer_ongoing, 0); 130262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1303d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_set_drvdata(pdev, ab8500); 1304d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 13056bc4a568414caab05424b702165a732177daccd0Lee Jones if (platid) 13066bc4a568414caab05424b702165a732177daccd0Lee Jones version = platid->driver_data; 13076bc4a568414caab05424b702165a732177daccd0Lee Jones 13080f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (version != AB8500_VERSION_UNDEFINED) 13090f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = version; 13100f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij else { 13110f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ret = get_register_interruptible(ab8500, AB8500_MISC, 13120f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij AB8500_IC_NAME_REG, &value); 13130f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ret < 0) 13148c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 13150f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 13160f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = value; 13170f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij } 13180f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 131947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = get_register_interruptible(ab8500, AB8500_MISC, 132047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_REV_REG, &value); 132162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 13228c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 132362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 132447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ab8500->chip_id = value; 132562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 13260f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", 13270f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500_version_str[ab8500->version], 13280f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id >> 4, 13290f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id & 0x0F); 13300f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 1331d6255529b2639de542324f314b93939b7996a7c5Linus Walleij /* Configure AB8500 or AB9540 IRQ */ 1332a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson if (is_ab9540(ab8500) || is_ab8505(ab8500)) { 1333d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB9540_NUM_IRQ_REGS; 1334d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab9540_irq_regoffset; 1335d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } else { 1336d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB8500_NUM_IRQ_REGS; 1337d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab8500_irq_regoffset; 1338d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 13398c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL); 13402ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->mask) 13412ced445e2ddf65f484a489161accddf475676965Linus Walleij return -ENOMEM; 13428c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, GFP_KERNEL); 13438c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones if (!ab8500->oldmask) 13448c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return -ENOMEM; 13458c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones 1346e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin /* 1347e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1348e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1349e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1350e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1351e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1352e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1353e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1354e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1355e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1356e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1357e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1358e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1359e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1360e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1361e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1362b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value); 1363b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1364b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value) { 1365b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) { 1366b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value & 1) 1367b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT " \"%s\"", 1368b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg switch_off_status[i]); 1369b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg value = value >> 1; 1370b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1371b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 1372b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT "\n"); 1373b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } else { 1374b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg printk(KERN_CONT " None\n"); 1375b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 1376e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 137762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat && plat->init) 137862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent plat->init(ab8500); 137962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 138062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent /* Clear and mask all interrupts */ 13812ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 13820f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 13830f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 13840f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 13850f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 13860f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 13870f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 138892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 138962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 139047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin get_register_interruptible(ab8500, AB8500_INTERRUPT, 13912ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], 139292d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin &value); 139347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, 13942ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); 139562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 139662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 139747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = abx500_register_ops(ab8500->dev, &ab8500_ops); 139847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (ret) 13998c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 140047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 14012ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) 140262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[i] = ab8500->oldmask[i] = 0xff; 140362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 140406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = ab8500_irq_init(ab8500, np); 140506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (ret) 14068c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 140762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 140806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* Activate this feature only in ab9540 */ 140906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones /* till tests are done on ab8500 1p2 or later*/ 141006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (is_ab9540(ab8500)) { 14118c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL, 14128c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ab8500_hierarchical_irq, 14138c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones IRQF_ONESHOT | IRQF_NO_SUSPEND, 14148c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones "ab8500", ab8500); 141506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 141606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones else { 14178c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL, 14188c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones ab8500_irq, 14198c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones IRQF_ONESHOT | IRQF_NO_SUSPEND, 14208c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones "ab8500", ab8500); 142162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret) 14228c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 142362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 142462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1425bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, 1426bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(abx500_common_devs), NULL, 142755692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ab8500->irq_base, ab8500->domain); 1428bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (ret) 14298c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 1430d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1431bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (is_ab9540(ab8500)) 1432bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, 1433bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(ab9540_devs), NULL, 143455692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ab8500->irq_base, ab8500->domain); 1435bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones else 1436bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, 1437bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(ab8500_devs), NULL, 143855692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ab8500->irq_base, ab8500->domain); 1439bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (ret) 14408c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 144144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 1442bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (is_ab9540(ab8500) || is_ab8505(ab8500)) 1443bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, 1444bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(ab9540_ab8505_devs), NULL, 144555692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ab8500->irq_base, ab8500->domain); 1446bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (ret) 14478c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 144862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 14496ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (!no_bm) { 14506ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson /* Add battery management devices */ 14516ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, 14526ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ARRAY_SIZE(ab8500_bm_devs), NULL, 145355692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown ab8500->irq_base, ab8500->domain); 14546ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (ret) 14556ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson dev_err(ab8500->dev, "error adding bm devices\n"); 14566ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson } 14576ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1458d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1459d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1460d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab9540_attr_group); 1461d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1462d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1463d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab8500_attr_group); 1464cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin if (ret) 1465cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin dev_err(ab8500->dev, "error creating sysfs entries\n"); 146606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 146706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return ret; 146862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 146962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 14704740f73fe5388ab5d22d552d2a0dacc62418a70cBill Pembertonstatic int ab8500_remove(struct platform_device *pdev) 147162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1472d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500 = platform_get_drvdata(pdev); 1473d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1474d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (is_ab9540(ab8500)) 1475d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group); 1476d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1477d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group); 147806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 147962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mfd_remove_devices(ab8500->dev); 148062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 148162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 148262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 148362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1484d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = { 1485d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8500-core", AB8500_VERSION_AB8500 }, 1486d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8505-i2c", AB8500_VERSION_AB8505 }, 1487d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab9540-i2c", AB8500_VERSION_AB9540 }, 1488d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8540-i2c", AB8500_VERSION_AB8540 }, 1489d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { } 1490d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1491d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1492d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = { 1493d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .driver = { 1494d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .name = "ab8500-core", 1495d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .owner = THIS_MODULE, 1496d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones }, 1497d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .probe = ab8500_probe, 149884449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton .remove = ab8500_remove, 1499d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .id_table = ab8500_id, 1500d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1501d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1502d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void) 1503d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1504d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return platform_driver_register(&ab8500_core_driver); 1505d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1506d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1507d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void) 1508d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1509d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_driver_unregister(&ab8500_core_driver); 1510d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1511ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init); 1512d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit); 1513d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1514adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent"); 151562579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core"); 151662579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2"); 1517