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