aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/ymu831/mcdevif.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/ymu831/mcdevif.c')
-rw-r--r--sound/soc/codecs/ymu831/mcdevif.c441
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 0000000..5fcd517
--- /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
+}
+
+