linux/include/sound/soc-jack.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0
   2 *
   3 * soc-jack.h
   4 *
   5 * Copyright (C) 2019 Renesas Electronics Corp.
   6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
   7 */
   8#ifndef __SOC_JACK_H
   9#define __SOC_JACK_H
  10
  11/**
  12 * struct snd_soc_jack_pin - Describes a pin to update based on jack detection
  13 *
  14 * @pin:    name of the pin to update
  15 * @mask:   bits to check for in reported jack status
  16 * @invert: if non-zero then pin is enabled when status is not reported
  17 * @list:   internal list entry
  18 */
  19struct snd_soc_jack_pin {
  20        struct list_head list;
  21        const char *pin;
  22        int mask;
  23        bool invert;
  24};
  25
  26/**
  27 * struct snd_soc_jack_zone - Describes voltage zones of jack detection
  28 *
  29 * @min_mv: start voltage in mv
  30 * @max_mv: end voltage in mv
  31 * @jack_type: type of jack that is expected for this voltage
  32 * @debounce_time: debounce_time for jack, codec driver should wait for this
  33 *              duration before reading the adc for voltages
  34 * @list:   internal list entry
  35 */
  36struct snd_soc_jack_zone {
  37        unsigned int min_mv;
  38        unsigned int max_mv;
  39        unsigned int jack_type;
  40        unsigned int debounce_time;
  41        struct list_head list;
  42};
  43
  44/**
  45 * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection
  46 *
  47 * @gpio:         legacy gpio number
  48 * @idx:          gpio descriptor index within the function of the GPIO
  49 *                consumer device
  50 * @gpiod_dev:    GPIO consumer device
  51 * @name:         gpio name. Also as connection ID for the GPIO consumer
  52 *                device function name lookup
  53 * @report:       value to report when jack detected
  54 * @invert:       report presence in low state
  55 * @debounce_time: debounce time in ms
  56 * @wake:         enable as wake source
  57 * @jack_status_check: callback function which overrides the detection
  58 *                     to provide more complex checks (eg, reading an
  59 *                     ADC).
  60 */
  61struct snd_soc_jack_gpio {
  62        unsigned int gpio;
  63        unsigned int idx;
  64        struct device *gpiod_dev;
  65        const char *name;
  66        int report;
  67        int invert;
  68        int debounce_time;
  69        bool wake;
  70
  71        /* private: */
  72        struct snd_soc_jack *jack;
  73        struct delayed_work work;
  74        struct notifier_block pm_notifier;
  75        struct gpio_desc *desc;
  76
  77        void *data;
  78        /* public: */
  79        int (*jack_status_check)(void *data);
  80};
  81
  82struct snd_soc_jack {
  83        struct mutex mutex;
  84        struct snd_jack *jack;
  85        struct snd_soc_card *card;
  86        struct list_head pins;
  87        int status;
  88        struct blocking_notifier_head notifier;
  89        struct list_head jack_zones;
  90};
  91
  92/* Jack reporting */
  93void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
  94int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
  95                          struct snd_soc_jack_pin *pins);
  96void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
  97                                    struct notifier_block *nb);
  98void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
  99                                      struct notifier_block *nb);
 100int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
 101                           struct snd_soc_jack_zone *zones);
 102int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
 103#ifdef CONFIG_GPIOLIB
 104int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
 105                           struct snd_soc_jack_gpio *gpios);
 106int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
 107                            struct snd_soc_jack *jack,
 108                            int count, struct snd_soc_jack_gpio *gpios);
 109void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
 110                             struct snd_soc_jack_gpio *gpios);
 111#else
 112static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
 113                                         struct snd_soc_jack_gpio *gpios)
 114{
 115        return 0;
 116}
 117
 118static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
 119                                          struct snd_soc_jack *jack,
 120                                          int count,
 121                                          struct snd_soc_jack_gpio *gpios)
 122{
 123        return 0;
 124}
 125
 126static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
 127                                           struct snd_soc_jack_gpio *gpios)
 128{
 129}
 130#endif
 131
 132#endif /* __SOC_JACK_H */
 133