131 lines · c
1/* SPDX-License-Identifier: GPL-2.02 *3 * soc-jack.h4 *5 * Copyright (C) 2019 Renesas Electronics Corp.6 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>7 */8#ifndef __SOC_JACK_H9#define __SOC_JACK_H10 11/**12 * struct snd_soc_jack_pin - Describes a pin to update based on jack detection13 *14 * @pin: name of the pin to update15 * @mask: bits to check for in reported jack status16 * @invert: if non-zero then pin is enabled when status is not reported17 * @list: internal list entry18 */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 detection28 *29 * @min_mv: start voltage in mv30 * @max_mv: end voltage in mv31 * @jack_type: type of jack that is expected for this voltage32 * @debounce_time: debounce_time for jack, codec driver should wait for this33 * duration before reading the adc for voltages34 * @list: internal list entry35 */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 detection46 *47 * @idx: gpio descriptor index within the function of the GPIO48 * consumer device49 * @gpiod_dev: GPIO consumer device50 * @name: gpio name. Also as connection ID for the GPIO consumer51 * device function name lookup52 * @report: value to report when jack detected53 * @invert: report presence in low state54 * @debounce_time: debounce time in ms55 * @wake: enable as wake source56 * @jack_status_check: callback function which overrides the detection57 * to provide more complex checks (eg, reading an58 * ADC).59 */60struct snd_soc_jack_gpio {61 unsigned int idx;62 struct device *gpiod_dev;63 const char *name;64 int report;65 int invert;66 int debounce_time;67 bool wake;68 69 /* private: */70 struct snd_soc_jack *jack;71 struct delayed_work work;72 struct notifier_block pm_notifier;73 struct gpio_desc *desc;74 75 void *data;76 /* public: */77 int (*jack_status_check)(void *data);78};79 80struct snd_soc_jack {81 struct mutex mutex;82 struct snd_jack *jack;83 struct snd_soc_card *card;84 struct list_head pins;85 int status;86 struct blocking_notifier_head notifier;87 struct list_head jack_zones;88};89 90/* Jack reporting */91void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);92int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,93 struct snd_soc_jack_pin *pins);94void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,95 struct notifier_block *nb);96void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,97 struct notifier_block *nb);98int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,99 struct snd_soc_jack_zone *zones);100int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);101#ifdef CONFIG_GPIOLIB102int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,103 struct snd_soc_jack_gpio *gpios);104int snd_soc_jack_add_gpiods(struct device *gpiod_dev,105 struct snd_soc_jack *jack,106 int count, struct snd_soc_jack_gpio *gpios);107void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,108 struct snd_soc_jack_gpio *gpios);109#else110static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,111 struct snd_soc_jack_gpio *gpios)112{113 return 0;114}115 116static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev,117 struct snd_soc_jack *jack,118 int count,119 struct snd_soc_jack_gpio *gpios)120{121 return 0;122}123 124static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,125 struct snd_soc_jack_gpio *gpios)126{127}128#endif129 130#endif /* __SOC_JACK_H */131