void __sramfunc board_pmu_suspend(void) { int ret; ret = gpio_readl(GPIO_SWPORTA_DDR); gpio_writel(ret | GPIO3_D2_OUTPUT, GPIO_SWPORTA_DDR); ret = gpio_readl(GPIO_SWPORTA_DR); gpio_writel(ret | GPIO3_D2_OUTPUT_HIGH, GPIO_SWPORTA_DR); //set pmu_sleep output high }
void __sramfunc board_pmu_resume(void) { int ret; ret = gpio_readl(GPIO_SWPORTA_DDR); gpio_writel(ret | GPIO3_D2_OUTPUT, GPIO_SWPORTA_DDR); ret = gpio_readl(GPIO_SWPORTA_DR); gpio_writel(ret & GPIO3_D2_OUTPUT_LOW, GPIO_SWPORTA_DR); //set pmu_sleep output low sram_udelay(2000); }
int gpio_irq_request(unsigned gpio, int type) { int reg_addr = gpio&0xffff0000; int index = gpio&0xffff; if(reg_addr==0) { gpio_err("no gpio group 0x%x\n",gpio); return -1; } //gpio_err("%s,reg_addr=0x%x,index=%d,type=%d,addr = %x\n",__func__,reg_addr,index,type,reg_addr+RK_GPIO_DEBOUNCE_REG); gpio_writel(gpio_readl(reg_addr+RK_GPIO_DIR_REG)&(~(1ul<<index)), reg_addr+RK_GPIO_DIR_REG); //input gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_MASK)&(~(1ul<<index)), reg_addr+RK_GPIO_INT_MASK); //int mask gpio_writel(gpio_readl(reg_addr+RK_GPIO_DEBOUNCE_REG)|(1ul<<index), reg_addr+RK_GPIO_DEBOUNCE_REG); //debounce if((type & IRQ_TYPE_EDGE_RISING) || (type&IRQ_TYPE_EDGE_FALLING)) gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_LEVEL)|(1ul<<index), reg_addr+RK_GPIO_INT_LEVEL); //use edge sensitive else if((type & IRQ_TYPE_LEVEL_HIGH) || (type&IRQ_TYPE_LEVEL_LOW)) gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_LEVEL)&(~(1ul<<index)), reg_addr+RK_GPIO_INT_LEVEL); //use level if((type & IRQ_TYPE_EDGE_RISING) || (type&IRQ_TYPE_LEVEL_HIGH)) gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_POLARITY)|(1ul<<index), reg_addr+RK_GPIO_INT_POLARITY); else if((type & IRQ_TYPE_EDGE_FALLING) || (type&IRQ_TYPE_LEVEL_LOW)) gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_POLARITY)&(~(1ul<<index)), reg_addr+RK_GPIO_INT_POLARITY); if(type) gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_EN)|(1ul<<index), reg_addr+RK_GPIO_INT_EN); //enable int else gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_EN)&(~(1ul<<index)), reg_addr+RK_GPIO_INT_EN); return 0; }
int gpio_set_value(unsigned gpio, int value) { int reg_addr = gpio&0xffff0000; int index = gpio&0xffff; if(reg_addr==0) { gpio_err("no gpio group \n"); return -1; } if(value)gpio_writel(gpio_readl(reg_addr+RK_GPIO_WRITE_REG)|(1ul<<index), reg_addr+RK_GPIO_WRITE_REG); else gpio_writel(gpio_readl(reg_addr+RK_GPIO_WRITE_REG)&(~(1ul<<index)), reg_addr+RK_GPIO_WRITE_REG); return 0; }
int gpio_direction_output(unsigned gpio, int value) { int reg_addr = gpio&0xffff0000; int index = gpio&0xffff; if(reg_addr==0) { gpio_err("no gpio group 0x%x\n",gpio); return -1; } gpio_writel(gpio_readl(reg_addr+RK_GPIO_DIR_REG)|(1ul<<index), reg_addr+RK_GPIO_DIR_REG); return gpio_set_value(gpio, value); }
int gpio_irq_clr(unsigned gpio) { int reg_addr = gpio&0xffff0000; int index = gpio&0xffff; if(reg_addr==0) { gpio_err("no gpio group \n"); return -1; } gpio_writel(gpio_readl(reg_addr+RK_GPIO_INT_EOI)|(1ul<<index), reg_addr+RK_GPIO_INT_EOI); return 0; }
int gpio_direction_input(unsigned gpio) { int reg_addr = gpio&0xffff0000; int index = gpio&0xffff; if(reg_addr==0) { gpio_err("no gpio group 0x%x\n",gpio); return -1; } gpio_writel(gpio_readl(reg_addr+RK_GPIO_DIR_REG)&(~(1ul<<index)), reg_addr+RK_GPIO_DIR_REG); // gpio_writel(reg_addr+RK_GPIO_DEBOUNCE_REG, gpio_readl(reg_addr+RK_GPIO_DEBOUNCE_REG)|(1ul<<index)); return 0; }
void portmux_select_gpio(void *port, unsigned long pin_mask, unsigned long flags) { /* Both pull-up and pull-down set means buskeeper */ if (flags & PORTMUX_PULL_DOWN) gpio_writel(port, PDERS, pin_mask); else gpio_writel(port, PDERC, pin_mask); if (flags & PORTMUX_PULL_UP) gpio_writel(port, PUERS, pin_mask); else gpio_writel(port, PUERC, pin_mask); /* Enable open-drain mode if requested */ if (flags & PORTMUX_OPEN_DRAIN) gpio_writel(port, ODMERS, pin_mask); else gpio_writel(port, ODMERC, pin_mask); /* Select drive strength */ if (flags & PORTMUX_DRIVE_LOW) gpio_writel(port, ODCR0S, pin_mask); else gpio_writel(port, ODCR0C, pin_mask); if (flags & PORTMUX_DRIVE_HIGH) gpio_writel(port, ODCR1S, pin_mask); else gpio_writel(port, ODCR1C, pin_mask); /* Select direction and initial pin state */ if (flags & PORTMUX_DIR_OUTPUT) { if (flags & PORTMUX_INIT_HIGH) gpio_writel(port, OVRS, pin_mask); else gpio_writel(port, OVRC, pin_mask); gpio_writel(port, ODERS, pin_mask); } else { gpio_writel(port, ODERC, pin_mask); } /* Enable GPIO */ gpio_writel(port, GPERS, pin_mask); }
void portmux_select_peripheral(void *port, unsigned long pin_mask, enum portmux_function func, unsigned long flags) { /* Both pull-up and pull-down set means buskeeper */ if (flags & PORTMUX_PULL_DOWN) gpio_writel(port, PDERS, pin_mask); else gpio_writel(port, PDERC, pin_mask); if (flags & PORTMUX_PULL_UP) gpio_writel(port, PUERS, pin_mask); else gpio_writel(port, PUERC, pin_mask); /* Select drive strength */ if (flags & PORTMUX_DRIVE_LOW) gpio_writel(port, ODCR0S, pin_mask); else gpio_writel(port, ODCR0C, pin_mask); if (flags & PORTMUX_DRIVE_HIGH) gpio_writel(port, ODCR1S, pin_mask); else gpio_writel(port, ODCR1C, pin_mask); /* Select function */ if (func & PORTMUX_FUNC_B) gpio_writel(port, PMR0S, pin_mask); else gpio_writel(port, PMR0C, pin_mask); if (func & PORTMUX_FUNC_C) gpio_writel(port, PMR1S, pin_mask); else gpio_writel(port, PMR1C, pin_mask); /* Disable GPIO (i.e. enable peripheral) */ gpio_writel(port, GPERC, pin_mask); }
void gpio_direction_output(int gpio, int value) { gpio_writel(gpio, 1 << G(gpio), DMW96_GPIO_DIR_OUT); gpio_set_value(gpio, value); }
void gpio_set_value(int gpio, int value) { int reg = value ? DMW96_GPIO_DATA_SET : DMW96_GPIO_DATA_CLR; gpio_writel(gpio, 1 << G(gpio), reg); }
void gpio_disable(int gpio) { gpio_writel(gpio, 1 << G(gpio), DMW96_GPIO_EN_CLR); }
void gpio_enable(int gpio) { gpio_writel(gpio, 1 << G(gpio), DMW96_GPIO_EN_SET); }