1d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan/* 2d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Core driver for ams AS3722 PMICs 3d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * 4d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Copyright (C) 2013 AMS AG 5d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Copyright (c) 2013, NVIDIA Corporation. All rights reserved. 6d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * 7d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Author: Florian Lobmaier <florian.lobmaier@ams.com> 8d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Author: Laxman Dewangan <ldewangan@nvidia.com> 9d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * 10d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * This program is free software; you can redistribute it and/or modify 11d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * it under the terms of the GNU General Public License as published by 12d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * the Free Software Foundation; either version 2 of the License, or 13d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * (at your option) any later version. 14d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * 15d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * This program is distributed in the hope that it will be useful, 16d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * but WITHOUT ANY WARRANTY; without even the implied warranty of 17d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * GNU General Public License for more details. 19d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * 20d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * You should have received a copy of the GNU General Public License 21d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * along with this program; if not, write to the Free Software 22d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan */ 24d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 25d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/err.h> 26d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/i2c.h> 27d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/interrupt.h> 28d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/irq.h> 29d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/kernel.h> 30d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/module.h> 31d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/mfd/core.h> 32d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/mfd/as3722.h> 33d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/of.h> 34d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/regmap.h> 35d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#include <linux/slab.h> 36d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 37d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan#define AS3722_DEVICE_ID 0x0C 38d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 39d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct resource as3722_rtc_resource[] = { 40d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 41d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-rtc-alarm", 42d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .start = AS3722_IRQ_RTC_ALARM, 43d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .end = AS3722_IRQ_RTC_ALARM, 44d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .flags = IORESOURCE_IRQ, 45d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 46d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 47d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 48d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct resource as3722_adc_resource[] = { 49d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 50d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-adc", 51d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .start = AS3722_IRQ_ADC, 52d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .end = AS3722_IRQ_ADC, 53d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .flags = IORESOURCE_IRQ, 54d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 55d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 56d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 575ac98553afe41ffb5513fa8aac6df699a70231a3Geert Uytterhoevenstatic const struct mfd_cell as3722_devs[] = { 58d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 59d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-pinctrl", 60d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 61d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 62d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-regulator", 63d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 64d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 65d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-rtc", 66d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .num_resources = ARRAY_SIZE(as3722_rtc_resource), 67d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .resources = as3722_rtc_resource, 68d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 69d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 70d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-adc", 71d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .num_resources = ARRAY_SIZE(as3722_adc_resource), 72d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .resources = as3722_adc_resource, 73d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 74d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { 75d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722-power-off", 76d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 77603ab143bd41d07e91afc31e44774d09aab005faBibek Basu { 78603ab143bd41d07e91afc31e44774d09aab005faBibek Basu .name = "as3722-wdt", 79603ab143bd41d07e91afc31e44774d09aab005faBibek Basu }, 80d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 81d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 82d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_irq as3722_irqs[] = { 83d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan /* INT1 IRQs */ 84d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_LID] = { 85d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_LID, 86d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 87d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ACOK] = { 88d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_ACOK, 89d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 90d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ENABLE1] = { 91d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_ENABLE1, 92d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 93d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_OCCUR_ALARM_SD0] = { 94d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_OCURR_ALARM_SD0, 95d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 96d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ONKEY_LONG_PRESS] = { 97d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_ONKEY_LONG, 98d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 99d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ONKEY] = { 100d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_ONKEY, 101d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 102d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_OVTMP] = { 103d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_OVTMP, 104d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 105d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_LOWBAT] = { 106d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK1_LOWBAT, 107d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 108d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 109d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan /* INT2 IRQs */ 110d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_SD0_LV] = { 111d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_SD0_LV, 112d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 113d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 114d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_SD1_LV] = { 115d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_SD1_LV, 116d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 117d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 118d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_SD2_LV] = { 119d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_SD2345_LV, 120d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 121d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 122d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_PWM1_OV_PROT] = { 123d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_PWM1_OV_PROT, 124d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 125d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 126d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_PWM2_OV_PROT] = { 127d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_PWM2_OV_PROT, 128d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 129d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 130d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ENABLE2] = { 131d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_ENABLE2, 132d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 133d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 134d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_SD6_LV] = { 135d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_SD6_LV, 136d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 137d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 138d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_RTC_REP] = { 139d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK2_RTC_REP, 140d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 1, 141d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 142d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 143d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan /* INT3 IRQs */ 144d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_RTC_ALARM] = { 145d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_RTC_ALARM, 146d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 147d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 148d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_GPIO1] = { 149d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_GPIO1, 150d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 151d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 152d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_GPIO2] = { 153d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_GPIO2, 154d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 155d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 156d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_GPIO3] = { 157d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_GPIO3, 158d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 159d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 160d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_GPIO4] = { 161d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_GPIO4, 162d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 163d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 164d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_GPIO5] = { 165d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_GPIO5, 166d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 167d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 168d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_WATCHDOG] = { 169d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_WATCHDOG, 170d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 171d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 172d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ENABLE3] = { 173d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK3_ENABLE3, 174d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 2, 175d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 176d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 177d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan /* INT4 IRQs */ 178d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD0_SHUTDOWN] = { 179d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD0_SHUTDOWN, 180d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 181d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 182d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD1_SHUTDOWN] = { 183d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD1_SHUTDOWN, 184d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 185d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 186d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD2_SHUTDOWN] = { 187d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD6_SHUTDOWN, 188d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 189d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 190d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD0_ALARM] = { 191d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD0_ALARM, 192d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 193d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 194d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD1_ALARM] = { 195d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD1_ALARM, 196d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 197d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 198d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_TEMP_SD6_ALARM] = { 199d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_TEMP_SD6_ALARM, 200d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 201d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 202d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_OCCUR_ALARM_SD6] = { 203d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_OCCUR_ALARM_SD6, 204d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 205d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 206d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan [AS3722_IRQ_ADC] = { 207d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask = AS3722_INTERRUPT_MASK4_ADC, 208d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_offset = 3, 209d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 210d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 211d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 212d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_irq_chip as3722_irq_chip = { 213d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722", 214d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .irqs = as3722_irqs, 215d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .num_irqs = ARRAY_SIZE(as3722_irqs), 216d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .num_regs = 4, 217d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .status_base = AS3722_INTERRUPT_STATUS1_REG, 218d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .mask_base = AS3722_INTERRUPT_MASK1_REG, 219d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 220d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 221d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic int as3722_check_device_id(struct as3722 *as3722) 222d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan{ 223d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan u32 val; 224d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan int ret; 225d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 226d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan /* Check that this is actually a AS3722 */ 227d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_read(as3722, AS3722_ASIC_ID1_REG, &val); 228d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) { 229d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "ASIC_ID1 read failed: %d\n", ret); 230d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 231d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 232d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 233d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (val != AS3722_DEVICE_ID) { 234d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "Device is not AS3722, ID is 0x%x\n", val); 235d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return -ENODEV; 236d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 237d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 238d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_read(as3722, AS3722_ASIC_ID2_REG, &val); 239d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) { 240d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "ASIC_ID2 read failed: %d\n", ret); 241d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 242d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 243d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 244d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_info(as3722->dev, "AS3722 with revision 0x%x found\n", val); 245d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return 0; 246d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan} 247d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 248d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic int as3722_configure_pullups(struct as3722 *as3722) 249d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan{ 250d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan int ret; 251d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan u32 val = 0; 252d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 253d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (as3722->en_intern_int_pullup) 254d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan val |= AS3722_INT_PULL_UP; 255d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (as3722->en_intern_i2c_pullup) 256d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan val |= AS3722_I2C_PULL_UP; 257d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 258d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_update_bits(as3722, AS3722_IOVOLTAGE_REG, 259d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan AS3722_INT_PULL_UP | AS3722_I2C_PULL_UP, val); 260d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) 261d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "IOVOLTAGE_REG update failed: %d\n", ret); 262d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 263d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan} 264d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 265d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_range as3722_readable_ranges[] = { 266d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD0_VOLTAGE_REG, AS3722_SD6_VOLTAGE_REG), 267d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_GPIO0_CONTROL_REG, AS3722_LDO7_VOLTAGE_REG), 268d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_LDO9_VOLTAGE_REG, AS3722_REG_SEQU_MOD3_REG), 269d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD_PHSW_CTRL_REG, AS3722_PWM_CONTROL_H_REG), 270d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_WATCHDOG_TIMER_REG, AS3722_WATCHDOG_TIMER_REG), 271d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_WATCHDOG_SOFTWARE_SIGNAL_REG, 272d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan AS3722_BATTERY_VOLTAGE_MONITOR2_REG), 273d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD_CONTROL_REG, AS3722_PWM_VCONTROL4_REG), 274d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_BB_CHARGER_REG, AS3722_SRAM_REG), 275d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_RTC_ACCESS_REG, AS3722_RTC_ACCESS_REG), 276d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_RTC_STATUS_REG, AS3722_TEMP_STATUS_REG), 277d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_ADC0_CONTROL_REG, AS3722_ADC_CONFIGURATION_REG), 278d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_ASIC_ID1_REG, AS3722_ASIC_ID2_REG), 279d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_LOCK_REG, AS3722_LOCK_REG), 28009507305a5b372812929f3e8acf9b72f35a88c1cStephen Warren regmap_reg_range(AS3722_FUSE7_REG, AS3722_FUSE7_REG), 281d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 282d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 283d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_access_table as3722_readable_table = { 284d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .yes_ranges = as3722_readable_ranges, 285d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .n_yes_ranges = ARRAY_SIZE(as3722_readable_ranges), 286d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 287d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 288d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_range as3722_writable_ranges[] = { 289d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD0_VOLTAGE_REG, AS3722_SD6_VOLTAGE_REG), 290d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_GPIO0_CONTROL_REG, AS3722_LDO7_VOLTAGE_REG), 291d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_LDO9_VOLTAGE_REG, AS3722_GPIO_SIGNAL_OUT_REG), 292d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_REG_SEQU_MOD1_REG, AS3722_REG_SEQU_MOD3_REG), 293d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD_PHSW_CTRL_REG, AS3722_PWM_CONTROL_H_REG), 294d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_WATCHDOG_TIMER_REG, AS3722_WATCHDOG_TIMER_REG), 295d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_WATCHDOG_SOFTWARE_SIGNAL_REG, 296d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan AS3722_BATTERY_VOLTAGE_MONITOR2_REG), 297d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD_CONTROL_REG, AS3722_PWM_VCONTROL4_REG), 298d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_BB_CHARGER_REG, AS3722_SRAM_REG), 299d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_INTERRUPT_MASK1_REG, AS3722_TEMP_STATUS_REG), 300d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_ADC0_CONTROL_REG, AS3722_ADC1_CONTROL_REG), 301d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_ADC1_THRESHOLD_HI_MSB_REG, 302d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan AS3722_ADC_CONFIGURATION_REG), 303d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_LOCK_REG, AS3722_LOCK_REG), 304d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 305d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 306d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_access_table as3722_writable_table = { 307d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .yes_ranges = as3722_writable_ranges, 308d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .n_yes_ranges = ARRAY_SIZE(as3722_writable_ranges), 309d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 310d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 311d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_range as3722_cacheable_ranges[] = { 312d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD0_VOLTAGE_REG, AS3722_LDO11_VOLTAGE_REG), 313d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_reg_range(AS3722_SD_CONTROL_REG, AS3722_LDOCONTROL1_REG), 314d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 315d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 316d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct regmap_access_table as3722_volatile_table = { 317d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .no_ranges = as3722_cacheable_ranges, 318d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .n_no_ranges = ARRAY_SIZE(as3722_cacheable_ranges), 319d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 320d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 3214c78b520ee8f9c4b085912f1db2f1308f7ae5890Mark Brownstatic const struct regmap_config as3722_regmap_config = { 322d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .reg_bits = 8, 323d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .val_bits = 8, 324d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .max_register = AS3722_MAX_REGISTER, 325d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .cache_type = REGCACHE_RBTREE, 326d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .rd_table = &as3722_readable_table, 327d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .wr_table = &as3722_writable_table, 328d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .volatile_table = &as3722_volatile_table, 329d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 330d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 331d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic int as3722_i2c_of_probe(struct i2c_client *i2c, 332d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan struct as3722 *as3722) 333d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan{ 334d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan struct device_node *np = i2c->dev.of_node; 335d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan struct irq_data *irq_data; 336d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 337d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (!np) { 338d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(&i2c->dev, "Device Tree not found\n"); 339d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return -EINVAL; 340d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 341d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 342d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan irq_data = irq_get_irq_data(i2c->irq); 343d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (!irq_data) { 344d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(&i2c->dev, "Invalid IRQ: %d\n", i2c->irq); 345d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return -EINVAL; 346d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 347d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 348d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->en_intern_int_pullup = of_property_read_bool(np, 349d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan "ams,enable-internal-int-pullup"); 350d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->en_intern_i2c_pullup = of_property_read_bool(np, 351d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan "ams,enable-internal-i2c-pullup"); 352d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->irq_flags = irqd_get_trigger_type(irq_data); 353d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_dbg(&i2c->dev, "IRQ flags are 0x%08lx\n", as3722->irq_flags); 354d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return 0; 355d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan} 356d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 357d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic int as3722_i2c_probe(struct i2c_client *i2c, 358d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan const struct i2c_device_id *id) 359d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan{ 360d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan struct as3722 *as3722; 361d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan unsigned long irq_flags; 362d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan int ret; 363d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 364d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722 = devm_kzalloc(&i2c->dev, sizeof(struct as3722), GFP_KERNEL); 365d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (!as3722) 366d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return -ENOMEM; 367d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 368d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->dev = &i2c->dev; 369d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->chip_irq = i2c->irq; 370d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan i2c_set_clientdata(i2c, as3722); 371d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 372d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_i2c_of_probe(i2c, as3722); 373d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) 374d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 375d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 376d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan as3722->regmap = devm_regmap_init_i2c(i2c, &as3722_regmap_config); 377d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (IS_ERR(as3722->regmap)) { 378d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = PTR_ERR(as3722->regmap); 379d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(&i2c->dev, "regmap init failed: %d\n", ret); 380d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 381d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 382d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 383d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_check_device_id(as3722); 384d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) 385d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 386d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 387d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan irq_flags = as3722->irq_flags | IRQF_ONESHOT; 388d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = regmap_add_irq_chip(as3722->regmap, as3722->chip_irq, 389d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan irq_flags, -1, &as3722_irq_chip, 390d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan &as3722->irq_data); 391d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) { 392d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "Failed to add regmap irq: %d\n", ret); 393d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 394d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 395d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 396d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = as3722_configure_pullups(as3722); 397d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret < 0) 398d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan goto scrub; 399d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 400d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ret = mfd_add_devices(&i2c->dev, -1, as3722_devs, 401d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan ARRAY_SIZE(as3722_devs), NULL, 0, 402d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_irq_get_domain(as3722->irq_data)); 403d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan if (ret) { 404d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_err(as3722->dev, "Failed to add MFD devices: %d\n", ret); 405d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan goto scrub; 406d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan } 407d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 408d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan dev_dbg(as3722->dev, "AS3722 core driver initialized successfully\n"); 409d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return 0; 410d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 411d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganscrub: 412d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_del_irq_chip(as3722->chip_irq, as3722->irq_data); 413d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return ret; 414d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan} 415d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 416d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic int as3722_i2c_remove(struct i2c_client *i2c) 417d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan{ 418d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan struct as3722 *as3722 = i2c_get_clientdata(i2c); 419d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 420d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan mfd_remove_devices(as3722->dev); 421d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan regmap_del_irq_chip(as3722->chip_irq, as3722->irq_data); 422d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan return 0; 423d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan} 424d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 425d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct of_device_id as3722_of_match[] = { 426d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { .compatible = "ams,as3722", }, 427d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan {}, 428d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 429d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_DEVICE_TABLE(of, as3722_of_match); 430d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 431d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic const struct i2c_device_id as3722_i2c_id[] = { 432d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan { "as3722", 0 }, 433d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan {}, 434d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 435d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_DEVICE_TABLE(i2c, as3722_i2c_id); 436d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 437d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganstatic struct i2c_driver as3722_i2c_driver = { 438d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .driver = { 439d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .name = "as3722", 440d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .owner = THIS_MODULE, 441d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .of_match_table = as3722_of_match, 442d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan }, 443d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .probe = as3722_i2c_probe, 444d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .remove = as3722_i2c_remove, 445d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan .id_table = as3722_i2c_id, 446d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan}; 447d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 448d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewanganmodule_i2c_driver(as3722_i2c_driver); 449d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman Dewangan 450d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_DESCRIPTION("I2C support for AS3722 PMICs"); 451d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_AUTHOR("Florian Lobmaier <florian.lobmaier@ams.com>"); 452d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>"); 453d460a6f3d67a8558fb58299518077888b7dbf5f3Laxman DewanganMODULE_LICENSE("GPL"); 454