imx51_iomux.c revision 1.4 1 1.4 chs /* $NetBSD: imx51_iomux.c,v 1.4 2012/10/27 17:17:39 chs Exp $ */
2 1.1 bsh
3 1.1 bsh /*
4 1.1 bsh * Copyright (c) 2009, 2010 Genetec Corporation. All rights reserved.
5 1.1 bsh * Written by Hashimoto Kenichi for Genetec Corporation.
6 1.1 bsh *
7 1.1 bsh * Redistribution and use in source and binary forms, with or without
8 1.1 bsh * modification, are permitted provided that the following conditions
9 1.1 bsh * are met:
10 1.1 bsh * 1. Redistributions of source code must retain the above copyright
11 1.1 bsh * notice, this list of conditions and the following disclaimer.
12 1.1 bsh * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 bsh * notice, this list of conditions and the following disclaimer in the
14 1.1 bsh * documentation and/or other materials provided with the distribution.
15 1.1 bsh *
16 1.1 bsh * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
17 1.1 bsh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 bsh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 bsh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
20 1.1 bsh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 bsh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 bsh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 bsh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 bsh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 bsh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 bsh * POSSIBILITY OF SUCH DAMAGE.
27 1.1 bsh */
28 1.1 bsh #include <sys/cdefs.h>
29 1.4 chs __KERNEL_RCSID(0, "$NetBSD: imx51_iomux.c,v 1.4 2012/10/27 17:17:39 chs Exp $");
30 1.1 bsh
31 1.1 bsh #define _INTR_PRIVATE
32 1.1 bsh
33 1.1 bsh #include "locators.h"
34 1.1 bsh
35 1.1 bsh #include <sys/param.h>
36 1.1 bsh #include <sys/evcnt.h>
37 1.1 bsh #include <sys/atomic.h>
38 1.1 bsh #include <sys/device.h>
39 1.1 bsh
40 1.1 bsh #include <uvm/uvm_extern.h>
41 1.1 bsh
42 1.1 bsh #include <machine/intr.h>
43 1.1 bsh
44 1.1 bsh #include <arm/cpu.h>
45 1.1 bsh #include <arm/armreg.h>
46 1.1 bsh #include <arm/cpufunc.h>
47 1.1 bsh
48 1.2 dyoung #include <sys/bus.h>
49 1.1 bsh
50 1.1 bsh #include <arm/imx/imx51reg.h>
51 1.1 bsh #include <arm/imx/imx51var.h>
52 1.1 bsh
53 1.1 bsh struct iomux_softc {
54 1.1 bsh bus_space_tag_t iomux_memt;
55 1.1 bsh bus_space_handle_t iomux_memh;
56 1.1 bsh };
57 1.1 bsh
58 1.1 bsh #define IOMUX_READ(iomux, reg) \
59 1.1 bsh bus_space_read_4((iomux)->iomux_memt, (iomux)->iomux_memh, (reg))
60 1.1 bsh #define IOMUX_WRITE(iomux, reg, val) \
61 1.1 bsh bus_space_write_4((iomux)->iomux_memt, (iomux)->iomux_memh, (reg), (val))
62 1.1 bsh
63 1.1 bsh static int iomux_match(device_t, cfdata_t, void *);
64 1.1 bsh static void iomux_attach(device_t, device_t, void *);
65 1.1 bsh
66 1.1 bsh static struct iomux_softc *iomuxsc = NULL;
67 1.1 bsh
68 1.3 bsh CFATTACH_DECL_NEW(imxiomux, sizeof(struct iomux_softc),
69 1.3 bsh iomux_match, iomux_attach, NULL, NULL);
70 1.1 bsh
71 1.1 bsh int
72 1.1 bsh iomux_match(device_t parent, cfdata_t cfdata, void *aux)
73 1.1 bsh {
74 1.1 bsh struct axi_attach_args *axia = aux;
75 1.1 bsh
76 1.1 bsh if (axia->aa_addr != IOMUXC_BASE)
77 1.1 bsh return 0;
78 1.1 bsh
79 1.1 bsh return 1;
80 1.1 bsh }
81 1.1 bsh
82 1.1 bsh void
83 1.1 bsh iomux_attach(device_t parent, device_t self, void *aux)
84 1.1 bsh {
85 1.1 bsh struct axi_attach_args * const axia = aux;
86 1.1 bsh struct iomux_softc * const iomux = device_private(self);
87 1.1 bsh int error;
88 1.1 bsh
89 1.1 bsh if (axia->aa_size == AXICF_SIZE_DEFAULT)
90 1.1 bsh axia->aa_size = IOMUXC_SIZE;
91 1.1 bsh
92 1.1 bsh iomux->iomux_memt = axia->aa_iot;
93 1.1 bsh error = bus_space_map(axia->aa_iot, axia->aa_addr, axia->aa_size,
94 1.1 bsh 0, &iomux->iomux_memh);
95 1.1 bsh
96 1.1 bsh if (error) {
97 1.1 bsh aprint_error(": failed to map register %#lx@%#lx: %d\n",
98 1.1 bsh axia->aa_size, axia->aa_addr, error);
99 1.1 bsh return;
100 1.1 bsh }
101 1.1 bsh
102 1.1 bsh aprint_normal("\n");
103 1.1 bsh
104 1.1 bsh iomuxsc = iomux;
105 1.1 bsh }
106 1.1 bsh
107 1.1 bsh static void
108 1.1 bsh iomux_set_function_sub(struct iomux_softc *sc, uint32_t pin, uint32_t fn)
109 1.1 bsh {
110 1.1 bsh bus_size_t mux_ctl_reg = IOMUX_PIN_TO_MUX_ADDRESS(pin);
111 1.1 bsh
112 1.1 bsh if (mux_ctl_reg != IOMUX_MUX_NONE)
113 1.1 bsh bus_space_write_4(sc->iomux_memt, sc->iomux_memh,
114 1.1 bsh mux_ctl_reg, fn);
115 1.1 bsh }
116 1.1 bsh
117 1.1 bsh void
118 1.1 bsh iomux_set_function(unsigned int pin, unsigned int fn)
119 1.1 bsh {
120 1.1 bsh iomux_set_function_sub(iomuxsc, pin, fn);
121 1.1 bsh }
122 1.1 bsh
123 1.1 bsh
124 1.1 bsh static void
125 1.1 bsh iomux_set_pad_sub(struct iomux_softc *sc, uint32_t pin, uint32_t config)
126 1.1 bsh {
127 1.1 bsh bus_size_t pad_ctl_reg = IOMUX_PIN_TO_PAD_ADDRESS(pin);
128 1.1 bsh
129 1.1 bsh if (pad_ctl_reg != IOMUX_PAD_NONE)
130 1.1 bsh bus_space_write_4(sc->iomux_memt, sc->iomux_memh,
131 1.1 bsh pad_ctl_reg, config);
132 1.1 bsh }
133 1.1 bsh
134 1.1 bsh void
135 1.1 bsh iomux_set_pad(unsigned int pin, unsigned int config)
136 1.1 bsh {
137 1.1 bsh iomux_set_pad_sub(iomuxsc, pin, config);
138 1.1 bsh }
139 1.1 bsh
140 1.1 bsh #if 0
141 1.1 bsh void
142 1.1 bsh iomux_set_input(unsigned int input, unsigned int config)
143 1.1 bsh {
144 1.1 bsh bus_size_t input_ctl_reg = input;
145 1.1 bsh
146 1.1 bsh bus_space_write_4(iomuxsc->iomux_memt, iomuxsc->iomux_memh,
147 1.1 bsh input_ctl_reg, config);
148 1.1 bsh }
149 1.1 bsh #endif
150 1.1 bsh
151 1.1 bsh void
152 1.1 bsh iomux_mux_config(const struct iomux_conf *conflist)
153 1.1 bsh {
154 1.1 bsh int i;
155 1.1 bsh
156 1.1 bsh for (i = 0; conflist[i].pin != IOMUX_CONF_EOT; i++) {
157 1.1 bsh iomux_set_pad_sub(iomuxsc, conflist[i].pin, conflist[i].pad);
158 1.3 bsh iomux_set_function_sub(iomuxsc, conflist[i].pin,
159 1.1 bsh conflist[i].mux);
160 1.1 bsh }
161 1.1 bsh }
162 1.1 bsh
163 1.1 bsh #if 0
164 1.1 bsh void
165 1.1 bsh iomux_input_config(const struct iomux_input_conf *conflist)
166 1.1 bsh {
167 1.1 bsh int i;
168 1.1 bsh
169 1.1 bsh for (i = 0; conflist[i].inout != -1; i++) {
170 1.3 bsh iomux_set_inout(iomuxsc, conflist[i].inout,
171 1.1 bsh conflist[i].inout_mode);
172 1.1 bsh }
173 1.1 bsh }
174 1.1 bsh #endif
175 1.1 bsh
176