1 /* $NetBSD: netbookpro_machdep.c,v 1.4 2023/09/09 07:07:03 andvar Exp $ */
2 /*
3 * Copyright (c) 2011 KIYOHARA Takashi
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27 #include <sys/cdefs.h>
28 __KERNEL_RCSID(0, "$NetBSD: netbookpro_machdep.c,v 1.4 2023/09/09 07:07:03 andvar Exp $");
29
30 #include <sys/systm.h>
31 #include <sys/device.h>
32 #include <sys/mutex.h>
33 #include <sys/param.h>
34
35 #include <uvm/uvm.h>
36
37 #include <machine/bootconfig.h>
38 #include <machine/pmap.h>
39
40 #include <arm/xscale/pxa2x0_gpio.h>
41
42 #include <hpcarm/dev/nbppconvar.h>
43
44 #include <dev/cons.h>
45 #include <dev/i2c/i2cvar.h>
46
47 #include "nbppcon.h"
48
49 #include "biconsdev.h"
50 #if NBICONSDEV > 0
51 #include <dev/hpc/bicons.h>
52 cons_decl(bicons);
53 #endif
54 #include "wsdisplay.h"
55 #if NWSDISPLAY == 0
56 #include <dev/wscons/wskbdvar.h>
57 #endif
58
59 static void netbookpro_reset(void);
60 void pxa2x0_machdep_init(void);
61
62 static int __unused enable_console(void (*)(struct consdev *),
63 void (*)(struct consdev *));
64 static void disable_consoles(void);
65 static void cn_nonprobe(struct consdev *);
66
67 const struct pmap_devmap machdep_devmap[] = {
68 /* Framebuffer */
69 DEVMAP_ENTRY(
70 0x14000000,
71 0x14000000,
72 0x00400000
73 ),
74 DEVMAP_ENTRY_END
75 };
76
77 static struct pxa2x0_gpioconf netbookpro_boarddep_gpioconf[] = {
78 { 6, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCLK */
79 { 8, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS0 */
80 { 52, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPCE1 */
81 { 53, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPCE2 */
82 { -1 }
83 };
84
85 static struct pxa2x0_gpioconf *netbookpro_gpioconf[] = {
86 pxa25x_pcic_gpioconf,
87 netbookpro_boarddep_gpioconf,
88 NULL
89 };
90
91 static void
netbookpro_reset(void)92 netbookpro_reset(void)
93 {
94 device_t pcon;
95
96 pcon = device_find_by_xname("nbppcon0");
97 #if NNBPPCON > 0
98 if (pcon != NULL)
99 nbppcon_pwr_hwreset(pcon);
100 #endif
101
102 while (1 /*CONSTCOND*/);
103
104 /* NOTREACHED */
105 }
106
107 void
pxa2x0_machdep_init(void)108 pxa2x0_machdep_init(void)
109 {
110 extern void (*__cpu_reset)(void);
111 extern void (*__sleep_func)(void *);
112 extern BootConfig bootconfig; /* Boot config storage */
113
114
115 __cpu_reset = netbookpro_reset;
116 __sleep_func = NULL;
117 bootconfig.dram[0].pages = 32768; /* 128MiB */
118
119 pxa2x0_gpio_config(netbookpro_gpioconf);
120 }
121
122 void
consinit(void)123 consinit(void)
124 {
125 static int consinit_called = 0;
126
127 if (consinit_called != 0)
128 return;
129
130 consinit_called = 1;
131
132 disable_consoles();
133
134 #if NBICONSDEV > 0
135 enable_console(biconscninit, biconscnprobe);
136 bicons_set_priority(CN_INTERNAL);
137 cninit();
138 #if NWSDISPLAY == 0
139 if (cn_tab != NULL) { /* XXXX */
140 cn_tab->cn_getc = wskbd_cngetc;
141 cn_tab->cn_pollc = wskbd_cnpollc;
142 cn_tab->cn_bell = wskbd_cnbell;
143 }
144 #endif
145 #endif
146 }
147
148 static int __unused
enable_console(void (* init)(struct consdev *),void (* probe)(struct consdev *))149 enable_console(void (*init)(struct consdev *), void (*probe)(struct consdev *))
150 {
151 struct consdev *cp;
152
153 for (cp = constab; cp->cn_probe; cp++) {
154 if (cp->cn_init == init) {
155 cp->cn_probe = probe;
156 return 1;
157 }
158 }
159 return 0;
160 }
161
162 static void
disable_consoles(void)163 disable_consoles(void)
164 {
165 struct consdev *cp;
166
167 for (cp = constab; cp->cn_probe; cp++)
168 cp->cn_probe = cn_nonprobe;
169 }
170
171 static void
cn_nonprobe(struct consdev * cp)172 cn_nonprobe(struct consdev *cp)
173 {
174
175 cp->cn_pri = CN_DEAD;
176 }
177