summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c')
-rw-r--r--arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c b/arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c
new file mode 100644
index 000000000000..43cc3cbf5ee4
--- /dev/null
+++ b/arch/arm/mach-tegra/odm_kit/platform/vibrate/nvodm_vibrate.c
@@ -0,0 +1,272 @@
+/*
+ * Copyright (c) 2006-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.
+ *
+ */
+
+/**
+ * @file
+ * <b>NVIDIA Tegra ODM Kit:
+ * Vibrate Interface</b>
+ *
+ * @b Description: Defines the ODM interface for Vibrate devices.
+ *
+ */
+
+#include "nvodm_vibrate.h"
+#include "nvos.h"
+#include "nvassert.h"
+#include "nvodm_services.h"
+#include "nvodm_query_discovery.h"
+#include "nvodm_pmu.h"
+
+#define VIBRATE_DEVICE_GUID NV_ODM_GUID('v','i','b','r','a','t','o','r')
+
+/**
+ * @brief Used to enable/disable debug print messages.
+ */
+#define NV_ODM_DEBUG 0
+
+#if NV_ODM_DEBUG
+ #define NV_ODM_TRACE NvOdmOsDebugPrintf
+#else
+ #define NV_ODM_TRACE (void)
+#endif
+
+typedef struct NvOdmVibDeviceRec
+{
+ /* The handle to the Pmu device */
+ NvOdmServicesPmuHandle hOdmServicePmuDevice;
+
+ /*Pmu Vdd Rail capabilities*/
+ NvOdmServicesPmuVddRailCapabilities RailCaps;
+
+ /* Pmu Rail ID*/
+ NvU32 VddId;
+
+} NvOdmVibDevice;
+
+
+/**
+ * @brief Allocates a handle to the device. Configures the PWM
+ * control to the Vibro motor with default values. To change
+ * the amplitude and frequency use NvOdmVibrateSetParameter API.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibOpen(NvOdmVibDeviceHandle *hOdmVibrate)
+{
+ const NvOdmPeripheralConnectivity *pConnectivity = NULL;
+ NvU32 Index = 0;
+
+ NV_ASSERT(hOdmVibrate);
+
+ /* Allocate the handle */
+ (*hOdmVibrate) = (NvOdmVibDeviceHandle)NvOdmOsAlloc(sizeof(NvOdmVibDevice));
+ if (*hOdmVibrate == NULL)
+ {
+ NV_ODM_TRACE(("Error Allocating NvOdmPmuDevice. \n"));
+ return NV_FALSE;
+ }
+ NvOsMemset((*hOdmVibrate), 0, sizeof(NvOdmVibDevice));
+
+ /* Get the PMU handle */
+ (*hOdmVibrate)->hOdmServicePmuDevice = NvOdmServicesPmuOpen();
+ if (!(*hOdmVibrate)->hOdmServicePmuDevice)
+ {
+ NV_ODM_TRACE(("Error Opening Pmu device. \n"));
+ NvOdmOsFree(*hOdmVibrate);
+ *hOdmVibrate = NULL;
+ return NV_FALSE;
+ }
+
+ // Get the peripheral connectivity information
+ pConnectivity = NvOdmPeripheralGetGuid(VIBRATE_DEVICE_GUID);
+ if (pConnectivity == NULL)
+ return NV_FALSE;
+
+ // Search for the Vdd rail and set the proper volage to the rail.
+ for (Index = 0; Index < pConnectivity->NumAddress; ++Index)
+ {
+ if (pConnectivity->AddressList[Index].Interface == NvOdmIoModule_Vdd)
+ {
+ (*hOdmVibrate)->VddId = pConnectivity->AddressList[Index].Address;
+ NvOdmServicesPmuGetCapabilities((*hOdmVibrate)->hOdmServicePmuDevice, (*hOdmVibrate)->VddId, &((*hOdmVibrate)->RailCaps));
+ break;
+ }
+ }
+
+ return NV_TRUE;
+}
+
+/**
+ * @brief Closes the ODM device and destroys all allocated resources.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @return None.
+ */
+void NvOdmVibClose(NvOdmVibDeviceHandle hOdmVibrate)
+{
+ if (hOdmVibrate != NULL)
+ {
+ NvOdmServicesPmuClose(hOdmVibrate->hOdmServicePmuDevice);
+ hOdmVibrate->hOdmServicePmuDevice = NULL;
+
+ hOdmVibrate->VddId = 0;
+
+ NvOsMemset(&hOdmVibrate->RailCaps, 0, sizeof(NvOdmServicesPmuVddRailCapabilities));
+
+ NvOdmOsFree(hOdmVibrate);
+ hOdmVibrate = NULL;
+ }
+}
+
+
+/**
+ * @brief Gets capabilities of the Vibrate device.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @param RequestedCaps [IN] Specifies the capability to get.
+ * @param pCapsValue [OUT] A pointer to the returned value.
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibGetCaps(
+ NvOdmVibDeviceHandle hOdmVibrate,
+ NvOdmVibCaps RequestedCaps,
+ NvU32 *pCapsValue)
+{
+ NV_ASSERT(hOdmVibrate);
+ NV_ASSERT(pCapsValue);
+
+ if (!hOdmVibrate || !pCapsValue)
+ {
+ return NV_FALSE;
+ }
+
+ return NV_TRUE;
+}
+
+/**
+ * @brief The frequency to the Vibro motor can be set
+ * using this function. A frequency less than zero will be
+ * clamped to zero and a frequency value beyond the max supported value
+ * will be clamped to the max supported value.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @param Freq [IN] Frequency in Hz
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibSetFrequency(NvOdmVibDeviceHandle hOdmVibrate, NvS32 Freq)
+{
+ //AP20 Vibrator does'nt support setting Frequency
+ return NV_TRUE;
+}
+
+/**
+ * @brief The dutycycle of the PWM driving the Vibro motor can be set
+ * using this function. A dutycycle less than zero will be
+ * clamped to zero and value beyond the max supported value
+ * will be clamped to the max supported value.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @param DCycle [IN] Duty Cycle value in percentage (0%-100%)
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibSetDutyCycle(NvOdmVibDeviceHandle hOdmVibrate, NvS32 DCycle)
+{
+ //AP20 Vibrator does'nt support setting DutyCycle
+ return NV_TRUE;
+}
+
+/**
+ * @brief Starts the Vibro with the frequency and duty-cycle set using the
+ * Set API.
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibStart(NvOdmVibDeviceHandle hOdmVibrate)
+{
+ NvU32 SettlingTime = 0;
+
+ NV_ASSERT(hOdmVibrate);
+
+ if (!hOdmVibrate)
+ {
+ return NV_FALSE;
+ }
+
+ if (hOdmVibrate->hOdmServicePmuDevice != NULL)
+ {
+ // Search for the Vdd rail and power Off the module
+ if (hOdmVibrate->VddId)
+ {
+ NvOdmServicesPmuSetVoltage(hOdmVibrate->hOdmServicePmuDevice,
+ hOdmVibrate->VddId, hOdmVibrate->RailCaps.requestMilliVolts, &SettlingTime);
+
+ if (SettlingTime)
+ NvOdmOsWaitUS(SettlingTime);
+ }
+ }
+
+ return NV_TRUE;
+}
+
+/**
+ * @brief Stops the Vibro motor
+ * @param hOdmVibrate [IN] Opaque handle to the device.
+ * @return NV_TRUE on success and NV_FALSE on error
+ */
+NvBool
+NvOdmVibStop(NvOdmVibDeviceHandle hOdmVibrate)
+{
+ NvU32 SettlingTime;
+
+ NV_ASSERT(hOdmVibrate);
+
+ if (!hOdmVibrate)
+ {
+ return NV_FALSE;
+ }
+
+ if (hOdmVibrate->hOdmServicePmuDevice != NULL)
+ {
+ // Search for the Vdd rail and power Off the module
+ if (hOdmVibrate->VddId)
+ {
+ NvOdmServicesPmuSetVoltage(hOdmVibrate->hOdmServicePmuDevice,
+ hOdmVibrate->VddId, NVODM_VOLTAGE_OFF, &SettlingTime);
+
+ if (SettlingTime)
+ NvOdmOsWaitUS(SettlingTime);
+ }
+ }
+
+ return NV_TRUE;
+}