root/include/linux/mfd/wm8994/core.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. wm8994_reg_read
  2. wm8994_reg_write
  3. wm8994_bulk_read
  4. wm8994_bulk_write
  5. wm8994_set_bits
  6. wm8994_request_irq
  7. wm8994_free_irq

   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * include/linux/mfd/wm8994/core.h -- Core interface for WM8994
   4  *
   5  * Copyright 2009 Wolfson Microelectronics PLC.
   6  *
   7  * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
   8  */
   9 
  10 #ifndef __MFD_WM8994_CORE_H__
  11 #define __MFD_WM8994_CORE_H__
  12 
  13 #include <linux/mutex.h>
  14 #include <linux/interrupt.h>
  15 #include <linux/regmap.h>
  16 
  17 #include <linux/mfd/wm8994/pdata.h>
  18 
  19 enum wm8994_type {
  20         WM8994 = 0,
  21         WM8958 = 1,
  22         WM1811 = 2,
  23 };
  24 
  25 struct regulator_dev;
  26 struct regulator_bulk_data;
  27 struct irq_domain;
  28 
  29 #define WM8994_NUM_GPIO_REGS 11
  30 #define WM8994_NUM_LDO_REGS   2
  31 #define WM8994_NUM_IRQ_REGS   2
  32 
  33 #define WM8994_IRQ_TEMP_SHUT            0
  34 #define WM8994_IRQ_MIC1_DET             1
  35 #define WM8994_IRQ_MIC1_SHRT            2
  36 #define WM8994_IRQ_MIC2_DET             3
  37 #define WM8994_IRQ_MIC2_SHRT            4
  38 #define WM8994_IRQ_FLL1_LOCK            5
  39 #define WM8994_IRQ_FLL2_LOCK            6
  40 #define WM8994_IRQ_SRC1_LOCK            7
  41 #define WM8994_IRQ_SRC2_LOCK            8
  42 #define WM8994_IRQ_AIF1DRC1_SIG_DET     9
  43 #define WM8994_IRQ_AIF1DRC2_SIG_DET     10
  44 #define WM8994_IRQ_AIF2DRC_SIG_DET      11
  45 #define WM8994_IRQ_FIFOS_ERR            12
  46 #define WM8994_IRQ_WSEQ_DONE            13
  47 #define WM8994_IRQ_DCS_DONE             14
  48 #define WM8994_IRQ_TEMP_WARN            15
  49 
  50 /* GPIOs in the chip are numbered from 1-11 */
  51 #define WM8994_IRQ_GPIO(x) (x + WM8994_IRQ_TEMP_WARN)
  52 
  53 struct wm8994 {
  54         struct wm8994_pdata pdata;
  55 
  56         enum wm8994_type type;
  57         int revision;
  58         int cust_id;
  59 
  60         struct device *dev;
  61         struct regmap *regmap;
  62 
  63         bool ldo_ena_always_driven;
  64 
  65         int gpio_base;
  66         int irq_base;
  67 
  68         int irq;
  69         struct regmap_irq_chip_data *irq_data;
  70         struct irq_domain *edge_irq;
  71 
  72         /* Used over suspend/resume */
  73         bool suspended;
  74 
  75         struct regulator_dev *dbvdd;
  76         int num_supplies;
  77         struct regulator_bulk_data *supplies;
  78 };
  79 
  80 /* Device I/O API */
  81 
  82 static inline int wm8994_reg_read(struct wm8994 *wm8994, unsigned short reg)
  83 {
  84         unsigned int val;
  85         int ret;
  86 
  87         ret = regmap_read(wm8994->regmap, reg, &val);
  88 
  89         if (ret < 0)
  90                 return ret;
  91         else
  92                 return val;
  93 }
  94 
  95 static inline int wm8994_reg_write(struct wm8994 *wm8994, unsigned short reg,
  96                                    unsigned short val)
  97 {
  98         return regmap_write(wm8994->regmap, reg, val);
  99 }
 100 
 101 static inline int wm8994_bulk_read(struct wm8994 *wm8994, unsigned short reg,
 102                                    int count, u16 *buf)
 103 {
 104         return regmap_bulk_read(wm8994->regmap, reg, buf, count);
 105 }
 106 
 107 static inline int wm8994_bulk_write(struct wm8994 *wm8994, unsigned short reg,
 108                                     int count, const u16 *buf)
 109 {
 110         return regmap_raw_write(wm8994->regmap, reg, buf, count * sizeof(u16));
 111 }
 112 
 113 static inline int wm8994_set_bits(struct wm8994 *wm8994, unsigned short reg,
 114                     unsigned short mask, unsigned short val)
 115 {
 116         return regmap_update_bits(wm8994->regmap, reg, mask, val);
 117 }
 118 
 119 /* Helper to save on boilerplate */
 120 static inline int wm8994_request_irq(struct wm8994 *wm8994, int irq,
 121                                      irq_handler_t handler, const char *name,
 122                                      void *data)
 123 {
 124         if (!wm8994->irq_data)
 125                 return -EINVAL;
 126         return request_threaded_irq(regmap_irq_get_virq(wm8994->irq_data, irq),
 127                                     NULL, handler, IRQF_TRIGGER_RISING, name,
 128                                     data);
 129 }
 130 static inline void wm8994_free_irq(struct wm8994 *wm8994, int irq, void *data)
 131 {
 132         if (!wm8994->irq_data)
 133                 return;
 134         free_irq(regmap_irq_get_virq(wm8994->irq_data, irq), data);
 135 }
 136 
 137 int wm8994_irq_init(struct wm8994 *wm8994);
 138 void wm8994_irq_exit(struct wm8994 *wm8994);
 139 
 140 #endif

/* [<][>][^][v][top][bottom][index][help] */