Index: arch/arm/mach-tegra/nv/include/nvrm_gpio.h |
diff --git a/arch/arm/mach-tegra/nv/include/nvrm_gpio.h b/arch/arm/mach-tegra/nv/include/nvrm_gpio.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..62a711638621cbbf62630b5f3021d87c0c40c7f6 |
--- /dev/null |
+++ b/arch/arm/mach-tegra/nv/include/nvrm_gpio.h |
@@ -0,0 +1,389 @@ |
+/* |
+ * 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. |
+ * |
+ */ |
+ |
+#ifndef INCLUDED_nvrm_gpio_H |
+#define INCLUDED_nvrm_gpio_H |
+ |
+ |
+#if defined(__cplusplus) |
+extern "C" |
+{ |
+#endif |
+ |
+#include "nvrm_init.h" |
+ |
+ |
+/** @file |
+ * @brief <b>NVIDIA Driver Development Kit NvRm gpio APIs</b> |
+ * |
+ * @b Description: Declares Interface for NvRm gpio module. |
+ */ |
+ |
+ /** |
+ * @defgroup nvrm_gpio RM GPIO Services |
+ * |
+ * This is the Resource Manager interface to general-purpose input-output |
+ * (GPIO) services. Fundamental abstraction of this API is a "pin handle", which |
+ * of type NvRmGpioPinHandle. A Pin handle is acquired by making a call to |
+ * NvRmGpioAcquirePinHandle API. This API returns a pin handle which is |
+ * subsequently used by the rest of the GPIO APIs. |
+ * |
+ * @ingroup nvddk_rm |
+ * @{ |
+ */ |
+ |
+#include "nvcommon.h" |
+#include "nvos.h" |
+ |
+/** |
+ * NvRmGpioHandle is an opaque handle to the GPIO device on the chip. |
+ */ |
+ |
+typedef struct NvRmGpioRec *NvRmGpioHandle; |
+ |
+/** |
+ * @brief GPIO pin handle which describes the physical pin. This values should |
+ * not be cached or hardcoded by the drivers. This can vary from chip to chip |
+ * and board to board. |
+ */ |
+ |
+typedef NvU32 NvRmGpioPinHandle; |
+ |
+/** |
+ * @brief Defines the possible gpio pin modes. |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ /** |
+ * Specifies the gpio pin as not in use. When in this state, the RM or |
+ * ODM Kit may park the pin in a board-specific state in order to |
+ * minimize leakage current. |
+ */ |
+ NvRmGpioPinMode_Inactive = 1, |
+ |
+ /// Specifies the gpio pin mode as input and enable interrupt for level low. |
+ NvRmGpioPinMode_InputInterruptLow, |
+ |
+ /// Specifies the gpio pin mode as input and enable interrupt for level high. |
+ NvRmGpioPinMode_InputInterruptHigh, |
+ |
+ /// Specifies the gpio pin mode as input and no interrupt configured. |
+ NvRmGpioPinMode_InputData, |
+ |
+ /// Specifies the gpio pin mode as output. |
+ NvRmGpioPinMode_Output, |
+ |
+ /// Specifies the gpio pin mode as a special function. |
+ NvRmGpioPinMode_Function, |
+ |
+ /// Specifies the gpio pin as input and interrupt configured to any edge. |
+ /// i.e seamphore will be signaled for both the rising and failling edges. |
+ NvRmGpioPinMode_InputInterruptAny, |
+ |
+ /// Sepciifed the gpio pin a input and interrupt configured to rising edge. |
+ NvRmGpioPinMode_InputInterruptRisingEdge, |
+ |
+ /// Sepciifed the gpio pin a input and interrupt configured to falling edge. |
+ NvRmGpioPinMode_InputInterruptFallingEdge, |
+ NvRmGpioPinMode_Num, |
+ NvRmGpioPinMode_Force32 = 0x7FFFFFFF |
+} NvRmGpioPinMode; |
+ |
+/** |
+ * @brief Defines the pin state |
+ */ |
+ |
+typedef enum |
+{ |
+ |
+ // Pin state high |
+ NvRmGpioPinState_Low = 0, |
+ |
+ // Pin is high |
+ NvRmGpioPinState_High, |
+ |
+ // Pin is in tri state |
+ NvRmGpioPinState_TriState, |
+ NvRmGpioPinState_Num, |
+ NvRmGpioPinState_Force32 = 0x7FFFFFFF |
+} NvRmGpioPinState; |
+ |
+// Gnerates a contruct the pin handle till the NvRmGpioAcquirePinHandle |
+// API is implemented. |
+#define GPIO_MAKE_PIN_HANDLE(inst, port, pin) (0x80000000 | (((NvU32)(pin) & 0xFF)) | (((NvU32)(port) & 0xff) << 8) | (((NvU32)(inst) & 0xff )<< 16)) |
+#define NVRM_GPIO_CAMERA_PORT (0xfe) |
+#define NVRM_GPIO_CAMERA_INST (0xfe) |
+ |
+/** |
+ * Creates and opens a GPIO handle. The handle can then be used to |
+ * access GPIO functions. |
+ * |
+ * @param hRmDevice The RM device handle. |
+ * @param phGpio Specifies a pointer to the gpio handle where the |
+ * allocated handle is stored. The memory for handle is allocated |
+ * inside this API. |
+ * |
+ * @retval NvSuccess gpio initialization is successful. |
+ */ |
+ |
+ NvError NvRmGpioOpen( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmGpioHandle * phGpio ); |
+ |
+/** |
+ * Closes the GPIO handle. Any pin settings made while this handle was |
+ * open will remain. All events enabled by this handle will be |
+ * disabled. |
+ * |
+ * @param hGpio A handle from NvRmGpioOpen(). If hGpio is NULL, this API does |
+ * nothing. |
+ */ |
+ |
+ void NvRmGpioClose( |
+ NvRmGpioHandle hGpio ); |
+ |
+/** Get NvRmGpioPinHandle from the physical port and pin number. If a driver |
+ * acquires a pin handle another driver will not be able to use this until the |
+ * pin is released. |
+ * |
+ * @param hGpio A handle from NvRmGpioOpen(). |
+ * @param port Physical gpio ports which are chip specific. |
+ * @param pinNumber pin number in that port. |
+ * @param phGpioPin Pointer to the GPIO pin handle. |
+ */ |
+ |
+ NvError NvRmGpioAcquirePinHandle( |
+ NvRmGpioHandle hGpio, |
+ NvU32 port, |
+ NvU32 pin, |
+ NvRmGpioPinHandle * phPin ); |
+ |
+/** Releases the pin handles acquired by NvRmGpioAcquirePinHandle API. |
+ * |
+ * @param hGpio A handle got from NvRmGpioOpen(). |
+ * @param hPin Array of pin handles got from NvRmGpioAcquirePinHandle(). |
+ * @param pinCount Size of pin handles array. |
+ */ |
+ |
+ void NvRmGpioReleasePinHandles( |
+ NvRmGpioHandle hGpio, |
+ NvRmGpioPinHandle * hPin, |
+ NvU32 pinCount ); |
+ |
+/** |
+ * Sets the state of array of pins. |
+ * |
+ * NOTE: When multiple pins are specified (pinCount is greater than |
+ * one), ODMs should not make assumptions about the order in which |
+ * pins are updated. The implementation will attempt to coalesce |
+ * updates to occur atomically; however, this can not be guaranteed in |
+ * all cases, and may not occur if the list of pins includes pins from |
+ * multiple ports. |
+ * |
+ * @param hGpio Specifies the gpio handle. |
+ * @param pin Array of pin handles. |
+ * @param pinState Array of elements specifying the pin state (of type |
+ * NvRmGpioPinState). |
+ * @param pinCount Number of elements in the array. |
+ */ |
+ |
+ void NvRmGpioWritePins( |
+ NvRmGpioHandle hGpio, |
+ NvRmGpioPinHandle * pin, |
+ NvRmGpioPinState * pinState, |
+ NvU32 pinCount ); |
+ |
+/** |
+ * Reads the state of array of pins. |
+ * |
+ * @param hGpio The gpio handle. |
+ * @param pin Array of pin handles. |
+ * @param pinState Array of elements specifying the pin state (of type |
+ * NvRmGpioPinState). |
+ * @param pinCount Number of elements in the array. |
+ */ |
+ |
+ void NvRmGpioReadPins( |
+ NvRmGpioHandle hGpio, |
+ NvRmGpioPinHandle * pin, |
+ NvRmGpioPinState * pPinState, |
+ NvU32 pinCount ); |
+ |
+/** |
+ * Configures a set of GPIO pins to a specified mode. Don't use this API for |
+ * the interrupt modes. For interrupt modes, use NvRmGpioInterruptRegister and |
+ * NvRmGpioInterruptUnregister APIs. |
+ * |
+ * @param hGpio The gpio handle. |
+ * @param pin Pin handle array returned by a calls to NvRmGpioAcquirePinHandle() |
+ * @param pinCount Number elements in the pin handle array. |
+ * |
+ * @param Mode Pin mode of type NvRmGpioPinMode. |
+ * |
+ * |
+ * @retval NvSuccess requested operation is successful. |
+ */ |
+ |
+ NvError NvRmGpioConfigPins( |
+ NvRmGpioHandle hGpio, |
+ NvRmGpioPinHandle * pin, |
+ NvU32 pinCount, |
+ NvRmGpioPinMode Mode ); |
+ |
+/* |
+ * Get the IRQs associated with the pin handles. So that the client can |
+ * register the interrupt callback for that using interrupt APIs |
+ */ |
+ |
+ NvError NvRmGpioGetIrqs( |
+ NvRmDeviceHandle hRmDevice, |
+ NvRmGpioPinHandle * pin, |
+ NvU32 * Irq, |
+ NvU32 pinCount ); |
+ |
+/** |
+ * Opaque handle to the GPIO interrupt. |
+ */ |
+ |
+typedef struct NvRmGpioInterruptRec *NvRmGpioInterruptHandle; |
+ |
+ |
+/* NOTE: Use the 2 APIs below to configure the gpios to interrupt mode and to |
+ * have callabck functions. For the test case of how to use this APIs refer to |
+ * the nvrm_gpio_unit_test applicaiton. |
+ * |
+ * Since the ISR is written by the clients of the API, care should be taken to |
+ * clear the interrupt before the ISR is returned. If one fails to do that, |
+ * interrupt will be triggered soon after the ISR returns. |
+ */ |
+ |
+/** |
+ * Registers an interrupt callback function and the mode of interrupt for the |
+ * gpio pin specified. |
+ * |
+ * Callback will be using the interrupt thread an the interrupt stack on linux |
+ * and IST on wince. So, care should be taken on what APIs can be used on the |
+ * callback function. Not all the nvos functions are available in the interrupt |
+ * context. Check the nvos.h header file for the list of the functions available. |
+ * When the callback is called, the interrupt on the pin is disabled. As soon as |
+ * the callback exists, the interrupt is re-enabled. So, external interrupts |
+ * should be cleared and then only the callback should be returned. |
+ * |
+ * @param hGpio The gpio handle. |
+ * @param hRm The RM device handle. |
+ * @param hPin The handle to a GPIO pin. |
+ * @param Callback Callback function which will be caused when the interrupt |
+ * triggers. |
+ * @param Mode Interrupt mode. See @NvRmGpioPinMode |
+ * @param CallbackArg Argument used when the callback is called by the ISR. |
+ * @param hGpioInterrupt Interrupt handle for this registered intterrupt. This |
+ * handle should be used while calling NvRmGpioInterruptUnregister for |
+ * unregistering the interrupt. |
+ * @param DebounceTime The debounce time in milliseconds |
+ * @retval NvSuccess requested operation is successful. |
+ */ |
+NvError |
+NvRmGpioInterruptRegister( |
+ NvRmGpioHandle hGpio, |
+ NvRmDeviceHandle hRm, |
+ NvRmGpioPinHandle hPin, |
+ NvOsInterruptHandler Callback, |
+ NvRmGpioPinMode Mode, |
+ void *CallbackArg, |
+ NvRmGpioInterruptHandle *hGpioInterrupt, |
+ NvU32 DebounceTime); |
+ |
+/** |
+ * Unregister the GPIO interrupt handler. |
+ * |
+ * @param hGpio The gpio handle. |
+ * @param hRm The RM device handle. |
+ * @param handle The interrupt handle returned by a successfull call to the |
+ * NvRmGpioInterruptRegister API. |
+ * |
+ */ |
+void |
+NvRmGpioInterruptUnregister( |
+ NvRmGpioHandle hGpio, |
+ NvRmDeviceHandle hRm, |
+ NvRmGpioInterruptHandle handle); |
+ |
+/** |
+ * Enable the GPIO interrupt handler. |
+ * |
+ * @param handle The interrupt handle returned by a successfull call to the |
+ * NvRmGpioInterruptRegister API. |
+ * |
+ * @retval "NvError_BadParameter" if handle is not valid |
+ * @retval "NvError_InsufficientMemory" if interupt enable failed. |
+ * @retval "NvSuccess" if registration is successfull. |
+*/ |
+NvError |
+NvRmGpioInterruptEnable(NvRmGpioInterruptHandle handle); |
+ |
+/* |
+ * Callback used to re-enable the interrupts. |
+ * |
+ * @param handle The interrupt handle returned by a successfull call to the |
+ * NvRmGpioInterruptRegister API. |
+ */ |
+void |
+NvRmGpioInterruptDone( NvRmGpioInterruptHandle handle ); |
+ |
+ |
+ |
+/** |
+ * Mask/Unmask a gpio interrupt. |
+ * |
+ * Drivers can use this API to fend off interrupts. Mask means interrupts are |
+ * not forwarded to the CPU. Unmask means, interrupts are forwarded to the CPU. |
+ * In case of SMP systems, this API masks the interrutps to all the CPU, not |
+ * just the calling CPU. |
+ * |
+ * |
+ * @param handle Interrupt handle returned by NvRmGpioInterruptRegister API. |
+ * @param mask NV_FALSE to forrward the interrupt to CPU. NV_TRUE to |
+ * mask the interupts to CPU. |
+ */ |
+void |
+NvRmGpioInterruptMask(NvRmGpioInterruptHandle hGpioInterrupt, NvBool mask); |
+ |
+ |
+/** @} */ |
+ |
+#if defined(__cplusplus) |
+} |
+#endif |
+ |
+#endif |