GNU Linux-libre 4.14.266-gnu1
[releases.git] / drivers / pinctrl / sprd / pinctrl-sprd.h
1 /*
2  * Driver header file for pin controller driver
3  * Copyright (C) 2017 Spreadtrum  - http://www.spreadtrum.com
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * version 2 as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  */
14
15 #ifndef __PINCTRL_SPRD_H__
16 #define __PINCTRL_SPRD_H__
17
18 struct platform_device;
19
20 #define NUM_OFFSET      (20)
21 #define TYPE_OFFSET     (16)
22 #define BIT_OFFSET      (8)
23 #define WIDTH_OFFSET    (4)
24
25 #define SPRD_PIN_INFO(num, type, offset, width, reg)    \
26                 (((num) & 0xFFF) << NUM_OFFSET |        \
27                  ((type) & 0xF) << TYPE_OFFSET |        \
28                  ((offset) & 0xFF) << BIT_OFFSET |      \
29                  ((width) & 0xF) << WIDTH_OFFSET |      \
30                  ((reg) & 0xF))
31
32 #define SPRD_PINCTRL_PIN(pin)   SPRD_PINCTRL_PIN_DATA(pin, #pin)
33
34 #define SPRD_PINCTRL_PIN_DATA(a, b)                             \
35         {                                                       \
36                 .name = b,                                      \
37                 .num = (((a) >> NUM_OFFSET) & 0xfff),           \
38                 .type = (((a) >> TYPE_OFFSET) & 0xf),           \
39                 .bit_offset = (((a) >> BIT_OFFSET) & 0xff),     \
40                 .bit_width = ((a) >> WIDTH_OFFSET & 0xf),       \
41                 .reg = ((a) & 0xf)                              \
42         }
43
44 enum pin_type {
45         GLOBAL_CTRL_PIN,
46         COMMON_PIN,
47         MISC_PIN,
48 };
49
50 struct sprd_pins_info {
51         const char *name;
52         unsigned int num;
53         enum pin_type type;
54
55         /* for global control pins configuration */
56         unsigned long bit_offset;
57         unsigned long bit_width;
58         unsigned int reg;
59 };
60
61 int sprd_pinctrl_core_probe(struct platform_device *pdev,
62                             struct sprd_pins_info *sprd_soc_pin_info,
63                             int pins_cnt);
64 int sprd_pinctrl_remove(struct platform_device *pdev);
65 void sprd_pinctrl_shutdown(struct platform_device *pdev);
66
67 #endif /* __PINCTRL_SPRD_H__ */