blob: c43297760c0598ae38dd4e4377b379ad6585a1a9 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2009-2014 Freescale Semiconductor, Inc. All Rights Reserved.
*
*/
/*!
* @defgroup keypad Keypad Driver
*/
/*!
* @file mxc_keyb.h
*
* @brief MXC keypad header file.
*
* @ingroup keypad
*/
#ifndef __MXC_KEYB_H__
#define __MXC_KEYB_H__
/*!
* Keypad Module Name
*/
#define MOD_NAME "mxckpd"
/*!
* Keypad irq number
*/
#define KPP_IRQ MXC_INT_KPP
/*!
* XLATE mode selection
*/
#define KEYPAD_XLATE 0
/*!
* RAW mode selection
*/
#define KEYPAD_RAW 1
/*!
* Maximum number of keys.
*/
#define MAXROW 8
#define MAXCOL 8
#define MXC_MAXKEY (MAXROW * MAXCOL)
/*!
* This define indicates break scancode for every key release. A constant
* of 128 is added to the key press scancode.
*/
#define MXC_KEYRELEASE 128
/*
* _reg_KPP_KPCR _reg_KPP_KPSR _reg_KPP_KDDR _reg_KPP_KPDR
* Keypad Control Register Address
*/
#define KPCR (KPP_BASE_ADDR + 0x00)
/*
* Keypad Status Register Address
*/
#define KPSR (KPP_BASE_ADDR + 0x02)
/*
* Keypad Data Direction Address
*/
#define KDDR (KPP_BASE_ADDR + 0x04)
/*
* Keypad Data Register
*/
#define KPDR (KPP_BASE_ADDR + 0x06)
/*
* Key Press Interrupt Status bit
*/
#define KBD_STAT_KPKD 0x01
/*
* Key Release Interrupt Status bit
*/
#define KBD_STAT_KPKR 0x02
/*
* Key Depress Synchronizer Chain Status bit
*/
#define KBD_STAT_KDSC 0x04
/*
* Key Release Synchronizer Status bit
*/
#define KBD_STAT_KRSS 0x08
/*
* Key Depress Interrupt Enable Status bit
*/
#define KBD_STAT_KDIE 0x100
/*
* Key Release Interrupt Enable
*/
#define KBD_STAT_KRIE 0x200
/*
* Keypad Clock Enable
*/
#define KBD_STAT_KPPEN 0x400
/*!
* Buffer size of keypad queue. Should be a power of 2.
*/
#define KPP_BUF_SIZE 128
/*!
* Test whether bit is set for integer c
*/
#define TEST_BIT(c, n) ((c) & (0x1 << (n)))
/*!
* Set nth bit in the integer c
*/
#define BITSET(c, n) ((c) | (1 << (n)))
/*!
* Reset nth bit in the integer c
*/
#define BITRESET(c, n) ((c) & ~(1 << (n)))
enum KeyEvent {
KDepress,
KRelease
};
/*!
* This enum represents the keypad state machine to maintain debounce logic
* for key press/release.
*/
enum KeyState {
/*!
* Key press state.
*/
KStateUp,
/*!
* Key press debounce state.
*/
KStateFirstDown,
/*!
* Key release state.
*/
KStateDown,
/*!
* Key release debounce state.
*/
KStateFirstUp
};
/*!
* Keypad Private Data Structure
*/
struct keypad_priv {
/*!
* Keypad state machine.
*/
enum KeyState iKeyState;
/*!
* Number of rows configured in the keypad matrix
*/
unsigned long kpp_rows;
/*!
* Number of Columns configured in the keypad matrix
*/
unsigned long kpp_cols;
};
/*!
* Keypad Data Structure
* */
struct kpp_key_info {
enum KeyEvent evt;
unsigned short val;
};
int mxc_kpp_init(void);
int mxc_kpp_getc(struct kpp_key_info **);
/*!
* These functions are used to configure and the GPIO pins for keypad to
* activate and deactivate it.
*/
void setup_mxc_kpd(void);
#endif /* __MXC_KEYB_H__ */