aboutsummaryrefslogtreecommitdiff
path: root/drivers/pinctrl/pinctrl-equilibrium.h
blob: 83cb7dafc657f67b4df8fcb30a3b8425b3f17386 (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* SPDX-License-Identifier: GPL-2.0 */
/*
 *  Copyright(c) 2019 Intel Corporation.
 */

#ifndef __PINCTRL_EQUILIBRIUM_H
#define __PINCTRL_EQUILIBRIUM_H

/* PINPAD register offset */
#define REG_PMX_BASE	0x0	/* Port Multiplexer Control Register */
#define REG_PUEN	0x80	/* PULL UP Enable Register */
#define REG_PDEN	0x84	/* PULL DOWN Enable Register */
#define REG_SRC		0x88	/* Slew Rate Control Register */
#define REG_DCC0	0x8C	/* Drive Current Control Register 0 */
#define REG_DCC1	0x90	/* Drive Current Control Register 1 */
#define REG_OD		0x94	/* Open Drain Enable Register */
#define REG_AVAIL	0x98	/* Pad Control Availability Register */
#define DRV_CUR_PINS	16	/* Drive Current pin number per register */
#define REG_DRCC(x)	(REG_DCC0 + (x) * 4) /* Driver current macro */

/* GPIO register offset */
#define GPIO_OUT	0x0	/* Data Output Register */
#define GPIO_IN		0x4	/* Data Input Register */
#define GPIO_DIR	0x8	/* Direction Register */
#define GPIO_EXINTCR0	0x18	/* External Interrupt Control Register 0 */
#define GPIO_EXINTCR1	0x1C	/* External Interrupt Control Register 1 */
#define GPIO_IRNCR	0x20	/* IRN Capture Register */
#define GPIO_IRNICR	0x24	/* IRN Interrupt Control Register */
#define GPIO_IRNEN	0x28	/* IRN Interrupt Enable Register */
#define GPIO_IRNCFG	0x2C	/* IRN Interrupt Configuration Register */
#define GPIO_IRNRNSET	0x30	/* IRN Interrupt Enable Set Register */
#define GPIO_IRNENCLR	0x34	/* IRN Interrupt Enable Clear Register */
#define GPIO_OUTSET	0x40	/* Output Set Register */
#define GPIO_OUTCLR	0x44	/* Output Clear Register */
#define GPIO_DIRSET	0x48	/* Direction Set Register */
#define GPIO_DIRCLR	0x4C	/* Direction Clear Register */

/* parse given pin's driver current value */
#define PARSE_DRV_CURRENT(val, pin) (((val) >> ((pin) * 2)) & 0x3)

#define GPIO_EDGE_TRIG		0
#define GPIO_LEVEL_TRIG		1
#define GPIO_SINGLE_EDGE	0
#define GPIO_BOTH_EDGE		1
#define GPIO_POSITIVE_TRIG	0
#define GPIO_NEGATIVE_TRIG	1

#define EQBR_GPIO_MODE		0

typedef enum {
	OP_COUNT_NR_FUNCS,
	OP_ADD_FUNCS,
	OP_COUNT_NR_FUNC_GRPS,
	OP_ADD_FUNC_GRPS,
	OP_NONE,
} funcs_util_ops;

/**
 * struct gpio_irq_type: gpio irq configuration
 * @trig_type: level trigger or edge trigger
 * @edge_type: sigle edge or both edge
 * @logic_type: positive trigger or negative trigger
 */
struct gpio_irq_type {
	unsigned int trig_type;
	unsigned int edge_type;
	unsigned int logic_type;
};

/**
 * struct eqbr_pmx_func: represent a pin function.
 * @name: name of the pin function, used to lookup the function.
 * @groups: one or more names of pin groups that provide this function.
 * @nr_groups: number of groups included in @groups.
 */
struct eqbr_pmx_func {
	const char		*name;
	const char		**groups;
	unsigned int		nr_groups;
};

/**
 * struct eqbr_pin_bank: represent a pin bank.
 * @membase: base address of the pin bank register.
 * @id: bank id, to idenify the unique bank.
 * @pin_base: starting pin number of the pin bank.
 * @nr_pins: number of the pins of the pin bank.
 * @aval_pinmap: available pin bitmap of the pin bank.
 */
struct eqbr_pin_bank {
	void __iomem		*membase;
	unsigned int		id;
	unsigned int		pin_base;
	unsigned int		nr_pins;
	u32			aval_pinmap;
};

/**
 * struct eqbr_gpio_ctrl: represent a gpio controller.
 * @node: device node of gpio controller.
 * @bank: pointer to corresponding pin bank.
 * @membase: base address of the gpio controller.
 * @chip: gpio chip.
 * @ic:   irq chip.
 * @name: gpio chip name.
 * @virq: irq number of the gpio chip to parent's irq domain.
 * @lock: spin lock to protect gpio register write.
 */
struct eqbr_gpio_ctrl {
	struct device_node	*node;
	struct eqbr_pin_bank	*bank;
	void __iomem		*membase;
	struct gpio_chip	chip;
	struct irq_chip		ic;
	const char		*name;
	unsigned int		virq;
	raw_spinlock_t		lock; /* protect gpio register */
};

/**
 * struct eqbr_pinctrl_drv_data:
 * @dev: device instance representing the controller.
 * @pctl_desc: pin controller descriptor.
 * @pctl_dev: pin control class device
 * @membase: base address of pin controller
 * @pin_banks: list of pin banks of the driver.
 * @nr_banks: number of pin banks.
 * @gpio_ctrls: list of gpio controllers.
 * @nr_gpio_ctrls: number of gpio controllers.
 * @lock: protect pinctrl register write
 */
struct eqbr_pinctrl_drv_data {
	struct device			*dev;
	struct pinctrl_desc		pctl_desc;
	struct pinctrl_dev		*pctl_dev;
	void __iomem			*membase;
	struct eqbr_pin_bank		*pin_banks;
	unsigned int			nr_banks;
	struct eqbr_gpio_ctrl		*gpio_ctrls;
	unsigned int			nr_gpio_ctrls;
	raw_spinlock_t			lock; /* protect pinpad register */
};

#endif /* __PINCTRL_EQUILIBRIUM_H */