Lines Matching refs:s
343 static void max310x_set_baud(struct max310x_port *s, int baud) in max310x_set_baud() argument
345 unsigned int mode = 0, div = s->uartclk / baud; in max310x_set_baud()
350 div = (s->uartclk * 2) / baud; in max310x_set_baud()
356 div = (s->uartclk * 4) / baud; in max310x_set_baud()
359 regmap_write(s->regmap, MAX310X_BRGDIVMSB_REG, in max310x_set_baud()
361 regmap_write(s->regmap, MAX310X_BRGDIVLSB_REG, (div / 16) & 0xff); in max310x_set_baud()
362 regmap_write(s->regmap, MAX310X_BRGCFG_REG, (div % 16) | mode); in max310x_set_baud()
365 static void max310x_wait_pll(struct max310x_port *s) in max310x_wait_pll() argument
370 if (!(s->pdata->driver_flags & MAX310X_EXT_CLK)) { in max310x_wait_pll()
374 regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &sts); in max310x_wait_pll()
394 static int max310x_set_ref_clk(struct max310x_port *s) in max310x_set_ref_clk() argument
398 unsigned long fdiv, fmul, bestfreq = s->pdata->frequency; in max310x_set_ref_clk()
401 max310x_update_best_err(s->pdata->frequency, &besterr); in max310x_set_ref_clk()
405 fdiv = DIV_ROUND_CLOSEST(s->pdata->frequency, div); in max310x_set_ref_clk()
438 if (s->pdata->driver_flags & MAX310X_EXT_CLK) in max310x_set_ref_clk()
446 regmap_write(s->regmap, MAX310X_PLLCFG_REG, pllcfg); in max310x_set_ref_clk()
450 regmap_write(s->regmap, MAX310X_CLKSRC_REG, clksrc); in max310x_set_ref_clk()
453 max310x_wait_pll(s); in max310x_set_ref_clk()
455 dev_dbg(s->port.dev, "Reference clock set to %lu Hz\n", bestfreq); in max310x_set_ref_clk()
460 static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen) in max310x_handle_rx() argument
465 dev_warn(s->port.dev, "Possible RX FIFO overrun %d\n", rxlen); in max310x_handle_rx()
470 dev_dbg(s->port.dev, "RX Len = %u\n", rxlen); in max310x_handle_rx()
473 regmap_read(s->regmap, MAX310X_RHR_REG, &ch); in max310x_handle_rx()
474 regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &sts); in max310x_handle_rx()
479 s->port.icount.rx++; in max310x_handle_rx()
484 s->port.icount.brk++; in max310x_handle_rx()
485 if (uart_handle_break(&s->port)) in max310x_handle_rx()
488 s->port.icount.parity++; in max310x_handle_rx()
490 s->port.icount.frame++; in max310x_handle_rx()
492 s->port.icount.overrun++; in max310x_handle_rx()
494 sts &= s->port.read_status_mask; in max310x_handle_rx()
505 if (uart_handle_sysrq_char(s->port, ch)) in max310x_handle_rx()
508 if (sts & s->port.ignore_status_mask) in max310x_handle_rx()
511 uart_insert_char(&s->port, sts, MAX310X_LSR_RXOVR_BIT, in max310x_handle_rx()
515 tty_flip_buffer_push(&s->port.state->port); in max310x_handle_rx()
518 static void max310x_handle_tx(struct max310x_port *s) in max310x_handle_tx() argument
520 struct circ_buf *xmit = &s->port.state->xmit; in max310x_handle_tx()
523 if (unlikely(s->port.x_char)) { in max310x_handle_tx()
524 regmap_write(s->regmap, MAX310X_THR_REG, s->port.x_char); in max310x_handle_tx()
525 s->port.icount.tx++; in max310x_handle_tx()
526 s->port.x_char = 0; in max310x_handle_tx()
530 if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port)) in max310x_handle_tx()
537 regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &txlen); in max310x_handle_tx()
541 dev_dbg(s->port.dev, "TX Len = %u\n", to_send); in max310x_handle_tx()
544 s->port.icount.tx += to_send; in max310x_handle_tx()
546 regmap_write(s->regmap, MAX310X_THR_REG, in max310x_handle_tx()
553 uart_write_wakeup(&s->port); in max310x_handle_tx()
558 struct max310x_port *s = (struct max310x_port *)dev_id; in max310x_ist() local
561 mutex_lock(&s->max310x_mutex); in max310x_ist()
565 regmap_read(s->regmap, MAX310X_IRQSTS_REG, &ists); in max310x_ist()
566 regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &lsr); in max310x_ist()
567 regmap_read(s->regmap, MAX310X_RXFIFOLVL_REG, &rxlen); in max310x_ist()
571 dev_dbg(s->port.dev, "IRQ status: 0x%02x\n", ists); in max310x_ist()
574 max310x_handle_rx(s, rxlen); in max310x_ist()
576 max310x_handle_tx(s); in max310x_ist()
578 uart_handle_cts_change(&s->port, in max310x_ist()
582 mutex_unlock(&s->max310x_mutex); in max310x_ist()
589 struct max310x_port *s = container_of(ws, struct max310x_port, tx_work); in max310x_wq_proc() local
591 mutex_lock(&s->max310x_mutex); in max310x_wq_proc()
592 max310x_handle_tx(s); in max310x_wq_proc()
593 mutex_unlock(&s->max310x_mutex); in max310x_wq_proc()
598 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_start_tx() local
600 queue_work(s->wq, &s->tx_work); in max310x_start_tx()
616 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_tx_empty() local
618 mutex_lock(&s->max310x_mutex); in max310x_tx_empty()
619 regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &val); in max310x_tx_empty()
620 mutex_unlock(&s->max310x_mutex); in max310x_tx_empty()
647 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_break_ctl() local
649 mutex_lock(&s->max310x_mutex); in max310x_break_ctl()
650 regmap_update_bits(s->regmap, MAX310X_LCR_REG, in max310x_break_ctl()
653 mutex_unlock(&s->max310x_mutex); in max310x_break_ctl()
660 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_set_termios() local
664 mutex_lock(&s->max310x_mutex); in max310x_set_termios()
699 regmap_write(s->regmap, MAX310X_LCR_REG, lcr); in max310x_set_termios()
720 regmap_write(s->regmap, MAX310X_XON1_REG, termios->c_cc[VSTART]); in max310x_set_termios()
721 regmap_write(s->regmap, MAX310X_XOFF1_REG, termios->c_cc[VSTOP]); in max310x_set_termios()
731 regmap_write(s->regmap, MAX310X_FLOWCTRL_REG, flow); in max310x_set_termios()
739 max310x_set_baud(s, baud); in max310x_set_termios()
744 mutex_unlock(&s->max310x_mutex); in max310x_set_termios()
750 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_startup() local
752 if (s->pdata->suspend) in max310x_startup()
753 s->pdata->suspend(0); in max310x_startup()
755 mutex_lock(&s->max310x_mutex); in max310x_startup()
758 max310x_set_baud(s, 9600); in max310x_startup()
762 regmap_write(s->regmap, MAX310X_LCR_REG, val); in max310x_startup()
765 regmap_update_bits(s->regmap, MAX310X_MODE1_REG, in max310x_startup()
767 (s->pdata->uart_flags[line] & MAX310X_AUTO_DIR_CTRL) in max310x_startup()
772 if (s->pdata->uart_flags[line] & MAX310X_LOOPBACK) in max310x_startup()
774 if (s->pdata->uart_flags[line] & MAX310X_ECHO_SUPRESS) in max310x_startup()
779 regmap_write(s->regmap, MAX310X_MODE2_REG, val); in max310x_startup()
784 regmap_write(s->regmap, MAX310X_FIFOTRIGLVL_REG, val); in max310x_startup()
789 regmap_write(s->regmap, MAX310X_FLOWLVL_REG, val); in max310x_startup()
792 regmap_write(s->regmap, MAX310X_RXTO_REG, 0); in max310x_startup()
797 regmap_write(s->regmap, MAX310X_LSR_IRQEN_REG, val); in max310x_startup()
800 regmap_update_bits(s->regmap, MAX310X_MODE2_REG, in max310x_startup()
804 regmap_read(s->regmap, MAX310X_IRQSTS_REG, &val); in max310x_startup()
811 regmap_write(s->regmap, MAX310X_IRQEN_REG, val); in max310x_startup()
813 mutex_unlock(&s->max310x_mutex); in max310x_startup()
820 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_shutdown() local
823 mutex_lock(&s->max310x_mutex); in max310x_shutdown()
824 regmap_write(s->regmap, MAX310X_IRQEN_REG, 0); in max310x_shutdown()
825 mutex_unlock(&s->max310x_mutex); in max310x_shutdown()
827 if (s->pdata->suspend) in max310x_shutdown()
828 s->pdata->suspend(1); in max310x_shutdown()
833 struct max310x_port *s = container_of(port, struct max310x_port, port); in max310x_type() local
835 return (port->type == PORT_MAX310X) ? s->name : NULL; in max310x_type()
889 struct max310x_port *s = dev_get_drvdata(dev); in max310x_suspend() local
893 ret = uart_suspend_port(&s->uart, &s->port); in max310x_suspend()
895 mutex_lock(&s->max310x_mutex); in max310x_suspend()
898 regmap_update_bits(s->regmap, MAX310X_MODE1_REG, in max310x_suspend()
902 mutex_unlock(&s->max310x_mutex); in max310x_suspend()
904 if (s->pdata->suspend) in max310x_suspend()
905 s->pdata->suspend(1); in max310x_suspend()
912 struct max310x_port *s = dev_get_drvdata(dev); in max310x_resume() local
916 if (s->pdata->suspend) in max310x_resume()
917 s->pdata->suspend(0); in max310x_resume()
919 mutex_lock(&s->max310x_mutex); in max310x_resume()
922 regmap_update_bits(s->regmap, MAX310X_MODE1_REG, in max310x_resume()
926 max310x_wait_pll(s); in max310x_resume()
928 mutex_unlock(&s->max310x_mutex); in max310x_resume()
930 return uart_resume_port(&s->uart, &s->port); in max310x_resume()
944 struct max310x_port *s = container_of(chip, struct max310x_port, gpio); in max310x_gpio_get() local
946 mutex_lock(&s->max310x_mutex); in max310x_gpio_get()
947 regmap_read(s->regmap, MAX310X_GPIODATA_REG, &val); in max310x_gpio_get()
948 mutex_unlock(&s->max310x_mutex); in max310x_gpio_get()
955 struct max310x_port *s = container_of(chip, struct max310x_port, gpio); in max310x_gpio_set() local
957 mutex_lock(&s->max310x_mutex); in max310x_gpio_set()
958 regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ? in max310x_gpio_set()
960 mutex_unlock(&s->max310x_mutex); in max310x_gpio_set()
965 struct max310x_port *s = container_of(chip, struct max310x_port, gpio); in max310x_gpio_direction_input() local
967 mutex_lock(&s->max310x_mutex); in max310x_gpio_direction_input()
969 regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset, 0); in max310x_gpio_direction_input()
971 mutex_unlock(&s->max310x_mutex); in max310x_gpio_direction_input()
979 struct max310x_port *s = container_of(chip, struct max310x_port, gpio); in max310x_gpio_direction_output() local
981 mutex_lock(&s->max310x_mutex); in max310x_gpio_direction_output()
983 regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset, in max310x_gpio_direction_output()
985 regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ? in max310x_gpio_direction_output()
988 mutex_unlock(&s->max310x_mutex); in max310x_gpio_direction_output()
1003 struct max310x_port *s; in max310x_probe() local
1017 s = devm_kzalloc(dev, sizeof(struct max310x_port), GFP_KERNEL); in max310x_probe()
1018 if (!s) { in max310x_probe()
1022 dev_set_drvdata(dev, s); in max310x_probe()
1028 s->pdata = pdata; in max310x_probe()
1033 s->name = "MAX3107"; in max310x_probe()
1034 s->nr_gpio = 4; in max310x_probe()
1035 s->uart.nr = 1; in max310x_probe()
1036 s->regcfg.max_register = 0x1f; in max310x_probe()
1039 s->name = "MAX3108"; in max310x_probe()
1040 s->nr_gpio = 4; in max310x_probe()
1041 s->uart.nr = 1; in max310x_probe()
1042 s->regcfg.max_register = 0x1e; in max310x_probe()
1058 mutex_init(&s->max310x_mutex); in max310x_probe()
1067 s->regcfg.reg_bits = 8; in max310x_probe()
1068 s->regcfg.val_bits = 8; in max310x_probe()
1069 s->regcfg.read_flag_mask = 0x00; in max310x_probe()
1070 s->regcfg.write_flag_mask = 0x80; in max310x_probe()
1071 s->regcfg.cache_type = REGCACHE_RBTREE; in max310x_probe()
1072 s->regcfg.writeable_reg = max3107_8_reg_writeable; in max310x_probe()
1073 s->regcfg.volatile_reg = max310x_reg_volatile; in max310x_probe()
1074 s->regcfg.precious_reg = max310x_reg_precious; in max310x_probe()
1075 s->regmap = devm_regmap_init_spi(spi, &s->regcfg); in max310x_probe()
1076 if (IS_ERR(s->regmap)) { in max310x_probe()
1077 ret = PTR_ERR(s->regmap); in max310x_probe()
1083 ret = regmap_write(s->regmap, MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT); in max310x_probe()
1089 regmap_write(s->regmap, MAX310X_MODE2_REG, 0); in max310x_probe()
1094 regmap_read(s->regmap, MAX3107_REVID_REG, &val); in max310x_probe()
1097 s->name, val); in max310x_probe()
1106 regmap_read(s->regmap, MAX310X_CLKSRC_REG, &val); in max310x_probe()
1109 dev_err(dev, "%s not present\n", s->name); in max310x_probe()
1123 s->uartclk = max310x_set_ref_clk(s); in max310x_probe()
1126 regmap_write(s->regmap, MAX310X_IRQEN_REG, 0); in max310x_probe()
1132 regmap_write(s->regmap, MAX310X_MODE1_REG, val); in max310x_probe()
1137 dev_name(dev), s); in max310x_probe()
1144 s->uart.owner = THIS_MODULE; in max310x_probe()
1145 s->uart.driver_name = dev_name(dev); in max310x_probe()
1146 s->uart.dev_name = "ttyMAX"; in max310x_probe()
1147 s->uart.major = MAX310X_MAJOR; in max310x_probe()
1148 s->uart.minor = MAX310X_MINOR; in max310x_probe()
1149 ret = uart_register_driver(&s->uart); in max310x_probe()
1156 s->wq = create_freezable_workqueue(dev_name(dev)); in max310x_probe()
1157 INIT_WORK(&s->tx_work, max310x_wq_proc); in max310x_probe()
1160 s->port.line = 0; in max310x_probe()
1161 s->port.dev = dev; in max310x_probe()
1162 s->port.irq = spi->irq; in max310x_probe()
1163 s->port.type = PORT_MAX310X; in max310x_probe()
1164 s->port.fifosize = MAX310X_FIFO_SIZE; in max310x_probe()
1165 s->port.flags = UPF_SKIP_TEST | UPF_FIXED_TYPE; in max310x_probe()
1166 s->port.iotype = UPIO_PORT; in max310x_probe()
1167 s->port.membase = (void __iomem *)0xffffffff; /* Bogus value */ in max310x_probe()
1168 s->port.uartclk = s->uartclk; in max310x_probe()
1169 s->port.ops = &max310x_ops; in max310x_probe()
1170 uart_add_one_port(&s->uart, &s->port); in max310x_probe()
1175 s->gpio.owner = THIS_MODULE; in max310x_probe()
1176 s->gpio.dev = dev; in max310x_probe()
1177 s->gpio.label = dev_name(dev); in max310x_probe()
1178 s->gpio.direction_input = max310x_gpio_direction_input; in max310x_probe()
1179 s->gpio.get = max310x_gpio_get; in max310x_probe()
1180 s->gpio.direction_output= max310x_gpio_direction_output; in max310x_probe()
1181 s->gpio.set = max310x_gpio_set; in max310x_probe()
1182 s->gpio.base = pdata->gpio_base; in max310x_probe()
1183 s->gpio.ngpio = s->nr_gpio; in max310x_probe()
1184 s->gpio.can_sleep = 1; in max310x_probe()
1185 if (gpiochip_add(&s->gpio)) { in max310x_probe()
1187 s->gpio.base = 0; in max310x_probe()
1212 struct max310x_port *s = dev_get_drvdata(dev); in max310x_remove() local
1217 devm_free_irq(dev, s->port.irq, s); in max310x_remove()
1219 destroy_workqueue(s->wq); in max310x_remove()
1221 uart_remove_one_port(&s->uart, &s->port); in max310x_remove()
1223 uart_unregister_driver(&s->uart); in max310x_remove()
1226 if (s->pdata->gpio_base) { in max310x_remove()
1227 ret = gpiochip_remove(&s->gpio); in max310x_remove()
1235 if (s->pdata->suspend) in max310x_remove()
1236 s->pdata->suspend(1); in max310x_remove()
1237 if (s->pdata->exit) in max310x_remove()
1238 s->pdata->exit(); in max310x_remove()