1 /*
2  * Freescale STMP37XX/STMP378X Pin Multiplexing
3  *
4  * Author: Vladislav Buzov <vbuzov@embeddedalley.com>
5  *
6  * Copyright 2008 Freescale Semiconductor, Inc. All Rights Reserved.
7  * Copyright 2008 Embedded Alley Solutions, Inc All Rights Reserved.
8  */
9 
10 /*
11  * The code contained herein is licensed under the GNU General Public
12  * License. You may obtain a copy of the GNU General Public License
13  * Version 2 or later at the following locations:
14  *
15  * http://www.opensource.org/licenses/gpl-license.html
16  * http://www.gnu.org/copyleft/gpl.html
17  */
18 #ifndef __PINMUX_H
19 #define __PINMUX_H
20 
21 #include <linux/spinlock.h>
22 #include <linux/types.h>
23 #include <linux/gpio.h>
24 #include <asm-generic/gpio.h>
25 
26 /* Pin definitions */
27 #include "pins.h"
28 #include <mach/pins.h>
29 
30 /*
31  * Each pin may be routed up to four different HW interfaces
32  * including GPIO
33  */
34 enum pin_fun {
35 	PIN_FUN1 = 0,
36 	PIN_FUN2,
37 	PIN_FUN3,
38 	PIN_GPIO,
39 };
40 
41 /*
42  * Each pin may have different output drive strength in range from
43  * 4mA to 20mA. The most common case is 4, 8 and 12 mA strengths.
44  */
45 enum pin_strength {
46 	PIN_4MA = 0,
47 	PIN_8MA,
48 	PIN_12MA,
49 	PIN_16MA,
50 	PIN_20MA,
51 };
52 
53 /*
54  * Each pin can be programmed for 1.8V or 3.3V
55  */
56 enum pin_voltage {
57 	PIN_1_8V = 0,
58 	PIN_3_3V,
59 };
60 
61 /*
62  * Structure to define a group of pins and their parameters
63  */
64 struct pin_desc {
65 	unsigned id;
66 	enum pin_fun fun;
67 	enum pin_strength strength;
68 	enum pin_voltage voltage;
69 	unsigned pullup:1;
70 };
71 
72 struct pin_group {
73 	struct pin_desc *pins;
74 	int nr_pins;
75 };
76 
77 /* Set pin drive strength */
78 void stmp3xxx_pin_strength(unsigned id, enum pin_strength strength,
79 			   const char *label);
80 
81 /* Set pin voltage */
82 void stmp3xxx_pin_voltage(unsigned id, enum pin_voltage voltage,
83 			   const char *label);
84 
85 /* Enable pull-up resistor for a pin */
86 void stmp3xxx_pin_pullup(unsigned id, int enable, const char *label);
87 
88 /*
89  * Request a pin ownership, only one module (identified by @label)
90  * may own a pin.
91  */
92 int stmp3xxx_request_pin(unsigned id, enum pin_fun fun, const char *label);
93 
94 /* Release pin */
95 void stmp3xxx_release_pin(unsigned id, const char *label);
96 
97 void stmp3xxx_set_pin_type(unsigned id, enum pin_fun fun);
98 
99 /*
100  * Each bank is associated with a number of registers to control
101  * pin function, drive strength, voltage and pull-up reigster. The
102  * number of registers of a given type depends on the number of bits
103  * describin particular pin.
104  */
105 #define HW_MUXSEL_NUM		2	/* registers per bank */
106 #define HW_MUXSEL_PIN_LEN	2	/* bits per pin */
107 #define HW_MUXSEL_PIN_NUM	16	/* pins per register */
108 #define HW_MUXSEL_PINFUN_MASK	0x3	/* pin function mask */
109 #define HW_MUXSEL_PINFUN_NUM	4	/* four options for a pin */
110 
111 #define HW_DRIVE_NUM		4	/* registers per bank */
112 #define HW_DRIVE_PIN_LEN	4	/* bits per pin */
113 #define HW_DRIVE_PIN_NUM	8	/* pins per register */
114 #define HW_DRIVE_PINDRV_MASK	0x3	/* pin strength mask - 2 bits */
115 #define HW_DRIVE_PINDRV_NUM	5	/* five possible strength values */
116 #define HW_DRIVE_PINV_MASK	0x4	/* pin voltage mask - 1 bit */
117 
118 
119 struct stmp3xxx_pinmux_bank {
120 	struct gpio_chip chip;
121 
122 	/* Pins allocation map */
123 	unsigned long pin_map;
124 
125 	/* Pin owner names */
126 	const char *pin_labels[32];
127 
128 	/* Bank registers */
129 	void __iomem *hw_muxsel[HW_MUXSEL_NUM];
130 	void __iomem *hw_drive[HW_DRIVE_NUM];
131 	void __iomem *hw_pull;
132 
133 	void __iomem *pin2irq,
134 		*irqlevel,
135 		*irqpolarity,
136 		*irqen,
137 		*irqstat;
138 
139 	/* HW MUXSEL register function bit values */
140 	u8 functions[HW_MUXSEL_PINFUN_NUM];
141 
142 	/*
143 	 * HW DRIVE register strength bit values:
144 	 * 0xff - requested strength is not supported for this bank
145 	 */
146 	u8 strengths[HW_DRIVE_PINDRV_NUM];
147 
148 	/* GPIO things */
149 	void __iomem *hw_gpio_in,
150 		     *hw_gpio_out,
151 		     *hw_gpio_doe;
152 	int irq, virq;
153 };
154 
155 int __init stmp3xxx_pinmux_init(int virtual_irq_start);
156 
157 #endif /* __PINMUX_H */
158