ARM: tegra12: set CPU rate to 2.2GHz for sku 0x87
[linux-3.10.git] / arch / arm / mach-tegra / board-touch-maxim_sti-spi.c
1 /*
2  * arch/arm/mach-tegra/board-touch-maxim_sti-spi.c
3  *
4  * Copyright (c)2013 Maxim Integrated Products, Inc.
5  * Copyright (C) 2013, NVIDIA Corporation.  All Rights Reserved.
6  *
7  * This software is licensed under the terms of the GNU General Public
8  * License version 2, as published by the Free Software Foundation, and
9  * may be copied, distributed, and modified under those terms.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  */
17
18 #if defined(CONFIG_TOUCHSCREEN_MAXIM_STI) || \
19         defined(CONFIG_TOUCHSCREEN_MAXIM_STI_MODULE)
20
21 #include <linux/errno.h>
22 #include <linux/kernel.h>
23 #include <linux/spi/spi-tegra.h>
24 #include <linux/spi/spi.h>
25 #include <linux/gpio.h>
26 #include <linux/maxim_sti.h>
27
28 #define MAXIM_STI_GPIO_ERROR(ret, gpio, op)                                \
29         ({if (ret < 0) {                                                   \
30                 pr_err("%s: GPIO %d %s failed (%d)\n", __func__, gpio, op, \
31                         ret);                                              \
32                 return ret;                                                \
33         } })
34 static int maxim_sti_init(struct maxim_sti_pdata *pdata, bool init)
35 {
36         int  ret;
37
38         if (init) {
39                 ret = gpio_request(pdata->gpio_irq, "maxim_sti_irq");
40                 MAXIM_STI_GPIO_ERROR(ret, pdata->gpio_irq, "request");
41                 ret = gpio_direction_input(pdata->gpio_irq);
42                 MAXIM_STI_GPIO_ERROR(ret, pdata->gpio_irq, "direction");
43
44                 ret = gpio_request(pdata->gpio_reset, "maxim_sti_reset");
45                 MAXIM_STI_GPIO_ERROR(ret, pdata->gpio_reset, "request");
46                 ret = gpio_direction_output(pdata->gpio_reset,
47                                             pdata->default_reset_state);
48                 MAXIM_STI_GPIO_ERROR(ret, pdata->gpio_reset, "direction");
49         } else {
50                 gpio_free(pdata->gpio_irq);
51                 gpio_free(pdata->gpio_reset);
52         }
53
54         return 0;
55 }
56
57 static void maxim_sti_reset(struct maxim_sti_pdata *pdata, int value)
58 {
59         gpio_set_value(pdata->gpio_reset, !!value);
60 }
61
62 static int maxim_sti_irq(struct maxim_sti_pdata *pdata)
63 {
64         return gpio_get_value(pdata->gpio_irq);
65 }
66
67 void __init touch_init_maxim_sti(struct spi_board_info *spi_board)
68 {
69         struct maxim_sti_pdata  *pdata;
70
71         pdata = (struct maxim_sti_pdata *)spi_board->platform_data;
72         pdata->init  = maxim_sti_init;
73         pdata->reset = maxim_sti_reset;
74         pdata->irq   = maxim_sti_irq;
75
76         spi_board->irq = gpio_to_irq(pdata->gpio_irq);
77
78         spi_register_board_info(spi_board, 1);
79 }
80
81 #endif
82