static void __tc6393xb_gpio_set(struct gpio_chip *chip, unsigned offset, int value) { struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio); u8 dsr; dsr = tmio_ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8)); if (value) dsr |= TC_GPIO_BIT(offset); else dsr &= ~TC_GPIO_BIT(offset); tmio_iowrite8(dsr, tc6393xb->scr + SCR_GPO_DSR(offset / 8)); }
static int tc6393xb_gpio_get(struct gpio_chip *chip, unsigned offset) { struct tc6393xb *tc6393xb = container_of(chip, struct tc6393xb, gpio); /* XXX: does dsr also represent inputs? */ return tmio_ioread8(tc6393xb->scr + SCR_GPO_DSR(offset / 8)) & TC_GPIO_BIT(offset); }
static void tc6393xb_scr_writeb(TC6393xbState *s, hwaddr addr, uint32_t value) { switch (addr) { SCR_REG_B(ISR); SCR_REG_B(IMR); SCR_REG_B(IRR); SCR_REG_W(GPER); SCR_REG_A(GPI_SR); SCR_REG_A(GPI_IMR); SCR_REG_A(GPI_EDER); SCR_REG_A(GPI_LIR); case SCR_GPO_DSR(0): case SCR_GPO_DSR(1): case SCR_GPO_DSR(2): s->gpio_level = (s->gpio_level & ~(0xff << ((addr - SCR_GPO_DSR(0))*8))) | ((value & 0xff) << ((addr - SCR_GPO_DSR(0))*8)); tc6393xb_gpio_handler_update(s); return; case SCR_GPO_DOECR(0): case SCR_GPO_DOECR(1): case SCR_GPO_DOECR(2): s->gpio_dir = (s->gpio_dir & ~(0xff << ((addr - SCR_GPO_DOECR(0))*8))) | ((value & 0xff) << ((addr - SCR_GPO_DOECR(0))*8)); tc6393xb_gpio_handler_update(s); return; SCR_REG_A(GP_IARCR); SCR_REG_A(GP_IARLCR); SCR_REG_A(GPI_BCR); SCR_REG_W(GPA_IARCR); SCR_REG_W(GPA_IARLCR); SCR_REG_W(CCR); SCR_REG_W(PLL2CR); SCR_REG_L(PLL1CR); SCR_REG_B(DIARCR); SCR_REG_B(DBOCR); SCR_REG_B(FER); SCR_REG_W(MCR); SCR_REG_B(CONFIG); SCR_REG_B(DEBUG); } fprintf(stderr, "tc6393xb_scr: unhandled write at %08x: %02x\n", (uint32_t) addr, value & 0xff); }
static uint32_t tc6393xb_scr_readb(TC6393xbState *s, hwaddr addr) { switch (addr) { case SCR_REVID: return 3; case SCR_REVID+1: return 0; SCR_REG_B(ISR); SCR_REG_B(IMR); SCR_REG_B(IRR); SCR_REG_W(GPER); SCR_REG_A(GPI_SR); SCR_REG_A(GPI_IMR); SCR_REG_A(GPI_EDER); SCR_REG_A(GPI_LIR); case SCR_GPO_DSR(0): case SCR_GPO_DSR(1): case SCR_GPO_DSR(2): return (s->gpio_level >> ((addr - SCR_GPO_DSR(0)) * 8)) & 0xff; case SCR_GPO_DOECR(0): case SCR_GPO_DOECR(1): case SCR_GPO_DOECR(2): return (s->gpio_dir >> ((addr - SCR_GPO_DOECR(0)) * 8)) & 0xff; SCR_REG_A(GP_IARCR); SCR_REG_A(GP_IARLCR); SCR_REG_A(GPI_BCR); SCR_REG_W(GPA_IARCR); SCR_REG_W(GPA_IARLCR); SCR_REG_W(CCR); SCR_REG_W(PLL2CR); SCR_REG_L(PLL1CR); SCR_REG_B(DIARCR); SCR_REG_B(DBOCR); SCR_REG_B(FER); SCR_REG_W(MCR); SCR_REG_B(CONFIG); SCR_REG_B(DEBUG); } fprintf(stderr, "tc6393xb_scr: unhandled read at %08x\n", (uint32_t) addr); return 0; }
static int tc6393xb_suspend(struct platform_device *dev, pm_message_t state) { struct tc6393xb_platform_data *tcpd = dev->dev.platform_data; struct tc6393xb *tc6393xb = platform_get_drvdata(dev); int i, ret; tc6393xb->suspend_state.ccr = ioread16(tc6393xb->scr + SCR_CCR); tc6393xb->suspend_state.fer = ioread8(tc6393xb->scr + SCR_FER); for (i = 0; i < 3; i++) { tc6393xb->suspend_state.gpo_dsr[i] = ioread8(tc6393xb->scr + SCR_GPO_DSR(i)); tc6393xb->suspend_state.gpo_doecr[i] = ioread8(tc6393xb->scr + SCR_GPO_DOECR(i)); tc6393xb->suspend_state.gpi_bcr[i] = ioread8(tc6393xb->scr + SCR_GPI_BCR(i)); } ret = tcpd->suspend(dev); clk_disable(tc6393xb->clk); return ret; }
static int tc6393xb_resume(struct platform_device *dev) { struct tc6393xb_platform_data *tcpd = dev->dev.platform_data; struct tc6393xb *tc6393xb = platform_get_drvdata(dev); int ret; int i; clk_enable(tc6393xb->clk); ret = tcpd->resume(dev); if (ret) return ret; if (!tcpd->resume_restore) return 0; iowrite8(tc6393xb->suspend_state.fer, tc6393xb->scr + SCR_FER); iowrite16(tcpd->scr_pll2cr, tc6393xb->scr + SCR_PLL2CR); iowrite16(tc6393xb->suspend_state.ccr, tc6393xb->scr + SCR_CCR); iowrite16(SCR_MCR_RDY_OPENDRAIN | SCR_MCR_RDY_UNK | SCR_MCR_RDY_EN | SCR_MCR_INT_OPENDRAIN | SCR_MCR_INT_UNK | SCR_MCR_INT_EN | BIT(15), tc6393xb->scr + SCR_MCR); iowrite16(tcpd->scr_gper, tc6393xb->scr + SCR_GPER); iowrite8(0, tc6393xb->scr + SCR_IRR); iowrite8(0xbf, tc6393xb->scr + SCR_IMR); for (i = 0; i < 3; i++) { iowrite8(tc6393xb->suspend_state.gpo_dsr[i], tc6393xb->scr + SCR_GPO_DSR(i)); iowrite8(tc6393xb->suspend_state.gpo_doecr[i], tc6393xb->scr + SCR_GPO_DOECR(i)); iowrite8(tc6393xb->suspend_state.gpi_bcr[i], tc6393xb->scr + SCR_GPI_BCR(i)); } return 0; }