162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * wm_hubs.h  --  WM899x common code
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2009 Wolfson Microelectronics plc
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef _WM_HUBS_H
1162306a36Sopenharmony_ci#define _WM_HUBS_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/completion.h>
1462306a36Sopenharmony_ci#include <linux/interrupt.h>
1562306a36Sopenharmony_ci#include <linux/list.h>
1662306a36Sopenharmony_ci#include <sound/control.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct snd_soc_component;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciextern const unsigned int wm_hubs_spkmix_tlv[];
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* This *must* be the first element of the codec->private_data struct */
2362306a36Sopenharmony_cistruct wm_hubs_data {
2462306a36Sopenharmony_ci	int dcs_codes_l;
2562306a36Sopenharmony_ci	int dcs_codes_r;
2662306a36Sopenharmony_ci	int dcs_readback_mode;
2762306a36Sopenharmony_ci	int hp_startup_mode;
2862306a36Sopenharmony_ci	int series_startup;
2962306a36Sopenharmony_ci	int no_series_update;
3062306a36Sopenharmony_ci	bool micd_scthr;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	bool no_cache_dac_hp_direct;
3362306a36Sopenharmony_ci	struct list_head dcs_cache;
3462306a36Sopenharmony_ci	bool (*check_class_w_digital)(struct snd_soc_component *);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	int micb1_delay;
3762306a36Sopenharmony_ci	int micb2_delay;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	bool lineout1_se;
4062306a36Sopenharmony_ci	bool lineout1n_ena;
4162306a36Sopenharmony_ci	bool lineout1p_ena;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	bool lineout2_se;
4462306a36Sopenharmony_ci	bool lineout2n_ena;
4562306a36Sopenharmony_ci	bool lineout2p_ena;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	bool dcs_done_irq;
4862306a36Sopenharmony_ci	struct completion dcs_done;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	struct snd_soc_component *component;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciextern int wm_hubs_add_analogue_controls(struct snd_soc_component *);
5462306a36Sopenharmony_ciextern int wm_hubs_add_analogue_routes(struct snd_soc_component *, int, int);
5562306a36Sopenharmony_ciextern int wm_hubs_handle_analogue_pdata(struct snd_soc_component *,
5662306a36Sopenharmony_ci					 int lineout1_diff, int lineout2_diff,
5762306a36Sopenharmony_ci					 int lineout1fb, int lineout2fb,
5862306a36Sopenharmony_ci					 int jd_scthr, int jd_thr,
5962306a36Sopenharmony_ci					 int micbias1_delay, int micbias2_delay,
6062306a36Sopenharmony_ci					 int micbias1_lvl, int micbias2_lvl);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciextern irqreturn_t wm_hubs_dcs_done(int irq, void *data);
6362306a36Sopenharmony_ciextern void wm_hubs_vmid_ena(struct snd_soc_component *component);
6462306a36Sopenharmony_ciextern void wm_hubs_set_bias_level(struct snd_soc_component *component,
6562306a36Sopenharmony_ci				   enum snd_soc_bias_level level);
6662306a36Sopenharmony_ciextern void wm_hubs_update_class_w(struct snd_soc_component *component);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciextern const struct snd_kcontrol_new wm_hubs_hpl_mux;
6962306a36Sopenharmony_ciextern const struct snd_kcontrol_new wm_hubs_hpr_mux;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#endif
72