diff options
Diffstat (limited to 'sound/soc/codecs/ymu831/mcdevif.c')
-rw-r--r-- | sound/soc/codecs/ymu831/mcdevif.c | 441 |
1 files changed, 441 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcdevif.c b/sound/soc/codecs/ymu831/mcdevif.c new file mode 100644 index 000000000000..5fcd5174831c --- /dev/null +++ b/sound/soc/codecs/ymu831/mcdevif.c @@ -0,0 +1,441 @@ +/**************************************************************************** + * + * Copyright(c) 2012 Yamaha Corporation. All rights reserved. + * + * Module : mcdevif.c + * + * Description : MC Driver device interface + * + * Version : 1.0.0 2012.12.13 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ****************************************************************************/ + + +#include "mcdefs.h" +#include "mcdevif.h" +#include "mcservice.h" +#include "mcresctrl.h" +#include "mcdevprof.h" +#include "mcmachdep.h" +#if MCDRV_DEBUG_LEVEL +#include "mcdebuglog.h" +#endif + + + +static struct MCDRV_PACKET *gpsPacket; +static UINT32 gdPackets; + +/**************************************************************************** + * McDevIf_AllocPacketBuf + * + * Description: + * allocate the buffer for register setting packets. + * Arguments: + * none + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR + * + ****************************************************************************/ +SINT32 McDevIf_AllocPacketBuf( + void +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_AllocPacketBuf"); +#endif + + gpsPacket = McResCtrl_AllocPacketBuf(); + if (gpsPacket == NULL) { + ; + sdRet = MCDRV_ERROR; + } else { + McDevIf_ClearPacket(); + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_AllocPacketBuf", &sdRet); +#endif + + return sdRet; +} + +/**************************************************************************** + * McDevIf_ReleasePacketBuf + * + * Description: + * Release the buffer for register setting packets. + * Arguments: + * none + * Return: + * none + * + ****************************************************************************/ +void McDevIf_ReleasePacketBuf( + void +) +{ +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_ReleasePacketBuf"); +#endif + + McResCtrl_ReleasePacketBuf(); + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_ReleasePacketBuf", 0); +#endif +} + +/**************************************************************************** + * McDevIf_ClearPacket + * + * Description: + * Clear packets. + * Arguments: + * none + * Return: + * none + * + ****************************************************************************/ +void McDevIf_ClearPacket( + void +) +{ +#if (MCDRV_DEBUG_LEVEL >= 4) + SINT32 sdRet; + McDebugLog_FuncIn("McDevIf_ClearPacket"); +#endif + + if (gpsPacket == NULL) { +#if (MCDRV_DEBUG_LEVEL >= 4) + sdRet = MCDRV_ERROR; + McDebugLog_FuncOut("McDevIf_ClearPacket", &sdRet); +#endif + return; + } + + gdPackets = 0; + gpsPacket[0].dDesc = MCDRV_PACKET_TYPE_TERMINATE; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_ClearPacket", 0); +#endif +} + +/**************************************************************************** + * McDevIf_AddPacket + * + * Description: + * Add a packet. + * Arguments: + * dDesc packet info + * bData packet data + * Return: + * none + * + ****************************************************************************/ +void McDevIf_AddPacket( + UINT32 dDesc, + UINT8 bData +) +{ +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_AddPacket"); +#endif + + if (gpsPacket == NULL) { + ; + } else { + if (gdPackets >= MCDRV_MAX_PACKETS) { + ; + McDevIf_ExecutePacket(); + } + + gpsPacket[gdPackets].dDesc = dDesc; + gpsPacket[gdPackets].bData = bData; + gpsPacket[++gdPackets].dDesc = MCDRV_PACKET_TYPE_TERMINATE; + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_AddPacket", 0); +#endif +} + +/**************************************************************************** + * McDevIf_AddPacketRepeat + * + * Description: + * Add packets to set data at same register over agian. + * Arguments: + * dDesc packet info + * pbData poointer to packet data + * dDataCount packet data count + * Return: + * none + * + ****************************************************************************/ +void McDevIf_AddPacketRepeat( + UINT32 dDesc, + const UINT8 *pbData, + UINT32 dDataCount +) +{ + UINT32 dCount; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_AddPacketRepeat"); +#endif + + for (dCount = 0; dCount < dDataCount; dCount++) { + ; + McDevIf_AddPacket(dDesc, pbData[dCount]); + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_AddPacketRepeat", 0); +#endif +} + +/**************************************************************************** + * McDevIf_ExecutePacket + * + * Description: + * Execute sequence for register setting. + * Arguments: + * none + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +SINT32 McDevIf_ExecutePacket( + void +) +{ + SINT32 sdRet; + SINT16 swPacketIndex; + UINT32 dPacketType; + UINT32 dParam1; + UINT32 dParam2; + UINT16 wAddress; + UINT16 wRegType; + enum MCDRV_UPDATE_MODE eUpdateMode; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_ExecutePacket"); +#endif + + if (gpsPacket == NULL) { + sdRet = MCDRV_ERROR_RESOURCEOVER; + } else { + sdRet = MCDRV_SUCCESS; + + McResCtrl_InitRegUpdate(); + swPacketIndex = 0; + while ((MCDRV_PACKET_TYPE_TERMINATE + != (gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_TYPE_MASK)) + && (sdRet == MCDRV_SUCCESS)) { + dPacketType = gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_TYPE_MASK; + switch (dPacketType) { + case MCDRV_PACKET_TYPE_WRITE: + case MCDRV_PACKET_TYPE_FORCE_WRITE: + wRegType = + (UINT16)(gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_REGTYPE_MASK); + wAddress = + (UINT16)(gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_ADR_MASK); + if (MCDRV_PACKET_TYPE_WRITE == dPacketType) { + ; + eUpdateMode = eMCDRV_UPDATE_NORMAL; + } else if (MCDRV_PACKET_TYPE_FORCE_WRITE + == dPacketType) { + eUpdateMode = eMCDRV_UPDATE_FORCE; + } else { + eUpdateMode = eMCDRV_UPDATE_DUMMY; + } + McResCtrl_AddRegUpdate(wRegType, + wAddress, + gpsPacket[swPacketIndex].bData, + eUpdateMode); + break; + + case MCDRV_PACKET_TYPE_TIMWAIT: + McResCtrl_ExecuteRegUpdate(); + McResCtrl_InitRegUpdate(); + dParam1 = gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_TIME_MASK; + McSrv_Sleep(dParam1); + break; + + case MCDRV_PACKET_TYPE_EVTWAIT: + McResCtrl_ExecuteRegUpdate(); + McResCtrl_InitRegUpdate(); + dParam1 = gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_EVT_MASK; + dParam2 = gpsPacket[swPacketIndex].dDesc + & MCDRV_PACKET_EVTPRM_MASK; + sdRet = McResCtrl_WaitEvent(dParam1, dParam2); + break; + + default: + sdRet = MCDRV_ERROR; + break; + } + + swPacketIndex++; + } + if (sdRet == MCDRV_SUCCESS) { + ; + McResCtrl_ExecuteRegUpdate(); + } + McDevIf_ClearPacket(); + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_ExecutePacket", &sdRet); +#endif + + return sdRet; +} + +/**************************************************************************** + * McDevIf_ReadDirect + * + * Description: + * Read data from register directly + * Arguments: + * dDesc register info + * pbData pointer to data buffer + * dSize read count + * Return: + * none + * + ****************************************************************************/ +void McDevIf_ReadDirect( + UINT32 dDesc, + UINT8 *pbData, + UINT32 dSize +) +{ + UINT8 bSlaveAddr; + UINT8 abData[2]; + UINT8 bAddr = (UINT8)(dDesc&MCDRV_PACKET_ADR_MASK); + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_ReadDirect"); +#endif + + switch (dDesc&MCDRV_PACKET_REGTYPE_MASK) { + case MCDRV_PACKET_REGTYPE_IF: + if ((bAddr == MCI_ANA_REG_D) + || (bAddr == MCI_CD_REG_D)) + bSlaveAddr = + McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_ANA); + else + bSlaveAddr = + McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + McSrv_ReadRegN(bSlaveAddr, bAddr, pbData, dSize); + break; + + case MCDRV_PACKET_REGTYPE_B: + bSlaveAddr = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + abData[0] = MCI_B_REG_A<<1; + abData[1] = bAddr; + McSrv_WriteReg(bSlaveAddr, abData, 2); + bAddr = MCI_B_REG_D; + McSrv_ReadRegN(bSlaveAddr, bAddr, pbData, dSize); + break; + + case MCDRV_PACKET_REGTYPE_E: + bSlaveAddr = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + abData[0] = MCI_E_REG_A<<1; + abData[1] = bAddr; + McSrv_WriteReg(bSlaveAddr, abData, 2); + bAddr = MCI_E_REG_D; + McSrv_ReadRegN(bSlaveAddr, bAddr, pbData, dSize); + break; + + case MCDRV_PACKET_REGTYPE_C: + bSlaveAddr = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + abData[0] = MCI_C_REG_A<<1; + abData[1] = bAddr; + McSrv_WriteReg(bSlaveAddr, abData, 2); + bAddr = MCI_C_REG_D; + McSrv_ReadRegN(bSlaveAddr, bAddr, pbData, dSize); + break; + + case MCDRV_PACKET_REGTYPE_F: + bSlaveAddr = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + abData[0] = MCI_F_REG_A<<1; + abData[1] = bAddr; + McSrv_WriteReg(bSlaveAddr, abData, 2); + bAddr = MCI_F_REG_D; + McSrv_ReadRegN(bSlaveAddr, bAddr, pbData, dSize); + break; + + default: + *pbData = + McResCtrl_GetRegVal((UINT16)(dDesc&MCDRV_PACKET_REGTYPE_MASK), + bAddr); + break; + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_ReadDirect", NULL); +#endif +} + +/**************************************************************************** + * McDevIf_WriteDirect + * + * Description: + * Write data to register directly + * Arguments: + * pbData pointer to data buffer + * dSize data count + * Return: + * none + * + ****************************************************************************/ +void McDevIf_WriteDirect( + UINT8 *pbData, + UINT32 dSize +) +{ + UINT8 bSlaveAddr; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McDevIf_WriteDirect"); +#endif + + bSlaveAddr = McDevProf_GetSlaveAddr(eMCDRV_SLAVE_ADDR_DIG); + McSrv_WriteReg(bSlaveAddr, pbData, dSize); + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McDevIf_WriteDirect", NULL); +#endif +} + + |