hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
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
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright 2012 Freescale Semiconductor, Inc.
 */
 
#ifndef __PINCTRL_MXS_H
#define __PINCTRL_MXS_H
 
#include <linux/platform_device.h>
#include <linux/pinctrl/pinctrl.h>
 
#define SET    0x4
#define CLR    0x8
#define TOG    0xc
 
#define MXS_PINCTRL_PIN(pin)    PINCTRL_PIN(pin, #pin)
#define PINID(bank, pin)    ((bank) * 32 + (pin))
 
/*
 * pinmux-id bit field definitions
 *
 * bank:    15..12    (4)
 * pin:        11..4    (8)
 * muxsel:    3..0    (4)
 */
#define MUXID_TO_PINID(m)    PINID((m) >> 12 & 0xf, (m) >> 4 & 0xff)
#define MUXID_TO_MUXSEL(m)    ((m) & 0xf)
 
#define PINID_TO_BANK(p)    ((p) >> 5)
#define PINID_TO_PIN(p)        ((p) % 32)
 
/*
 * pin config bit field definitions
 *
 * pull-up:    6..5    (2)
 * voltage:    4..3    (2)
 * mA:        2..0    (3)
 *
 * MSB of each field is presence bit for the config.
 */
#define PULL_PRESENT        (1 << 6)
#define PULL_SHIFT        5
#define VOL_PRESENT        (1 << 4)
#define VOL_SHIFT        3
#define MA_PRESENT        (1 << 2)
#define MA_SHIFT        0
#define CONFIG_TO_PULL(c)    ((c) >> PULL_SHIFT & 0x1)
#define CONFIG_TO_VOL(c)    ((c) >> VOL_SHIFT & 0x1)
#define CONFIG_TO_MA(c)        ((c) >> MA_SHIFT & 0x3)
 
struct mxs_function {
   const char *name;
   const char **groups;
   unsigned ngroups;
};
 
struct mxs_group {
   const char *name;
   unsigned int *pins;
   unsigned npins;
   u8 *muxsel;
   u8 config;
};
 
struct mxs_regs {
   u16 muxsel;
   u16 drive;
   u16 pull;
};
 
struct mxs_pinctrl_soc_data {
   const struct mxs_regs *regs;
   const struct pinctrl_pin_desc *pins;
   unsigned npins;
   struct mxs_function *functions;
   unsigned nfunctions;
   struct mxs_group *groups;
   unsigned ngroups;
};
 
int mxs_pinctrl_probe(struct platform_device *pdev,
             struct mxs_pinctrl_soc_data *soc);
 
#endif /* __PINCTRL_MXS_H */