162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * CS35L41 ALSA HDA audio driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2021 Cirrus Logic, Inc.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Lucas Tanure <tanureal@opensource.cirrus.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __CS35L41_HDA_H__
1162306a36Sopenharmony_ci#define __CS35L41_HDA_H__
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/efi.h>
1462306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1562306a36Sopenharmony_ci#include <linux/gpio/consumer.h>
1662306a36Sopenharmony_ci#include <linux/device.h>
1762306a36Sopenharmony_ci#include <sound/cs35l41.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <linux/firmware/cirrus/cs_dsp.h>
2062306a36Sopenharmony_ci#include <linux/firmware/cirrus/wmfw.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct cs35l41_amp_cal_data {
2362306a36Sopenharmony_ci	u32 calTarget[2];
2462306a36Sopenharmony_ci	u32 calTime[2];
2562306a36Sopenharmony_ci	s8 calAmbient;
2662306a36Sopenharmony_ci	u8 calStatus;
2762306a36Sopenharmony_ci	u16 calR;
2862306a36Sopenharmony_ci} __packed;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct cs35l41_amp_efi_data {
3162306a36Sopenharmony_ci	u32 size;
3262306a36Sopenharmony_ci	u32 count;
3362306a36Sopenharmony_ci	struct cs35l41_amp_cal_data data[];
3462306a36Sopenharmony_ci} __packed;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_cienum cs35l41_hda_spk_pos {
3762306a36Sopenharmony_ci	CS35l41_LEFT,
3862306a36Sopenharmony_ci	CS35l41_RIGHT,
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cienum cs35l41_hda_gpio_function {
4262306a36Sopenharmony_ci	CS35L41_NOT_USED,
4362306a36Sopenharmony_ci	CS35l41_VSPK_SWITCH,
4462306a36Sopenharmony_ci	CS35L41_INTERRUPT,
4562306a36Sopenharmony_ci	CS35l41_SYNC,
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct cs35l41_hda {
4962306a36Sopenharmony_ci	struct device *dev;
5062306a36Sopenharmony_ci	struct regmap *regmap;
5162306a36Sopenharmony_ci	struct gpio_desc *reset_gpio;
5262306a36Sopenharmony_ci	struct cs35l41_hw_cfg hw_cfg;
5362306a36Sopenharmony_ci	struct hda_codec *codec;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	int irq;
5662306a36Sopenharmony_ci	int index;
5762306a36Sopenharmony_ci	int channel_index;
5862306a36Sopenharmony_ci	unsigned volatile long irq_errors;
5962306a36Sopenharmony_ci	const char *amp_name;
6062306a36Sopenharmony_ci	const char *acpi_subsystem_id;
6162306a36Sopenharmony_ci	int firmware_type;
6262306a36Sopenharmony_ci	int speaker_id;
6362306a36Sopenharmony_ci	struct mutex fw_mutex;
6462306a36Sopenharmony_ci	struct work_struct fw_load_work;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	struct regmap_irq_chip_data *irq_data;
6762306a36Sopenharmony_ci	bool firmware_running;
6862306a36Sopenharmony_ci	bool request_fw_load;
6962306a36Sopenharmony_ci	bool fw_request_ongoing;
7062306a36Sopenharmony_ci	bool halo_initialized;
7162306a36Sopenharmony_ci	bool playback_started;
7262306a36Sopenharmony_ci	struct cs_dsp cs_dsp;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cienum halo_state {
7662306a36Sopenharmony_ci	HALO_STATE_CODE_INIT_DOWNLOAD = 0,
7762306a36Sopenharmony_ci	HALO_STATE_CODE_START,
7862306a36Sopenharmony_ci	HALO_STATE_CODE_RUN
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciextern const struct dev_pm_ops cs35l41_hda_pm_ops;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciint cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq,
8462306a36Sopenharmony_ci		      struct regmap *regmap);
8562306a36Sopenharmony_civoid cs35l41_hda_remove(struct device *dev);
8662306a36Sopenharmony_ciint cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id);
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci#endif /*__CS35L41_HDA_H__*/
89