xref: /netbsd-src/sys/arch/arm/at91/at91sam9260bus.c (revision 30ba21540f737b3d029b915d1d262a41c81df6da)
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