NvBool 
Adt7461TemperatureGet(
    NvOdmTmonDeviceHandle hTmon,
    NvOdmTmonZoneID ZoneId,
    NvS32* pDegreesC)
{
    NvU8 Data;
    NvBool ExtRange;
    ADT7461ChannelID ChannelId;
    ADT7461PrivData* pPrivData;
    const ADT7461RegisterInfo* pReg;

    NV_ASSERT(hTmon && hTmon->pPrivate && pDegreesC);
    pPrivData = hTmon->pPrivate;
    ExtRange = ((pPrivData->ShadowConfig &
                 ADT7461ConfigBits_ExtendedRange) != 0);
    ChannelId = pPrivData->ConnectivityMap[ZoneId];
    pReg = &pPrivData->pDeviceInfo->Channels[ChannelId].Tdata;

    if(!Adt7461ReadReg(pPrivData, pReg, &Data))
        return NV_FALSE;

    *pDegreesC = ADT7461_T_DATA_TO_VALUE(ExtRange, Data);
	/*
    NVODM_ADT7461_PRINTF(("Adt7461TemperatureGet ChannelId=%d,ExtRange=%d,Data=%d,ZoneId=%d,t=%d\n",ChannelId,ExtRange,Data,ZoneId,*pDegreesC));

    pReg = &pPrivData->pDeviceInfo->Channels[1].Tdata;

    if(!Adt7461ReadReg(pPrivData, pReg, &Data))
        return NV_FALSE;
    NVODM_ADT7461_PRINTF(("Adt7461TemperatureGet ChannelId=1,Data=%d\n",Data));//*/

    return NV_TRUE;
}
NvBool
Adt7461ParameterConfig(
    NvOdmTmonDeviceHandle hTmon,
    NvOdmTmonZoneID ZoneId,
    NvOdmTmonConfigParam ParamId,
    NvS32* pSetting)
{
    NvU8 Data;
    NvBool ExtRange, OdmProtected;
    ADT7461PrivData* pPrivData;
    const ADT7461RegisterInfo* pReg;
    const ADT7461ChannelInfo* pChannel;

    NV_ASSERT(hTmon && hTmon->pPrivate && pSetting);
    pPrivData = hTmon->pPrivate;
#if PRE_ER_GMT_THERMALSENSOR
    ExtRange = 0; /* not support ADT thermal sensor*/
#else
    ExtRange = ((pPrivData->ShadowConfig &
                 ADT7461ConfigBits_ExtendedRange) != 0);
#endif			
    pChannel = &pPrivData->pDeviceInfo->Channels[(
        pPrivData->ConnectivityMap[ZoneId])];

    switch (ParamId)
    {
        case NvOdmTmonConfigParam_IntrLimitHigh:
#if PRE_ER_WORKAROUND
            return NV_TRUE;
#endif
            pReg = &pChannel->IntrLimitHigh;
            OdmProtected = pChannel->ChannelPolicy.IntrLimitsOdmProtected;
            break;

        case NvOdmTmonConfigParam_IntrLimitLow:
#if PRE_ER_WORKAROUND
            return NV_TRUE;
#endif
            pReg = &pChannel->IntrLimitLow;
            OdmProtected = pChannel->ChannelPolicy.IntrLimitsOdmProtected;
            break;

        case NvOdmTmonConfigParam_HwLimitCrit:
#if PRE_ER_WORKAROUND
            return NV_TRUE;
#endif
            pReg = &pChannel->ComparatorLimit;
            OdmProtected = pChannel->ChannelPolicy.HwLimitCritOdmProtected;
            break;

        case NvOdmTmonConfigParam_SampleMs:
            OdmProtected = pChannel->ChannelPolicy.RateOdmProtected;
            return Adt7461ConfigureSampleInterval(
                pPrivData, OdmProtected, pSetting);

        default:        // unsupported parameter
            *pSetting = ODM_TMON_PARAMETER_UNSPECIFIED;
            return NV_TRUE;
    }

    // Common processing for temperature limits configuration
    if ((OdmProtected) ||
        ((*pSetting) == ODM_TMON_PARAMETER_UNSPECIFIED))
    {
        // Read ADT7461 register and convert data to current parameter value
        if(!Adt7461ReadReg(pPrivData, pReg, &Data))
            return NV_FALSE;

        *pSetting = ADT7461_T_DATA_TO_VALUE(ExtRange, Data);
    }
    else
    {
        // Clip target setting to temperature range 
        if ((*pSetting) > ADT7461_T_RANGE_LIMIT_HIGH(ExtRange))
            *pSetting = ADT7461_T_RANGE_LIMIT_HIGH(ExtRange);
        else if ((*pSetting) < ADT7461_T_RANGE_LIMIT_LOW(ExtRange))
            *pSetting = ADT7461_T_RANGE_LIMIT_LOW(ExtRange);

        // Convert new configuration setting and write to ADT7461 register
        Data = ADT7461_T_VALUE_TO_DATA(ExtRange, *pSetting);
        if(!Adt7461WriteReg(pPrivData, pReg, Data))
            return NV_FALSE;
    }
    return NV_TRUE;
}
NvBool 
Adt7461TemperatureGet(
    NvOdmTmonDeviceHandle hTmon,
    NvOdmTmonZoneID ZoneId,
    NvS32* pDegreesC)
{
    NvU8 Data;
    NvBool ExtRange;
    ADT7461ChannelID ChannelId;
    ADT7461PrivData* pPrivData;
    const ADT7461RegisterInfo* pReg;
#if (DEBUG_THERMALSENSOR || CONFIG_TEGRA_TMON_PROC)
	ADT7461RegisterInfo reg;
	int i;
#endif

    NV_ASSERT(hTmon && hTmon->pPrivate && pDegreesC);
    pPrivData = hTmon->pPrivate;
#if PRE_ER_GMT_THERMALSENSOR
    ExtRange = 0; /* not support ADT thermal sensor*/
#else
    ExtRange = ((pPrivData->ShadowConfig &
                 ADT7461ConfigBits_ExtendedRange) != 0);
#endif	
    ChannelId = pPrivData->ConnectivityMap[ZoneId];
    pReg = &pPrivData->pDeviceInfo->Channels[ChannelId].Tdata;

    if(!Adt7461ReadReg(pPrivData, pReg, &Data))
        return NV_FALSE;

    *pDegreesC = ADT7461_T_DATA_TO_VALUE(ExtRange, Data);

#if CONFIG_TEGRA_TMON_PROC
	reg.RdAddr = pReg->RdAddr - 1;	/* local temperature register address */
	reg.WrAddr = pReg->WrAddr - 1;

	if(!Adt7461ReadReg(pPrivData, &reg, &Data))
		return NV_FALSE;
       /* export temperature to /proc/localtmon */
	localTemperatureC = (NvS32)ADT7461_T_DATA_TO_VALUE(ExtRange, Data);
	   
#endif

#if DEBUG_THERMALSENSOR
	printk("ChannelId:0x%x\n", ChannelId);	
	printk("Temperature Data register pReg:0x%x\n", pReg);
	printk("Temperature *pDegreesC:0x%x\n", *pDegreesC);
	i = 0 ; 
	reg.RdAddr = pReg->RdAddr - 1;
	reg.WrAddr = pReg->WrAddr - 1;
	while(i < 40 ){
		if(!Adt7461ReadReg(pPrivData, &reg, &Data))
			return NV_FALSE;
		printk("register pReg:0x%x\n", reg.RdAddr);
		printk("Data:0x%x, %d\n", ADT7461_T_DATA_TO_VALUE(ExtRange, Data), (NvS32)ADT7461_T_DATA_TO_VALUE(ExtRange, Data));
		i++;
		reg.RdAddr++;
	}
#endif

    return NV_TRUE;
}