kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c/sdio/callback.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/drivers/pbus/mmc/sdcard/sdcard3c/sdio/callback.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,162 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include <kernel/kernel.h>
+
+#include <drivers/sdio/callback.h>
+#include <drivers/sdio/sdio.h>
+#include "utraceepbussdio.h"
+
+EXPORT_C void TSDIOFunctionCallback::Register(DMMCSocket* aSocketP)
+/**
+@publishedPartner
+@released
+ 
+Provides support for passing notification events to clients of the SDIO controller.
+
+@param aSocketP A pointer to the socket from which to recieve notification events
+*/
+	{
+	TRACE2(TTraceContext(EBorder), UTraceModuleEPBusSDIO::ESDIOFunctionCallbackRegistered, reinterpret_cast<TUint32>(this), reinterpret_cast<TUint32>(aSocketP)); // @SymTraceDataPublishedTvk
+
+	iBusState = (TPBusState)(aSocketP->State());
+
+	iCallBack.iFunction = TSDIOFunctionCallback::NotificationCallBack;
+	iCallBack.iPtr=this;
+	iCallBack.SetSocket(aSocketP->iSocketNumber);
+	iCallBack.Add();	
+
+	TRACE1(TTraceContext(EBorder), UTraceModuleEPBusSDIO::ESDIOFunctionCallbackRegisteredReturning, reinterpret_cast<TUint32>(this)); // @SymTraceDataPublishedTvk	
+	}
+
+void TSDIOFunctionCallback::NotificationCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2)
+/**
+Provides support for passing notification events to clients of the cards functions.
+*/
+	{
+	SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EInternals), "TSDIOFunctionCallback::NotificationCallBack(%d, 0x%08x, 0x%08x)", aReason, a1, a2)); // @SymTraceDataInternalTechnology
+	
+	TSDIOFunctionCallback& self = *static_cast<TSDIOFunctionCallback*>(aPtr);
+
+	switch (aReason)
+		{
+		case TPBusCallBack::EPBusStateChange:
+			{
+			// a1 == TPBusState
+			// a2 == error code
+			self.DoStateChange((TPBusState)(TInt)a1, (TInt)a2);
+			break;
+			}
+
+		case TPBusCallBack::EPBusCustomNotification:
+			{
+			TInt customReason = (TInt)a1;
+			switch(customReason)
+				{
+				case ESdioNotifyPowerSleep:
+					{
+					self.CallBack(ESdioNotifyPowerSleep);
+					break;
+					}
+					
+				case ESdioNotifyPowerDownPending:
+					{
+					self.CallBack(ESdioNotifyPowerDownPending);
+					break;
+					}
+					
+				default:
+					{
+					SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EWarning), "Unknown Custom Callback Reason (%d)", customReason)); // @SymTraceDataInternalTechnology
+					break;
+					}
+				}
+			break;
+			}
+
+		default:
+			{
+			SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EWarning), "Unknown Callback Reason (%d, 0x%08x, 0x%08x)", aReason, a1, a2)); // @SymTraceDataInternalTechnology
+			break;
+			}
+		}
+	}
+
+
+/**
+Provides support for passing notification events to clients of the cards functions.
+*/
+void TSDIOFunctionCallback::DoStateChange(TPBusState aNewState, TInt aReasonCode)
+	{
+	if (iBusState != aNewState)
+		{
+		iBusState = aNewState;
+		SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EInternals), "Calling Back to client. iBusState = %d", iBusState)); // @SymTraceDataInternalTechnology
+		switch(iBusState)
+			{
+			case EPBusCardAbsent:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusCardAbsent (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				CallBack(ESdioNotifyCardRemoved);
+				break;
+
+			case EPBusOff:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusOff (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+
+				switch (aReasonCode)
+					{
+					case KErrNone:
+					case KErrTimedOut:
+						CallBack(ESdioNotifyPowerDown);
+						break;
+					case KErrNotReady:
+						// card detected following door close
+						CallBack(ESdioNotifyCardInserted);
+						break;
+					case KErrAbort:
+						CallBack(ESdioNotifyEmergencyPowerDown);
+						break;
+					default:
+						CallBack(ESdioNotifyPowerUp);
+						break;
+					}
+				break;
+
+			case EPBusPoweringUp:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusPoweringUp (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				break;
+
+			case EPBusOn:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusOn (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				CallBack(ESdioNotifyPowerUp);
+				break;
+
+			case EPBusPsuFault:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusPsuFault (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				CallBack(ESdioNotifyPsuFault);
+				break;
+
+			case EPBusPowerUpPending:
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EState), "EPBusPowerUpPending (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				break;
+			
+			default:	
+				SYMBIAN_TRACE_SDIO_VERBOSE_ONLY(Printf(TTraceContext(EWarning), "Unknown State Change (%d)", aReasonCode)); // @SymTraceDataInternalTechnology
+				break;
+			}
+		}
+	}