From 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Tue, 22 Oct 2024 10:36:11 +0000 Subject: [PATCH] 修改4g拨号为QMI,需要在系统里后台执行quectel-CM --- kernel/drivers/tty/serial/cpm_uart/cpm_uart_core.c | 90 ++++++++++++++++++++------------------------- 1 files changed, 40 insertions(+), 50 deletions(-) diff --git a/kernel/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/kernel/drivers/tty/serial/cpm_uart/cpm_uart_core.c index ad40c75..f727222 100644 --- a/kernel/drivers/tty/serial/cpm_uart/cpm_uart_core.c +++ b/kernel/drivers/tty/serial/cpm_uart/cpm_uart_core.c @@ -24,14 +24,13 @@ #include <linux/console.h> #include <linux/sysrq.h> #include <linux/device.h> -#include <linux/bootmem.h> +#include <linux/memblock.h> #include <linux/dma-mapping.h> #include <linux/fs_uart_pd.h> #include <linux/of_address.h> #include <linux/of_irq.h> #include <linux/of_platform.h> -#include <linux/gpio.h> -#include <linux/of_gpio.h> +#include <linux/gpio/consumer.h> #include <linux/clk.h> #include <asm/io.h> @@ -39,10 +38,6 @@ #include <asm/delay.h> #include <asm/fs_pd.h> #include <asm/udbg.h> - -#if defined(CONFIG_SERIAL_CPM_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) -#define SUPPORT_SYSRQ -#endif #include <linux/serial_core.h> #include <linux/kernel.h> @@ -92,11 +87,11 @@ struct uart_cpm_port *pinfo = container_of(port, struct uart_cpm_port, port); - if (pinfo->gpios[GPIO_RTS] >= 0) - gpio_set_value(pinfo->gpios[GPIO_RTS], !(mctrl & TIOCM_RTS)); + if (pinfo->gpios[GPIO_RTS]) + gpiod_set_value(pinfo->gpios[GPIO_RTS], !(mctrl & TIOCM_RTS)); - if (pinfo->gpios[GPIO_DTR] >= 0) - gpio_set_value(pinfo->gpios[GPIO_DTR], !(mctrl & TIOCM_DTR)); + if (pinfo->gpios[GPIO_DTR]) + gpiod_set_value(pinfo->gpios[GPIO_DTR], !(mctrl & TIOCM_DTR)); } static unsigned int cpm_uart_get_mctrl(struct uart_port *port) @@ -105,23 +100,23 @@ container_of(port, struct uart_cpm_port, port); unsigned int mctrl = TIOCM_CTS | TIOCM_DSR | TIOCM_CAR; - if (pinfo->gpios[GPIO_CTS] >= 0) { - if (gpio_get_value(pinfo->gpios[GPIO_CTS])) + if (pinfo->gpios[GPIO_CTS]) { + if (gpiod_get_value(pinfo->gpios[GPIO_CTS])) mctrl &= ~TIOCM_CTS; } - if (pinfo->gpios[GPIO_DSR] >= 0) { - if (gpio_get_value(pinfo->gpios[GPIO_DSR])) + if (pinfo->gpios[GPIO_DSR]) { + if (gpiod_get_value(pinfo->gpios[GPIO_DSR])) mctrl &= ~TIOCM_DSR; } - if (pinfo->gpios[GPIO_DCD] >= 0) { - if (gpio_get_value(pinfo->gpios[GPIO_DCD])) + if (pinfo->gpios[GPIO_DCD]) { + if (gpiod_get_value(pinfo->gpios[GPIO_DCD])) mctrl &= ~TIOCM_CAR; } - if (pinfo->gpios[GPIO_RI] >= 0) { - if (!gpio_get_value(pinfo->gpios[GPIO_RI])) + if (pinfo->gpios[GPIO_RI]) { + if (!gpiod_get_value(pinfo->gpios[GPIO_RI])) mctrl |= TIOCM_RNG; } @@ -347,9 +342,7 @@ /* ASSUMPTION: it contains nothing valid */ i = 0; } -#ifdef SUPPORT_SYSRQ port->sysrq = 0; -#endif goto error_return; } @@ -576,8 +569,6 @@ /* * Set up parity check flag */ -#define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) - port->read_status_mask = (BD_SC_EMPTY | BD_SC_OV); if (termios->c_iflag & INPCK) port->read_status_mask |= BD_SC_FR | BD_SC_PR; @@ -1147,6 +1138,7 @@ { const u32 *data; void __iomem *mem, *pram; + struct device *dev = pinfo->port.dev; int len; int ret; int i; @@ -1160,8 +1152,8 @@ if (!pinfo->clk) { data = of_get_property(np, "fsl,cpm-brg", &len); if (!data || len != 4) { - printk(KERN_ERR "CPM UART %s has no/invalid " - "fsl,cpm-brg property.\n", np->name); + printk(KERN_ERR "CPM UART %pOFn has no/invalid " + "fsl,cpm-brg property.\n", np); return -EINVAL; } pinfo->brg = *data; @@ -1169,8 +1161,8 @@ data = of_get_property(np, "fsl,cpm-command", &len); if (!data || len != 4) { - printk(KERN_ERR "CPM UART %s has no/invalid " - "fsl,cpm-command property.\n", np->name); + printk(KERN_ERR "CPM UART %pOFn has no/invalid " + "fsl,cpm-command property.\n", np); return -EINVAL; } pinfo->command = *data; @@ -1206,7 +1198,8 @@ pinfo->port.uartclk = ppc_proc_freq; pinfo->port.mapbase = (unsigned long)mem; pinfo->port.type = PORT_CPM; - pinfo->port.ops = &cpm_uart_pops, + pinfo->port.ops = &cpm_uart_pops; + pinfo->port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_CPM_CONSOLE); pinfo->port.iotype = UPIO_MEM; pinfo->port.fifosize = pinfo->tx_nrfifos * pinfo->tx_fifosize; spin_lock_init(&pinfo->port.lock); @@ -1218,29 +1211,28 @@ } for (i = 0; i < NUM_GPIOS; i++) { - int gpio; + struct gpio_desc *gpiod; - pinfo->gpios[i] = -1; + pinfo->gpios[i] = NULL; - gpio = of_get_gpio(np, i); + gpiod = devm_gpiod_get_index_optional(dev, NULL, i, GPIOD_ASIS); - if (gpio_is_valid(gpio)) { - ret = gpio_request(gpio, "cpm_uart"); - if (ret) { - pr_err("can't request gpio #%d: %d\n", i, ret); - continue; - } + if (IS_ERR(gpiod)) { + ret = PTR_ERR(gpiod); + goto out_irq; + } + + if (gpiod) { if (i == GPIO_RTS || i == GPIO_DTR) - ret = gpio_direction_output(gpio, 0); + ret = gpiod_direction_output(gpiod, 0); else - ret = gpio_direction_input(gpio); + ret = gpiod_direction_input(gpiod); if (ret) { pr_err("can't set direction for gpio #%d: %d\n", i, ret); - gpio_free(gpio); continue; } - pinfo->gpios[i] = gpio; + pinfo->gpios[i] = gpiod; } } @@ -1250,6 +1242,8 @@ return cpm_uart_request_port(&pinfo->port); +out_irq: + irq_dispose_mapping(pinfo->port.irq); out_pram: cpm_uart_unmap_pram(pinfo, pram); out_mem: @@ -1269,19 +1263,14 @@ { struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; unsigned long flags; - int nolock = oops_in_progress; - if (unlikely(nolock)) { + if (unlikely(oops_in_progress)) { local_irq_save(flags); - } else { - spin_lock_irqsave(&pinfo->port.lock, flags); - } - - cpm_uart_early_write(pinfo, s, count, true); - - if (unlikely(nolock)) { + cpm_uart_early_write(pinfo, s, count, true); local_irq_restore(flags); } else { + spin_lock_irqsave(&pinfo->port.lock, flags); + cpm_uart_early_write(pinfo, s, count, true); spin_unlock_irqrestore(&pinfo->port.lock, flags); } } @@ -1380,6 +1369,7 @@ static int __init cpm_uart_console_init(void) { + cpm_muram_init(); register_console(&cpm_scc_uart_console); return 0; } -- Gitblit v1.6.2