void at91_gpio_conf_output(__u32 nPioIdx, __u32 mask, int isPullUp) { writel(VA(PIO_BASE(nPioIdx) + PIO_PER), mask); writel(VA(PIO_BASE(nPioIdx) + PIO_OER), mask); writel(VA(PIO_BASE(nPioIdx) + PIO_IDR), mask); writel(VA(PIO_BASE(nPioIdx) + (isPullUp ? PIO_PUER : PIO_PUDR)), mask); }
void at91_gpio_conf_periB(__u32 nPioIdx, __u32 mask, int isPullUp) { writel(VA(PIO_BASE(nPioIdx)) + PIO_PDR, mask); writel(VA(PIO_BASE(nPioIdx)) + PIO_BSR, mask); writel(VA(PIO_BASE(nPioIdx)) + PIO_IDR, mask); writel(VA(PIO_BASE(nPioIdx)) + (isPullUp ? PIO_PUER : PIO_PUDR), mask); }
static void at91sam926x_gpio_irqparse(struct int_pin *ipin, __u32 irq) { __u32 dwPioStat; __u32 nPioIdx, nPioPin; nPioIdx = irq - PIO_IRQ_OFFSET; dwPioStat = readl(VA(PIO_BASE(nPioIdx) + PIO_ISR)); dwPioStat &= readl(VA(PIO_BASE(nPioIdx) + PIO_IMR)); // printf("%s(): stat = 0x%08x\n", __func__, dwPioStat); for (nPioPin = 0; nPioPin < 32; nPioPin++) { if (dwPioStat & (1 << nPioPin)) irq_handle(32 + 32 * nPioIdx + nPioPin); } }
static void at91sam926x_gpio_umask(__u32 irq) { __u32 nPioIdx, nPioPin; irq -= 32; nPioIdx = irq >> 5; nPioPin = irq & 0x1f; writel(VA(PIO_BASE(nPioIdx) + PIO_IER), 1 << nPioPin); }