1 /*        $NetBSD: at91sam9260bus.c,v 1.2 2023/04/21 15:00:48 skrll Exp $       */
2 /*
3  * Copied from at91sam9261bus.c
4  * Adaptation to AT91SAM9260 by Aymeric Vincent is in the public domain.
5  */
6 
7 #include <sys/cdefs.h>
8 __KERNEL_RCSID(0, "$NetBSD: at91sam9260bus.c,v 1.2 2023/04/21 15:00:48 skrll Exp $");
9 
10 #include <sys/types.h>
11 #include <sys/param.h>
12 #include <sys/systm.h>
13 #include <sys/kernel.h>
14 #include <sys/time.h>
15 #include <sys/device.h>
16 #include <uvm/uvm_extern.h>
17 
18 #include <arm/at91/at91sam9260busvar.h>
19 
20 const struct at91bus_machdep at91sam9260bus = {
21           at91sam9260bus_init,
22           at91sam9260bus_attach_cn,
23           at91sam9260bus_devmap,
24 
25           /* clocking support: */
26           at91sam9260bus_peripheral_clock,
27 
28           /* PIO support: */
29           at91sam9260bus_pio_port,
30           at91sam9260bus_gpio_mask,
31 
32           /* interrupt handling support: */
33           at91sam9260bus_intr_init,
34           at91sam9260bus_intr_establish,
35           at91sam9260bus_intr_disestablish,
36           at91sam9260bus_intr_poll,
37           at91sam9260bus_intr_dispatch,
38 
39           /* configuration */
40           at91sam9260bus_peripheral_name,
41           at91sam9260bus_search_peripherals
42 };
43 
at91sam9260bus_init(struct at91bus_clocks * clocks)44 void at91sam9260bus_init(struct at91bus_clocks *clocks) {
45           pmap_devmap_register(at91_devmap());
46           at91pmc_get_clocks(clocks);
47 }
48 
at91sam9260bus_devmap(void)49 const struct pmap_devmap *at91sam9260bus_devmap(void) {
50           static const struct pmap_devmap devmap[] = {
51               {
52                     AT91SAM9260_APB_VBASE,
53                     AT91SAM9260_APB_HWBASE,
54                     AT91SAM9260_APB_SIZE,
55                     VM_PROT_READ | VM_PROT_WRITE,
56                     PTE_NOCACHE
57               },
58 
59               {
60                     0, 0, 0, 0, 0
61               }
62           };
63 
64           return devmap;
65 }
66 
at91sam9260bus_peripheral_clock(int pid,int enable)67 void at91sam9260bus_peripheral_clock(int pid, int enable) {
68           switch (pid) {
69           case PID_UHP:
70                     if (enable)
71                               PMCREG(PMC_SCER) = PMC_SCSR_SAM_UHP;
72                     else
73                               PMCREG(PMC_SCDR) = PMC_SCSR_SAM_UHP;
74                     break;
75           }
76           at91pmc_peripheral_clock(pid, enable);
77 }
78 
at91sam9260bus_pio_port(int pid)79 at91pio_port at91sam9260bus_pio_port(int pid) {
80           switch (pid) {
81           case PID_PIOA:      return AT91_PIOA;
82           case PID_PIOB:      return AT91_PIOB;
83           case PID_PIOC:      return AT91_PIOC;
84           default:  panic("%s: pid %d not valid", __FUNCTION__, pid);
85           }
86 
87 }
88 
at91sam9260bus_gpio_mask(int pid)89 uint32_t at91sam9260bus_gpio_mask(int pid) {
90           return 0xFFFFFFFFUL;
91 }
92 
at91sam9260bus_peripheral_name(int pid)93 const char *at91sam9260bus_peripheral_name(int pid) {
94           switch (pid) {
95           case PID_FIQ:       return "FIQ";
96           case PID_SYSIRQ:return "SYS";
97           case PID_PIOA:      return "PIOA";
98           case PID_PIOB:      return "PIOB";
99           case PID_PIOC:      return "PIOC";
100           case PID_US0:       return "USART0";
101           case PID_US1:       return "USART1";
102           case PID_US2:       return "USART2";
103           case PID_MCI:       return "MCI";
104           case PID_UDP:       return "UDP";
105           case PID_TWI:       return "TWI";
106           case PID_SPI0:      return "SPI0";
107           case PID_SPI1:      return "SPI1";
108           case PID_SSC:       return "SSC";
109           case PID_TC0:       return "TC0";
110           case PID_TC1:       return "TC1";
111           case PID_TC2:       return "TC2";
112           case PID_UHP:       return "UHP";
113           case PID_EMAC:      return "EMAC";
114           case PID_US3:       return "USART3";
115           case PID_US4:       return "USART4";
116           case PID_US5:       return "USART5";
117           case PID_TC3:       return "TC3";
118           case PID_TC4:       return "TC4";
119           case PID_TC5:       return "TC5";
120           case PID_IRQ0:      return "IRQ0";
121           case PID_IRQ1:      return "IRQ1";
122           case PID_IRQ2:      return "IRQ2";
123           default:  panic("%s: invalid pid %d", __FUNCTION__, pid);
124           }
125 }
126 
at91sam9260bus_search_peripherals(device_t self,device_t found_func (device_t,bus_addr_t,int))127 void at91sam9260bus_search_peripherals(device_t self,
128                                  device_t found_func(device_t, bus_addr_t, int)) {
129           static const struct {
130                     bus_addr_t          addr;
131                     int                 pid;
132           } table[] = {
133                     {AT91SAM9260_PMC_BASE,                  -1},
134                     {AT91SAM9260_AIC_BASE,                  -1},
135                     {AT91SAM9260_PIT_BASE,                  PID_SYSIRQ},
136                     {AT91SAM9260_TC0_BASE,                  PID_TC0},
137                     {AT91SAM9260_TC1_BASE,                  PID_TC1},
138                     {AT91SAM9260_TC2_BASE,                  PID_TC2},
139                     {AT91SAM9260_DBGU_BASE,                 PID_SYSIRQ},
140                     {AT91SAM9260_PIOA_BASE,                 PID_PIOA},
141                     {AT91SAM9260_PIOB_BASE,                 PID_PIOB},
142                     {AT91SAM9260_PIOC_BASE,                 PID_PIOC},
143                     {AT91SAM9260_USART0_BASE,     PID_US0},
144                     {AT91SAM9260_USART1_BASE,     PID_US1},
145                     {AT91SAM9260_USART2_BASE,     PID_US2},
146                     {AT91SAM9260_SSC_BASE,                  PID_SSC},
147 //                  {AT91SAM9260_EMAC_BASE,                 PID_EMAC},
148                     {AT91SAM9260_TWI_BASE,                  PID_TWI},
149                     {AT91SAM9260_SPI0_BASE,                 PID_SPI0},
150                     {AT91SAM9260_SPI1_BASE,                 PID_SPI1},
151                     {AT91SAM9260_UHP_BASE,                  PID_UHP},
152                     {AT91SAM9260_UDP_BASE,                  PID_UDP},
153                     {AT91SAM9260_MCI_BASE,                  PID_MCI},
154                     {0, 0}
155           };
156           int i;
157 
158           for (i = 0; table[i].addr; i++)
159                     found_func(self, table[i].addr, table[i].pid);
160 }
161 
162