uboot/drivers/input/tegra-kbc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 *  (C) Copyright 2011
   4 *  NVIDIA Corporation <www.nvidia.com>
   5 */
   6
   7#include <common.h>
   8#include <dm.h>
   9#include <fdtdec.h>
  10#include <input.h>
  11#include <keyboard.h>
  12#include <key_matrix.h>
  13#include <log.h>
  14#include <stdio_dev.h>
  15#include <tegra-kbc.h>
  16#include <asm/io.h>
  17#include <asm/arch/clock.h>
  18#include <asm/arch/funcmux.h>
  19#include <asm/arch-tegra/timer.h>
  20#include <linux/delay.h>
  21#include <linux/input.h>
  22
  23enum {
  24        KBC_MAX_GPIO            = 24,
  25        KBC_MAX_KPENT           = 8,    /* size of keypress entry queue */
  26};
  27
  28#define KBC_FIFO_TH_CNT_SHIFT           14
  29#define KBC_DEBOUNCE_CNT_SHIFT          4
  30#define KBC_CONTROL_FIFO_CNT_INT_EN     (1 << 3)
  31#define KBC_CONTROL_KBC_EN              (1 << 0)
  32#define KBC_INT_FIFO_CNT_INT_STATUS     (1 << 2)
  33#define KBC_KPENT_VALID                 (1 << 7)
  34#define KBC_ST_STATUS                   (1 << 3)
  35
  36enum {
  37        KBC_DEBOUNCE_COUNT      = 2,
  38        KBC_REPEAT_RATE_MS      = 30,
  39        KBC_REPEAT_DELAY_MS     = 240,
  40        KBC_CLOCK_KHZ           = 32,   /* Keyboard uses a 32KHz clock */
  41};
  42
  43/* keyboard controller config and state */
  44struct tegra_kbd_priv {
  45        struct input_config *input;     /* The input layer */
  46        struct key_matrix matrix;       /* The key matrix layer */
  47
  48        struct kbc_tegra *kbc;          /* tegra keyboard controller */
  49        unsigned char inited;           /* 1 if keyboard has been inited */
  50        unsigned char first_scan;       /* 1 if this is our first key scan */
  51
  52        /*
  53         * After init we must wait a short time before polling the keyboard.
  54         * This gives the tegra keyboard controller time to react after reset
  55         * and lets us grab keys pressed during reset.
  56         */
  57        unsigned int init_dly_ms;       /* Delay before we can read keyboard */
  58        unsigned int start_time_ms;     /* Time that we inited (in ms) */
  59        unsigned int last_poll_ms;      /* Time we should last polled */
  60        unsigned int next_repeat_ms;    /* Next time we repeat a key */
  61};
  62
  63/**
  64 * reads the keyboard fifo for current keypresses
  65 *
  66 * @param priv          Keyboard private data
  67 * @param fifo          Place to put fifo results
  68 * @param max_keycodes  Maximum number of key codes to put in the fifo
  69 * @return number of items put into fifo
  70 */
  71static int tegra_kbc_find_keys(struct tegra_kbd_priv *priv, int *fifo,
  72                               int max_keycodes)
  73{
  74        struct key_matrix_key keys[KBC_MAX_KPENT], *key;
  75        u32 kp_ent = 0;
  76        int i;
  77
  78        for (key = keys, i = 0; i < KBC_MAX_KPENT; i++, key++) {
  79                /* Get next word */
  80                if (!(i & 3))
  81                        kp_ent = readl(&priv->kbc->kp_ent[i / 4]);
  82
  83                key->valid = (kp_ent & KBC_KPENT_VALID) != 0;
  84                key->row = (kp_ent >> 3) & 0xf;
  85                key->col = kp_ent & 0x7;
  86
  87                /* Shift to get next entry */
  88                kp_ent >>= 8;
  89        }
  90        return key_matrix_decode(&priv->matrix, keys, KBC_MAX_KPENT, fifo,
  91                                 max_keycodes);
  92}
  93
  94/**
  95 * Process all the keypress sequences in fifo and send key codes
  96 *
  97 * The fifo contains zero or more keypress sets. Each set
  98 * consists of from 1-8 keycodes, representing the keycodes which
  99 * were simultaneously pressed during that scan.
 100 *
 101 * This function works through each set and generates ASCII characters
 102 * for each. Not that one set may produce more than one ASCII characters -
 103 * for example holding down 'd' and 'f' at the same time will generate
 104 * two ASCII characters.
 105 *
 106 * Note: if fifo_cnt is 0, we will tell the input layer that no keys are
 107 * pressed.
 108 *
 109 * @param priv          Keyboard private data
 110 * @param fifo_cnt      Number of entries in the keyboard fifo
 111 */
 112static void process_fifo(struct tegra_kbd_priv *priv, int fifo_cnt)
 113{
 114        int fifo[KBC_MAX_KPENT];
 115        int cnt = 0;
 116
 117        /* Always call input_send_keycodes() at least once */
 118        do {
 119                if (fifo_cnt)
 120                        cnt = tegra_kbc_find_keys(priv, fifo, KBC_MAX_KPENT);
 121
 122                input_send_keycodes(priv->input, fifo, cnt);
 123        } while (--fifo_cnt > 0);
 124}
 125
 126/**
 127 * Check the keyboard controller and emit ASCII characters for any keys that
 128 * are pressed.
 129 *
 130 * @param priv          Keyboard private data
 131 */
 132static void check_for_keys(struct tegra_kbd_priv *priv)
 133{
 134        int fifo_cnt;
 135
 136        if (!priv->first_scan &&
 137            get_timer(priv->last_poll_ms) < KBC_REPEAT_RATE_MS)
 138                return;
 139        priv->last_poll_ms = get_timer(0);
 140        priv->first_scan = 0;
 141
 142        /*
 143         * Once we get here we know the keyboard has been scanned. So if there
 144         * scan waiting for us, we know that nothing is held down.
 145         */
 146        fifo_cnt = (readl(&priv->kbc->interrupt) >> 4) & 0xf;
 147        process_fifo(priv, fifo_cnt);
 148}
 149
 150/**
 151 * In order to detect keys pressed on boot, wait for the hardware to
 152 * complete scanning the keys. This includes time to transition from
 153 * Wkup mode to Continous polling mode and the repoll time. We can
 154 * deduct the time that's already elapsed.
 155 *
 156 * @param priv          Keyboard private data
 157 */
 158static void kbd_wait_for_fifo_init(struct tegra_kbd_priv *priv)
 159{
 160        if (!priv->inited) {
 161                unsigned long elapsed_time;
 162                long delay_ms;
 163
 164                elapsed_time = get_timer(priv->start_time_ms);
 165                delay_ms = priv->init_dly_ms - elapsed_time;
 166                if (delay_ms > 0) {
 167                        udelay(delay_ms * 1000);
 168                        debug("%s: delay %ldms\n", __func__, delay_ms);
 169                }
 170
 171                priv->inited = 1;
 172        }
 173}
 174
 175/**
 176 * Check the tegra keyboard, and send any keys that are pressed.
 177 *
 178 * This is called by input_tstc() and input_getc() when they need more
 179 * characters
 180 *
 181 * @param input         Input configuration
 182 * @return 1, to indicate that we have something to look at
 183 */
 184static int tegra_kbc_check(struct input_config *input)
 185{
 186        struct tegra_kbd_priv *priv = dev_get_priv(input->dev);
 187
 188        kbd_wait_for_fifo_init(priv);
 189        check_for_keys(priv);
 190
 191        return 1;
 192}
 193
 194/* configures keyboard GPIO registers to use the rows and columns */
 195static void config_kbc_gpio(struct tegra_kbd_priv *priv, struct kbc_tegra *kbc)
 196{
 197        int i;
 198
 199        for (i = 0; i < KBC_MAX_GPIO; i++) {
 200                u32 row_cfg, col_cfg;
 201                u32 r_shift = 5 * (i % 6);
 202                u32 c_shift = 4 * (i % 8);
 203                u32 r_mask = 0x1f << r_shift;
 204                u32 c_mask = 0xf << c_shift;
 205                u32 r_offs = i / 6;
 206                u32 c_offs = i / 8;
 207
 208                row_cfg = readl(&kbc->row_cfg[r_offs]);
 209                col_cfg = readl(&kbc->col_cfg[c_offs]);
 210
 211                row_cfg &= ~r_mask;
 212                col_cfg &= ~c_mask;
 213
 214                if (i < priv->matrix.num_rows) {
 215                        row_cfg |= ((i << 1) | 1) << r_shift;
 216                } else {
 217                        col_cfg |= (((i - priv->matrix.num_rows) << 1) | 1)
 218                                        << c_shift;
 219                }
 220
 221                writel(row_cfg, &kbc->row_cfg[r_offs]);
 222                writel(col_cfg, &kbc->col_cfg[c_offs]);
 223        }
 224}
 225
 226/**
 227 * Start up the keyboard device
 228 */
 229static void tegra_kbc_open(struct tegra_kbd_priv *priv)
 230{
 231        struct kbc_tegra *kbc = priv->kbc;
 232        unsigned int scan_period;
 233        u32 val;
 234
 235        /*
 236         * We will scan at twice the keyboard repeat rate, so that there is
 237         * always a scan ready when we check it in check_for_keys().
 238         */
 239        scan_period = KBC_REPEAT_RATE_MS / 2;
 240        writel(scan_period * KBC_CLOCK_KHZ, &kbc->rpt_dly);
 241        writel(scan_period * KBC_CLOCK_KHZ, &kbc->init_dly);
 242        /*
 243         * Before reading from the keyboard we must wait for the init_dly
 244         * plus the rpt_delay, plus 2ms for the row scan time.
 245         */
 246        priv->init_dly_ms = scan_period * 2 + 2;
 247
 248        val = KBC_DEBOUNCE_COUNT << KBC_DEBOUNCE_CNT_SHIFT;
 249        val |= 1 << KBC_FIFO_TH_CNT_SHIFT;      /* fifo interrupt threshold */
 250        val |= KBC_CONTROL_KBC_EN;              /* enable */
 251        writel(val, &kbc->control);
 252
 253        priv->start_time_ms = get_timer(0);
 254        priv->last_poll_ms = get_timer(0);
 255        priv->next_repeat_ms = priv->last_poll_ms;
 256        priv->first_scan = 1;
 257}
 258
 259static int tegra_kbd_start(struct udevice *dev)
 260{
 261        struct tegra_kbd_priv *priv = dev_get_priv(dev);
 262
 263        /* Set up pin mux and enable the clock */
 264        funcmux_select(PERIPH_ID_KBC, FUNCMUX_DEFAULT);
 265        clock_enable(PERIPH_ID_KBC);
 266        config_kbc_gpio(priv, priv->kbc);
 267
 268        tegra_kbc_open(priv);
 269        debug("%s: Tegra keyboard ready\n", __func__);
 270
 271        return 0;
 272}
 273
 274/**
 275 * Set up the tegra keyboard. This is called by the stdio device handler
 276 *
 277 * We want to do this init when the keyboard is actually used rather than
 278 * at start-up, since keyboard input may not currently be selected.
 279 *
 280 * Once the keyboard starts there will be a period during which we must
 281 * wait for the keyboard to init. We do this only when a key is first
 282 * read - see kbd_wait_for_fifo_init().
 283 *
 284 * @return 0 if ok, -ve on error
 285 */
 286static int tegra_kbd_probe(struct udevice *dev)
 287{
 288        struct tegra_kbd_priv *priv = dev_get_priv(dev);
 289        struct keyboard_priv *uc_priv = dev_get_uclass_priv(dev);
 290        struct stdio_dev *sdev = &uc_priv->sdev;
 291        struct input_config *input = &uc_priv->input;
 292        int ret;
 293
 294        priv->kbc = dev_read_addr_ptr(dev);
 295        if ((fdt_addr_t)priv->kbc == FDT_ADDR_T_NONE) {
 296                debug("%s: No keyboard register found\n", __func__);
 297                return -EINVAL;
 298        }
 299        input_set_delays(input, KBC_REPEAT_DELAY_MS, KBC_REPEAT_RATE_MS);
 300
 301        /* Decode the keyboard matrix information (16 rows, 8 columns) */
 302        ret = key_matrix_init(&priv->matrix, 16, 8, 1);
 303        if (ret) {
 304                debug("%s: Could not init key matrix: %d\n", __func__, ret);
 305                return ret;
 306        }
 307        ret = key_matrix_decode_fdt(dev, &priv->matrix);
 308        if (ret) {
 309                debug("%s: Could not decode key matrix from fdt: %d\n",
 310                      __func__, ret);
 311                return ret;
 312        }
 313        input_add_tables(input, false);
 314        if (priv->matrix.fn_keycode) {
 315                ret = input_add_table(input, KEY_FN, -1,
 316                                      priv->matrix.fn_keycode,
 317                                      priv->matrix.key_count);
 318                if (ret) {
 319                        debug("%s: input_add_table() failed\n", __func__);
 320                        return ret;
 321                }
 322        }
 323
 324        /* Register the device. init_tegra_keyboard() will be called soon */
 325        priv->input = input;
 326        input->dev = dev;
 327        input->read_keys = tegra_kbc_check;
 328        strcpy(sdev->name, "tegra-kbc");
 329        ret = input_stdio_register(sdev);
 330        if (ret) {
 331                debug("%s: input_stdio_register() failed\n", __func__);
 332                return ret;
 333        }
 334
 335        return 0;
 336}
 337
 338static const struct keyboard_ops tegra_kbd_ops = {
 339        .start  = tegra_kbd_start,
 340};
 341
 342static const struct udevice_id tegra_kbd_ids[] = {
 343        { .compatible = "nvidia,tegra20-kbc" },
 344        { }
 345};
 346
 347U_BOOT_DRIVER(tegra_kbd) = {
 348        .name   = "tegra_kbd",
 349        .id     = UCLASS_KEYBOARD,
 350        .of_match = tegra_kbd_ids,
 351        .probe = tegra_kbd_probe,
 352        .ops    = &tegra_kbd_ops,
 353        .priv_auto      = sizeof(struct tegra_kbd_priv),
 354};
 355