Lines Matching +full:lpc +full:- +full:interrupts
1 // SPDX-License-Identifier: GPL-2.0+
62 * to the host on the Host <-> BMC LPC bus. It could be different on a
68 return readb(vuart->port->port.membase + reg); in aspeed_vuart_readb()
73 writeb(val, vuart->port->port.membase + reg); in aspeed_vuart_writeb()
85 return snprintf(buf, PAGE_SIZE - 1, "0x%x\n", addr); in lpc_address_show()
91 return -EINVAL; in aspeed_vuart_set_lpc_address()
127 return snprintf(buf, PAGE_SIZE - 1, "%u\n", reg); in sirq_show()
135 return -EINVAL; in aspeed_vuart_set_sirq()
174 return snprintf(buf, PAGE_SIZE - 1, "%u\n", reg ? 1 : 0); in sirq_polarity_show()
251 struct aspeed_vuart *vuart = uart_8250_port->port.private_data; in aspeed_vuart_startup()
266 struct aspeed_vuart *vuart = uart_8250_port->port.private_data; in aspeed_vuart_shutdown()
278 up->ier &= ~irqs; in __aspeed_vuart_set_throttle()
280 up->ier |= irqs; in __aspeed_vuart_set_throttle()
281 serial_out(up, UART_IER, up->ier); in __aspeed_vuart_set_throttle()
288 spin_lock_irqsave(&port->lock, flags); in aspeed_vuart_set_throttle()
290 spin_unlock_irqrestore(&port->lock, flags); in aspeed_vuart_set_throttle()
306 struct uart_8250_port *up = vuart->port; in aspeed_vuart_unthrottle_exp()
308 if (!tty_buffer_space_avail(&up->port.state->port)) { in aspeed_vuart_unthrottle_exp()
309 mod_timer(&vuart->unthrottle_timer, in aspeed_vuart_unthrottle_exp()
314 aspeed_vuart_unthrottle(&up->port); in aspeed_vuart_unthrottle_exp()
318 * Custom interrupt handler to manage finer-grained flow control. Although we
340 spin_lock_irqsave(&port->lock, flags); in aspeed_vuart_handle_irq()
345 space = tty_buffer_space_avail(&port->state->port); in aspeed_vuart_handle_irq()
349 struct aspeed_vuart *vuart = port->private_data; in aspeed_vuart_handle_irq()
352 if (!timer_pending(&vuart->unthrottle_timer)) in aspeed_vuart_handle_irq()
353 mod_timer(&vuart->unthrottle_timer, in aspeed_vuart_handle_irq()
362 if (--count == 0) in aspeed_vuart_handle_irq()
366 tty_flip_buffer_push(&port->state->port); in aspeed_vuart_handle_irq()
388 dev_warn(vuart->dev, in aspeed_vuart_auto_configure_sirq_polarity()
389 "could not get regmap for aspeed,sirq-polarity-sense\n"); in aspeed_vuart_auto_configure_sirq_polarity()
393 dev_warn(vuart->dev, "could not read hw strap table\n"); in aspeed_vuart_auto_configure_sirq_polarity()
408 return -EINVAL; in aspeed_vuart_map_irq_polarity()
422 np = pdev->dev.of_node; in aspeed_vuart_probe()
424 vuart = devm_kzalloc(&pdev->dev, sizeof(*vuart), GFP_KERNEL); in aspeed_vuart_probe()
426 return -ENOMEM; in aspeed_vuart_probe()
428 vuart->dev = &pdev->dev; in aspeed_vuart_probe()
429 timer_setup(&vuart->unthrottle_timer, aspeed_vuart_unthrottle_exp, 0); in aspeed_vuart_probe()
435 port.port.mapbase = res->start; in aspeed_vuart_probe()
442 port.port.dev = &pdev->dev; in aspeed_vuart_probe()
446 rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group); in aspeed_vuart_probe()
450 if (of_property_read_u32(np, "clock-frequency", &clk)) { in aspeed_vuart_probe()
451 vuart->clk = devm_clk_get(&pdev->dev, NULL); in aspeed_vuart_probe()
452 if (IS_ERR(vuart->clk)) { in aspeed_vuart_probe()
453 dev_warn(&pdev->dev, in aspeed_vuart_probe()
454 "clk or clock-frequency not defined\n"); in aspeed_vuart_probe()
455 rc = PTR_ERR(vuart->clk); in aspeed_vuart_probe()
459 rc = clk_prepare_enable(vuart->clk); in aspeed_vuart_probe()
463 clk = clk_get_rate(vuart->clk); in aspeed_vuart_probe()
466 /* If current-speed was set, then try not to change it. */ in aspeed_vuart_probe()
467 if (of_property_read_u32(np, "current-speed", &prop) == 0) in aspeed_vuart_probe()
471 if (of_property_read_u32(np, "reg-offset", &prop) == 0) in aspeed_vuart_probe()
475 if (of_property_read_u32(np, "reg-shift", &prop) == 0) in aspeed_vuart_probe()
479 if (of_property_read_u32(np, "fifo-size", &prop) == 0) in aspeed_vuart_probe()
495 if (of_property_read_bool(np, "no-loopback-test")) in aspeed_vuart_probe()
501 if (of_property_read_bool(np, "auto-flow-control")) in aspeed_vuart_probe()
508 vuart->line = rc; in aspeed_vuart_probe()
509 vuart->port = serial8250_get_port(vuart->line); in aspeed_vuart_probe()
512 np, "aspeed,sirq-polarity-sense", 2, 0, in aspeed_vuart_probe()
515 dev_dbg(&pdev->dev, in aspeed_vuart_probe()
516 "aspeed,sirq-polarity-sense property not found\n"); in aspeed_vuart_probe()
525 rc = of_property_read_u32(np, "aspeed,lpc-io-reg", &prop); in aspeed_vuart_probe()
531 dev_err(&pdev->dev, "invalid value in aspeed,lpc-io-reg property\n"); in aspeed_vuart_probe()
535 rc = of_property_read_u32_array(np, "aspeed,lpc-interrupts", sirq, 2); in aspeed_vuart_probe()
543 dev_err(&pdev->dev, "invalid sirq number in aspeed,lpc-interrupts property\n"); in aspeed_vuart_probe()
549 dev_err(&pdev->dev, "invalid sirq polarity in aspeed,lpc-interrupts property\n"); in aspeed_vuart_probe()
563 clk_disable_unprepare(vuart->clk); in aspeed_vuart_probe()
566 sysfs_remove_group(&vuart->dev->kobj, &aspeed_vuart_attr_group); in aspeed_vuart_probe()
574 del_timer_sync(&vuart->unthrottle_timer); in aspeed_vuart_remove()
576 serial8250_unregister_port(vuart->line); in aspeed_vuart_remove()
577 sysfs_remove_group(&vuart->dev->kobj, &aspeed_vuart_attr_group); in aspeed_vuart_remove()
578 clk_disable_unprepare(vuart->clk); in aspeed_vuart_remove()
584 { .compatible = "aspeed,ast2400-vuart" },
585 { .compatible = "aspeed,ast2500-vuart" },
591 .name = "aspeed-vuart",