1e4961125SRichard Fitzgerald /* SPDX-License-Identifier: GPL-2.0-only */ 2e4961125SRichard Fitzgerald /* 3e4961125SRichard Fitzgerald * Driver for Cirrus Logic CS35L56 smart amp 4e4961125SRichard Fitzgerald * 5e4961125SRichard Fitzgerald * Copyright (C) 2023 Cirrus Logic, Inc. and 6e4961125SRichard Fitzgerald * Cirrus Logic International Semiconductor Ltd. 7e4961125SRichard Fitzgerald */ 8e4961125SRichard Fitzgerald 9e4961125SRichard Fitzgerald #ifndef CS35L56_H 10e4961125SRichard Fitzgerald #define CS35L56_H 11e4961125SRichard Fitzgerald 12e4961125SRichard Fitzgerald #include <linux/completion.h> 13e4961125SRichard Fitzgerald #include <linux/regulator/consumer.h> 14e4961125SRichard Fitzgerald #include <linux/pm_runtime.h> 15e4961125SRichard Fitzgerald #include <linux/workqueue.h> 16e4961125SRichard Fitzgerald #include <sound/cs35l56.h> 17e4961125SRichard Fitzgerald #include "wm_adsp.h" 18e4961125SRichard Fitzgerald 19e4961125SRichard Fitzgerald #define CS35L56_SDW_GEN_INT_STAT_1 0xc0 20e4961125SRichard Fitzgerald #define CS35L56_SDW_GEN_INT_MASK_1 0xc1 21e4961125SRichard Fitzgerald #define CS35L56_SDW_INT_MASK_CODEC_IRQ BIT(0) 22e4961125SRichard Fitzgerald 23e4961125SRichard Fitzgerald #define CS35L56_SDW_INVALID_BUS_SCALE 0xf 24e4961125SRichard Fitzgerald 25e4961125SRichard Fitzgerald #define CS35L56_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE) 26e4961125SRichard Fitzgerald #define CS35L56_TX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE \ 27e4961125SRichard Fitzgerald | SNDRV_PCM_FMTBIT_S32_LE) 28e4961125SRichard Fitzgerald 29e4961125SRichard Fitzgerald #define CS35L56_RATES (SNDRV_PCM_RATE_48000) 30e4961125SRichard Fitzgerald 31e4961125SRichard Fitzgerald struct sdw_slave; 32e4961125SRichard Fitzgerald 33e4961125SRichard Fitzgerald struct cs35l56_private { 34e4961125SRichard Fitzgerald struct wm_adsp dsp; /* must be first member */ 35898673b9SSimon Trimmer struct cs35l56_base base; 36e4961125SRichard Fitzgerald struct work_struct dsp_work; 37e4961125SRichard Fitzgerald struct workqueue_struct *dsp_wq; 38e4961125SRichard Fitzgerald struct snd_soc_component *component; 39e4961125SRichard Fitzgerald struct regulator_bulk_data supplies[CS35L56_NUM_BULK_SUPPLIES]; 40e4961125SRichard Fitzgerald struct sdw_slave *sdw_peripheral; 41e4961125SRichard Fitzgerald struct work_struct sdw_irq_work; 42e4961125SRichard Fitzgerald bool sdw_irq_no_unmask; 43e4961125SRichard Fitzgerald bool soft_resetting; 44e4961125SRichard Fitzgerald bool sdw_attached; 45e4961125SRichard Fitzgerald struct completion init_completion; 46e4961125SRichard Fitzgerald 47*245eeff1SRichard Fitzgerald int speaker_id; 48e4961125SRichard Fitzgerald u32 rx_mask; 49e4961125SRichard Fitzgerald u32 tx_mask; 50e4961125SRichard Fitzgerald u8 asp_slot_width; 51e4961125SRichard Fitzgerald u8 asp_slot_count; 52e4961125SRichard Fitzgerald bool tdm_mode; 53e4961125SRichard Fitzgerald bool sysclk_set; 54e4961125SRichard Fitzgerald }; 55e4961125SRichard Fitzgerald 56e4961125SRichard Fitzgerald extern const struct dev_pm_ops cs35l56_pm_ops_i2c_spi; 57e4961125SRichard Fitzgerald 58f9dc6b87SRichard Fitzgerald int cs35l56_system_suspend(struct device *dev); 59f9dc6b87SRichard Fitzgerald int cs35l56_system_suspend_late(struct device *dev); 60f9dc6b87SRichard Fitzgerald int cs35l56_system_suspend_no_irq(struct device *dev); 61f9dc6b87SRichard Fitzgerald int cs35l56_system_resume_no_irq(struct device *dev); 62f9dc6b87SRichard Fitzgerald int cs35l56_system_resume_early(struct device *dev); 63f9dc6b87SRichard Fitzgerald int cs35l56_system_resume(struct device *dev); 64e4961125SRichard Fitzgerald irqreturn_t cs35l56_irq(int irq, void *data); 65898673b9SSimon Trimmer int cs35l56_irq_request(struct cs35l56_base *cs35l56_base, int irq); 66e4961125SRichard Fitzgerald int cs35l56_common_probe(struct cs35l56_private *cs35l56); 67e4961125SRichard Fitzgerald int cs35l56_init(struct cs35l56_private *cs35l56); 689ed4c762SSimon Trimmer void cs35l56_remove(struct cs35l56_private *cs35l56); 69e4961125SRichard Fitzgerald 70e4961125SRichard Fitzgerald #endif /* ifndef CS35L56_H */ 71