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