1 /* SPDX-License-Identifier: GPL-2.0 2 * 3 * ALSA SoC Texas Instruments TAS2783 Audio Smart Amplifier 4 * 5 * Copyright (C) 2025 Texas Instruments Incorporated 6 * https://www.ti.com 7 * 8 * The TAS2783 driver implements a flexible and configurable 9 * algo coefficient setting for single TAS2783 chips. 10 * 11 * Author: Niranjan H Y <niranjanhy@ti.com> 12 * Author: Baojun Xu <baojun.xu@ti.com> 13 */ 14 #include <linux/workqueue.h> 15 16 #ifndef __TAS2783_H__ 17 #define __TAS2783_H__ 18 19 #define TAS2783_DEVICE_RATES (SNDRV_PCM_RATE_44100 | \ 20 SNDRV_PCM_RATE_48000 | \ 21 SNDRV_PCM_RATE_96000 | \ 22 SNDRV_PCM_RATE_88200) 23 #define TAS2783_DEVICE_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 24 SNDRV_PCM_FMTBIT_S24_LE | \ 25 SNDRV_PCM_FMTBIT_S32_LE) 26 27 /* book, page, register */ 28 #define TASDEV_REG_SDW(book, page, reg) (((book) * 256 * 128) + \ 29 0x800000 + ((page) * 128) + (reg)) 30 31 #define TAS2783_SW_RESET TASDEV_REG_SDW(0x0, 0x00, 0x01) 32 /* Volume control */ 33 #define TAS2783_DVC_LVL TASDEV_REG_SDW(0x0, 0x00, 0x1A) 34 #define TAS2783_AMP_LEVEL TASDEV_REG_SDW(0x0, 0x00, 0x03) 35 #define TAS2783_AMP_LEVEL_MASK GENMASK(5, 1) 36 37 #define PRAM_ADDR_START TASDEV_REG_SDW(0x8c, 0x01, 0x8) 38 #define PRAM_ADDR_END TASDEV_REG_SDW(0x8c, 0xff, 0x7f) 39 #define YRAM_ADDR_START TASDEV_REG_SDW(0x00, 0x02, 0x8) 40 #define YRAM_ADDR_END TASDEV_REG_SDW(0x00, 0x37, 0x7f) 41 42 /* Calibration data */ 43 #define TAS2783_CAL_R0 TASDEV_REG_SDW(0, 0x16, 0x4C) 44 #define TAS2783_CAL_INVR0 TASDEV_REG_SDW(0, 0x16, 0x5C) 45 #define TAS2783_CAL_R0LOW TASDEV_REG_SDW(0, 0x16, 0x64) 46 #define TAS2783_CAL_POWER TASDEV_REG_SDW(0, 0x15, 0x44) 47 #define TAS2783_CAL_TLIM TASDEV_REG_SDW(0, 0x17, 0x58) 48 49 /* TAS2783 SDCA Control - function number */ 50 #define FUNC_NUM_SMART_AMP 0x01 51 52 /* TAS2783 SDCA entity */ 53 54 #define TAS2783_SDCA_ENT_FU21 0x01 55 #define TAS2783_SDCA_ENT_FU23 0x02 56 #define TAS2783_SDCA_ENT_FU26 0x03 57 #define TAS2783_SDCA_ENT_XU22 0x04 58 #define TAS2783_SDCA_ENT_CS24 0x05 59 #define TAS2783_SDCA_ENT_CS21 0x06 60 #define TAS2783_SDCA_ENT_CS25 0x07 61 #define TAS2783_SDCA_ENT_CS26 0x08 62 #define TAS2783_SDCA_ENT_CS28 0x09 63 #define TAS2783_SDCA_ENT_PDE23 0x0C 64 #define TAS2783_SDCA_ENT_UDMPU23 0x0E 65 #define TAS2783_SDCA_ENT_SAPU29 0x0F 66 #define TAS2783_SDCA_ENT_PPU21 0x10 67 #define TAS2783_SDCA_ENT_PPU26 0x11 68 #define TAS2783_SDCA_ENT_TG23 0x12 69 #define TAS2783_SDCA_ENT_IT21 0x13 70 #define TAS2783_SDCA_ENT_IT29 0x14 71 #define TAS2783_SDCA_ENT_IT26 0x15 72 #define TAS2783_SDCA_ENT_IT28 0x16 73 #define TAS2783_SDCA_ENT_OT24 0x17 74 #define TAS2783_SDCA_ENT_OT23 0x18 75 #define TAS2783_SDCA_ENT_OT25 0x19 76 #define TAS2783_SDCA_ENT_OT28 0x1A 77 #define TAS2783_SDCA_ENT_MU26 0x1b 78 #define TAS2783_SDCA_ENT_OT127 0x1E 79 #define TAS2783_SDCA_ENT_FU127 0x1F 80 #define TAS2783_SDCA_ENT_CS127 0x20 81 #define TAS2783_SDCA_ENT_MFPU21 0x22 82 #define TAS2783_SDCA_ENT_MFPU26 0x23 83 84 /* TAS2783 SDCA control */ 85 #define TAS2783_SDCA_CTL_REQ_POW_STATE 0x01 86 #define TAS2783_SDCA_CTL_FU_MUTE 0x01 87 #define TAS2783_SDCA_CTL_UDMPU_CLUSTER 0x10 88 89 #define TAS2783_DEVICE_CHANNEL_LEFT 1 90 #define TAS2783_DEVICE_CHANNEL_RIGHT 2 91 92 #define TAS2783_SDCA_POW_STATE_ON 0 93 #define TAS2783_SDCA_POW_STATE_OFF 3 94 95 /* calibration data */ 96 #define TAS2783_CALIB_PARAMS 6 /* 5 + 1 unique id */ 97 #define TAS2783_CALIB_MAX_SPK_COUNT 8 98 #define TAS2783_CALIB_HDR_SZ 12 99 #define TAS2783_CALIB_CRC_SZ 4 100 #define TAS2783_CALIB_DATA_SZ ((TAS2783_CALIB_HDR_SZ) + TAS2783_CALIB_CRC_SZ + \ 101 ((TAS2783_CALIB_PARAMS) * 4 * (TAS2783_CALIB_MAX_SPK_COUNT))) 102 103 #if IS_ENABLED(CONFIG_SND_SOC_TAS2783_UTIL) 104 int32_t tas25xx_register_misc(struct sdw_slave *peripheral); 105 int32_t tas25xx_deregister_misc(void); 106 #else 107 static void tas25xx_register_misc(struct sdw_slave *peripheral) {} 108 static void tas25xx_deregister_misc(void) {} 109 #endif 110 111 #endif /*__TAS2783_H__ */ 112