summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9d0f9e1)
raw | patch | inline | side by side (parent: 9d0f9e1)
author | Tracy Yi <tracy-yi@ti.com> | |
Mon, 13 Aug 2018 02:22:48 +0000 (10:22 +0800) | ||
committer | Tracy Yi <tracy-yi@ti.com> | |
Mon, 13 Aug 2018 02:22:48 +0000 (10:22 +0800) |
Signed-off-by: Tracy Yi <tracy-yi@ti.com>
tas2555-core.c | patch | blob | history | |
tas2555.h | patch | blob | history |
diff --git a/tas2555-core.c b/tas2555-core.c
index bae360f18574e1adfdefc020cd4a98a468016f0b..79fe354fddf614dee237c4aef061b63eb1977fd2 100755 (executable)
--- a/tas2555-core.c
+++ b/tas2555-core.c
#define PPC_WITH_DRIVER_VERSION 0x010bc000
#define PPC_WITH_CHECKSUM 0x010c8400
-#define PPC_DRIVER_VERSION 0x00000200
+#define PPC_WITH_CHKSUM_VERSION 0x00000200
+#define PPC_WITH_APPMODE_VERSION 0x00000300
#define TAS2555_CAL_NAME "/data/tas2555_cal.bin"
-//set default PLL CLKIN to GPI2 (MCLK) = 0x00
+//set default PLL CLKIN to GPI2 (BCLK) = 0x00
#define TAS2555_DEFAULT_PLL_CLKIN 0x00
static int tas2555_load_calibration(struct tas2555_priv *pTAS2555,
0xFFFFFFFF, 0xFFFFFFFF
};
+static unsigned int p_tas2555_startup_with_boost_rom1_data[] = {
+ TAS2555_CLK_ERR_CTRL1, 0x00, //disable clock error detection on PLL
+ TAS2555_PLL_CLKIN_REG, TAS2555_DEFAULT_PLL_CLKIN,
+ TAS2555_POWER_CTRL1_REG, 0xF8, //PLL, DSP, clock dividers power up
+ TAS2555_UDELAY, 2000, //delay 2ms
+ TAS2555_POWER_CTRL2_REG, 0xA0, //Class-D, Boost power up
+ TAS2555_UDELAY, 2000, //delay 2ms
+ TAS2555_CLK_ERR_CTRL1, 0x0b, //enable clock error detection on PLL
+ 0xFFFFFFFF, 0xFFFFFFFF
+};
+
+static unsigned int p_tas2555_startup_wo_boost_rom1_data[] = {
+ TAS2555_CLK_ERR_CTRL1, 0x00, //disable clock error detection on PLL
+ TAS2555_PLL_CLKIN_REG, TAS2555_DEFAULT_PLL_CLKIN,
+ TAS2555_POWER_CTRL1_REG, 0xF8, //PLL, DSP, clock dividers power up
+ TAS2555_UDELAY, 2000, //delay 2ms
+ TAS2555_POWER_CTRL2_REG, 0x80, //Class-D,
+ TAS2555_CLK_ERR_CTRL1, 0x0b, //enable clock error detection on PLL
+ 0xFFFFFFFF, 0xFFFFFFFF
+};
+
+static unsigned int p_tas2555_startup_with_boost_data[] = {
+ TAS2555_CLK_ERR_CTRL1, 0x00, //disable clock error detection on PLL
+ TAS2555_PLL_CLKIN_REG, TAS2555_DEFAULT_PLL_CLKIN,
+ TAS2555_POWER_CTRL1_REG, 0xF8, //PLL, DSP, clock dividers power up
+ TAS2555_UDELAY, 2000, //delay
+ TAS2555_POWER_CTRL2_REG, 0xA0, //Class-D, Boost power up
+ TAS2555_POWER_CTRL2_REG, 0xA3, //Class-D, Boost, IV sense power up
+ TAS2555_CLK_ERR_CTRL1, 0x0b, //enable clock error detection on PLL
+ 0xFFFFFFFF, 0xFFFFFFFF
+};
+
+static unsigned int p_tas2555_startup_wo_boost_data[] = {
+ TAS2555_CLK_ERR_CTRL1, 0x00, //disable clock error detection on PLL
+ TAS2555_PLL_CLKIN_REG, TAS2555_DEFAULT_PLL_CLKIN,
+ TAS2555_POWER_CTRL1_REG, 0xF8, //PLL, DSP, clock dividers power up
+ TAS2555_UDELAY, 2000, //delay
+ TAS2555_POWER_CTRL2_REG, 0x80, //Class-D, Boost power up
+ TAS2555_POWER_CTRL2_REG, 0x83, //Class-D, Boost, IV sense power up
+ TAS2555_CLK_ERR_CTRL1, 0x0b, //enable clock error detection on PLL
+ 0xFFFFFFFF, 0xFFFFFFFF
+};
+
static unsigned int p_tas2555_unmute_data[] = {
TAS2555_MUTE_REG, 0x00, //unmute
TAS2555_SOFT_MUTE_REG, 0x00, //soft unmute
return nResult;
}
+int tas2555_pwr_startup(struct tas2555_priv *pTAS2555)
+{
+ int nResult = 0;
+ struct TProgram *pProgram;
+
+ if ((pTAS2555->mpFirmware->mnPrograms == 0)
+ || (pTAS2555->mpFirmware->mnConfigurations == 0)) {
+ nResult = -1;
+ dev_err(pTAS2555->dev, "Firmware not loaded\n");
+ goto err;
+ }
+
+ pProgram = &(pTAS2555->mpFirmware->mpPrograms[pTAS2555->mnCurrentProgram]);
+ if (pProgram->mnAppMode == APP_MODE_ROM1) {
+ if (pProgram->mnBoost == BOOST_MODE_DEVA) {
+ dev_dbg(pTAS2555->dev, "load startup_with_boost_rom1_data\n");
+ nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_with_boost_rom1_data);
+ } else if (pProgram->mnAppMode == BOOST_MODE_OFF) {
+ dev_dbg(pTAS2555->dev, "load startup_wo_boost_rom1_data\n");
+ nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_wo_boost_rom1_data);
+ } else {
+ nResult = -1;
+ dev_err(pTAS2555->dev, "invalid boost mode\n");
+ goto err;
+ }
+ } else if ((pProgram->mnAppMode == APP_MODE_ROM2)
+ || (pProgram->mnAppMode == APP_MODE_TUNING)) {
+ if (pProgram->mnBoost == BOOST_MODE_DEVA) {
+ dev_dbg(pTAS2555->dev, "load startup_with_boost_data\n");
+ nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_with_boost_data);
+ } else if (pProgram->mnAppMode == BOOST_MODE_OFF) {
+ dev_dbg(pTAS2555->dev, "load startup_wo_boost_data\n");
+ nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_wo_boost_data);
+ } else {
+ nResult = -1;
+ dev_err(pTAS2555->dev, "invalid boost mode\n");
+ goto err;
+ }
+ } else {
+ nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_data);
+ dev_info(pTAS2555->dev, "invalid appmode and invalid boost mode\n");
+ }
+
+err:
+
+ return nResult;
+}
+
int tas2555_enable(struct tas2555_priv *pTAS2555, bool bEnable)
{
int nResult = 0;
}
dev_dbg(pTAS2555->dev, "Enable: load startup sequence\n");
- nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_data);
+ nResult = tas2555_pwr_startup(pTAS2555);
if (nResult < 0)
goto end;
if (pTAS2555->mpFirmware->mpConfigurations) {
@@ -651,7 +743,7 @@ static int fw_parse_block_data(struct tas2555_priv *pTAS2555, struct TFirmware *
pBlock->mnType = fw_convert_number(pData);
pData += 4;
- if (pFirmware->mnDriverVersion >= PPC_DRIVER_VERSION) {
+ if (pFirmware->mnDriverVersion >= PPC_WITH_CHKSUM_VERSION) {
pBlock->mbPChkSumPresent = pData[0];
pData++;
pProgram->mpDescription = kmemdup(pData, n + 1, GFP_KERNEL);
pData += n + 1;
+ if (pFirmware->mnDriverVersion >= PPC_WITH_APPMODE_VERSION) {
+ pProgram->mnAppMode = pData[0];
+ pData++;
+
+ pProgram->mnBoost = (pData[0] << 8) + pData[1];
+ pData += 2;
+ } else {
+ /* invalid appmode and boost */
+ pProgram->mnAppMode = 0xff;
+ pProgram->mnBoost = 0xffff;
+ }
+
n = fw_parse_data(pTAS2555, pFirmware, &(pProgram->mData), pData);
pData += n;
}
if (nResult < 0)
goto end;
dev_dbg(pTAS2555->dev, "TAS2555: power up TAS2555\n");
- nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_data);
+ nResult = tas2555_pwr_startup(pTAS2555);
if (nResult < 0)
goto end;
dev_dbg(pTAS2555->dev,
@@ -1779,7 +1883,7 @@ int tas2555_set_program(struct tas2555_priv *pTAS2555, unsigned int nProgram, in
if (pTAS2555->mbPowerUp){
dev_dbg(pTAS2555->dev, "device powered up, load startup\n");
- nResult = tas2555_dev_load_data(pTAS2555, p_tas2555_startup_data);
+ nResult = tas2555_pwr_startup(pTAS2555);
if(nResult < 0)
goto end;
dev_dbg(pTAS2555->dev,
MODULE_AUTHOR("Texas Instruments Inc.");
MODULE_DESCRIPTION("TAS2555 common functions for Android Linux");
-MODULE_LICENSE("GPLv2");
\ No newline at end of file
+MODULE_LICENSE("GPLv2");
diff --git a/tas2555.h b/tas2555.h
index a8d4bed7f636f1398c1393e7358c0429bb463a4a..3d50402d078d5d62f27453aeb16f12096c02b013 100755 (executable)
--- a/tas2555.h
+++ b/tas2555.h
struct TBlock *mpBlocks;
};
+#define APP_MODE_ROM1 0
+#define APP_MODE_ROM2 1
+#define APP_MODE_TUNING 2
+
+#define BOOST_MODE_OFF 0
+#define BOOST_MODE_DEVA 1
+#define BOOST_MODE_DEVB 2
+#define BOOST_MODE_DEVBOTH 3
+
struct TProgram{
char mpName[64];
char *mpDescription;
+ unsigned char mnAppMode;
+ unsigned short mnBoost;
struct TData mData;
};