blob: 0cc8307a8608dca23b9ed17596377cf620830e81 [file] [edit]
#ifndef __TAS256X_
#define __TAS256X_
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include <linux/hrtimer.h>
#include <linux/printk.h>
#include <linux/delay.h>
#include <sound/soc.h>
#include <linux/version.h>
#define TAS256X_DRIVER_TAG "TAS256X_REL_20221021"
/* Page Control Register */
#define TAS256X_PAGECTL_REG 0
/* Book Control Register (available in page0 of each book) */
#define TAS256X_BOOKCTL_PAGE 0
#define TAS256X_BOOKCTL_REG 127
#define TAS256X_REG(book, page, reg) (((book * 256 * 128) + \
(page * 128)) + reg)
#define TAS256X_BOOK_ID(reg) (reg / (256 * 128))
#define TAS256X_PAGE_ID(reg) ((reg % (256 * 128)) / 128)
#define TAS256X_BOOK_REG(reg) (reg % (256 * 128))
#define TAS256X_PAGE_REG(reg) ((reg % (256 * 128)) % 128)
/* Software Reset */
#define TAS256X_SOFTWARERESET TAS256X_REG(0x0, 0x0, 0x01)
#define TAS256X_SOFTWARERESET_SOFTWARERESET_MASK (0x1 << 0)
#define TAS256X_SOFTWARERESET_SOFTWARERESET_DONTRESET (0x0 << 0)
#define TAS256X_SOFTWARERESET_SOFTWARERESET_RESET (0x1 << 0)
/* Power Control */
#define TAS256X_POWERCONTROL TAS256X_REG(0x0, 0x0, 0x02)
#define TAS256X_POWERCONTROL_ISNSPOWER_MASK (0x1 << 3)
#define TAS256X_POWERCONTROL_ISNSPOWER_ACTIVE (0x0 << 3)
#define TAS256X_POWERCONTROL_ISNSPOWER_POWEREDDOWN (0x1 << 3)
#define TAS256X_POWERCONTROL_VSNSPOWER_MASK (0x1 << 2)
#define TAS256X_POWERCONTROL_VSNSPOWER_ACTIVE (0x0 << 2)
#define TAS256X_POWERCONTROL_VSNSPOWER_POWEREDDOWN (0x1 << 2)
#define TAS256X_POWERCONTROL_OPERATIONALMODE10_MASK (0x3 << 0)
#define TAS256X_POWERCONTROL_OPERATIONALMODE10_ACTIVE (0x0 << 0)
#define TAS256X_POWERCONTROL_OPERATIONALMODE10_MUTE (0x1 << 0)
#define TAS256X_POWERCONTROL_OPERATIONALMODE10_SHUTDOWN (0x2 << 0)
/* Playback Configuration Reg0 */
#define TAS256X_PLAYBACKCONFIGURATIONREG0 TAS256X_REG(0x0, 0x0, 0x03)
#define TAS256X_PLAYBACKCONFIGURATIONREG0_DCBLOCKER_MASK (0x1 << 6)
#define TAS256X_PLAYBACKCONFIGURATIONREG0_DCBLOCKER_ENABLED (0x0 << 6)
#define TAS256X_PLAYBACKCONFIGURATIONREG0_DCBLOCKER_DISABLED (0x1 << 6)
/* Misc Configuration Reg0 */
#define TAS256X_MISCCONFIGURATIONREG0 TAS256X_REG(0x0, 0x0, 0x04)
#define TAS256X_MISCCONFIGURATIONREG0_CPPGRETRY_MASK (0x1 << 7)
#define TAS256X_MISCCONFIGURATIONREG0_CPPGRETRY_DONOTRETRY (0x0 << 7)
#define TAS256X_MISCCONFIGURATIONREG0_CPPGRETRY_RETRY (0x1 << 7)
#define TAS256X_MISCCONFIGURATIONREG0_VBATPRORETRY_MASK (0x1 << 6)
#define TAS256X_MISCCONFIGURATIONREG0_VBATPRORETRY_DONOTRETRY (0x0 << 6)
#define TAS256X_MISCCONFIGURATIONREG0_VBATPRORETRY_RETRY (0x1 << 6)
#define TAS256X_MISCCONFIGURATIONREG0_OCERETRY_MASK (0x1 << 5)
#define TAS256X_MISCCONFIGURATIONREG0_OCERETRY_DONOTRETRY (0x0 << 5)
#define TAS256X_MISCCONFIGURATIONREG0_OCERETRY_RETRY (0x1 << 5)
#define TAS256X_MISCCONFIGURATIONREG0_OTERETRY_MASK (0x1 << 4)
#define TAS256X_MISCCONFIGURATIONREG0_OTERETRY_DONOTRETRY (0x0 << 4)
#define TAS256X_MISCCONFIGURATIONREG0_OTERETRY_RETRY (0x1 << 4)
#define TAS256X_MISCCONFIGURATIONREG0_IRQZPULL_MASK (0x1 << 3)
#define TAS256X_MISCCONFIGURATIONREG0_IRQZPULL_DISABLED (0x0 << 3)
#define TAS256X_MISCCONFIGURATIONREG0_IRQZPULL_ENABLED (0x1 << 3)
#define TAS256X_MISCCONFIGURATIONREG0_AMPSS_MASK (0x1 << 2)
#define TAS256X_MISCCONFIGURATIONREG0_AMPSS_DISABLED (0x0 << 2)
#define TAS256X_MISCCONFIGURATIONREG0_AMPSS_ENABLED (0x1 << 2)
/* TDM Configuration Reg0 */
#define TAS256X_TDMCONFIGURATIONREG0 TAS256X_REG(0x0, 0x0, 0x06)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATERAMP_MASK (0x1 << 5)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATERAMP_48KHZ (0x0 << 5)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATERAMP_44_1KHZ (0x1 << 5)
#define TAS256X_TDMCONFIGURATIONREG0_DETECTSAMPRATE_MASK (0x1 << 4)
#define TAS256X_TDMCONFIGURATIONREG0_DETECTSAMPRATE_DISABLED (0x1 << 4)
#define TAS256X_TDMCONFIGURATIONREG0_DETECTSAMPRATE_ENABLED (0x0 << 4)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATE31_MASK (0x7 << 1)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATE31_14_7_16KHZ (0x1 << 1)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATE31_44_1_48KHZ (0x4 << 1)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATE31_88_2_96KHZ (0x5 << 1)
#define TAS256X_TDMCONFIGURATIONREG0_SAMPRATE31_176_4_192KHZ (0x6 << 1)
#define TAS256X_TDMCONFIGURATIONREG0_FRAMESTART_MASK (0x1 << 0)
#define TAS256X_TDMCONFIGURATIONREG0_FRAMESTART_LOWTOHIGH (0x0 << 0)
#define TAS256X_TDMCONFIGURATIONREG0_FRAMESTART_HIGHTOLOW (0x1 << 0)
/* TDM Configuration Reg1 */
#define TAS256X_TDMCONFIGURATIONREG1 TAS256X_REG(0x0, 0x0, 0x07)
#define TAS256X_TDMCONFIGURATIONREG1_RXJUSTIFY_MASK (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG1_RXJUSTIFY_LEFT (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG1_RXJUSTIFY_RIGHT (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG1_RXOFFSET51_MASK (0x1f << 1)
#define TAS256X_TDMCONFIGURATIONREG1_RXOFFSET51_SHIFT (1)
#define TAS256X_TDMCONFIGURATIONREG1_RXEDGE_MASK (0x1 << 0)
#define TAS256X_TDMCONFIGURATIONREG1_RXEDGE_SHIFT (0)
#define TAS256X_TDMCONFIGURATIONREG1_RXEDGE_RISING (0x0 << 0)
#define TAS256X_TDMCONFIGURATIONREG1_RXEDGE_FALLING (0x1 << 0)
/* TDM Configuration Reg2 */
#define TAS256X_TDMCONFIGURATIONREG2 TAS256X_REG(0x0, 0x0, 0x08)
#define TAS256X_TDMCONFIGURATIONREG2_IVLEN76_MASK (0X3 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVLENCFG76_16BITS (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVLENCFG76_12BITS (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVLENCFG76_8BITS (0x2 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVMONLEN76_MASK (0x3 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVMONLEN76_8BITS (0x2 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVMONLEN76_12BITS (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_IVMONLEN76_16BITS (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG2_RXSCFG54_MASK (0x3 << 4)
#define TAS256X_TDMCONFIGURATIONREG2_RXSCFG54_MONO_I2C (0x0 << 4)
#define TAS256X_TDMCONFIGURATIONREG2_RXSCFG54_MONO_LEFT (0x1 << 4)
#define TAS256X_TDMCONFIGURATIONREG2_RXSCFG54_MONO_RIGHT (0x2 << 4)
#define TAS256X_TDMCONFIGURATIONREG2_RXSCFG54_STEREO_DOWNMIX (0x3 << 4)
#define TAS256X_TDMCONFIGURATIONREG2_RXWLEN32_MASK (0x3 << 2)
#define TAS256X_TDMCONFIGURATIONREG2_RXWLEN32_16BITS (0x0 << 2)
#define TAS256X_TDMCONFIGURATIONREG2_RXWLEN32_20BITS (0x1 << 2)
#define TAS256X_TDMCONFIGURATIONREG2_RXWLEN32_24BITS (0x2 << 2)
#define TAS256X_TDMCONFIGURATIONREG2_RXWLEN32_32BITS (0x3 << 2)
#define TAS256X_TDMCONFIGURATIONREG2_RXSLEN10_MASK (0x3 << 0)
#define TAS256X_TDMCONFIGURATIONREG2_RXSLEN10_16BITS (0x0 << 0)
#define TAS256X_TDMCONFIGURATIONREG2_RXSLEN10_24BITS (0x1 << 0)
#define TAS256X_TDMCONFIGURATIONREG2_RXSLEN10_32BITS (0x2 << 0)
/* TDM Configuration Reg3 */
#define TAS256X_TDMCONFIGURATIONREG3 TAS256X_REG(0x0, 0x0, 0x09)
#define TAS256X_TDMCONFIGURATIONREG3_RXSLOTRIGHT74_MASK (0xf << 4)
#define TAS256X_TDMCONFIGURATIONREG3_RXSLOTRIGHT74_SHIFT (4)
#define TAS256X_TDMCONFIGURATIONREG3_RXSLOTLeft30_Mask (0xf << 0)
#define TAS256X_TDMCONFIGURATIONREG3_RXSLOTLeft30_SHIFT (0)
/* TDM Configuration Reg4 */
#define TAS256X_TDMConfigurationReg4 TAS256X_REG(0x0, 0x0, 0x0A)
#define TAS256X_TDMCONFIGURATIONREG4_TXKEEPER_MASK (0x1 << 5)
#define TAS256X_TDMCONFIGURATIONREG4_TXKEEPER_DISABLE (0x0 << 5)
#define TAS256X_TDMCONFIGURATIONREG4_TXKEEPER_ENABLE (0x1 << 5)
#define TAS256X_TDMCONFIGURATIONREG4_TXFILL_MASK (0x1 << 4)
#define TAS256X_TDMCONFIGURATIONREG4_TXFILL_TRANSMIT0 (0x0 << 4)
#define TAS256X_TDMCONFIGURATIONREG4_TXFILL_TRANSMITHIZ (0x1 << 4)
#define TAS256X_TDMCONFIGURATIONREG4_TXOFFSET31_MASK (0x7 << 1)
#define TAS256X_TDMCONFIGURATIONREG4_TXOFFSET31_SHIFT (1)
#define TAS256X_TDMCONFIGURATIONREG4_TXEDGE_MASK (0x1 << 0)
#define TAS256X_TDMCONFIGURATIONREG4_TXEDGE_SHIFT (0)
#define TAS256X_TDMCONFIGURATIONREG4_TXEDGE_RISING (0x0 << 0)
#define TAS256X_TDMCONFIGURATIONREG4_TXEDGE_FALLING (0x1 << 0)
/* TDM Configuration Reg5 */
#define TAS256X_TDMCONFIGURATIONREG5 TAS256X_REG(0x0, 0x0, 0x0B)
#define TAS256X_TDMCONFIGURATIONREG5_VSNSTX_MASK (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG5_VSNSTX_DISABLE (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG5_VSNSTX_ENABLE (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG5_VSNSSLOT50_MASK (0x3f << 0)
/* TDM Configuration Reg6 */
#define TAS256X_TDMCONFIGURATIONREG6 TAS256X_REG(0x0, 0x0, 0x0C)
#define TAS256X_TDMCONFIGURATIONREG6_ISNSTX_MASK (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG6_ISNSTX_DISABLE (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG6_ISNSTX_ENABLE (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG6_ISNSSLOT50_MASK (0x3f << 0)
/* TDM Configuration Reg7 */
#define TAS256X_TDMCONFIGURATIONREG7 TAS256X_REG(0x0, 0x0, 0x0D)
#define TAS256X_TDMCONFIGURATIONREG7_VBATSLEN_MASK (0x1 << 7)
#define TAS256X_TDMCONFIGURATIONREG7_VBATSLEN_8BITS (0x0 << 7)
#define TAS256X_TDMCONFIGURATIONREG7_VBATSLEN_16BITS (0x1 << 7)
#define TAS256X_TDMCONFIGURATIONREG7_VBATTX_MASK (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG7_VBATTX_DISABLE (0x0 << 6)
#define TAS256X_TDMCONFIGURATIONREG7_VBATTX_ENABLE (0x1 << 6)
#define TAS256X_TDMCONFIGURATIONREG7_VBATSLOT50_MASK (0x3f << 0)
/* Interrupt Mask Reg0 */
#define TAS256X_INTERRUPTMASKREG0 TAS256X_REG(0x0, 0x0, 0x1A)
#define TAS256X_INTERRUPTMASKREG0_LIMMUTEINTMASK_MASK (0x1 << 7)
#define TAS256X_INTERRUPTMASKREG0_LIMMUTEINTMASK_UNMASK (0x0 << 7)
#define TAS256X_INTERRUPTMASKREG0_LIMMUTEINTMASK_DISABLE (0x1 << 7)
#define TAS256X_INTERRUPTMASKREG0_LIMINFHLDINTMASK_MASK (0x1 << 6)
#define TAS256X_INTERRUPTMASKREG0_LIMINFHLDINTMASK_UNMASK (0x0 << 6)
#define TAS256X_INTERRUPTMASKREG0_LIMINFHLDINTMASK_DISABLE (0x1 << 6)
#define TAS256X_INTERRUPTMASKREG0_LIMMAXATNINTMASK_MASK (0x1 << 5)
#define TAS256X_INTERRUPTMASKREG0_LIMMAXATNINTMASK_UNMASK (0x0 << 5)
#define TAS256X_INTERRUPTMASKREG0_LIMMAXATNINTMASK_DISABLE (0x1 << 5)
#define TAS256X_INTERRUPTMASKREG0_VBATLESSTHANINFINTMASK_MASK (0x1 << 4)
#define TAS256X_INTERRUPTMASKREG0_VBATLESSTHANINFINTMASK_UNMASK (0x0 << 4)
#define TAS256X_INTERRUPTMASKREG0_VBATLESSTHANINFINTMASK_DISABLE (0x1 << 4)
#define TAS256X_INTERRUPTMASKREG0_LIMACTIVEFLAGINTMASK_MASK (0x1 << 3)
#define TAS256X_INTERRUPTMASKREG0_LIMACTIVEFLAGINTMASK_UNMASK (0x0 << 3)
#define TAS256X_INTERRUPTMASKREG0_LIMACTIVEFLAGINTMASK_DISABLE (0x1 << 3)
#define TAS256X_INTERRUPTMASKREG0_TDMCLOCKERRORINTMASK_MASK (0x1 << 2)
#define TAS256X_INTERRUPTMASKREG0_TDMCLOCKERRORINTMASK_UNMASK (0x0 << 2)
#define TAS256X_INTERRUPTMASKREG0_TDMCLOCKERRORINTMASK_DISABLE (0x1 << 2)
#define TAS256X_INTERRUPTMASKREG0_OCEINTMASK_MASK (0x1 << 1)
#define TAS256X_INTERRUPTMASKREG0_OCEINTMASK_UNMASK (0x0 << 1)
#define TAS256X_INTERRUPTMASKREG0_OCEINTMASK_DISABLE (0x1 << 1)
#define TAS256X_INTERRUPTMASKREG0_OTEINTMASK_MASK (0x1 << 0)
#define TAS256X_INTERRUPTMASKREG0_OTEINTMASK_UNMASK (0x0 << 0)
#define TAS256X_INTERRUPTMASKREG0_OTEINTMASK_DISABLE (0x1 << 0)
#define TAS256X_INTERRUPTMASKREG0_DISABLE 0xff
/* Interrupt Mask Reg1 */
#define TAS256X_INTERRUPTMASKREG1 TAS256X_REG(0x0, 0x0, 0x1B)
#define TAS256X_INTERRUPTMASKREG1_DSPOUTPUTINTMASK_MASK (0x1 << 7)
#define TAS256X_INTERRUPTMASKREG1_DSPOUTPUTINTMASK_UNMASK (0x0 << 7)
#define TAS256X_INTERRUPTMASKREG1_DSPOUTPUTINTMASK_DISABLE (0x1 << 7)
#define TAS256X_INTERRUPTMASKREG1_CRCINTMASK_MASK (0x1 << 6)
#define TAS256X_INTERRUPTMASKREG1_CRCINTMASK_UNMASK (0x0 << 6)
#define TAS256X_INTERRUPTMASKREG1_CRCINTMASK_DISABLE (0x1 << 6)
#define TAS256X_INTERRUPTMASKREG1_VBATOVLOINTMASK_MASK (0x1 << 2)
#define TAS256X_INTERRUPTMASKREG1_VBATOVLOINTMASK_UNMASK (0x0 << 2)
#define TAS256X_INTERRUPTMASKREG1_VBATOVLOINTMASK_DISABLE (0x1 << 2)
#define TAS256X_INTERRUPTMASKREG1_VBATUVLOINTMASK_MASK (0x1 << 1)
#define TAS256X_INTERRUPTMASKREG1_VBATUVLOINTMASK_UNMASK (0x0 << 1)
#define TAS256X_INTERRUPTMASKREG1_VBATUVLOINTMASK_DISABLE (0x1 << 1)
#define TAS256X_INTERRUPTMASKREG1_BROWNOUTFLAGINTMASK_MASK (0x1 << 0)
#define TAS256X_INTERRUPTMASKREG1_BROWNOUTFLAGINTMASK_UNMASK (0x0 << 0)
#define TAS256X_INTERRUPTMASKREG1_BROWNOUTFLAGINTMASK_DISABLE (0x1 << 0)
#define TAS256X_INTERRUPTMASKREG1_DISABLE 0xff
/* Latched-Interrupt Reg0 */
#define TAS256X_LATCHEDINTERRUPTREG0 TAS256X_REG(0x0, 0x0, 0x24)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMUTESTICKY_MASK (0x1 << 7)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMUTESTICKY_NOINTERRUPT (0x0 << 7)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMUTESTICKY_INTERRUPT (0x1 << 7)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMINFHLDSTICKY_MASK (0x1 << 6)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMINFHLDSTICKY_NOINTERRUPT (0x0 << 6)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMINFHLDSTICKY_INTERRUPT (0x1 << 6)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMAXATNSTICKY_MASK (0x1 << 5)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMAXATNSTICKY_NOINTERRUPT (0x0 << 5)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMMAXATNSTICKY_INTERRUPT (0x1 << 5)
#define TAS256X_LATCHEDINTERRUPTREG0_VBATLESSTHANINFSTICKY_MASK (0x1 << 4)
#define TAS256X_LATCHEDINTERRUPTREG0_VBATLESSTHANINFSTICKY_NOINTERRUPT \
(0x0 << 4)
#define TAS256X_LATCHEDINTERRUPTREG0_VBATLESSTHANINFSTICKY_INTERRUPT (0x1 << 4)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMACTIVEFLAGSTICKY_MASK (0x1 << 3)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMACTIVEFLAGSTICKY_NOINTERRUPT (0x0 << 3)
#define TAS256X_LATCHEDINTERRUPTREG0_LIMACTIVEFLAGSTICKY_INTERRUPT (0x1 << 3)
#define TAS256X_LATCHEDINTERRUPTREG0_TDMCLOCKERRORSTICKY_MASK (0x1 << 2)
#define TAS256X_LATCHEDINTERRUPTREG0_TDMCLOCKERRORSTICKY_NOINTERRUPT (0x0 << 2)
#define TAS256X_LATCHEDINTERRUPTREG0_TDMCLOCKERRORSTICKY_INTERRUPT (0x1 << 2)
#define TAS256X_LATCHEDINTERRUPTREG0_OCEFLAGSTICKY_MASK (0x1 << 1)
#define TAS256X_LATCHEDINTERRUPTREG0_OCEFLAGSTICKY_NOINTERRUPT (0x0 << 1)
#define TAS256X_LATCHEDINTERRUPTREG0_OCEFLAGSTICKY_INTERRUPT (0x1 << 1)
#define TAS256X_LATCHEDINTERRUPTREG0_OTEFLAGSTICKY_MASK (0x1 << 0)
#define TAS256X_LATCHEDINTERRUPTREG0_OTEFLAGSTICKY_NOINTERRUPT (0x0 << 0)
#define TAS256X_LATCHEDINTERRUPTREG0_OTEFLAGSTICKY_INTERRUPT (0x1 << 0)
/* Latched-Interrupt Reg1 */
#define TAS256X_LATCHEDINTERRUPTREG1 TAS256X_REG(0x0, 0x0, 0x25)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMAUDDATAINVALIDSTICKY_MASK (0x1 << 7)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMAUDDATAINVALIDSTICKY_NOINTERRUPT \
(0x0 << 7)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMAUDDATAINVALIDSTICKY_INTERRUPT \
(0x1 << 7)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATOVLOSTICKY_MASK (0x1 << 3)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATOVLOSTICKY_NOINTERRUPT (0x0 << 3)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATOVLOSTICKY_INTERRUPT (0x1 << 3)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATUVLOSTICKY_MASK (0x1 << 2)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATUVLOSTICKY_NOINTERRUPT (0x0 << 2)
#define TAS256X_LATCHEDINTERRUPTREG1_VBATUVLOSTICKY_INTERRUPT (0x1 << 2)
#define TAS256X_LATCHEDINTERRUPTREG1_BROWNOUTFLAGSTICKY_MASK (0x1 << 1)
#define TAS256X_LATCHEDINTERRUPTREG1_BROWNOUTFLAGSTICKY_NOINTERRUPT (0x0 << 1)
#define TAS256X_LATCHEDINTERRUPTREG1_BROWNOUTFLAGSTICKY_INTERRUPT (0x1 << 1)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMCLOCKERRORSTICKY_MASK (0x1 << 0)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMCLOCKERRORSTICKY_NOINTERRUPT (0x0 << 0)
#define TAS256X_LATCHEDINTERRUPTREG1_PDMCLOCKERRORSTICKY_INTERRUPT (0x1 << 0)
/* Interrupt Configuration */
#define TAS256X_INTERRUPTCONFIGURATION TAS256X_REG(0x0, 0x0, 0x30)
#define TAS256X_INTERRUPTCONFIGURATION_LTCHINTCLEAR_MASK (0x1 << 2)
#define TAS256X_INTERRUPTCONFIGURATION_LTCHINTCLEAR (0x1 << 2)
#define TAS256X_INTERRUPTCONFIGURATION_PININTCONFIG10_MASK (0x3 << 0)
#define TAS256X_INTERRUPTCONFIGURATION_PININTCONFIG10_ASSERTONLIVEINTERRUPTS \
(0x0 << 0)
#define \
TAS256X_INTERRUPTCONFIGURATION_PININTCONFIG10_ASSERTONLATCHEDINTERRUPTS \
(0x1 << 0)
#define \
TAS256X_INTERRUPTCONFIGURATION_PININTCONFIG10_ASSERT2MSONLIVEINTERRUPTS \
(0x2 << 0)
#define \
TAS256X_INTERRUPTCONFIGURATION_PININTCONFIG10_ASSERT2MSONLATCHEDINTERRUPTS \
(0x3 << 0)
#define TAS256X_CLOCK_HALT_TIMER_MASK (0x7 << 3)
#define TAS256X_CLOCK_HALT_1MS (0x0 << 3)
#define TAS256X_CLOCK_HALT_3MS (0x1 << 3)
#define TAS256X_CLOCK_HALT_26MS (0x2 << 3)
#define TAS256X_CLOCK_HALT_52MS (0x3 << 3)
#define TAS256X_CLOCK_HALT_104MS (0x4 << 3)
#define TAS256X_CLOCK_HALT_209MS (0x5 << 3)
#define TAS256X_CLOCK_HALT_419MS (0x6 << 3)
#define TAS256X_CLOCK_HALT_838MS (0x7 << 3)
#define TAS256X_BOOSTSLOPE TAS256X_REG(0x0, 0x0, 0x35)
#define TAS256X_BOOSTSLOPE_MASK (0x3 << 2)
/* Clock Configuration */
#define TAS256X_CLOCKCONFIGURATION TAS256X_REG(0x0, 0x0, 0x38)
#define TAS256X_CLOCKCONFIGURATION_SBCLKTOFS52_MASK (0xf << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_16 (0x0 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_24 (0x1 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_32 (0x2 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_48 (0x3 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_64 (0x4 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_96 (0x5 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_128 (0x6 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_192 (0x7 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_256 (0x8 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_384 (0x9 << 2)
#define TAS256X_CLOCKCONFIGURATION_SBCLKtoFS52_512 (0xa << 2)
#define TAS256X_CLOCKCONFIGURATION_DISCLKRATEDETECT10_MASK (0x3 << 0)
#define TAS256X_CLOCKCONFIGURATION_DISCLKRATEDETECT10_DISABLED (0x1 << 0)
#define TAS256X_CLOCKCONFIGURATION_DISCLKRATEDETECT10_ENABLED (0x0 << 0)
#define TAS256X_VBATFILTER TAS256X_REG(0x0, 0x0, 0x3b)
#define TAS256X_VBAT_LPF_MASK (0x3 << 5)
#define TAS256X_VBAT_LPF_SHIFT 5
#define TAS256X_CLASSHRELEASETIMER TAS256X_REG(0x0, 0x0, 0x3c)
#define TAS256X_BOOST_CFG4 TAS256X_REG(0x0, 0x0, 0x40)
#define TAS256X_CHIPID TAS256X_REG(0x0, 0x0, 0x7D)
#define TAS256X_ICN_THRESHOLD_REG TAS256X_REG(0x0, 0x2, 0x64)
#define TAS256X_ICN_HYSTERESIS_REG TAS256X_REG(0x0, 0x2, 0x6c)
#define TAS256X_ICN_SW_REG TAS256X_REG(0x0, 0x0, 0x3e)
#define TAS256X_ICN_SW_MASK (0x01 << 4)
#define TAS256X_ICN_SW_ENABLE (0x10)
#define TAS256X_ICN_SW_DISABLE (0x00)
#define TAS256X_ICN_IVSENSE_MASK (0x01 << 1)
#define TAS256X_ICN_NG_MASK (0x01 << 5)
#define TAS256X_ICN_NG_SHIFT 5
#define TAS256X_TESTPAGECONFIGURATION TAS256X_REG(0x0, 0xfd, 0xd)
#define TAS256X_CLASSDCONFIGURATION1 TAS256X_REG(0x0, 0xfd, 0x19)
#define TAS256X_CLASSDCONFIGURATION2 TAS256X_REG(0x0, 0xfd, 0x32)
#define TAS256X_CLASSDCONFIGURATION3 TAS256X_REG(0x0, 0xfd, 0x33)
#define TAS256X_CLASSDCONFIGURATION4 TAS256X_REG(0x0, 0xfd, 0x3f)
#define TAS256X_EFFICIENCYCONFIGURATION TAS256X_REG(0x0, 0xfd, 0x5f)
#define TAS256X_HPF TAS256X_REG(0x0, 0x2, 0x70)
#define TAS256X_CLASSHHEADROOM TAS256X_REG(0x64, 0x7, 0x48)
#define TAS256X_CLASSHHYSTERESIS TAS256X_REG(0x64, 0x7, 0x4c)
#define TAS256X_CLASSHMTCT TAS256X_REG(0x64, 0x5, 0x4c)
/*PCM Digital Volume Control*/
#define TAS256X_DVC_PCM TAS256X_REG(0x0, 0x2, 0x0c)
/*Limiter Controls*/
#define TAS256X_LIM_MAX_ATN TAS256X_REG(0x0, 0x2, 0x14)
#define TAS256X_LIMB_TH_MAX TAS256X_REG(0x0, 0x2, 0x18)
#define TAS256X_LIMB_TH_MIN TAS256X_REG(0x0, 0x2, 0x1c)
#define TAS256X_LIMB_INF_PT TAS256X_REG(0x0, 0x2, 0x20)
#define TAS256X_LIMB_SLOPE TAS256X_REG(0x0, 0x2, 0x24)
/*Brown Out Protection Control*/
#define TAS256X_BOP_TH TAS256X_REG(0x0, 0x2, 0x28)
#define TAS256X_BOSD_TH TAS256X_REG(0x0, 0x2, 0x2c)
#define TAS256X_BOOSTCONFIGURATION4 TAS256X_REG(0x0, 0x0, 0x40)
#define TAS256X_BOOSTCONFIGURATION4_BOOSTCURRENTLIMIT_MASK (0x3f << 0)
#define TAS256X_BOOSTCONFIGURATION4_BOOSTCURRENTLIMIT_SHIFT 0
#define TAS256X_LIMITERCONFIGURATION0 TAS256X_REG(0x0, 0x0, 0x12)
#define TAS256X_LIMITER_ENABLE_MASK (0x1 << 0)
#define TAS256X_LIMITER_ENABLE_SHIFT 0x0
#define TAS256X_LIMITER_ATTACKRATE_MASK (0x7 << 1)
#define TAS256X_LIMITER_ATTACKRATE_SHIFT 0x1
#define TAS256X_LIMITER_ATTACKSTEPSIZE_MASK (0x3 << 4)
#define TAS256X_LIMITER_ATTACKSTEPSIZE_SHIFT 0x4
#define TAS256X_LIMITERCONFIGURATION1 TAS256X_REG(0x0, 0x0, 0x13)
#define TAS256X_LIMITER_RELEASERATE_MASK (0x7 << 3)
#define TAS256X_LIMITER_RELEASERATE_SHIFT 0x3
#define TAS256X_LIMITER_RELEASESTEPSIZE_MASK (0x3 << 6)
#define TAS256X_LIMITER_RELEASESTEPSIZE_SHIFT 0x6
#define TAS256X_BOPCONFIGURATION0 TAS256X_REG(0x0, 0x0, 0x14)
#define TAS256X_BOP_ENABLE_MASK (0x1 << 0)
#define TAS256X_BOP_ENABLE_SHIFT 0x0
#define TAS256X_BOP_MUTE_MASK (0x1 << 1)
#define TAS256X_BOP_MUTE_SHIFT 0x1
#define TAS256X_BOP_SHUTDOWN_ENABLE_MASK (0x1 << 4)
#define TAS256X_BOP_SHUTDOWN_ENABLE_SHIFT 0x4
#define TAS256X_BOPCONFIGURATION1 TAS256X_REG(0x0, 0x0, 0x15)
#define TAS256X_BOP_ATTACKRATE_MASK (0x7 << 5)
#define TAS256X_BOP_ATTACKRATE_SHIFT 0x5
#define TAS256X_BOP_ATTACKSTEPSIZE_MASK (0x3 << 0x3)
#define TAS256X_BOP_ATTACKSTEPSIZE_SHIFT 0x3
#define TAS256X_BOP_HOLDTIME_MASK (0x7 << 0x0)
#define TAS256X_BOP_HOLDTIME_SHIFT 0x0
#define TAS256X_MISC_CLASSD TAS256X_REG(0x0, 0x01, 0x21)
#define TAS256X_CMP_HYST_MASK (0x1 << 3)
#define TAS256X_CMP_HYST_SHIFT (0x3)
#define TAS256X_CLASSH_TIMER TAS256X_REG(0x64, 0x8, 0x1c)
#define TAS256X_CLASSH_TIMER_RELEASE TAS256X_REG(0x0, 0x0, 0x3c)
#define TAS256X_CLASSH_TIMER_RELEASE_MASK (0x1f << 2)
/*Test Page*/
#define TAS256X_TEST_PAGE_LOCK TAS256X_REG(0x00, 0xfd, 0x0d)
#define TAS256X_DAC_MODULATOR TAS256X_REG(0x00, 0xfd, 0x12)
#define TAS256X_DAC_MUTE TAS256X_REG(0x00, 0xfd, 0x47)
#define TAS256X_ICN_MODE TAS256X_REG(0x00, 0xfd, 0x64)
#define TAS256X_ICN_IMPROVE TAS256X_REG(0x00, 0xfd, 0x46)
/* Book */
#define TAS256X_BOOK TAS256X_REG(0x0, 0x0, 0x7F)
#define TAS256X_BOOK_BOOK70_MASK (0xff << 0)
/* data format */
#define TAS256X_DATAFORMAT_SHIFT 2
#define TAS256X_DATAFORMAT_I2S 0x0
#define TAS256X_DATAFORMAT_DSP 0x1
#define TAS256X_DATAFORMAT_RIGHT_J 0x2
#define TAS256X_DATAFORMAT_LEFT_J 0x3
#define TAS256X_DAI_FMT_MASK (0x7 << TAS256X_DATAFORMAT_SHIFT)
#define TAS256X_POWER_ACTIVE 0
#define TAS256X_POWER_MUTE 1
#define TAS256X_POWER_SHUTDOWN 2
#define ERROR_NONE 0x0000000
#define ERROR_PLL_ABSENT 0x0000001
#define ERROR_DEVA_I2C_COMM 0x0000002
#define ERROR_DEVB_I2C_COMM 0x0000004
#define ERROR_CLOCK 0x0000008
#define ERROR_YRAM_CRCCHK 0x0000010
#define ERROR_OVER_CURRENT 0x0000020
#define ERROR_DIE_OVERTEMP 0x0000040
#define ERROR_OVER_VOLTAGE 0x0000080
#define ERROR_UNDER_VOLTAGE 0x0000100
#define ERROR_BROWNOUT 0x0000200
#define ERROR_CLASSD_PWR 0x0000400
#define ERROR_FAILSAFE 0x0000800
/* 5 second */
#define CHECK_PERIOD 5000
#define TAS256X_I2C_RETRY_COUNT 3
#define ERROR_I2C_SUSPEND -1
#define ERROR_I2C_FAILED -2
#define TAS256X_LEFT_SWITCH 0x10000001
#define TAS256X_RIGHT_SWITCH 0x10000002
#define RX_SCFG_LEFT 0x10000003
#define RX_SCFG_RIGHT 0x10000004
#define RESTART_MAX 3
struct tas256x_priv;
#if KERNEL_VERSION(4, 19, 0) <= LINUX_VERSION_CODE
struct snd_soc_component;
#else
struct snd_soc_codec;
#endif
#if IS_ENABLED(CONFIG_TAS256X_REGBIN_PARSER)
#define TAS256X_CONFIG_SIZE (10)
#define TAS256X_DEVICE_SUM (8)
#define TAS256X_CMD_SING_W (0x1)
#define TAS256X_CMD_BURST (0x2)
#define TAS256X_CMD_DELAY (0x3)
#define TAS256X_CMD_FIELD_W (0x4)
#define SMS_HTONS(a, b) ((((a)&0x00FF)<<8) | \
((b)&0x00FF))
#define SMS_HTONL(a, b, c, d) ((((a)&0x000000FF)<<24) |\
(((b)&0x000000FF)<<16) | \
(((c)&0x000000FF)<<8) | \
((d)&0x000000FF))
enum tas256x_dsp_fw_state {
TAS256X_DSP_FW_NONE = 0,
TAS256X_DSP_FW_PENDING,
TAS256X_DSP_FW_FAIL,
TAS256X_DSP_FW_OK,
};
enum tas256x_bin_blk_type {
TAS256X_BIN_BLK_COEFF = 1,
TAS256X_BIN_BLK_POST_POWER_UP,
TAS256X_BIN_BLK_PRE_SHUTDOWN,
TAS256X_BIN_BLK_PRE_POWER_UP,
TAS256X_BIN_BLK_POST_SHUTDOWN
};
struct tas256x_fw_hdr {
unsigned int img_sz;
unsigned int checksum;
unsigned int binnary_version_num;
unsigned int drv_fw_version;
unsigned int timestamp;
unsigned char plat_type;
unsigned char dev_family;
unsigned char reserve;
unsigned char ndev;
unsigned char devs[TAS256X_DEVICE_SUM];
unsigned int nconfig;
unsigned int config_size[TAS256X_CONFIG_SIZE];
};
struct tas256x_block_data {
unsigned char dev_idx;
unsigned char block_type;
unsigned short yram_checksum;
unsigned int block_size;
unsigned int nSublocks;
unsigned char *regdata;
};
struct tas256x_config_info {
unsigned int nblocks;
unsigned int real_nblocks;
struct tas256x_block_data **blk_data;
};
void tas256x_select_cfg_blk(void *pContext, int conf_no, unsigned char block_type);
int tas256x_load_container(struct tas256x_priv *pTAS256x);
void tas256x_config_info_remove(void *pContext);
#endif /*CONFIG_TAS256X_REGBIN_PARSER*/
struct tas256x_register {
int book;
int page;
int reg;
};
struct tas256x_dai_cfg {
unsigned int dai_fmt;
unsigned int tdm_delay;
};
/*struct tas256x_buf_cfg {
unsigned short bufSize;
unsigned char *buf;
};
*/
enum channel {
channel_left = 0x01,
channel_right = 0x02,
channel_both = channel_left|channel_right
};
/*
* device ops function structure
*/
struct tas_device_ops {
/**< init typically for loading optimal settings */
int (*tas_init)(struct tas256x_priv *p_tas256x, int chn);
#if KERNEL_VERSION(4, 19, 0) <= LINUX_VERSION_CODE
int (*tas_probe)(struct tas256x_priv *p_tas256x,
struct snd_soc_component *codec, int chn);
#else
int (*tas_probe)(struct tas256x_priv *p_tas256x,
struct snd_soc_codec *codec, int chn);
#endif
/*TODO:*/
};
struct tas_device {
int mn_chip_id;
int mn_current_book;
int mn_current_page;
int mn_addr;
int mn_reset_gpio;
int mn_irq_gpio;
int mn_irq;
int spk_control;
int device_id;
int rx_mode;
int dvc_pcm;
int bst_vltg;
int bst_ilm;
int ampoutput_lvl;
int lim_switch;
int lim_max_attn;
int lim_thr_max;
int lim_thr_min;
int lim_att_rate;
int lim_rel_rate;
int lim_att_stp_size;
int lim_rel_stp_size;
int lim_max_thd;
int lim_min_thd;
int lim_infl_pt;
int lim_trk_slp;
int bop_enable;
int bop_thd;
int bop_att_rate;
int bop_att_stp_size;
int bop_hld_time;
int bop_mute;
int bosd_enable;
int bosd_thd;
int vbat_lpf;
int rx_cfg;
int classh_timer;
int reciever_enable;
int icn_thr;
int icn_hyst;
int noise_gate;
struct tas_device_ops dev_ops;
};
struct tas256x_priv {
void *platform_data;
bool mb_power_up;
int mn_power_state;
bool mb_irq_eable;
int mn_sampling_rate;
int mn_frame_size;
int mn_ppg;
int mn_ch_size;
int mn_rx_slot_width;
int mn_rx_width;
int mn_tx_slot_width;
int mn_iv_width;
int mn_vbat;
bool mb_mute;
bool dac_mute;
int mn_channels;
int mn_slots;
int mn_rx_slot_map[2];
int mn_fmt;
int mn_fmt_mode;
int mn_frame_start;
int mn_rx_edge;
int mn_rx_offset;
int mn_tx_edge;
int mn_tx_offset;
struct tas_device **devs;
int icn_sw;
int (*read)(struct tas256x_priv *p_tas256x, enum channel chn,
unsigned int reg, unsigned int *pValue);
int (*write)(struct tas256x_priv *p_tas256x, enum channel chn,
unsigned int reg, unsigned int Value);
int (*bulk_read)(struct tas256x_priv *p_tas256x, enum channel chn,
unsigned int reg, unsigned char *p_data, unsigned int len);
int (*bulk_write)(struct tas256x_priv *p_tas256x, enum channel chn,
unsigned int reg, unsigned char *p_data, unsigned int len);
int (*update_bits)(struct tas256x_priv *p_tas256x, enum channel chn,
unsigned int reg, unsigned int mask, unsigned int value);
void (*hw_reset)(struct tas256x_priv *p_tas256x);
void (*clear_irq)(struct tas256x_priv *p_tas256x);
void (*enable_irq)(struct tas256x_priv *p_tas256x, bool enable);
unsigned int mn_err_code;
unsigned int mn_restart;
int (*plat_write)(void *plat_data,
unsigned int i2c_addr, unsigned int reg, unsigned int value);
int (*plat_bulk_write)(void *plat_data, unsigned int i2c_addr,
unsigned int reg, unsigned char *pData,
unsigned int nLength);
int (*plat_read)(void *plat_data, unsigned int i2c_addr,
unsigned int reg, unsigned int *value);
int (*plat_bulk_read)(void *plat_data, unsigned int i2c_addr,
unsigned int reg, unsigned char *pData,
unsigned int nLength);
int (*plat_update_bits)(void *plat_data, unsigned int i2c_addr,
unsigned int reg, unsigned int mask,
unsigned int value);
void (*schedule_init_work)(struct tas256x_priv *p_tas256x);
struct mutex dev_lock;
#if IS_ENABLED(CONFIG_TAS256X_CODEC)
struct mutex codec_lock;
#endif
#if IS_ENABLED(CONFIG_TAS256X_MISC)
struct mutex file_lock;
#endif
struct delayed_work irq_work;
struct delayed_work init_work;
struct delayed_work dc_work;
int iv_enable;
#if IS_ENABLED(CONFIG_TAS256X_REGBIN_PARSER)
int fw_state;
struct tas256x_fw_hdr fw_hdr;
int ncfgs;
struct tas256x_config_info **cfg_info;
int profile_cfg_id;
#endif
};
#endif /* __TAS256X_ */