summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuresh Mangipudi <smangipudi@nvidia.com>2010-07-23 17:10:42 -0700
committerGary King <gking@nvidia.com>2010-07-26 15:23:34 -0700
commit86ec9122a2a50dd4652c05f1090c0f01a4110a6c (patch)
treedd03ed75c10cf06a2b4d91ddaec4880733b568c3
parent51b2a84496a6426cec1f8aa56a60ea3a05e7d1f5 (diff)
[ventana]Battery charging.
The GPIO port R pin 6 needs to be set low for charging of battery on ventana rev C Change-Id: I2ac17494f65f550d5bf676ae8ec09819983b72ac Reviewed-on: http://git-master/r/4171 Tested-by: Suresh Mangipudi <smangipudi@nvidia.com> Reviewed-by: Gary King <gking@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/Makefile2
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/battery/Makefile2
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/battery/nvodm_battery_ventana.c246
-rw-r--r--arch/arm/mach-tegra/odm_kit/query/ventana/nvodm_query_gpio.c1
-rw-r--r--drivers/power/tegra_odm_battery.c22
5 files changed, 267 insertions, 6 deletions
diff --git a/arch/arm/mach-tegra/odm_kit/platform/Makefile b/arch/arm/mach-tegra/odm_kit/platform/Makefile
index 8cf34fa4b7f6..c5cafc81bfc7 100644
--- a/arch/arm/mach-tegra/odm_kit/platform/Makefile
+++ b/arch/arm/mach-tegra/odm_kit/platform/Makefile
@@ -5,4 +5,4 @@ obj-$(CONFIG_TOUCHSCREEN_TEGRA_ODM) += touch/
obj-$(CONFIG_TEGRA_ODM_VIBRATE) += vibrate/
obj-$(CONFIG_MOUSE_TEGRA_NVEC) += mouse/
obj-$(CONFIG_TEGRA_BATTERY_NVEC) += battery/
-obj-$(CONFIG_BATTERY_TEGRA_ODM) += battery/
+obj-$(CONFIG_TEGRA_BATTERY_ODM) += battery/
diff --git a/arch/arm/mach-tegra/odm_kit/platform/battery/Makefile b/arch/arm/mach-tegra/odm_kit/platform/battery/Makefile
index 9494d32754cc..5e7430cbfad9 100644
--- a/arch/arm/mach-tegra/odm_kit/platform/battery/Makefile
+++ b/arch/arm/mach-tegra/odm_kit/platform/battery/Makefile
@@ -9,4 +9,4 @@ endif
obj-$(CONFIG_TEGRA_ODM_HARMONY) += nvodm_battery.o
obj-$(CONFIG_TEGRA_ODM_WHISTLER) += nvodm_battery_stub.o
-obj-$(CONFIG_TEGRA_ODM_VENTANA) += nvodm_battery_stub.o
+obj-$(CONFIG_TEGRA_ODM_VENTANA) += nvodm_battery_ventana.o
diff --git a/arch/arm/mach-tegra/odm_kit/platform/battery/nvodm_battery_ventana.c b/arch/arm/mach-tegra/odm_kit/platform/battery/nvodm_battery_ventana.c
new file mode 100644
index 000000000000..33e36285e837
--- /dev/null
+++ b/arch/arm/mach-tegra/odm_kit/platform/battery/nvodm_battery_ventana.c
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2009 NVIDIA Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of the NVIDIA Corporation nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "nvcommon.h"
+#include "nvodm_battery.h"
+#include "nvrm_gpio.h"
+#include "nvodm_query_discovery.h"
+#include "nvodm_query_gpio.h"
+#include "nvos.h"
+
+typedef struct NvOdmBatteryDeviceRec
+{
+ NvRmGpioPinHandle hPin;
+ NvU32 PinCount;
+ NvRmDeviceHandle hRm;
+ NvRmGpioHandle hGpio;
+ NvBool bBattPresent;
+ NvBool bBattFull;
+ const NvOdmGpioPinInfo *pGpioPinInfo;
+
+} NvOdmBatteryDevice;
+
+/**
+ * Gets the battery event.
+ *
+ * @param hDevice A handle to the EC.
+ * @param pBatteryEvent Battery events
+ *
+ */
+void NvOdmBatteryGetEvent(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvU8 *pBatteryEvent)
+{
+ NvOdmBatteryDevice *pBattContext = NULL;
+
+ pBattContext = (NvOdmBatteryDevice *)hDevice;
+
+ *pBatteryEvent = 0;
+}
+
+NvBool NvOdmBatteryDeviceOpen(NvOdmBatteryDeviceHandle *hDevice,
+ NvOdmOsSemaphoreHandle *hOdmSemaphore)
+{
+ NvOdmBatteryDevice *pBattContext = NULL;
+ NvU32 i;
+ NvError NvStatus = NvError_Success;
+
+ pBattContext = NvOdmOsAlloc(sizeof(NvOdmBatteryDevice));
+ if (!pBattContext)
+ {
+ NvOsDebugPrintf(("NvOdmOsAlloc failed to allocate pBattContext."));
+ return NV_FALSE;
+ }
+
+ NvOdmOsMemset(pBattContext, 0, sizeof(NvOdmBatteryDevice));
+ NvStatus = NvRmOpen(&pBattContext->hRm, 0);
+ if (NvStatus != NvError_Success)
+ goto Cleanup;
+
+ NvStatus = NvRmGpioOpen(pBattContext->hRm, &pBattContext->hGpio);
+ if (NvStatus != NvError_Success)
+ goto Cleanup;
+
+ pBattContext->pGpioPinInfo = NvOdmQueryGpioPinMap(
+ NvOdmGpioPinGroup_Battery,
+ 0,
+ &pBattContext->PinCount);
+ if (pBattContext->pGpioPinInfo == NULL)
+ {
+ goto Cleanup;
+ }
+ for (i = 0; i < pBattContext->PinCount; i++ )
+ {
+ /*Need the pin 1 to be set to Output for charging of the battery. */
+ if (i == 1)
+ {
+ NvRmGpioAcquirePinHandle(
+ pBattContext->hGpio,
+ pBattContext->pGpioPinInfo[i].Port,
+ pBattContext->pGpioPinInfo[i].Pin,
+ &pBattContext->hPin);
+ if (!pBattContext->hPin)
+ {
+ goto Cleanup;
+ }
+ NvRmGpioConfigPins(pBattContext->hGpio, &pBattContext->hPin, 1, NvRmGpioPinMode_Output);
+ }
+ }
+ *hDevice = pBattContext;
+ return NV_TRUE;
+Cleanup:
+ NvOdmBatteryDeviceClose(pBattContext);
+ return NV_FALSE;
+}
+
+void NvOdmBatteryDeviceClose(NvOdmBatteryDeviceHandle hDevice)
+{
+ NvOdmBatteryDevice *pBattContext = NULL;
+ pBattContext = (NvOdmBatteryDevice *)hDevice;
+
+ if (pBattContext->hGpio)
+ {
+ NvRmGpioReleasePinHandles(pBattContext->hGpio, &pBattContext->hPin,
+ pBattContext->PinCount);
+ NvRmGpioClose(pBattContext->hGpio);
+ }
+
+ if (pBattContext->hRm)
+ {
+ NvRmClose(pBattContext->hRm);
+ pBattContext->hRm = NULL;
+ }
+ if (pBattContext)
+ NvOdmOsFree(pBattContext);
+}
+/**
+ * Gets the AC line status.
+ *
+ * @param hDevice A handle to the EC.
+ * @param pStatus A pointer to the AC line
+ * status returned by the ODM.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool NvOdmBatteryGetAcLineStatus(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvOdmBatteryAcLineStatus *pStatus)
+{
+ *pStatus = NvOdmBatteryAcLine_Offline;
+ return NV_FALSE;
+}
+
+
+/**
+ * Gets the battery status.
+ *
+ * @param hDevice A handle to the EC.
+ * @param batteryInst The battery type.
+ * @param pStatus A pointer to the battery
+ * status returned by the ODM.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool NvOdmBatteryGetBatteryStatus(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvOdmBatteryInstance batteryInst,
+ NvU8 *pStatus)
+{
+ *pStatus = NVODM_BATTERY_STATUS_UNKNOWN;
+ return NV_FALSE;
+}
+
+/**
+ * Gets the battery data.
+ *
+ * @param hDevice A handle to the EC.
+ * @param batteryInst The battery type.
+ * @param pData A pointer to the battery
+ * data returned by the ODM.
+ *
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool NvOdmBatteryGetBatteryData(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvOdmBatteryInstance batteryInst,
+ NvOdmBatteryData *pData)
+{
+ NvOdmBatteryData BatteryData;
+
+ BatteryData.BatteryAverageCurrent = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryAverageInterval = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryCurrent = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryLifePercent = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryLifeTime = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryMahConsumed = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryTemperature = NVODM_BATTERY_DATA_UNKNOWN;
+ BatteryData.BatteryVoltage = NVODM_BATTERY_DATA_UNKNOWN;
+
+ *pData = BatteryData;
+ return NV_FALSE;
+}
+
+/**
+ * Gets the battery full life time.
+ *
+ * @param hDevice A handle to the EC.
+ * @param batteryInst The battery type.
+ * @param pLifeTime A pointer to the battery
+ * full life time returned by the ODM.
+ *
+ */
+void NvOdmBatteryGetBatteryFullLifeTime(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvOdmBatteryInstance batteryInst,
+ NvU32 *pLifeTime)
+{
+ *pLifeTime = NVODM_BATTERY_DATA_UNKNOWN;
+}
+
+
+/**
+ * Gets the battery chemistry.
+ *
+ * @param hDevice A handle to the EC.
+ * @param batteryInst The battery type.
+ * @param pChemistry A pointer to the battery
+ * chemistry returned by the ODM.
+ *
+ */
+void NvOdmBatteryGetBatteryChemistry(
+ NvOdmBatteryDeviceHandle hDevice,
+ NvOdmBatteryInstance batteryInst,
+ NvOdmBatteryChemistry *pChemistry)
+{
+ *pChemistry = NVODM_BATTERY_DATA_UNKNOWN;
+}
+
diff --git a/arch/arm/mach-tegra/odm_kit/query/ventana/nvodm_query_gpio.c b/arch/arm/mach-tegra/odm_kit/query/ventana/nvodm_query_gpio.c
index 2e714d2f4b6b..e1938ae40b44 100644
--- a/arch/arm/mach-tegra/odm_kit/query/ventana/nvodm_query_gpio.c
+++ b/arch/arm/mach-tegra/odm_kit/query/ventana/nvodm_query_gpio.c
@@ -156,6 +156,7 @@ static const NvOdmGpioPinInfo s_GpioKeyBoard[] = {
static const NvOdmGpioPinInfo s_Battery[] = {
// Low Battery
{NVODM_PORT('w'), 3, NvOdmGpioPinActiveState_Low},
+ {NVODM_PORT('r'), 6, NvOdmGpioPinActiveState_Low},
};
const NvOdmGpioPinInfo *NvOdmQueryGpioPinMap(NvOdmGpioPinGroup Group,
NvU32 Instance, NvU32 *pCount)
diff --git a/drivers/power/tegra_odm_battery.c b/drivers/power/tegra_odm_battery.c
index 9f77f1ff0702..d0c61978ae9b 100644
--- a/drivers/power/tegra_odm_battery.c
+++ b/drivers/power/tegra_odm_battery.c
@@ -35,6 +35,7 @@
#include "nvcommon.h"
#include "nvos.h"
#include "nvrm_pmu.h"
+#include "nvodm_battery.h"
#include "mach/nvrm_linux.h" // for s_hRmGlobal
#define NVBATTERY_POLLING_INTERVAL 30000 /* 30 Seconds */
@@ -121,6 +122,7 @@ typedef struct tegra_battery_dev {
NvU32 ACLineStatus;
NvU32 batt_status_poll_period;
NvBool present;
+ NvOdmBatteryDeviceHandle hOdmBattDev;
} tegra_battery_dev;
static tegra_battery_dev *batt_dev;
@@ -381,7 +383,7 @@ static void tegra_battery_poll_timer_func(unsigned long unused)
static int tegra_battery_probe(struct platform_device *pdev)
{
int i, rc;
-
+ NvBool result;
batt_dev = kzalloc(sizeof(*batt_dev), GFP_KERNEL);
if (!batt_dev) {
@@ -405,9 +407,12 @@ static int tegra_battery_probe(struct platform_device *pdev)
return rc;
}
}
-
printk(KERN_INFO "%s: battery driver registered\n", pdev->name);
-
+ result = NvOdmBatteryDeviceOpen(&(batt_dev->hOdmBattDev), NULL);
+ if (!result) {
+ pr_err("NvOdmBatteryDeviceOpen FAILED\n");
+ goto err;
+ }
batt_dev->batt_status_poll_period = NVBATTERY_POLLING_INTERVAL;
setup_timer(&(batt_dev->battery_poll_timer), tegra_battery_poll_timer_func, 0);
mod_timer(&(batt_dev->battery_poll_timer),
@@ -426,6 +431,12 @@ static int tegra_battery_probe(struct platform_device *pdev)
}
return 0;
+err:
+ if (batt_dev) {
+ kfree(batt_dev);
+ batt_dev = NULL;
+ }
+ return -1;
}
static int tegra_battery_remove(struct platform_device *pdev)
@@ -440,10 +451,13 @@ static int tegra_battery_remove(struct platform_device *pdev)
device_remove_file(&pdev->dev, &tegra_battery_attr);
del_timer_sync(&(batt_dev->battery_poll_timer));
+ if (batt_dev->hOdmBattDev) {
+ NvOdmBatteryDeviceClose(batt_dev->hOdmBattDev);
+ batt_dev->hOdmBattDev = NULL;
+ }
kfree(batt_dev);
batt_dev = NULL;
}
-
return 0;
}