summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r--arch/arm/mach-tegra/Kconfig8
-rw-r--r--arch/arm/mach-tegra/Makefile1
-rw-r--r--arch/arm/mach-tegra/include/nvodm_vibrate.h160
-rw-r--r--arch/arm/mach-tegra/tegra_vibrate.c100
4 files changed, 269 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index 604f7f5574b7..c84e77fd1a5b 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -68,4 +68,12 @@ config TEGRA_NVEC_USER
Enabling this option will expose a device node to enable user-land
clients to access embedded controller features.
+config TEGRA_ODM_VIBRATE
+ boolean "System vibrator device driver using NVIDIA Tegra ODM kit"
+ depends on ANDROID_TIMED_OUTPUT && MACH_TEGRA_GENERIC
+ default n
+ help
+ Adds a timed output vibrator device node for an NVIDIA Tegra ODM kit
+ vibrator driver
+
endif \ No newline at end of file
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile
index 9f18114131de..08587d580c74 100644
--- a/arch/arm/mach-tegra/Makefile
+++ b/arch/arm/mach-tegra/Makefile
@@ -28,6 +28,7 @@ obj-$(CONFIG_MACH_TEGRA_GENERIC) += nvrm/
# Misc drivers
obj-$(CONFIG_TEGRA_ODM_RFKILL) += tegra_rfkill_odm.o
+obj-$(CONFIG_TEGRA_ODM_VIBRATE) += tegra_vibrate.o
# NvEc
obj-$(CONFIG_TEGRA_NVEC) += nvec/
diff --git a/arch/arm/mach-tegra/include/nvodm_vibrate.h b/arch/arm/mach-tegra/include/nvodm_vibrate.h
new file mode 100644
index 000000000000..ea4e3ea5a7f2
--- /dev/null
+++ b/arch/arm/mach-tegra/include/nvodm_vibrate.h
@@ -0,0 +1,160 @@
+/*
+ * 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.
+ *
+ */
+
+#ifndef INCLUDED_NVODM_VIBRATE_H
+#define INCLUDED_NVODM_VIBRATE_H
+
+#include "nvcommon.h"
+
+/**
+ * @defgroup nvodm_vibrate Vibrate Adaption Interface
+ *
+ * This is the Vibrate ODM adaptation interface.
+ *
+ * @ingroup nvodm_adaptation
+ * @{
+ */
+
+/**
+ * @brief Opaque handle to the vibrate device.
+ */
+typedef struct NvOdmVibDeviceRec *NvOdmVibDeviceHandle;
+
+/**
+ * @brief Defines attributes that can be set/queried by clients.
+ */
+typedef enum
+{
+ NvOdmVibCaps_Invalid = 0x0,
+ /** Specifies the maximum supported frequency. */
+ NvOdmVibCaps_MaxFreq,
+ /** Specifies the minimum supported frequency. */
+ NvOdmVibCaps_MinFreq,
+ /** Specifies the maximum supported duty cycle. */
+ NvOdmVibCaps_MaxDutyCycle,
+ NvOdmVibCaps_Num,
+ NvOdmVibCaps_Force32 = 0x7FFFFFFF,
+} NvOdmVibCaps;
+
+#if defined(_cplusplus)
+extern "C"
+{
+#endif
+
+/**
+ * @brief Allocates a handle to the device. Configures the PWM
+ * control to the vibro motor with default values. To change
+ * the duty cycle and frequency, use NvOdmVibSetFrequency() and
+ * NvOdmVibSetDutyCycle() APIs.
+ * @param hOdmVibrate [IN] A pointer to the opaque handle to the device.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibOpen(NvOdmVibDeviceHandle *hOdmVibrate);
+
+/**
+ * @brief Closes the ODM device and destroys all allocated resources.
+ * @param hOdmVibrate [IN] The opaque handle to the device.
+ */
+void
+NvOdmVibClose(NvOdmVibDeviceHandle hOdmVibrate);
+
+/**
+ * @brief Gets capabilities of the vibrate device.
+ * @param hDevice [IN] The 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 if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibGetCaps(
+ NvOdmVibDeviceHandle hDevice,
+ NvOdmVibCaps RequestedCaps,
+ NvU32 *pCapsValue);
+
+/**
+ * @brief Sets the frequency to the vibro motor.
+ * A frequency less than zero will be set to zero
+ * and a frequency value beyond the maximum supported value
+ * will be set to the maximum supported value.
+ * @param hDevice [IN] The opaque handle to the device.
+ * @param Freq [IN] The frequency to set in Hz.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibSetFrequency(NvOdmVibDeviceHandle hDevice, NvS32 Freq);
+
+/**
+ * @brief Sets the dutycycle of the PWM driving the vibro motor.
+ * A duty cycle less than zero will be set to zero
+ * and value beyond the maximum supported value
+ * will be set to the maximum supported value.
+ * @param hDevice [IN] The opaque handle to the device.
+ * @param DCycle [IN] The duty cycle value to set in percentage (0%-100%).
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibSetDutyCycle(NvOdmVibDeviceHandle hDevice, NvS32 DCycle);
+
+/**
+ * @brief Starts the vibro with the frequency and duty cycle set using the
+ * set API.
+ * @param hDevice [IN] The opaque handle to the device.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibStart(NvOdmVibDeviceHandle hDevice);
+
+/**
+ * @brief Stops the vibro motor.
+ * @param hDevice [IN] The opaque handle to the device.
+ * @return NV_TRUE if successful, or NV_FALSE otherwise.
+ */
+NvBool
+NvOdmVibStop(NvOdmVibDeviceHandle hDevice);
+
+#if defined(__cplusplus)
+}
+#endif
+
+/** @} */
+
+#endif // INCLUDED_NVODM_VIBRATE_H
diff --git a/arch/arm/mach-tegra/tegra_vibrate.c b/arch/arm/mach-tegra/tegra_vibrate.c
new file mode 100644
index 000000000000..03c402095f48
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra_vibrate.c
@@ -0,0 +1,100 @@
+/*
+ * drivers/misc/tegra_vib_odm.c
+ *
+ * Miscellaneous timed output driver for vibrators implemented using NVIDIA's
+ * Tegra ODM kit
+ *
+ * Copyright (c) 2009, NVIDIA Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/hrtimer.h>
+#include <linux/delay.h>
+
+#include <../staging/android/timed_output.h>
+
+#include "mach/nvrm_linux.h"
+#include "nvos.h"
+#include "nvassert.h"
+#include "nvodm_query.h"
+#include "nvodm_vibrate.h"
+
+static NvOdmVibDeviceHandle s_hOdmVibrate = NULL;
+static int s_Timeout;
+
+static void vibrator_enable(struct timed_output_dev *dev, int value)
+{
+ s_Timeout = value;
+ if (!s_hOdmVibrate) {
+ NvOdmVibOpen(&s_hOdmVibrate);
+ if (!s_hOdmVibrate)
+ return;
+ }
+ if (value) {
+ NvOdmVibStart(s_hOdmVibrate);
+ msleep(value);
+ NvOdmVibStop(s_hOdmVibrate);
+ } else {
+ NvOdmVibStop(s_hOdmVibrate);
+ }
+}
+
+static int vibrator_get_time(struct timed_output_dev *dev)
+{
+ return s_Timeout;
+}
+
+
+static struct timed_output_dev tegra_vibrator = {
+ .name = "vibrator",
+ .get_time = vibrator_get_time,
+ .enable = vibrator_enable,
+};
+
+static int __init init_tegra_vibrator(void)
+{
+ int status;
+ if(!s_hOdmVibrate)
+ NvOdmVibOpen(&s_hOdmVibrate);
+
+ if (!s_hOdmVibrate)
+ return -ENODEV;
+
+ s_Timeout = 0;
+ status = timed_output_dev_register(&tegra_vibrator);
+
+ if (status)
+ NvOdmVibClose(s_hOdmVibrate);
+ return status;
+}
+
+static void __exit exit_tegra_vibrator(void)
+{
+ if(s_hOdmVibrate) {
+ timed_output_dev_unregister(&tegra_vibrator);
+ NvOdmVibClose(s_hOdmVibrate);
+ s_hOdmVibrate = NULL;
+ }
+}
+
+module_init(init_tegra_vibrator);
+module_exit(exit_tegra_vibrator);
+
+MODULE_DESCRIPTION("timed output vibrator device");
+MODULE_LICENSE("GPL");