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 */ 19 struct 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 */ 36 struct 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 */ 61 struct 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 82 struct 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 */ 93 void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask); 94 int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count, 95 struct snd_soc_jack_pin *pins); 96 void snd_soc_jack_notifier_register(struct snd_soc_jack *jack, 97 struct notifier_block *nb); 98 void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack, 99 struct notifier_block *nb); 100 int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count, 101 struct snd_soc_jack_zone *zones); 102 int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage); 103 #ifdef CONFIG_GPIOLIB 104 int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count, 105 struct snd_soc_jack_gpio *gpios); 106 int snd_soc_jack_add_gpiods(struct device *gpiod_dev, 107 struct snd_soc_jack *jack, 108 int count, struct snd_soc_jack_gpio *gpios); 109 void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count, 110 struct snd_soc_jack_gpio *gpios); 111 #else 112 static 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 118 static 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 126 static 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