110 lines · c
1/* SPDX-License-Identifier: GPL-2.02 *3 * CS35L41 ALSA HDA audio driver4 *5 * Copyright 2021 Cirrus Logic, Inc.6 *7 * Author: Lucas Tanure <tanureal@opensource.cirrus.com>8 */9 10#ifndef __CS35L41_HDA_H__11#define __CS35L41_HDA_H__12 13#include <linux/acpi.h>14#include <linux/efi.h>15#include <linux/regulator/consumer.h>16#include <linux/gpio/consumer.h>17#include <linux/device.h>18#include <sound/cs35l41.h>19#include <sound/cs-amp-lib.h>20 21#include <linux/firmware/cirrus/cs_dsp.h>22#include <linux/firmware/cirrus/wmfw.h>23 24#define CS35L41_MAX_ACCEPTABLE_SPI_SPEED_HZ 100000025#define DEFAULT_AMP_GAIN_PCM 17 /* 17.5dB Gain */26#define DEFAULT_AMP_GAIN_PDM 19 /* 19.5dB Gain */27 28struct cs35l41_amp_cal_data {29 u32 calTarget[2];30 u32 calTime[2];31 s8 calAmbient;32 u8 calStatus;33 u16 calR;34} __packed;35 36struct cs35l41_amp_efi_data {37 u32 size;38 u32 count;39 struct cs35l41_amp_cal_data data[];40} __packed;41 42enum cs35l41_hda_spk_pos {43 CS35L41_LEFT,44 CS35L41_RIGHT,45};46 47enum cs35l41_hda_gpio_function {48 CS35L41_NOT_USED,49 CS35l41_VSPK_SWITCH,50 CS35L41_INTERRUPT,51 CS35l41_SYNC,52};53 54enum control_bus {55 I2C,56 SPI57};58 59struct cs35l41_hda {60 struct device *dev;61 struct regmap *regmap;62 struct gpio_desc *reset_gpio;63 struct gpio_desc *cs_gpio;64 struct cs35l41_hw_cfg hw_cfg;65 struct hda_codec *codec;66 67 int irq;68 int index;69 int channel_index;70 unsigned volatile long irq_errors;71 const char *amp_name;72 const char *acpi_subsystem_id;73 int firmware_type;74 int speaker_id;75 struct mutex fw_mutex;76 struct work_struct fw_load_work;77 78 struct regmap_irq_chip_data *irq_data;79 bool firmware_running;80 bool request_fw_load;81 bool fw_request_ongoing;82 bool halo_initialized;83 bool playback_started;84 struct cs_dsp cs_dsp;85 struct acpi_device *dacpi;86 bool mute_override;87 enum control_bus control_bus;88 bool bypass_fw;89 unsigned int tuning_gain;90 struct cirrus_amp_cal_data cal_data;91 bool cal_data_valid;92 93};94 95enum halo_state {96 HALO_STATE_CODE_INIT_DOWNLOAD = 0,97 HALO_STATE_CODE_START,98 HALO_STATE_CODE_RUN99};100 101extern const struct dev_pm_ops cs35l41_hda_pm_ops;102 103int cs35l41_hda_probe(struct device *dev, const char *device_name, int id, int irq,104 struct regmap *regmap, enum control_bus control_bus);105void cs35l41_hda_remove(struct device *dev);106int cs35l41_get_speaker_id(struct device *dev, int amp_index, int num_amps, int fixed_gpio_id);107int cs35l41_hda_parse_acpi(struct cs35l41_hda *cs35l41, struct device *physdev, int id);108 109#endif /*__CS35L41_HDA_H__*/110