hc
2023-10-16 def2367077573b56f9fc4f824e5c0377a3a4175a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
 * Marvell PXA2xx family pin control
 *
 * Copyright (C) 2015 Robert Jarzmik
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 */
 
#ifndef __PINCTRL_PXA_H
#define __PINCTRL_PXA_H
 
#define PXA_FUNCTION(_dir, _af, _name)                \
   {                            \
       .name = _name,                    \
       .muxval = (_dir | (_af << 1)),            \
   }
 
#define PXA_PIN(_pin, funcs...)                    \
   {                            \
       .pin = _pin,                    \
       .functions = (struct pxa_desc_function[]){    \
           funcs, { } },                \
   }
 
#define PXA_GPIO_PIN(_pin, funcs...)                \
   {                            \
       .pin = _pin,                    \
       .functions = (struct pxa_desc_function[]){    \
           PXA_FUNCTION(0, 0, "gpio_in"),        \
           PXA_FUNCTION(1, 0, "gpio_out"),        \
           funcs, { } },                \
   }
 
#define PXA_GPIO_ONLY_PIN(_pin)                    \
   {                            \
       .pin = _pin,                    \
       .functions = (struct pxa_desc_function[]){    \
           PXA_FUNCTION(0, 0, "gpio_in"),        \
           PXA_FUNCTION(1, 0, "gpio_out"),        \
           { } },                    \
   }
 
#define PXA_PINCTRL_PIN(pin)        \
   PINCTRL_PIN(pin, "P" #pin)
 
struct pxa_desc_function {
   const char    *name;
   u8        muxval;
};
 
struct pxa_desc_pin {
   struct pinctrl_pin_desc        pin;
   struct pxa_desc_function    *functions;
};
 
struct pxa_pinctrl_group {
   const char    *name;
   unsigned    pin;
};
 
struct pxa_pinctrl_function {
   const char    *name;
   const char    **groups;
   unsigned    ngroups;
};
 
struct pxa_pinctrl {
   spinlock_t            lock;
   void __iomem            **base_gafr;
   void __iomem            **base_gpdr;
   void __iomem            **base_pgsr;
   struct device            *dev;
   struct pinctrl_desc        desc;
   struct pinctrl_dev        *pctl_dev;
   unsigned            npins;
   const struct pxa_desc_pin    *ppins;
   unsigned            ngroups;
   struct pxa_pinctrl_group    *groups;
   unsigned            nfuncs;
   struct pxa_pinctrl_function    *functions;
   char                *name;
};
 
int pxa2xx_pinctrl_init(struct platform_device *pdev,
           const struct pxa_desc_pin *ppins, int npins,
           void __iomem *base_gafr[], void __iomem *base_gpdr[],
           void __iomem *base_gpsr[]);
 
#endif /* __PINCTRL_PXA_H */