1 /* $NetBSD: at91sam9260bus.c,v 1.1 2011/11/04 17:20:54 aymeric 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.1 2011/11/04 17:20:54 aymeric 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 44 void at91sam9260bus_init(struct at91bus_clocks *clocks) { 45 pmap_devmap_register(at91_devmap()); 46 at91pmc_get_clocks(clocks); 47 } 48 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 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 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 89 uint32_t at91sam9260bus_gpio_mask(int pid) { 90 return 0xFFFFFFFFUL; 91 } 92 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 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