static int s3c_serial_suspend(struct platform_device *dev, pm_message_t state) { struct uart_port *port = s3c_dev_to_port(&dev->dev); unsigned int gpadata = 0; unsigned int gpaconslp = 0; if(port->line == 0) { gpadata = __raw_readl(S3C64XX_GPADAT); gpadata |= (1<<3); __raw_writel(gpadata, S3C64XX_GPADAT); } else if(port->line == 1) { s3c_gpio_cfgpin(S3C64XX_GPA(7), S3C_GPIO_SFN(1)); gpaconslp = __raw_readl(S3C64XX_GPACONSLP); gpaconslp |= (1 << 14); gpaconslp &= ~(1 << 15); __raw_writel(gpaconslp, S3C64XX_GPACONSLP); gpadata = __raw_readl(S3C64XX_GPADAT); gpadata |= (1 << 7); __raw_writel(gpadata, S3C64XX_GPADAT); s3c_gpio_setpull(S3C64XX_GPA(7), S3C_GPIO_PULL_NONE); } s3c6410_pm_do_save(uart_save + port->line * SAVE_UART_PORT, SAVE_UART_PORT); if (port) uart_suspend_port(&s3c_uart_drv, port); return 0; }
static int s3c_serial_resume(struct platform_device *dev) { struct uart_port *port = s3c_dev_to_port(&dev->dev); struct s3c_uart_port *ourport = to_ourport(port); unsigned int gpadata = 0; if (port) { clk_enable(ourport->clk); s3c_serial_resetport(port, s3c_port_to_cfg(port)); clk_disable(ourport->clk); s3c6410_pm_do_restore(uart_save + port->line * SAVE_UART_PORT, SAVE_UART_PORT); uart_resume_port(&s3c_uart_drv, port); } if (port->line == 0) { gpadata = __raw_readl(S3C64XX_GPADAT); gpadata &= ~(1<<3); __raw_writel(gpadata, S3C64XX_GPADAT); } else if(port->line == 1) { s3c_gpio_cfgpin(S3C64XX_GPA(7), S3C_GPIO_SFN(1)); gpadata = __raw_readl(S3C64XX_GPADAT); gpadata &= ~(1<<7); __raw_writel(gpadata, S3C64XX_GPADAT); s3c_gpio_setpull(S3C64XX_GPA(7), S3C_GPIO_PULL_NONE); s3c_gpio_cfgpin(S3C64XX_GPA(7), S3C_GPIO_SFN(2)); } return 0; }
.set_config = s3c_gpio_setcfg_s3c64xx_4bit, .set_pull = s3c_gpio_setpull_updown, .get_pull = s3c_gpio_getpull_updown, }; int s3c64xx_gpio2int_gpm(struct gpio_chip *chip, unsigned pin) { return pin < 5 ? IRQ_EINT(23) + pin : -ENXIO; } static struct s3c_gpio_chip gpio_4bit[] = { { .base = S3C64XX_GPA_BASE, .config = &gpio_4bit_cfg_eint0111, .chip = { .base = S3C64XX_GPA(0), .ngpio = S3C64XX_GPIO_A_NR, .label = "GPA", }, }, { .base = S3C64XX_GPB_BASE, .config = &gpio_4bit_cfg_eint0111, .chip = { .base = S3C64XX_GPB(0), .ngpio = S3C64XX_GPIO_B_NR, .label = "GPB", }, }, { .base = S3C64XX_GPC_BASE, .config = &gpio_4bit_cfg_eint0111, .chip = {
void s3c_setup_uart_cfg_gpio(unsigned char hwport, struct uart_port* port) { switch (hwport) { case 0: s3c_gpio_cfgpin(S3C64XX_GPA(0),S3C64XX_GPA0_UART_RXD0); s3c_gpio_setpull(S3C64XX_GPA(0), S3C_GPIO_PULL_DOWN); s3c_gpio_cfgpin(S3C64XX_GPA(1),S3C64XX_GPA1_UART_TXD0); s3c_gpio_setpull(S3C64XX_GPA(1), S3C_GPIO_PULL_DOWN); s3c_gpio_cfgpin(S3C64XX_GPA(2),S3C_GPIO_INPUT); s3c_gpio_setpull(S3C64XX_GPA(2), S3C_GPIO_PULL_DOWN); s3c_gpio_cfgpin(S3C64XX_GPA(3),S3C_GPIO_OUTPUT); s3c_gpio_setpull(S3C64XX_GPA(3), S3C_GPIO_PULL_DOWN); wr_regb(port, S3C_UMSTAT, 0); break; case 1: s3c_gpio_cfgpin(S3C64XX_GPA(4),S3C64XX_GPA4_UART_RXD1); s3c_gpio_setpull(S3C64XX_GPA(4), S3C_GPIO_PULL_DOWN); s3c_gpio_cfgpin(S3C64XX_GPA(5),S3C64XX_GPA5_UART_TXD1); s3c_gpio_setpull(S3C64XX_GPA(5), S3C_GPIO_PULL_DOWN); //s3c_gpio_cfgpin(S3C64XX_GPA(6),S3C64XX_GPA6_UART_nCTS1); s3c_gpio_setpull(S3C64XX_GPA(6), S3C_GPIO_PULL_DOWN); //s3c_gpio_cfgpin(S3C64XX_GPA(7),S3C64XX_GPA7_UART_nRTS1); s3c_gpio_setpull(S3C64XX_GPA(7), S3C_GPIO_PULL_DOWN); wr_regb(port, S3C_UMSTAT, 0); break; case 2: s3c_gpio_cfgpin(S3C64XX_GPB(0),S3C64XX_GPB0_UART_RXD2); s3c_gpio_setpull(S3C64XX_GPB(0), S3C_GPIO_PULL_DOWN); s3c_gpio_cfgpin(S3C64XX_GPB(1),S3C64XX_GPB1_UART_TXD2); s3c_gpio_setpull(S3C64XX_GPB(1), S3C_GPIO_PULL_DOWN); break; case 3: printk("UART 3 is used as I2C bus in M8\n"); break; default: printk("Unknown UART port ID\n"); break; } }