diff options
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r-- | arch/arm/mach-tegra/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-tegra/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/mach-tegra/include/nvodm_vibrate.h | 160 | ||||
-rw-r--r-- | arch/arm/mach-tegra/tegra_vibrate.c | 100 |
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"); |