diff options
author | Gary King <gking@nvidia.com> | 2010-05-28 17:11:00 -0700 |
---|---|---|
committer | Gary King <gking@nvidia.com> | 2010-05-28 17:21:03 -0700 |
commit | 10deb423f448f3a7c9519cd76a5012821e7c1d9b (patch) | |
tree | a87aa54b456326127ffa93559dd05597e8a276a0 /arch/arm/mach-tegra | |
parent | 27d9bbcaf200fb47758486634d67a26158945273 (diff) |
[ARM/tegra] add a vibrator timed_output driver for tegra ODM kit
Change-Id: I82b4c5b61f6a52ae3ebc93a28219c15da446b040
Reviewed-on: http://git-master/r/1831
Reviewed-by: Gary King <gking@nvidia.com>
Tested-by: Gary King <gking@nvidia.com>
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/vibrate.c | 102 |
4 files changed, 271 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index fe30e3d9461e..89cbea155df9 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -119,6 +119,14 @@ config TEGRA_USB_CHARGE help Enables charging over USB +config TEGRA_ODM_VIBRATE + boolean "System vibrator device driver using NVIDIA Tegra ODM kit" + depends on ANDROID_TIMED_OUTPUT && TEGRA_ODM_KIT + default n + help + Adds a timed output vibrator device node for an NVIDIA Tegra ODM kit + vibrator driver + if TEGRA_ODM_KIT source "arch/arm/mach-tegra/odm_kit/Kconfig" diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile index 10588a5f6887..db93efcc3ee5 100644 --- a/arch/arm/mach-tegra/Makefile +++ b/arch/arm/mach-tegra/Makefile @@ -46,3 +46,4 @@ obj-$(CONFIG_TEGRA_NVEC) += nvec_user.o obj-$(CONFIG_TEGRA_NVEC) += nvec/ obj-$(CONFIG_TEGRA_FUSE) += sysfs-fuse.o +obj-$(CONFIG_TEGRA_ODM_VIBRATE) += vibrate.o 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/vibrate.c b/arch/arm/mach-tegra/vibrate.c new file mode 100644 index 000000000000..9820ee1f051b --- /dev/null +++ b/arch/arm/mach-tegra/vibrate.c @@ -0,0 +1,102 @@ +/* + * arch/arm/mach-tegra/vibrate.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. + */ + +#define NV_DEBUG 0 + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/err.h> +#include <linux/hrtimer.h> +#include <linux/delay.h> + +#include <../drivers/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 = "tegra_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"); |