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 98a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones#define AB8500_IT_MASK25_REG 0x58 9947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 1007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN/* 1017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN * latch hierarchy registers 1027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN */ 1037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER1_REG 0x60 1047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER2_REG 0x61 1057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER3_REG 0x62 1063e1a498f2728476535571d270081a17fdfceaf26Lee Jones#define AB8540_IT_LATCHHIER4_REG 0x63 1077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 1087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN#define AB8500_IT_LATCHHIER_NUM 3 1093e1a498f2728476535571d270081a17fdfceaf26Lee Jones#define AB8540_IT_LATCHHIER_NUM 4 1107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 11147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin#define AB8500_REV_REG 0x80 1120f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij#define AB8500_IC_NAME_REG 0x82 113e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin#define AB8500_SWITCH_OFF_STATUS 0x00 11462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 115b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn#define AB8500_TURN_ON_STATUS 0x00 11693ff722e88530b9719cbf53be4f3197722461394Lee Jones#define AB8505_TURN_ON_STATUS_2 0x04 117b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 118f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define AB8500_CH_USBCH_STAT1_REG 0x02 119f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define VBUS_DET_DBNC100 0x02 120f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan#define VBUS_DET_DBNC1 0x01 121f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan 122f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic DEFINE_SPINLOCK(on_stat_lock); 123f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic u8 turn_on_stat_mask = 0xFF; 124f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanstatic u8 turn_on_stat_set; 1256ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonstatic bool no_bm; /* No battery management */ 1266ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Anderssonmodule_param(no_bm, bool, S_IRUGO); 1276ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 128d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_REG 0x23 129d6255529b2639de542324f314b93939b7996a7c5Linus Walleij#define AB9540_MODEM_CTRL2_SWDBBRSTN_BIT BIT(2) 130d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 13162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent/* 13262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * Map interrupt numbers to the LATCH and MASK register offsets, Interrupt 1332ced445e2ddf65f484a489161accddf475676965Linus Walleij * numbers are indexed into this array with (num / 8). The interupts are 1342ced445e2ddf65f484a489161accddf475676965Linus Walleij * defined in linux/mfd/ab8500.h 13562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * 13662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * This is one off from the register names, i.e. AB8500_IT_MASK1_REG is at 13762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent * offset 0. 13862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent */ 1392ced445e2ddf65f484a489161accddf475676965Linus Walleij/* AB8500 support */ 14062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic const int ab8500_irq_regoffset[AB8500_NUM_IRQ_REGS] = { 14192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 14262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 14362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 144a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones/* AB9540 / AB8505 support */ 145d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic const int ab9540_irq_regoffset[AB9540_NUM_IRQ_REGS] = { 146a29264b68a93556a09005b9f18cbd3f61f6fd355Lee Jones 0, 1, 2, 3, 4, 6, 7, 8, 9, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22, 23 147d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 148d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1493e1a498f2728476535571d270081a17fdfceaf26Lee Jones/* AB8540 support */ 1503e1a498f2728476535571d270081a17fdfceaf26Lee Jonesstatic const int ab8540_irq_regoffset[AB8540_NUM_IRQ_REGS] = { 1517ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones 0, 1, 2, 3, 4, -1, -1, -1, -1, 11, 18, 19, 20, 21, 12, 13, 24, 5, 22, 1527ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones 23, 25, 26, 27, 28, 29, 30, 31, 1533e1a498f2728476535571d270081a17fdfceaf26Lee Jones}; 1543e1a498f2728476535571d270081a17fdfceaf26Lee Jones 1550f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleijstatic const char ab8500_version_str[][7] = { 1560f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8500] = "AB8500", 1570f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8505] = "AB8505", 1580f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB9540] = "AB9540", 1590f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij [AB8500_VERSION_AB8540] = "AB8540", 1600f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij}; 1610f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 162822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write(struct ab8500 *ab8500, u16 addr, u8 data) 163d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 164d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 165d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 166d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 167d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 168d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 169d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 170d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 171d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 172822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_write_masked(struct ab8500 *ab8500, u16 addr, u8 mask, 173d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data) 174d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 175d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 176d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 177d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_write_masked((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 178d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones &mask, 1); 179d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) 180d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 181d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 182d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 183d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 184822672a7b496e724f879af703693f342e2215163Lee Jonesstatic int ab8500_prcmu_read(struct ab8500 *ab8500, u16 addr) 185d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 186d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones int ret; 187d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones u8 data; 188d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 189d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ret = prcmu_abb_read((u8)(addr >> 8), (u8)(addr & 0xFF), &data, 1); 190d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (ret < 0) { 191d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones dev_err(ab8500->dev, "prcmu i2c error %d\n", ret); 192d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return ret; 193d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones } 194d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return (int)data; 195d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 196d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 19747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_chip_id(struct device *dev) 19847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 1996bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin struct ab8500 *ab8500; 2006bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin 2016bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin if (!dev) 2026bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return -EINVAL; 2036bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin ab8500 = dev_get_drvdata(dev->parent); 2046bce7bf1a1f8a79a57ff69910c115e1d2ed8913dMattias Wallin return ab8500 ? (int)ab8500->chip_id : -EINVAL; 20547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 20647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 20747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int set_register_interruptible(struct ab8500 *ab8500, u8 bank, 20847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 data) 20962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 21062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 21147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* 21247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * Put the u8 bank and u8 register together into a an u16. 21347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * The bank on higher 8 bits and register in lower 8 bits. 21447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * */ 21547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 21662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 21762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "wr: addr %#x <= %#x\n", addr, data); 21862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 219392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 22047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 22162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->write(ab8500, addr, data); 22262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 22362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 22462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 22547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 22662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 22762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 22862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 22962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 23047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_set_register(struct device *dev, u8 bank, 23147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 value) 23262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 233112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 23447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 23562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 236112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 237112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = set_register_interruptible(ab8500, bank, reg, value); 238112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 239112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 24062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 24162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 24247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int get_register_interruptible(struct ab8500 *ab8500, u8 bank, 24347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 24462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 24562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 24647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 24747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 24847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 24947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 250392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 25162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 25262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ret = ab8500->read(ab8500, addr); 25362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 25462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 25562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent addr, ret); 25647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin else 25747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin *value = ret; 25862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 25947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin mutex_unlock(&ab8500->lock); 26062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret); 26162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 26262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 26362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 26462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 26547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_get_register(struct device *dev, u8 bank, 26647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 *value) 26762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 268112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 26947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 27062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 271112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 272112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg ret = get_register_interruptible(ab8500, bank, reg, value); 273112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 274112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 27562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 27647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 27747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int mask_and_set_register_interruptible(struct ab8500 *ab8500, u8 bank, 27847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 reg, u8 bitmask, u8 bitvalues) 27962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 28062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 28147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin /* put the u8 bank and u8 reg together into a an u16. 28247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin * bank on higher 8 bits and reg in lower */ 28347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u16 addr = ((u16)bank) << 8 | reg; 28462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 285392cbd1e608ba79bd2da652eb3a28d841e51eaeeRabin Vincent mutex_lock(&ab8500->lock); 28662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 287bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ab8500->write_masked == NULL) { 288bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson u8 data; 28962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 290bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->read(ab8500, addr); 291bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) { 292bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to read reg %#x: %d\n", 293bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 294bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 295bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 29662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 297bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (u8)ret; 298bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data = (~bitmask & data) | (bitmask & bitvalues); 299bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson 300bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write(ab8500, addr, data); 301bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 302bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to write reg %#x: %d\n", 303bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson addr, ret); 30462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 305bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_vdbg(ab8500->dev, "mask: addr %#x => data %#x\n", addr, 306bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson data); 307bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson goto out; 308bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson } 309bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret = ab8500->write_masked(ab8500, addr, bitmask, bitvalues); 310bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson if (ret < 0) 311bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson dev_err(ab8500->dev, "failed to modify reg %#x: %d\n", addr, 312bc628fd19d2d1d053b88fa225bb599be026c048bMattias Nilsson ret); 31362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentout: 31462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->lock); 31562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return ret; 31662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 31747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 31847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic int ab8500_mask_and_set_register(struct device *dev, 31947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 bank, u8 reg, u8 bitmask, u8 bitvalues) 32047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin{ 321112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg int ret; 32247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin struct ab8500 *ab8500 = dev_get_drvdata(dev->parent); 32347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 324112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 3257ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones ret = mask_and_set_register_interruptible(ab8500, bank, reg, 326112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg bitmask, bitvalues); 327112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 328112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return ret; 32947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin} 33047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 33147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallinstatic struct abx500_ops ab8500_ops = { 33247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_chip_id = ab8500_get_chip_id, 33347c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register = ab8500_get_register, 33447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register = ab8500_set_register, 33547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .get_register_page = NULL, 33647c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .set_register_page = NULL, 33747c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .mask_and_set_register = ab8500_mask_and_set_register, 33847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .event_registers_startup_state_get = NULL, 33947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin .startup_irq_enabled = NULL, 3401d843a6c8c2067615fea0ff8cb62d4a5c4a6f8aeMian Yousaf Kaukab .dump_all_banks = ab8500_dump_all_banks, 34147c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin}; 34262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3439505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_lock(struct irq_data *data) 34462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3459505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 34662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 34762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_lock(&ab8500->irq_lock); 348112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_inc(&ab8500->transfer_ongoing); 34962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 35062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3519505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_sync_unlock(struct irq_data *data) 35262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3539505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 35462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 35562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3562ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 35762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 old = ab8500->oldmask[i]; 35862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent u8 new = ab8500->mask[i]; 35962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int reg; 36062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 36162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (new == old) 36262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent continue; 36362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3640f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 3650f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 3660f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 3670f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 3680f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 3690f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 37092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 37192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin 3723e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (ab8500->irq_reg_offset[i] < 0) 3733e1a498f2728476535571d270081a17fdfceaf26Lee Jones continue; 3743e1a498f2728476535571d270081a17fdfceaf26Lee Jones 37562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->oldmask[i] = new; 37662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3772ced445e2ddf65f484a489161accddf475676965Linus Walleij reg = AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i]; 37847c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, reg, new); 37962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 380112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_dec(&ab8500->transfer_ongoing); 38162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_unlock(&ab8500->irq_lock); 38262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 38362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 3849505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_mask(struct irq_data *data) 38562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 3869505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 38706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 38862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 38962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 39062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 39162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[index] |= mask; 3929c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones 3939c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* The AB8500 GPIOs have two interrupts each (rising & falling). */ 3949c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R) 3959c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 2] |= mask; 3969c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB9540_INT_GPIO50R && offset <= AB9540_INT_GPIO54R) 3979c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 1] |= mask; 3989c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset == AB8540_INT_GPIO43R || offset == AB8540_INT_GPIO44R) 399e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij /* Here the falling IRQ is one bit lower */ 400e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij ab8500->mask[index] |= (mask << 1); 40162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 40262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4039505a0a0ac6160480eaab8d592dce6161e67e05dMark Brownstatic void ab8500_irq_unmask(struct irq_data *data) 40462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 4059505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown struct ab8500 *ab8500 = irq_data_get_irq_chip_data(data); 4069c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones unsigned int type = irqd_get_trigger_type(data); 40706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones int offset = data->hwirq; 40862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int index = offset / 8; 40962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int mask = 1 << (offset % 8); 41062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4119c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (type & IRQ_TYPE_EDGE_RISING) 4129c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 4139c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones 4149c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* The AB8500 GPIOs have two interrupts each (rising & falling). */ 4159c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (type & IRQ_TYPE_EDGE_FALLING) { 4169c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones if (offset >= AB8500_INT_GPIO6R && offset <= AB8500_INT_GPIO41R) 4179c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 2] &= ~mask; 4187ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones else if (offset >= AB9540_INT_GPIO50R && 4197ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones offset <= AB9540_INT_GPIO54R) 4209c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index + 1] &= ~mask; 4217ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones else if (offset == AB8540_INT_GPIO43R || 4227ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones offset == AB8540_INT_GPIO44R) 423e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij /* Here the falling IRQ is one bit lower */ 424e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij ab8500->mask[index] &= ~(mask << 1); 4259c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones else 4269c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 427e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij } else { 4289c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones /* Satisfies the case where type is not set. */ 4299c677b9b74d4314ed7f222bf802d6d1e7585eb65Lee Jones ab8500->mask[index] &= ~mask; 430e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij } 43162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 43262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 43340f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jonesstatic int ab8500_irq_set_type(struct irq_data *data, unsigned int type) 43440f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones{ 43540f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones return 0; 43662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 43762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 43862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincentstatic struct irq_chip ab8500_irq_chip = { 43962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500", 4409505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_lock = ab8500_irq_lock, 4419505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_bus_sync_unlock = ab8500_irq_sync_unlock, 4429505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_mask = ab8500_irq_mask, 443e6f9306e2762a651fe6b735a36fcb696d05e8ed2Virupax Sadashivpetimath .irq_disable = ab8500_irq_mask, 4449505a0a0ac6160480eaab8d592dce6161e67e05dMark Brown .irq_unmask = ab8500_irq_unmask, 44540f6e5a2b52eda7864b7167fb5af1c310b464766Lee Jones .irq_set_type = ab8500_irq_set_type, 44662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 44762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 4483e1a498f2728476535571d270081a17fdfceaf26Lee Jonesstatic void update_latch_offset(u8 *offset, int i) 4493e1a498f2728476535571d270081a17fdfceaf26Lee Jones{ 4503e1a498f2728476535571d270081a17fdfceaf26Lee Jones /* Fix inconsistent ITFromLatch25 bit mapping... */ 4513e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (unlikely(*offset == 17)) 4523e1a498f2728476535571d270081a17fdfceaf26Lee Jones *offset = 24; 4533e1a498f2728476535571d270081a17fdfceaf26Lee Jones /* Fix inconsistent ab8540 bit mapping... */ 4543e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (unlikely(*offset == 16)) 4553e1a498f2728476535571d270081a17fdfceaf26Lee Jones *offset = 25; 4567ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones if ((i == 3) && (*offset >= 24)) 4573e1a498f2728476535571d270081a17fdfceaf26Lee Jones *offset += 2; 4583e1a498f2728476535571d270081a17fdfceaf26Lee Jones} 4593e1a498f2728476535571d270081a17fdfceaf26Lee Jones 4607ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_line(struct ab8500 *ab8500, 4617ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_offset, u8 latch_val) 4627ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 4637a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri int int_bit, line, i; 4647ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4657a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri for (i = 0; i < ab8500->mask_size; i++) 4667a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri if (ab8500->irq_reg_offset[i] == latch_offset) 4677a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri break; 4687ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4697a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri if (i >= ab8500->mask_size) { 4707a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri dev_err(ab8500->dev, "Register offset 0x%2x not declared\n", 4717a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri latch_offset); 4727a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri return -ENXIO; 4737a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri } 4747ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4757a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri /* ignore masked out interrupts */ 4767a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri latch_val &= ~ab8500->mask[i]; 4777ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4787a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri while (latch_val) { 4797a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri int_bit = __ffs(latch_val); 4807ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN line = (i << 3) + int_bit; 4817ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_val &= ~(1 << int_bit); 4827ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 483e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij /* 484e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij * This handles the falling edge hwirqs from the GPIO 485e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij * lines. Route them back to the line registered for the 486e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij * rising IRQ, as this is merely a flag for the same IRQ 487e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij * in linux terms. 488e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij */ 489e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij if (line >= AB8500_INT_GPIO6F && line <= AB8500_INT_GPIO41F) 490e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij line -= 16; 491e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij if (line >= AB9540_INT_GPIO50F && line <= AB9540_INT_GPIO54F) 492e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij line -= 8; 493e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij if (line == AB8540_INT_GPIO43F || line == AB8540_INT_GPIO44F) 494e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij line += 1; 495e2ddf46ab4ab40a657a1808cf4e358c46ae1ba68Linus Walleij 496ed83d301eac2ca7c1315d0e283e1c14c07a53e16Linus Walleij handle_nested_irq(irq_create_mapping(ab8500->domain, line)); 4977a93fb375437225ee89a15652a887547450f3d2aFabio Baltieri } 4987ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 4997ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 5007ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 5017ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5027ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic int ab8500_handle_hierarchical_latch(struct ab8500 *ab8500, 5037ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int hier_offset, u8 hier_val) 5047ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 5057ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int latch_bit, status; 5067ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 latch_offset, latch_val; 5077ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5087ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN do { 5097ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_bit = __ffs(hier_val); 5107ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset = (hier_offset << 3) + latch_bit; 5117ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5123e1a498f2728476535571d270081a17fdfceaf26Lee Jones update_latch_offset(&latch_offset, hier_offset); 5137ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5147ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, 5157ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_INTERRUPT, 5167ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCH1_REG + latch_offset, 5177ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN &latch_val); 5187ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || latch_val == 0) 5197ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN goto discard; 5207ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5217ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_line(ab8500, 5227ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN latch_offset, latch_val); 5237ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 5247ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return status; 5257ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENdiscard: 5267ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN hier_val &= ~(1 << latch_bit); 5277ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } while (hier_val); 5287ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5297ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return 0; 5307ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 5317ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5327ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUENstatic irqreturn_t ab8500_hierarchical_irq(int irq, void *dev) 5337ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN{ 5347ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN struct ab8500 *ab8500 = dev; 5357ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 i; 5367ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5377ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN dev_vdbg(ab8500->dev, "interrupt\n"); 5387ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5397ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN /* Hierarchical interrupt version */ 5403e1a498f2728476535571d270081a17fdfceaf26Lee Jones for (i = 0; i < (ab8500->it_latchhier_num); i++) { 5417ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN int status; 5427ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN u8 hier_val; 5437ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5447ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = get_register_interruptible(ab8500, AB8500_INTERRUPT, 5457ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN AB8500_IT_LATCHHIER1_REG + i, &hier_val); 5467ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0 || hier_val == 0) 5477ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN continue; 5487ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 5497ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN status = ab8500_handle_hierarchical_latch(ab8500, i, hier_val); 5507ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN if (status < 0) 5517ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN break; 5527ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN } 5537ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN return IRQ_HANDLED; 5547ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN} 5557ccfe9b1d58ef5cf8fdbd50b6ee2ae0e9aa9cb36Michel JAOUEN 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 = { 5787ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones .map = ab8500_irq_map, 5797ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee 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 5863e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (is_ab8540(ab8500)) 5873e1a498f2728476535571d270081a17fdfceaf26Lee Jones num_irqs = AB8540_NR_IRQS; 5883e1a498f2728476535571d270081a17fdfceaf26Lee Jones else if (is_ab9540(ab8500)) 589d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB9540_NR_IRQS; 590a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson else if (is_ab8505(ab8500)) 591a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson num_irqs = AB8505_NR_IRQS; 592d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 593d6255529b2639de542324f314b93939b7996a7c5Linus Walleij num_irqs = AB8500_NR_IRQS; 59462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 595f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij /* If ->irq_base is zero this will give a linear mapping */ 5967602e05df73f3c775d5ef808c0bc4af9711e4438Grygorii Strashko ab8500->domain = irq_domain_add_simple(ab8500->dev->of_node, 597f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij num_irqs, 0, 598f1d11f394f6e3fc0368e72244fb5ddc4142e804bLinus Walleij &ab8500_irq_ops, ab8500); 59906e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 60006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (!ab8500->domain) { 60106e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones dev_err(ab8500->dev, "Failed to create irqdomain\n"); 60206e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return -ENOSYS; 60306e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones } 60406e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 60506e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return 0; 60662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 60762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 608112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aabergint ab8500_suspend(struct ab8500 *ab8500) 609112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg{ 610112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg if (atomic_read(&ab8500->transfer_ongoing)) 611112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg return -EINVAL; 612f35563027f4555fee8a6ee5a8c775cbf0c9ad4efLee Jones 613f35563027f4555fee8a6ee5a8c775cbf0c9ad4efLee Jones return 0; 614112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg} 615112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg 616a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_gpadc_resources[] = { 61762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 61862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "HW_CONV_END", 61962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_HW_ADC_CONV_END, 62062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_HW_ADC_CONV_END, 62162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 62262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 62362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 62462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "SW_CONV_END", 62562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_GP_SW_ADC_CONV_END, 62662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_GP_SW_ADC_CONV_END, 62762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 62862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 62962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 63062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 6314b106fb9895c7edba2acd41c152e8f6edf724651Lee Jonesstatic struct resource ab8505_gpadc_resources[] = { 632c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 633c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "SW_CONV_END", 634c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .start = AB8500_INT_GP_SW_ADC_CONV_END, 635c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .end = AB8500_INT_GP_SW_ADC_CONV_END, 636c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .flags = IORESOURCE_IRQ, 637c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 638c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones}; 639c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones 640a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_rtc_resources[] = { 64162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 64262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "60S", 64362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_60S, 64462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_60S, 64562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 64662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 64762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 64862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ALARM", 64962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .start = AB8500_INT_RTC_ALARM, 65062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .end = AB8500_INT_RTC_ALARM, 65162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .flags = IORESOURCE_IRQ, 65262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 65362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent}; 65462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 6559c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torguestatic struct resource ab8540_rtc_resources[] = { 6569c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue { 6579c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .name = "1S", 6589c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .start = AB8540_INT_RTC_1S, 6599c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .end = AB8540_INT_RTC_1S, 6609c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .flags = IORESOURCE_IRQ, 6619c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue }, 6629c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue { 6639c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .name = "ALARM", 6649c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .start = AB8500_INT_RTC_ALARM, 6659c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .end = AB8500_INT_RTC_ALARM, 6669c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .flags = IORESOURCE_IRQ, 6679c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue }, 6689c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue}; 6699c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue 670a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_poweronkey_db_resources[] = { 67177686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 67277686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBF", 67377686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_F, 67477686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_F, 67577686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 67677686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 67777686517977e77d101c8a7b397717df00a88922bSundar R Iyer { 67877686517977e77d101c8a7b397717df00a88922bSundar R Iyer .name = "ONKEY_DBR", 67977686517977e77d101c8a7b397717df00a88922bSundar R Iyer .start = AB8500_INT_PON_KEY1DB_R, 68077686517977e77d101c8a7b397717df00a88922bSundar R Iyer .end = AB8500_INT_PON_KEY1DB_R, 68177686517977e77d101c8a7b397717df00a88922bSundar R Iyer .flags = IORESOURCE_IRQ, 68277686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 68377686517977e77d101c8a7b397717df00a88922bSundar R Iyer}; 68477686517977e77d101c8a7b397717df00a88922bSundar R Iyer 685a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_av_acc_detect_resources[] = { 686e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_F", 6886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_F, 6896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_F, 6906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 691e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 692e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 6936af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_1DB_R", 6946af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_1DB_R, 6956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_1DB_R, 6966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 6976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 6986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 6996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_F", 7006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_F, 7016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_F, 7026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7036af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7046af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7056af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_21DB_R", 7066af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_21DB_R, 7076af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_21DB_R, 7086af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7116af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_F", 7126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_F, 7136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_F, 7146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 715e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 716e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7176af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ACC_DETECT_22DB_R", 7186af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ACC_DETECT_22DB_R, 7196af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ACC_DETECT_22DB_R, 7206af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7216af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7226af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 7236af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 724a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_charger_resources[] = { 7256af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 726e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CH_UNPLUG_DET", 727e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_UNPLUG_DET, 728e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_UNPLUG_DET, 729e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 730e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 731e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 732e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "MAIN_CHARGE_PLUG_DET", 733e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_CH_PLUG_DET, 734e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_CH_PLUG_DET, 735e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 736e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 737e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 738e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 739e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 740e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 741e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 742e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 743e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "VBUS_DET_F", 7456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_VBUS_DET_F, 7466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_VBUS_DET_F, 747e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 748e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 749e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_LINK_STATUS", 7516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_LINK_STATUS, 7526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_LINK_STATUS, 7536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7556af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 756e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_OVV", 757e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_OVV, 758e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_OVV, 759e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 760e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 761e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_R", 7636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_R, 7646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_R, 765e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 766e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 767e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CH_TH_PROT_F", 7696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_USB_CH_TH_PROT_F, 7706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_USB_CH_TH_PROT_F, 771e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 772e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 773e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 7746af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_EXT_CH_NOT_OK", 7756af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7766af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 7776af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7786af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7796af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7806af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_R", 7816af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_R, 7826af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_R, 7836af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7856af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7866af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "MAIN_CH_TH_PROT_F", 7876af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_MAIN_CH_TH_PROT_F, 7886af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_MAIN_CH_TH_PROT_F, 7896af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7906af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7916af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7926af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_CHARGER_NOT_OKR", 793a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_USB_CHARGER_NOT_OKR, 794a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_USB_CHARGER_NOT_OKR, 7956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 7966af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 7976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 7986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CH_WD_EXP", 7996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CH_WD_EXP, 8006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CH_WD_EXP, 8016af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8026af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 80334c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson { 80434c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson .name = "VBUS_CH_DROP_END", 80534c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson .start = AB8500_INT_VBUS_CH_DROP_END, 80634c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson .end = AB8500_INT_VBUS_CH_DROP_END, 80734c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson .flags = IORESOURCE_IRQ, 80834c11a709e928090cf34ecd706f7d3170f4e5026Paer-Olof Haakansson }, 8096af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 8106af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 811a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_btemp_resources[] = { 8126af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8136af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BAT_CTRL_INDB", 8146af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BAT_CTRL_INDB, 8156af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BAT_CTRL_INDB, 816e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 817e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 818e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 819e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_LOW", 820e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_LOW, 821e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_LOW, 822e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 823e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 824e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 825e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "BTEMP_HIGH", 826e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_BTEMP_HIGH, 827e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_BTEMP_HIGH, 828e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 829e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 830e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8316af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_LOW_MEDIUM", 8326af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_LOW_MEDIUM, 8336af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_LOW_MEDIUM, 834e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 835e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 836e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8376af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BTEMP_MEDIUM_HIGH", 8386af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BTEMP_MEDIUM_HIGH, 8396af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BTEMP_MEDIUM_HIGH, 840e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 841e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 8426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij}; 8436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 844a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_fg_resources[] = { 845e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "NCONV_ACCU", 8476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CCN_CONV_ACC, 8486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CCN_CONV_ACC, 849e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 850e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 851e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "BATT_OVV", 8536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_BATT_OVV, 8546af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_BATT_OVV, 855e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 856e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 857e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8586af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_F", 8596af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_F, 8606af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_F, 8616af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8626af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8636af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8646af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "LOW_BAT_R", 8656af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_LOW_BAT_R, 8666af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_LOW_BAT_R, 8676af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 8686af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 8696af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 8706af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "CC_INT_CALIB", 8716af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_CC_INT_CALIB, 8726af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_CC_INT_CALIB, 873e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 874e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 875a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson { 876a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .name = "CCEOC", 877a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_CCEOC, 878a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_CCEOC, 879a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .flags = IORESOURCE_IRQ, 880a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson }, 881e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 882e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 883a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_chargalg_resources[] = {}; 8846af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij 885df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#ifdef CONFIG_DEBUG_FS 886a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_debug_resources[] = { 887e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 8886999181eecb11863b78030c68037a9f851522735Linus Walleij .name = "IRQ_AB8500", 8896999181eecb11863b78030c68037a9f851522735Linus Walleij /* 8906999181eecb11863b78030c68037a9f851522735Linus Walleij * Number will be filled in. NOTE: this is deliberately 8916999181eecb11863b78030c68037a9f851522735Linus Walleij * not flagged as an IRQ in ordet to avoid remapping using 8926999181eecb11863b78030c68037a9f851522735Linus Walleij * the irqdomain in the MFD core, so that this IRQ passes 8936999181eecb11863b78030c68037a9f851522735Linus Walleij * unremapped to the debug code. 8946999181eecb11863b78030c68037a9f851522735Linus Walleij */ 8956999181eecb11863b78030c68037a9f851522735Linus Walleij }, 8966999181eecb11863b78030c68037a9f851522735Linus Walleij { 897e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_FIRST", 898e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_MAIN_EXT_CH_NOT_OK, 899e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_MAIN_EXT_CH_NOT_OK, 900e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 901e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 902e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 903e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "IRQ_LAST", 904a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .start = AB8500_INT_XTAL32K_KO, 905a982362c1723464fec0414f6460684844f2638f3Bengt Jonsson .end = AB8500_INT_XTAL32K_KO, 906e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 907e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 908e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 909df7206477e36bb73e81b99c2cbbc1b91e4b1c8acAxel Lin#endif 910e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 911a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_usb_resources[] = { 912e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 913e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_R", 914e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_R, 915e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_R, 916e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 917e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 918e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 919e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ID_WAKEUP_F", 920e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_ID_WAKEUP_F, 921e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_ID_WAKEUP_F, 922e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 923e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 924e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 925e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_F", 926e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_F, 927e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_F, 928e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 929e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 930e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 931e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "VBUS_DET_R", 932e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_VBUS_DET_R, 933e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_VBUS_DET_R, 934e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 935e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 93692d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin { 93792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .name = "USB_LINK_STATUS", 93892d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .start = AB8500_INT_USB_LINK_STATUS, 93992d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .end = AB8500_INT_USB_LINK_STATUS, 94092d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin .flags = IORESOURCE_IRQ, 94192d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin }, 9426af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9436af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_PLUG", 9446af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_PLUG, 9456af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_PLUG, 9466af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9476af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 9486af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 9496af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "USB_ADP_PROBE_UNPLUG", 9506af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .start = AB8500_INT_ADP_PROBE_UNPLUG, 9516af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .end = AB8500_INT_ADP_PROBE_UNPLUG, 9526af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .flags = IORESOURCE_IRQ, 9536af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 954e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 955e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 956a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8505_iddet_resources[] = { 95744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 95844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyDeglitch", 95944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYDEGLITCH, 96044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYDEGLITCH, 96144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 96244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 96344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 96444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KP", 96544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KP, 96644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KP, 96744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 96844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 96944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 97044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKP", 97144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKP, 97244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKP, 97344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 97444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 97544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 97644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "IKR", 97744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_IKR, 97844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_IKR, 97944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 98044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 98144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 98244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "KeyStuck", 98344f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .start = AB8505_INT_KEYSTUCK, 98444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .end = AB8505_INT_KEYSTUCK, 98544f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .flags = IORESOURCE_IRQ, 98644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 987492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones { 988492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .name = "VBUS_DET_R", 989492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .start = AB8500_INT_VBUS_DET_R, 990492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .end = AB8500_INT_VBUS_DET_R, 991492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .flags = IORESOURCE_IRQ, 992492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones }, 993492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones { 994492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .name = "VBUS_DET_F", 995492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .start = AB8500_INT_VBUS_DET_F, 996492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .end = AB8500_INT_VBUS_DET_F, 997492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .flags = IORESOURCE_IRQ, 998492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones }, 999492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones { 1000492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .name = "ID_DET_PLUGR", 1001492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .start = AB8500_INT_ID_DET_PLUGR, 1002492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .end = AB8500_INT_ID_DET_PLUGR, 1003492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .flags = IORESOURCE_IRQ, 1004492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones }, 1005492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones { 1006492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .name = "ID_DET_PLUGF", 1007492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .start = AB8500_INT_ID_DET_PLUGF, 1008492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .end = AB8500_INT_ID_DET_PLUGF, 1009492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones .flags = IORESOURCE_IRQ, 1010492390c8fd4a90b1e4ca371c8f8a23c63b04d7f9Lee Jones }, 101144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 101244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 1013a9e9ce4c41672cf3f6fcb1288bfd6b26c1f2a917Bill Pembertonstatic struct resource ab8500_temp_resources[] = { 1014e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1015151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang .name = "ABX500_TEMP_WARM", 1016e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .start = AB8500_INT_TEMP_WARM, 1017e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .end = AB8500_INT_TEMP_WARM, 1018e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .flags = IORESOURCE_IRQ, 1019e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1020e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin}; 1021e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin 10225ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8500_bm_devs[] = { 10234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 10244b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-charger", 10254b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .of_compatible = "stericsson,ab8500-charger", 10264b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_charger_resources), 10274b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_charger_resources, 10284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .platform_data = &ab8500_bm_data, 10294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .pdata_size = sizeof(ab8500_bm_data), 10304b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 10314b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 10324b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-btemp", 10334b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .of_compatible = "stericsson,ab8500-btemp", 10344b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_btemp_resources), 10354b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_btemp_resources, 10364b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .platform_data = &ab8500_bm_data, 10374b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .pdata_size = sizeof(ab8500_bm_data), 10384b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 10394b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 10404b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-fg", 10414b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .of_compatible = "stericsson,ab8500-fg", 10424b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_fg_resources), 10434b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_fg_resources, 10444b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .platform_data = &ab8500_bm_data, 10454b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .pdata_size = sizeof(ab8500_bm_data), 10464b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 10474b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 10484b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-chargalg", 10494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .of_compatible = "stericsson,ab8500-chargalg", 10504b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_chargalg_resources), 10514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_chargalg_resources, 10524b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .platform_data = &ab8500_bm_data, 10534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .pdata_size = sizeof(ab8500_bm_data), 10544b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 10554b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones}; 10564b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones 10575ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8500_devs[] = { 10585814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#ifdef CONFIG_DEBUG_FS 10595814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin { 10605814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin .name = "ab8500-debug", 1061bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-debug", 1062e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_debug_resources), 1063e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_debug_resources, 10645814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin }, 10655814fc35e1837e30b82c3d57f41310d4c4c52824Mattias Wallin#endif 106662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent { 1067e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-sysctrl", 1068bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-sysctrl", 1069e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1070e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 107153f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones .name = "ab8500-ext-regulator", 107253f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones .of_compatible = "stericsson,ab8500-ext-regulator", 107353f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones }, 107453f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones { 1075e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-regulator", 1076bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-regulator", 1077e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1078e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1079916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson .name = "abx500-clk", 1080916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson .of_compatible = "stericsson,abx500-clk", 1081916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson }, 1082916a871c48ef3ecbc4cac8f185c03160d0b42bfdUlf Hansson { 10834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-gpadc", 1084955de2eab3fd89bc6d5735817710926ba5817450Lee Jones .of_compatible = "stericsson,ab8500-gpadc", 10854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), 10864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_gpadc_resources, 10874b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 10884b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 108962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .name = "ab8500-rtc", 1090bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-rtc", 109162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 109262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent .resources = ab8500_rtc_resources, 109362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent }, 1094f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 10956af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .name = "ab8500-acc-det", 1096bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-acc-det", 10976af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 10986af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij .resources = ab8500_av_acc_detect_resources, 10996af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij }, 11006af75ecd5772eee4d7be974a881fd5a25f218b0bLinus Walleij { 11014b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones 1102e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-poweron-key", 1103bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-poweron-key", 1104e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 1105e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_poweronkey_db_resources, 1106e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1107e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1108f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1109bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1110f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 1, 1111f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1112f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1113f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1114bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1115f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 2, 1116f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1117f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy { 1118f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .name = "ab8500-pwm", 1119bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-pwm", 1120f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy .id = 3, 1121f0f05b1c751772d19c9c8f36d75e97b1d9687407Arun Murthy }, 1122bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones { 1123e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .name = "ab8500-denc", 1124bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones .of_compatible = "stericsson,ab8500-denc", 1125e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin }, 1126e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin { 1127eb696c3181dd5b2266794776519120abdfe127d9Lee Jones .name = "pinctrl-ab8500", 11284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .of_compatible = "stericsson,ab8500-gpio", 11294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 11304b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 1131151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang .name = "abx500-temp", 1132151621a704fc7b8eaa1d6905bec0c6388b0a57afHongbo Zhang .of_compatible = "stericsson,abx500-temp", 1133e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .num_resources = ARRAY_SIZE(ab8500_temp_resources), 1134e098aded79f24e2024139e82f778ff9db6dc142aMattias Wallin .resources = ab8500_temp_resources, 113577686517977e77d101c8a7b397717df00a88922bSundar R Iyer }, 11366ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 11374b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-usb", 1138f201f730b82393aa4969171d724025a82f7099daFabio Baltieri .of_compatible = "stericsson,ab8500-usb", 11394b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_usb_resources), 11404b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_usb_resources, 11416ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 11426ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson { 11434b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-codec", 1144fccf14ad1e4f09a4033908ead9bf3f393979d54bFabio Baltieri .of_compatible = "stericsson,ab8500-codec", 11456ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson }, 11466ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson}; 11476ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 11485ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab9540_devs[] = { 11494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS 1150d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 11514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-debug", 11524b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_debug_resources), 11534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_debug_resources, 1154d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 11554b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif 1156d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 11574b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-sysctrl", 1158d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 115944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 116053f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones .name = "ab8500-ext-regulator", 116153f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones }, 116253f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones { 11634b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-regulator", 116444f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1165c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 11669ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .name = "abx500-clk", 11679ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .of_compatible = "stericsson,abx500-clk", 11689ee17676a5a36621db020c596e766fec24aae959Ulf Hansson }, 11699ee17676a5a36621db020c596e766fec24aae959Ulf Hansson { 1170c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "ab8500-gpadc", 1171c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .of_compatible = "stericsson,ab8500-gpadc", 1172c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .num_resources = ARRAY_SIZE(ab8500_gpadc_resources), 1173c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .resources = ab8500_gpadc_resources, 1174c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 11754b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 11764b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-rtc", 11774b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 11784b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_rtc_resources, 11794b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 11804b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 11814b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-acc-det", 11824b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 11834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_av_acc_detect_resources, 11844b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 11854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 11864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-poweron-key", 11874b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 11884b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_poweronkey_db_resources, 11894b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 11904b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 11914b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-pwm", 11924b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .id = 1, 11934b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 11944b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 11954b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "abx500-temp", 11964b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_temp_resources), 11974b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_temp_resources, 11984b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 1199d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1200e64d905e28031031c52db403826cd3bfe060b181Lee Jones .name = "pinctrl-ab9540", 1201e64d905e28031031c52db403826cd3bfe060b181Lee Jones .of_compatible = "stericsson,ab9540-gpio", 1202d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 1203d6255529b2639de542324f314b93939b7996a7c5Linus Walleij { 1204d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .name = "ab9540-usb", 1205d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1206d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .resources = ab8500_usb_resources, 1207d6255529b2639de542324f314b93939b7996a7c5Linus Walleij }, 120844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath { 120944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab9540-codec", 121044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1211c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 1212c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "ab-iddet", 1213c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .num_resources = ARRAY_SIZE(ab8505_iddet_resources), 1214c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .resources = ab8505_iddet_resources, 1215c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 121644f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath}; 121744f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 1218c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones/* Device list for ab8505 */ 12195ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8505_devs[] = { 12204b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS 12214b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12224b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-debug", 12234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_debug_resources), 12244b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_debug_resources, 12254b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12264b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif 12274b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12284b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-sysctrl", 12294b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12304b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12314b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-regulator", 12324b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12334b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12349ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .name = "abx500-clk", 12359ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .of_compatible = "stericsson,abx500-clk", 12369ee17676a5a36621db020c596e766fec24aae959Ulf Hansson }, 12379ee17676a5a36621db020c596e766fec24aae959Ulf Hansson { 12384b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-gpadc", 1239955de2eab3fd89bc6d5735817710926ba5817450Lee Jones .of_compatible = "stericsson,ab8500-gpadc", 12404b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8505_gpadc_resources), 12414b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8505_gpadc_resources, 12424b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12434b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12444b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-rtc", 12454b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 12464b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_rtc_resources, 12474b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12484b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12494b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-acc-det", 12504b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 12514b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_av_acc_detect_resources, 12524b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12534b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12544b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-poweron-key", 12554b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 12564b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_poweronkey_db_resources, 12574b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12584b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12594b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-pwm", 12604b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .id = 1, 12614b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12624b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 1263eb696c3181dd5b2266794776519120abdfe127d9Lee Jones .name = "pinctrl-ab8505", 12644b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12654b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12664b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-usb", 12674b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_usb_resources), 12684b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_usb_resources, 12694b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12704b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12714b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-codec", 12724b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 1273c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 1274c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "ab-iddet", 1275c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .num_resources = ARRAY_SIZE(ab8505_iddet_resources), 1276c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .resources = ab8505_iddet_resources, 1277c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 1278c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones}; 1279c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones 12805ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_devs[] = { 12814b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#ifdef CONFIG_DEBUG_FS 12824b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12834b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-debug", 12844b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_debug_resources), 12854b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_debug_resources, 12864b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12874b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones#endif 12884b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12894b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-sysctrl", 12904b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12914b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 129253f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones .name = "ab8500-ext-regulator", 129353f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones }, 129453f325be2f99fb1e5dbbfc1f7707a9a6c97c83c2Lee Jones { 12954b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-regulator", 12964b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 12974b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 12989ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .name = "abx500-clk", 12999ee17676a5a36621db020c596e766fec24aae959Ulf Hansson .of_compatible = "stericsson,abx500-clk", 13009ee17676a5a36621db020c596e766fec24aae959Ulf Hansson }, 13019ee17676a5a36621db020c596e766fec24aae959Ulf Hansson { 13024b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-gpadc", 1303955de2eab3fd89bc6d5735817710926ba5817450Lee Jones .of_compatible = "stericsson,ab8500-gpadc", 13044b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8505_gpadc_resources), 13054b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8505_gpadc_resources, 13064b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 13074b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 13084b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-acc-det", 13094b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_av_acc_detect_resources), 13104b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_av_acc_detect_resources, 13114b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 13124b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 13134b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-poweron-key", 13144b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_poweronkey_db_resources), 13154b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_poweronkey_db_resources, 13164b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 13174b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 13184b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "ab8500-pwm", 13194b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .id = 1, 13204b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 13214b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones { 13224b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .name = "abx500-temp", 13234b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .num_resources = ARRAY_SIZE(ab8500_temp_resources), 13244b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones .resources = ab8500_temp_resources, 13254b106fb9895c7edba2acd41c152e8f6edf724651Lee Jones }, 1326c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 1327eb696c3181dd5b2266794776519120abdfe127d9Lee Jones .name = "pinctrl-ab8540", 1328c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 1329c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 1330c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "ab8540-usb", 1331c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .num_resources = ARRAY_SIZE(ab8500_usb_resources), 1332c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .resources = ab8500_usb_resources, 1333c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 1334c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 1335c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones .name = "ab8540-codec", 1336c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones }, 1337c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones { 133844f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .name = "ab-iddet", 133944f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .num_resources = ARRAY_SIZE(ab8505_iddet_resources), 134044f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath .resources = ab8505_iddet_resources, 134144f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath }, 1342d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1343d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 13445ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_cut1_devs[] = { 13459c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue { 13469c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .name = "ab8500-rtc", 13479c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .of_compatible = "stericsson,ab8500-rtc", 13489c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .num_resources = ARRAY_SIZE(ab8500_rtc_resources), 13499c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .resources = ab8500_rtc_resources, 13509c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue }, 13519c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue}; 13529c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue 13535ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell ab8540_cut2_devs[] = { 13549c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue { 13559c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .name = "ab8540-rtc", 13569c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .of_compatible = "stericsson,ab8540-rtc", 13579c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .num_resources = ARRAY_SIZE(ab8540_rtc_resources), 13589c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue .resources = ab8540_rtc_resources, 13599c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue }, 13609c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue}; 13619c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue 1362cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic ssize_t show_chip_id(struct device *dev, 1363cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct device_attribute *attr, char *buf) 1364cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin{ 1365cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin struct ab8500 *ab8500; 1366cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1367cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin ab8500 = dev_get_drvdata(dev); 1368e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones 1369cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin return sprintf(buf, "%#x\n", ab8500 ? ab8500->chip_id : -EINVAL); 1370cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin} 1371cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1372e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin/* 1373e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1374e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1375e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1376e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1377e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1378e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1379e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1380e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1381e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1382e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1383e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic ssize_t show_switch_off_status(struct device *dev, 1384e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct device_attribute *attr, char *buf) 1385e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin{ 1386e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin int ret; 1387e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin u8 value; 1388e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin struct ab8500 *ab8500; 1389e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1390e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ab8500 = dev_get_drvdata(dev); 1391e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1392e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1393e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1394e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1395e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return sprintf(buf, "%#x\n", value); 1396e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin} 1397e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1398f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan/* use mask and set to override the register turn_on_stat value */ 1399f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajanvoid ab8500_override_turn_on_stat(u8 mask, u8 set) 1400f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan{ 1401f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan spin_lock(&on_stat_lock); 1402f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan turn_on_stat_mask = mask; 1403f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan turn_on_stat_set = set; 1404f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan spin_unlock(&on_stat_lock); 1405f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan} 1406f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan 1407b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn/* 1408b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * ab8500 has turned on due to (TURN_ON_STATUS): 1409b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x01 PORnVbat 1410b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x02 PonKey1dbF 1411b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x04 PonKey2dbF 1412b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x08 RTCAlarm 1413b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x10 MainChDet 1414b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x20 VbusDet 1415b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x40 UsbIDDetect 1416b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn * 0x80 Reserved 1417b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn */ 1418b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic ssize_t show_turn_on_status(struct device *dev, 1419b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct device_attribute *attr, char *buf) 1420b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn{ 1421b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn int ret; 1422b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn u8 value; 1423b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn struct ab8500 *ab8500; 1424b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 1425b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ab8500 = dev_get_drvdata(dev); 1426b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, 1427b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn AB8500_TURN_ON_STATUS, &value); 1428b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn if (ret < 0) 1429b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return ret; 1430f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan 1431f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan /* 1432f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan * In L9540, turn_on_status register is not updated correctly if 1433f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan * the device is rebooted with AC/USB charger connected. Due to 1434f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan * this, the device boots android instead of entering into charge 1435f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan * only mode. Read the AC/USB status register to detect the charger 1436f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan * presence and update the turn on status manually. 1437f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan */ 1438f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan if (is_ab9540(ab8500)) { 1439f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan spin_lock(&on_stat_lock); 1440f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan value = (value & turn_on_stat_mask) | turn_on_stat_set; 1441f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan spin_unlock(&on_stat_lock); 1442f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan } 1443f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan 1444b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn return sprintf(buf, "%#x\n", value); 1445b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn} 1446b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn 144793ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic ssize_t show_turn_on_status_2(struct device *dev, 144893ff722e88530b9719cbf53be4f3197722461394Lee Jones struct device_attribute *attr, char *buf) 144993ff722e88530b9719cbf53be4f3197722461394Lee Jones{ 145093ff722e88530b9719cbf53be4f3197722461394Lee Jones int ret; 145193ff722e88530b9719cbf53be4f3197722461394Lee Jones u8 value; 145293ff722e88530b9719cbf53be4f3197722461394Lee Jones struct ab8500 *ab8500; 145393ff722e88530b9719cbf53be4f3197722461394Lee Jones 145493ff722e88530b9719cbf53be4f3197722461394Lee Jones ab8500 = dev_get_drvdata(dev); 145593ff722e88530b9719cbf53be4f3197722461394Lee Jones ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, 145693ff722e88530b9719cbf53be4f3197722461394Lee Jones AB8505_TURN_ON_STATUS_2, &value); 145793ff722e88530b9719cbf53be4f3197722461394Lee Jones if (ret < 0) 145893ff722e88530b9719cbf53be4f3197722461394Lee Jones return ret; 145993ff722e88530b9719cbf53be4f3197722461394Lee Jones return sprintf(buf, "%#x\n", (value & 0x1)); 146093ff722e88530b9719cbf53be4f3197722461394Lee Jones} 146193ff722e88530b9719cbf53be4f3197722461394Lee Jones 1462d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t show_ab9540_dbbrstn(struct device *dev, 1463d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, char *buf) 1464d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1465d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1466d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret; 1467d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 value; 1468d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1469d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1470d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1471d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = get_register_interruptible(ab8500, AB8500_REGU_CTRL2, 1472d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_REG, &value); 1473d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (ret < 0) 1474d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1475d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1476d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return sprintf(buf, "%d\n", 1477d6255529b2639de542324f314b93939b7996a7c5Linus Walleij (value & AB9540_MODEM_CTRL2_SWDBBRSTN_BIT) ? 1 : 0); 1478d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1479d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1480d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic ssize_t store_ab9540_dbbrstn(struct device *dev, 1481d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct device_attribute *attr, const char *buf, size_t count) 1482d6255529b2639de542324f314b93939b7996a7c5Linus Walleij{ 1483d6255529b2639de542324f314b93939b7996a7c5Linus Walleij struct ab8500 *ab8500; 1484d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int ret = count; 1485d6255529b2639de542324f314b93939b7996a7c5Linus Walleij int err; 1486d6255529b2639de542324f314b93939b7996a7c5Linus Walleij u8 bitvalues; 1487d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1488d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500 = dev_get_drvdata(dev); 1489d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1490d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (count > 0) { 1491d6255529b2639de542324f314b93939b7996a7c5Linus Walleij switch (buf[0]) { 1492d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '0': 1493d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = 0; 1494d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1495d6255529b2639de542324f314b93939b7996a7c5Linus Walleij case '1': 1496d6255529b2639de542324f314b93939b7996a7c5Linus Walleij bitvalues = AB9540_MODEM_CTRL2_SWDBBRSTN_BIT; 1497d6255529b2639de542324f314b93939b7996a7c5Linus Walleij break; 1498d6255529b2639de542324f314b93939b7996a7c5Linus Walleij default: 1499d6255529b2639de542324f314b93939b7996a7c5Linus Walleij goto exit; 1500d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1501d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1502d6255529b2639de542324f314b93939b7996a7c5Linus Walleij err = mask_and_set_register_interruptible(ab8500, 1503d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB8500_REGU_CTRL2, AB9540_MODEM_CTRL2_REG, 1504d6255529b2639de542324f314b93939b7996a7c5Linus Walleij AB9540_MODEM_CTRL2_SWDBBRSTN_BIT, bitvalues); 1505d6255529b2639de542324f314b93939b7996a7c5Linus Walleij if (err) 1506d6255529b2639de542324f314b93939b7996a7c5Linus Walleij dev_info(ab8500->dev, 1507d6255529b2639de542324f314b93939b7996a7c5Linus Walleij "Failed to set DBBRSTN %c, err %#x\n", 1508d6255529b2639de542324f314b93939b7996a7c5Linus Walleij buf[0], err); 1509d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 1510d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1511d6255529b2639de542324f314b93939b7996a7c5Linus Walleijexit: 1512d6255529b2639de542324f314b93939b7996a7c5Linus Walleij return ret; 1513d6255529b2639de542324f314b93939b7996a7c5Linus Walleij} 1514d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1515cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic DEVICE_ATTR(chip_id, S_IRUGO, show_chip_id, NULL); 1516e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallinstatic DEVICE_ATTR(switch_off_status, S_IRUGO, show_switch_off_status, NULL); 1517b4a310373209b87ba455f45227b5361cb746b946Andrew Lynnstatic DEVICE_ATTR(turn_on_status, S_IRUGO, show_turn_on_status, NULL); 151893ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic DEVICE_ATTR(turn_on_status_2, S_IRUGO, show_turn_on_status_2, NULL); 1519d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic DEVICE_ATTR(dbbrstn, S_IRUGO | S_IWUSR, 1520d6255529b2639de542324f314b93939b7996a7c5Linus Walleij show_ab9540_dbbrstn, store_ab9540_dbbrstn); 1521cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 1522cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute *ab8500_sysfs_entries[] = { 1523cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin &dev_attr_chip_id.attr, 1524e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin &dev_attr_switch_off_status.attr, 1525b4a310373209b87ba455f45227b5361cb746b946Andrew Lynn &dev_attr_turn_on_status.attr, 1526cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin NULL, 1527cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1528cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 152993ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic struct attribute *ab8505_sysfs_entries[] = { 153093ff722e88530b9719cbf53be4f3197722461394Lee Jones &dev_attr_turn_on_status_2.attr, 153193ff722e88530b9719cbf53be4f3197722461394Lee Jones NULL, 153293ff722e88530b9719cbf53be4f3197722461394Lee Jones}; 153393ff722e88530b9719cbf53be4f3197722461394Lee Jones 1534d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute *ab9540_sysfs_entries[] = { 1535d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_chip_id.attr, 1536d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_switch_off_status.attr, 1537d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_turn_on_status.attr, 1538d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &dev_attr_dbbrstn.attr, 1539d6255529b2639de542324f314b93939b7996a7c5Linus Walleij NULL, 1540d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1541d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1542cca69b67b3ba954ed8642583295b51933f902227Mattias Wallinstatic struct attribute_group ab8500_attr_group = { 1543cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin .attrs = ab8500_sysfs_entries, 1544cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin}; 1545cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin 154693ff722e88530b9719cbf53be4f3197722461394Lee Jonesstatic struct attribute_group ab8505_attr_group = { 154793ff722e88530b9719cbf53be4f3197722461394Lee Jones .attrs = ab8505_sysfs_entries, 154893ff722e88530b9719cbf53be4f3197722461394Lee Jones}; 154993ff722e88530b9719cbf53be4f3197722461394Lee Jones 1550d6255529b2639de542324f314b93939b7996a7c5Linus Walleijstatic struct attribute_group ab9540_attr_group = { 1551d6255529b2639de542324f314b93939b7996a7c5Linus Walleij .attrs = ab9540_sysfs_entries, 1552d6255529b2639de542324f314b93939b7996a7c5Linus Walleij}; 1553d6255529b2639de542324f314b93939b7996a7c5Linus Walleij 1554f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int ab8500_probe(struct platform_device *pdev) 155562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 15567ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones static const char *switch_off_status[] = { 1557b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Swoff bit programming", 1558b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Thermal protection activation", 1559b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Vbat lower then BattOk falling threshold", 1560b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Watchdog expired", 1561b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Non presence of 32kHz clock", 1562b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Battery level lower than power on reset threshold", 1563b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "Power on key 1 pressed longer than 10 seconds", 1564b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg "DB8500 thermal shutdown"}; 15657ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones static const char *turn_on_status[] = { 1566abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "Battery rising (Vbat)", 1567abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "Power On Key 1 dbF", 1568abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "Power On Key 2 dbF", 1569abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "RTC Alarm", 1570abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "Main Charger Detect", 1571abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "Vbus Detect (USB)", 1572abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "USB ID Detect", 1573abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin "UART Factory Mode Detect"}; 1574d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500_platform_data *plat = dev_get_platdata(&pdev->dev); 1575d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones const struct platform_device_id *platid = platform_get_device_id(pdev); 15766bc4a568414caab05424b702165a732177daccd0Lee Jones enum ab8500_version version = AB8500_VERSION_UNDEFINED; 15776bc4a568414caab05424b702165a732177daccd0Lee Jones struct device_node *np = pdev->dev.of_node; 1578d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500; 1579d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct resource *resource; 158062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int ret; 158162579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent int i; 158247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin u8 value; 158362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 15847ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones ab8500 = devm_kzalloc(&pdev->dev, sizeof(*ab8500), GFP_KERNEL); 1585d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones if (!ab8500) 1586d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return -ENOMEM; 1587d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1588d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->dev = &pdev->dev; 1589d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1590d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones resource = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 1591f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij if (!resource) { 1592f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij dev_err(&pdev->dev, "no IRQ resource\n"); 15938c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return -ENODEV; 1594f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij } 1595d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1596d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones ab8500->irq = resource->start; 1597d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1598822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->read = ab8500_prcmu_read; 1599822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write = ab8500_prcmu_write; 1600822672a7b496e724f879af703693f342e2215163Lee Jones ab8500->write_masked = ab8500_prcmu_write_masked; 1601d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 160262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->lock); 160362579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mutex_init(&ab8500->irq_lock); 1604112a80d29b529d4057777ac2cb4ec15ff5b6d210Jonas Aaberg atomic_set(&ab8500->transfer_ongoing, 0); 160562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1606d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_set_drvdata(pdev, ab8500); 1607d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 16086bc4a568414caab05424b702165a732177daccd0Lee Jones if (platid) 16096bc4a568414caab05424b702165a732177daccd0Lee Jones version = platid->driver_data; 16106bc4a568414caab05424b702165a732177daccd0Lee Jones 16110f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (version != AB8500_VERSION_UNDEFINED) 16120f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = version; 16130f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij else { 16140f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ret = get_register_interruptible(ab8500, AB8500_MISC, 16150f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij AB8500_IC_NAME_REG, &value); 1616f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij if (ret < 0) { 1617f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij dev_err(&pdev->dev, "could not probe HW\n"); 16188c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 1619f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij } 16200f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 16210f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->version = value; 16220f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij } 16230f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 162447c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = get_register_interruptible(ab8500, AB8500_MISC, 162547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin AB8500_REV_REG, &value); 162662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (ret < 0) 16278c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 162862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 162947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ab8500->chip_id = value; 163062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 16310f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij dev_info(ab8500->dev, "detected chip, %s rev. %1x.%1x\n", 16320f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500_version_str[ab8500->version], 16330f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id >> 4, 16340f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij ab8500->chip_id & 0x0F); 16350f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij 16363e1a498f2728476535571d270081a17fdfceaf26Lee Jones /* Configure AB8540 */ 16373e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (is_ab8540(ab8500)) { 16383e1a498f2728476535571d270081a17fdfceaf26Lee Jones ab8500->mask_size = AB8540_NUM_IRQ_REGS; 16393e1a498f2728476535571d270081a17fdfceaf26Lee Jones ab8500->irq_reg_offset = ab8540_irq_regoffset; 16403e1a498f2728476535571d270081a17fdfceaf26Lee Jones ab8500->it_latchhier_num = AB8540_IT_LATCHHIER_NUM; 16417ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones } /* Configure AB8500 or AB9540 IRQ */ 16423e1a498f2728476535571d270081a17fdfceaf26Lee Jones else if (is_ab9540(ab8500) || is_ab8505(ab8500)) { 1643d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB9540_NUM_IRQ_REGS; 1644d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab9540_irq_regoffset; 16453e1a498f2728476535571d270081a17fdfceaf26Lee Jones ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; 1646d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } else { 1647d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->mask_size = AB8500_NUM_IRQ_REGS; 1648d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ab8500->irq_reg_offset = ab8500_irq_regoffset; 16493e1a498f2728476535571d270081a17fdfceaf26Lee Jones ab8500->it_latchhier_num = AB8500_IT_LATCHHIER_NUM; 1650d6255529b2639de542324f314b93939b7996a7c5Linus Walleij } 16517ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones ab8500->mask = devm_kzalloc(&pdev->dev, ab8500->mask_size, 16527ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones GFP_KERNEL); 16532ced445e2ddf65f484a489161accddf475676965Linus Walleij if (!ab8500->mask) 16542ced445e2ddf65f484a489161accddf475676965Linus Walleij return -ENOMEM; 16557ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones ab8500->oldmask = devm_kzalloc(&pdev->dev, ab8500->mask_size, 16567ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones GFP_KERNEL); 16578c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones if (!ab8500->oldmask) 16588c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return -ENOMEM; 16598c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones 1660e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin /* 1661e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * ab8500 has switched off due to (SWITCH_OFF_STATUS): 1662e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x01 Swoff bit programming 1663e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x02 Thermal protection activation 1664e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x04 Vbat lower then BattOk falling threshold 1665e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x08 Watchdog expired 1666e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x10 Non presence of 32kHz clock 1667e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x20 Battery level lower than power on reset threshold 1668e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x40 Power on key 1 pressed longer than 10 seconds 1669e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin * 0x80 DB8500 thermal shutdown 1670e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin */ 1671e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 1672e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin ret = get_register_interruptible(ab8500, AB8500_RTC, 1673e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin AB8500_SWITCH_OFF_STATUS, &value); 1674e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin if (ret < 0) 1675e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin return ret; 1676b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg dev_info(ab8500->dev, "switch off cause(s) (%#x): ", value); 1677b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1678b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value) { 1679b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg for (i = 0; i < ARRAY_SIZE(switch_off_status); i++) { 1680b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg if (value & 1) 16817ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont(" \"%s\"", switch_off_status[i]); 1682b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg value = value >> 1; 1683b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg 1684b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 16857ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont("\n"); 1686b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } else { 16877ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont(" None\n"); 1688b04c530c78464a02963adeed6b6e458535d7cd8fJonas Aaberg } 1689abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin ret = get_register_interruptible(ab8500, AB8500_SYS_CTRL1_BLOCK, 1690abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin AB8500_TURN_ON_STATUS, &value); 1691abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin if (ret < 0) 1692abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin return ret; 1693abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin dev_info(ab8500->dev, "turn on reason(s) (%#x): ", value); 1694abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin 1695abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin if (value) { 1696abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin for (i = 0; i < ARRAY_SIZE(turn_on_status); i++) { 1697abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin if (value & 1) 16987ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont("\"%s\" ", turn_on_status[i]); 1699abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin value = value >> 1; 1700abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin } 17017ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont("\n"); 1702abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin } else { 17037ccf40b1a1aa060cc0c95bf00cf66f9e88636404Lee Jones pr_cont("None\n"); 1704abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin } 1705e5c238c3fde93afdddef36aec2642155c709d93aMattias Wallin 170662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent if (plat && plat->init) 170762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent plat->init(ab8500); 1708abee26cdb685fa47d3d17ec9cf39f6149ce67083Mattias Wallin 1709f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan if (is_ab9540(ab8500)) { 1710f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan ret = get_register_interruptible(ab8500, AB8500_CHARGER, 1711f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan AB8500_CH_USBCH_STAT1_REG, &value); 1712f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan if (ret < 0) 1713f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan return ret; 1714f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan if ((value & VBUS_DET_DBNC1) && (value & VBUS_DET_DBNC100)) 1715f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan ab8500_override_turn_on_stat(~AB8500_POW_KEY_1_ON, 1716f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan AB8500_VBUS_DET); 1717f04a9d8adf766c480353c0f2427e641251c9b059Rajkumar Kasirajan } 171862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 171962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent /* Clear and mask all interrupts */ 17202ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) { 17210f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij /* 17220f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * Interrupt register 12 doesn't exist prior to AB8500 version 17230f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij * 2.0 17240f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij */ 17250f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij if (ab8500->irq_reg_offset[i] == 11 && 17260f620837595145cd42be1c9dc6b619146fbeaf88Linus Walleij is_ab8500_1p1_or_earlier(ab8500)) 172792d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin continue; 172862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 17293e1a498f2728476535571d270081a17fdfceaf26Lee Jones if (ab8500->irq_reg_offset[i] < 0) 17303e1a498f2728476535571d270081a17fdfceaf26Lee Jones continue; 17313e1a498f2728476535571d270081a17fdfceaf26Lee Jones 173247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin get_register_interruptible(ab8500, AB8500_INTERRUPT, 17332ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_LATCH1_REG + ab8500->irq_reg_offset[i], 173492d50a4132977b932ed830fa58c05deeb5c524f0Mattias Wallin &value); 173547c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin set_register_interruptible(ab8500, AB8500_INTERRUPT, 17362ced445e2ddf65f484a489161accddf475676965Linus Walleij AB8500_IT_MASK1_REG + ab8500->irq_reg_offset[i], 0xff); 173762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent } 173862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 173947c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin ret = abx500_register_ops(ab8500->dev, &ab8500_ops); 174047c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin if (ret) 17418c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 174247c1697508f2ec9f6b31ce6c825fe1017871dea6Mattias Wallin 17432ced445e2ddf65f484a489161accddf475676965Linus Walleij for (i = 0; i < ab8500->mask_size; i++) 174462579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent ab8500->mask[i] = ab8500->oldmask[i] = 0xff; 174562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 174606e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones ret = ab8500_irq_init(ab8500, np); 174706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones if (ret) 17488c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 174962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1750f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak ret = devm_request_threaded_irq(&pdev->dev, ab8500->irq, NULL, 1751f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak ab8500_hierarchical_irq, 1752f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak IRQF_ONESHOT | IRQF_NO_SUSPEND, 1753f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak "ab8500", ab8500); 1754f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak if (ret) 1755f348fefd2a227122eb2d723e255c60cf491d0557Dariusz Szymczak return ret; 175662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 175772ef8e4b3bff21e62bba82c40d7b412a305c3a78Fabio Estevam#ifdef CONFIG_DEBUG_FS 17586999181eecb11863b78030c68037a9f851522735Linus Walleij /* Pass to debugfs */ 17596999181eecb11863b78030c68037a9f851522735Linus Walleij ab8500_debug_resources[0].start = ab8500->irq; 17606999181eecb11863b78030c68037a9f851522735Linus Walleij ab8500_debug_resources[0].end = ab8500->irq; 17616999181eecb11863b78030c68037a9f851522735Linus Walleij#endif 17626999181eecb11863b78030c68037a9f851522735Linus Walleij 1763bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (is_ab9540(ab8500)) 1764bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, 1765bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(ab9540_devs), NULL, 1766f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 17679c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue else if (is_ab8540(ab8500)) { 1768c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8540_devs, 1769c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones ARRAY_SIZE(ab8540_devs), NULL, 1770f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 17719c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue if (ret) 17729c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue return ret; 17739c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue 17749c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue if (is_ab8540_1p2_or_earlier(ab8500)) 17759c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut1_devs, 17769c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue ARRAY_SIZE(ab8540_cut1_devs), NULL, 1777f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 17789c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue else /* ab8540 >= cut2 */ 17799c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue ret = mfd_add_devices(ab8500->dev, 0, ab8540_cut2_devs, 17809c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue ARRAY_SIZE(ab8540_cut2_devs), NULL, 1781f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 17829c717cf3fa16f8ae8c6ccb8f4f8e784404ac9689Alexandre Torgue } else if (is_ab8505(ab8500)) 1783c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8505_devs, 1784c0eda9aef1c0ef7bb2812b739ddf400405568befLee Jones ARRAY_SIZE(ab8505_devs), NULL, 1785f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 1786bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones else 1787bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, 1788bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones ARRAY_SIZE(ab8500_devs), NULL, 1789f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 1790bad76991d7847b7877ae797cc79745d82ffd9120Lee Jones if (ret) 17918c4203cb5814f53169dc4ff084a65dcf509b6f60Lee Jones return ret; 179244f72e53382c9c673fd54c3bab67a6b9a2d4526eVirupax Sadashivpetimath 17936ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (!no_bm) { 17946ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson /* Add battery management devices */ 17956ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, 17966ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson ARRAY_SIZE(ab8500_bm_devs), NULL, 1797f864c46aae4cb6aed09e98615c427fcc4f1de104Linus Walleij 0, ab8500->domain); 17986ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson if (ret) 17996ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson dev_err(ab8500->dev, "error adding bm devices\n"); 18006ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson } 18016ef9418c9e6fc41e6c1066b6423f3a1625e4b822Rickard Andersson 1802e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones if (((is_ab8505(ab8500) || is_ab9540(ab8500)) && 1803e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500)) 1804d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1805d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab9540_attr_group); 1806d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1807d6255529b2639de542324f314b93939b7996a7c5Linus Walleij ret = sysfs_create_group(&ab8500->dev->kobj, 1808d6255529b2639de542324f314b93939b7996a7c5Linus Walleij &ab8500_attr_group); 180993ff722e88530b9719cbf53be4f3197722461394Lee Jones 181093ff722e88530b9719cbf53be4f3197722461394Lee Jones if ((is_ab8505(ab8500) || is_ab9540(ab8500)) && 181193ff722e88530b9719cbf53be4f3197722461394Lee Jones ab8500->chip_id >= AB8500_CUT2P0) 181293ff722e88530b9719cbf53be4f3197722461394Lee Jones ret = sysfs_create_group(&ab8500->dev->kobj, 181393ff722e88530b9719cbf53be4f3197722461394Lee Jones &ab8505_attr_group); 181493ff722e88530b9719cbf53be4f3197722461394Lee Jones 1815cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin if (ret) 1816cca69b67b3ba954ed8642583295b51933f902227Mattias Wallin dev_err(ab8500->dev, "error creating sysfs entries\n"); 181706e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 181806e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones return ret; 181962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 182062579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 18214740f73fe5388ab5d22d552d2a0dacc62418a70cBill Pembertonstatic int ab8500_remove(struct platform_device *pdev) 182262579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent{ 1823d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones struct ab8500 *ab8500 = platform_get_drvdata(pdev); 1824d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1825e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones if (((is_ab8505(ab8500) || is_ab9540(ab8500)) && 1826e436ddff5748c459853bb3fb97550a9b8b647b8dLee Jones ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500)) 1827d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab9540_attr_group); 1828d6255529b2639de542324f314b93939b7996a7c5Linus Walleij else 1829d6255529b2639de542324f314b93939b7996a7c5Linus Walleij sysfs_remove_group(&ab8500->dev->kobj, &ab8500_attr_group); 183006e589efa5b75e6a38a8e8b9c6cd774b5f679cdcLee Jones 183193ff722e88530b9719cbf53be4f3197722461394Lee Jones if ((is_ab8505(ab8500) || is_ab9540(ab8500)) && 183293ff722e88530b9719cbf53be4f3197722461394Lee Jones ab8500->chip_id >= AB8500_CUT2P0) 183393ff722e88530b9719cbf53be4f3197722461394Lee Jones sysfs_remove_group(&ab8500->dev->kobj, &ab8505_attr_group); 183493ff722e88530b9719cbf53be4f3197722461394Lee Jones 183562579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent mfd_remove_devices(ab8500->dev); 183662579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 183762579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent return 0; 183862579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent} 183962579266cf9caca5b999560be2b5ceee42fc4d4dRabin Vincent 1840d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic const struct platform_device_id ab8500_id[] = { 1841d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8500-core", AB8500_VERSION_AB8500 }, 1842d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8505-i2c", AB8500_VERSION_AB8505 }, 1843d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab9540-i2c", AB8500_VERSION_AB9540 }, 1844d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { "ab8540-i2c", AB8500_VERSION_AB8540 }, 1845d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones { } 1846d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1847d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1848d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic struct platform_driver ab8500_core_driver = { 1849d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .driver = { 1850d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .name = "ab8500-core", 1851d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .owner = THIS_MODULE, 1852d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones }, 1853d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .probe = ab8500_probe, 185484449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton .remove = ab8500_remove, 1855d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones .id_table = ab8500_id, 1856d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones}; 1857d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1858d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic int __init ab8500_core_init(void) 1859d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1860d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones return platform_driver_register(&ab8500_core_driver); 1861d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1862d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1863d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesstatic void __exit ab8500_core_exit(void) 1864d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones{ 1865d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones platform_driver_unregister(&ab8500_core_driver); 1866d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones} 1867ba7cbc3e15df1eb34a3a986b52ac82db3a569ab9Lee Jonescore_initcall(ab8500_core_init); 1868d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jonesmodule_exit(ab8500_core_exit); 1869d28f1db8187dd1ddc1fa6f380ff0402cf8e4d44dLee Jones 1870adceed6263887e04721b477e6504aa24789f827dMattias WallinMODULE_AUTHOR("Mattias Wallin, Srinidhi Kasagar, Rabin Vincent"); 187162579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_DESCRIPTION("AB8500 MFD core"); 187262579266cf9caca5b999560be2b5ceee42fc4d4dRabin VincentMODULE_LICENSE("GPL v2"); 1873