1f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 2f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * 3f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * This program is free software; you can redistribute it and/or modify 4f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * it under the terms of the GNU General Public License version 2 and 5f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * only version 2 as published by the Free Software Foundation. 6f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * 7f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * This program is distributed in the hope that it will be useful, 8f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * but WITHOUT ANY WARRANTY; without even the implied warranty of 9f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev * GNU General Public License for more details. 11f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev */ 12f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 13f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#ifndef __MFD_TABLA_CORE_H__ 14f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define __MFD_TABLA_CORE_H__ 15f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 16f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#include <linux/interrupt.h> 17f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#include <linux/pm_qos.h> 18f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 19f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define WCD9XXX_NUM_IRQ_REGS 3 20f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 21f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define WCD9XXX_SLIM_NUM_PORT_REG 3 22f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 23f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define WCD9XXX_INTERFACE_TYPE_SLIMBUS 0x00 24f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define WCD9XXX_INTERFACE_TYPE_I2C 0x01 25f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 26f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define TABLA_VERSION_1_0 0 27f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define TABLA_VERSION_1_1 1 28f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define TABLA_VERSION_2_0 2 29f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define TABLA_IS_1_X(ver) \ 30f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev (((ver == TABLA_VERSION_1_0) || (ver == TABLA_VERSION_1_1)) ? 1 : 0) 31f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define TABLA_IS_2_0(ver) ((ver == TABLA_VERSION_2_0) ? 1 : 0) 32f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 33f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define SITAR_VERSION_1P0 0 34f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define SITAR_VERSION_1P1 1 35f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define SITAR_IS_1P0(ver) \ 36f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev ((ver == SITAR_VERSION_1P0) ? 1 : 0) 37f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#define SITAR_IS_1P1(ver) \ 38f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev ((ver == SITAR_VERSION_1P1) ? 1 : 0) 39f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 40f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevenum { 41f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_SLIMBUS = 0, 42f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_REMOVAL, 43f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_SHORT_TERM, 44f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_PRESS, 45f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_RELEASE, 46f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_POTENTIAL, 47f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MBHC_INSERTION, 48f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_BG_PRECHARGE, 49f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_PA1_STARTUP, 50f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_PA2_STARTUP, 51f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_PA3_STARTUP, 52f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_PA4_STARTUP, 53f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_PA5_STARTUP, 54f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MICBIAS1_PRECHARGE, 55f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MICBIAS2_PRECHARGE, 56f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_MICBIAS3_PRECHARGE, 57f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_HPH_PA_OCPL_FAULT, 58f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_HPH_PA_OCPR_FAULT, 59f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_EAR_PA_OCPL_FAULT, 60f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_HPH_L_PA_STARTUP, 61f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_HPH_R_PA_STARTUP, 62f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_IRQ_EAR_PA_STARTUP, 63f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TABLA_NUM_IRQS, 64f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev}; 65f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 66f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevenum { 67f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_SLIMBUS = 0, 68f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_REMOVAL, 69f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_SHORT_TERM, 70f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_PRESS, 71f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_RELEASE, 72f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_POTENTIAL, 73f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MBHC_INSERTION, 74f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_BG_PRECHARGE, 75f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_PA1_STARTUP, 76f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_PA2_STARTUP, 77f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_PA3_STARTUP, 78f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_PA4_STARTUP, 79f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_PA5_STARTUP, 80f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MICBIAS1_PRECHARGE, 81f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MICBIAS2_PRECHARGE, 82f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_MICBIAS3_PRECHARGE, 83f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_HPH_PA_OCPL_FAULT, 84f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_HPH_PA_OCPR_FAULT, 85f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_EAR_PA_OCPL_FAULT, 86f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_HPH_L_PA_STARTUP, 87f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_HPH_R_PA_STARTUP, 88f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_IRQ_EAR_PA_STARTUP, 89f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev SITAR_NUM_IRQS, 90f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev}; 91f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 92f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 93f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevenum { 94f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_SLIMBUS = 0, 95f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_REMOVAL, 96f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_SHORT_TERM, 97f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_PRESS, 98f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_RELEASE, 99f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_POTENTIAL, 100f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MBHC_INSERTION, 101f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_BG_PRECHARGE, 102f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_PA1_STARTUP, 103f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_PA2_STARTUP, 104f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_PA3_STARTUP, 105f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_PA4_STARTUP, 106f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_PA5_STARTUP, 107f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MICBIAS1_PRECHARGE, 108f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MICBIAS2_PRECHARGE, 109f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_MICBIAS3_PRECHARGE, 110f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_HPH_PA_OCPL_FAULT, 111f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_HPH_PA_OCPR_FAULT, 112f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_EAR_PA_OCPL_FAULT, 113f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_HPH_L_PA_STARTUP, 114f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_HPH_R_PA_STARTUP, 115f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_IRQ_EAR_PA_STARTUP, 116f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev TAIKO_NUM_IRQS, 117f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev}; 118f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 119f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevenum wcd9xxx_pm_state { 120f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev WCD9XXX_PM_SLEEPABLE, 121f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev WCD9XXX_PM_AWAKE, 122f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev WCD9XXX_PM_ASLEEP, 123f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev}; 124f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 125f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstruct wcd9xxx { 126f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct device *dev; 127f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct slim_device *slim; 128f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct slim_device *slim_slave; 129f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct mutex io_lock; 130f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct mutex xfer_lock; 131f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct mutex irq_lock; 132f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 version; 133f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 134f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev unsigned int irq_base; 135f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev unsigned int irq; 136f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 irq_masks_cur[WCD9XXX_NUM_IRQ_REGS]; 137f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 irq_masks_cache[WCD9XXX_NUM_IRQ_REGS]; 138f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 irq_level[WCD9XXX_NUM_IRQ_REGS]; 139f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 140f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int reset_gpio; 141f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 142f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int (*read_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, 143f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int bytes, void *dest, bool interface_reg); 144f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int (*write_dev)(struct wcd9xxx *wcd9xxx, unsigned short reg, 145f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int bytes, void *src, bool interface_reg); 146f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 147f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u32 num_of_supplies; 148f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct regulator_bulk_data *supplies; 149f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 150f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev enum wcd9xxx_pm_state pm_state; 151f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct mutex pm_lock; 152f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev /* pm_wq notifies change of pm_state */ 153f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev wait_queue_head_t pm_wq; 154f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev struct pm_qos_request pm_qos_req; 155f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int wlock_holders; 156f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 157f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int num_rx_port; 158f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int num_tx_port; 159f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 160f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 idbyte[4]; 161f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev}; 162f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 163f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg); 164f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, 165f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 val); 166f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_interface_reg_read(struct wcd9xxx *wcd9xxx, unsigned short reg); 167f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_interface_reg_write(struct wcd9xxx *wcd9xxx, unsigned short reg, 168f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev u8 val); 169f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_bulk_read(struct wcd9xxx *wcd9xxx, unsigned short reg, 170f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int count, u8 *buf); 171f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_bulk_write(struct wcd9xxx *wcd9xxx, unsigned short reg, 172f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int count, u8 *buf); 173f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_irq_init(struct wcd9xxx *wcd9xxx); 174f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevvoid wcd9xxx_irq_exit(struct wcd9xxx *wcd9xxx); 175f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_get_logical_addresses(u8 *pgd_la, u8 *inf_la); 176f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevint wcd9xxx_get_intf_type(void); 177f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 178f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevbool wcd9xxx_lock_sleep(struct wcd9xxx *wcd9xxx); 179f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevvoid wcd9xxx_unlock_sleep(struct wcd9xxx *wcd9xxx); 180f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevenum wcd9xxx_pm_state wcd9xxx_pm_cmpxchg(struct wcd9xxx *wcd9xxx, 181f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev enum wcd9xxx_pm_state o, 182f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev enum wcd9xxx_pm_state n); 183f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 184f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstatic inline int wcd9xxx_request_irq(struct wcd9xxx *wcd9xxx, int irq, 185f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev irq_handler_t handler, const char *name, 186f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev void *data) 187f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev{ 188f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev if (!wcd9xxx->irq_base) 189f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return -EINVAL; 190f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return request_threaded_irq(wcd9xxx->irq_base + irq, NULL, handler, 191f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev IRQF_TRIGGER_RISING, name, 192f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev data); 193f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev} 194f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstatic inline void wcd9xxx_free_irq(struct wcd9xxx *wcd9xxx, 195f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev int irq, void *data) 196f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev{ 197f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev if (!wcd9xxx->irq_base) 198f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return; 199f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev free_irq(wcd9xxx->irq_base + irq, data); 200f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev} 201f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstatic inline void wcd9xxx_enable_irq(struct wcd9xxx *wcd9xxx, int irq) 202f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev{ 203f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev if (!wcd9xxx->irq_base) 204f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return; 205f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev enable_irq(wcd9xxx->irq_base + irq); 206f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev} 207f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstatic inline void wcd9xxx_disable_irq(struct wcd9xxx *wcd9xxx, int irq) 208f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev{ 209f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev if (!wcd9xxx->irq_base) 210f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return; 211f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev disable_irq_nosync(wcd9xxx->irq_base + irq); 212f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev} 213f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchevstatic inline void wcd9xxx_disable_irq_sync(struct wcd9xxx *wcd9xxx, int irq) 214f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev{ 215f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev if (!wcd9xxx->irq_base) 216f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev return; 217f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev disable_irq(wcd9xxx->irq_base + irq); 218f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev} 219f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev 220f0edc3f155a136d87beccd5ecef75c2d4b6f6b64Iliyan Malchev#endif 221