From: Greg Kroah-Hartman Date: Thu, 12 Dec 2024 13:45:43 +0000 (+0100) Subject: drop broken serial patches X-Git-Tag: v5.4.287~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d3aeef5a960fa4e022d9655ded134e0fbd1c746f;p=thirdparty%2Fkernel%2Fstable-queue.git drop broken serial patches --- diff --git a/queue-5.15/serial-sc16is7xx-change-efr-lock-to-operate-on-each-channels.patch b/queue-5.15/serial-sc16is7xx-change-efr-lock-to-operate-on-each-channels.patch deleted file mode 100644 index 0f4b7b19796..00000000000 --- a/queue-5.15/serial-sc16is7xx-change-efr-lock-to-operate-on-each-channels.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 4409df5866b7ff7686ba27e449ca97a92ee063c9 Mon Sep 17 00:00:00 2001 -From: Hugo Villeneuve -Date: Mon, 11 Dec 2023 12:13:51 -0500 -Subject: serial: sc16is7xx: change EFR lock to operate on each channels - -From: Hugo Villeneuve - -commit 4409df5866b7ff7686ba27e449ca97a92ee063c9 upstream. - -Now that the driver has been converted to use one regmap per port, change -efr locking to operate on a channel basis instead of on the whole IC. - -Fixes: 3837a0379533 ("serial: sc16is7xx: improve regmap debugfs by using one regmap per port") -Cc: # 6.1.x: 3837a03 serial: sc16is7xx: improve regmap debugfs by using one regmap per port -Signed-off-by: Hugo Villeneuve -Link: https://lore.kernel.org/r/20231211171353.2901416-5-hugo@hugovil.com -[Hui: fixed some conflict when backporting to 5.15.y] -Signed-off-by: Hui Wang -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/serial/sc16is7xx.c | 41 +++++++++++++++++++++++------------------ - 1 file changed, 23 insertions(+), 18 deletions(-) - ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -314,6 +314,7 @@ struct sc16is7xx_one_config { - struct sc16is7xx_one { - struct uart_port port; - struct regmap *regmap; -+ struct mutex efr_lock; /* EFR registers access */ - struct kthread_work tx_work; - struct kthread_work reg_work; - struct sc16is7xx_one_config config; -@@ -329,7 +330,6 @@ struct sc16is7xx_port { - unsigned char buf[SC16IS7XX_FIFO_SIZE]; - struct kthread_worker kworker; - struct task_struct *kworker_task; -- struct mutex efr_lock; - struct sc16is7xx_one p[]; - }; - -@@ -491,7 +491,6 @@ static bool sc16is7xx_regmap_noinc(struc - */ - static int sc16is7xx_set_baud(struct uart_port *port, int baud) - { -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); - struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - u8 lcr; - unsigned int prescaler = 1; -@@ -515,7 +514,7 @@ static int sc16is7xx_set_baud(struct uar - * because the bulk of the interrupt processing is run as a workqueue - * job in thread context. - */ -- mutex_lock(&s->efr_lock); -+ mutex_lock(&one->efr_lock); - - lcr = sc16is7xx_port_read(port, SC16IS7XX_LCR_REG); - -@@ -532,7 +531,7 @@ static int sc16is7xx_set_baud(struct uar - /* Put LCR back to the normal mode */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); - -- mutex_unlock(&s->efr_lock); -+ mutex_unlock(&one->efr_lock); - - /* If bit MCR_CLKSEL is set, the divide by 4 prescaler is activated. */ - sc16is7xx_port_update(port, SC16IS7XX_MCR_REG, -@@ -680,14 +679,20 @@ static void sc16is7xx_handle_tx(struct u - - static bool sc16is7xx_port_irq(struct sc16is7xx_port *s, int portno) - { -+ bool rc = true; - struct uart_port *port = &s->p[portno].port; -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); -+ -+ mutex_lock(&one->efr_lock); - - do { - unsigned int iir, rxlen; - - iir = sc16is7xx_port_read(port, SC16IS7XX_IIR_REG); -- if (iir & SC16IS7XX_IIR_NO_INT_BIT) -- return false; -+ if (iir & SC16IS7XX_IIR_NO_INT_BIT) { -+ rc = false; -+ goto out_port_irq; -+ } - - iir &= SC16IS7XX_IIR_ID_MASK; - -@@ -722,15 +727,17 @@ static bool sc16is7xx_port_irq(struct sc - break; - } - } while (0); -- return true; -+ -+out_port_irq: -+ mutex_unlock(&one->efr_lock); -+ -+ return rc; - } - - static irqreturn_t sc16is7xx_irq(int irq, void *dev_id) - { - struct sc16is7xx_port *s = (struct sc16is7xx_port *)dev_id; - -- mutex_lock(&s->efr_lock); -- - while (1) { - bool keep_polling = false; - int i; -@@ -741,23 +748,21 @@ static irqreturn_t sc16is7xx_irq(int irq - break; - } - -- mutex_unlock(&s->efr_lock); -- - return IRQ_HANDLED; - } - - static void sc16is7xx_tx_proc(struct kthread_work *ws) - { - struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port); -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - - if ((port->rs485.flags & SER_RS485_ENABLED) && - (port->rs485.delay_rts_before_send > 0)) - msleep(port->rs485.delay_rts_before_send); - -- mutex_lock(&s->efr_lock); -+ mutex_lock(&one->efr_lock); - sc16is7xx_handle_tx(port); -- mutex_unlock(&s->efr_lock); -+ mutex_unlock(&one->efr_lock); - } - - static void sc16is7xx_reconf_rs485(struct uart_port *port) -@@ -878,7 +883,6 @@ static void sc16is7xx_set_termios(struct - struct ktermios *termios, - struct ktermios *old) - { -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); - struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - unsigned int lcr, flow = 0; - int baud; -@@ -934,7 +938,7 @@ static void sc16is7xx_set_termios(struct - port->ignore_status_mask |= SC16IS7XX_LSR_BRK_ERROR_MASK; - - /* As above, claim the mutex while accessing the EFR. */ -- mutex_lock(&s->efr_lock); -+ mutex_lock(&one->efr_lock); - - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, - SC16IS7XX_LCR_CONF_MODE_B); -@@ -957,7 +961,7 @@ static void sc16is7xx_set_termios(struct - /* Update LCR register */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); - -- mutex_unlock(&s->efr_lock); -+ mutex_unlock(&one->efr_lock); - - /* Get baud rate generator configuration */ - baud = uart_get_baud_rate(port, termios, old, -@@ -1261,7 +1265,6 @@ static int sc16is7xx_probe(struct device - - s->devtype = devtype; - dev_set_drvdata(dev, s); -- mutex_init(&s->efr_lock); - - kthread_init_worker(&s->kworker); - s->kworker_task = kthread_run(kthread_worker_fn, &s->kworker, -@@ -1302,6 +1305,8 @@ static int sc16is7xx_probe(struct device - goto out_ports; - } - -+ mutex_init(&s->p[i].efr_lock); -+ - /* Disable all interrupts */ - sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_IER_REG, 0); - /* Disable TX/RX */ diff --git a/queue-5.15/serial-sc16is7xx-improve-regmap-debugfs-by-using-one-regmap-per-port.patch b/queue-5.15/serial-sc16is7xx-improve-regmap-debugfs-by-using-one-regmap-per-port.patch deleted file mode 100644 index f49b3009f46..00000000000 --- a/queue-5.15/serial-sc16is7xx-improve-regmap-debugfs-by-using-one-regmap-per-port.patch +++ /dev/null @@ -1,432 +0,0 @@ -From 3837a0379533aabb9e4483677077479f7c6aa910 Mon Sep 17 00:00:00 2001 -From: Hugo Villeneuve -Date: Mon, 30 Oct 2023 17:14:47 -0400 -Subject: serial: sc16is7xx: improve regmap debugfs by using one regmap per port - -From: Hugo Villeneuve - -commit 3837a0379533aabb9e4483677077479f7c6aa910 upstream. - -With this current driver regmap implementation, it is hard to make sense -of the register addresses displayed using the regmap debugfs interface, -because they do not correspond to the actual register addresses documented -in the datasheet. For example, register 1 is displayed as registers 04 thru -07: - -$ cat /sys/kernel/debug/regmap/spi0.0/registers - 04: 10 -> Port 0, register offset 1 - 05: 10 -> Port 1, register offset 1 - 06: 00 -> Port 2, register offset 1 -> invalid - 07: 00 -> port 3, register offset 1 -> invalid - ... - -The reason is that bits 0 and 1 of the register address correspond to the -channel (port) bits, so the register address itself starts at bit 2, and we -must 'mentally' shift each register address by 2 bits to get its real -address/offset. - -Also, only channels 0 and 1 are supported by the chip, so channel mask -combinations of 10b and 11b are invalid, and the display of these -registers is useless. - -This patch adds a separate regmap configuration for each port, similar to -what is done in the max310x driver, so that register addresses displayed -match the register addresses in the chip datasheet. Also, each port now has -its own debugfs entry. - -Example with new regmap implementation: - -$ cat /sys/kernel/debug/regmap/spi0.0-port0/registers -1: 10 -2: 01 -3: 00 -... - -$ cat /sys/kernel/debug/regmap/spi0.0-port1/registers -1: 10 -2: 01 -3: 00 - -As an added bonus, this also simplifies some operations (read/write/modify) -because it is no longer necessary to manually shift register addresses. - -Signed-off-by: Hugo Villeneuve -Link: https://lore.kernel.org/r/20231030211447.974779-1-hugo@hugovil.com -[Hui: Fixed some conflict when backporting to 5.15.y] -Signed-off-by: Hui Wang -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/serial/sc16is7xx.c | 136 +++++++++++++++++++++++------------------ - 1 file changed, 79 insertions(+), 57 deletions(-) - ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -292,8 +292,9 @@ - */ - - /* Misc definitions */ -+#define SC16IS7XX_SPI_READ_BIT BIT(7) - #define SC16IS7XX_FIFO_SIZE (64) --#define SC16IS7XX_REG_SHIFT 2 -+#define SC16IS7XX_GPIOS_PER_BANK 4 - - struct sc16is7xx_devtype { - char name[10]; -@@ -313,6 +314,7 @@ struct sc16is7xx_one_config { - struct sc16is7xx_one { - struct uart_port port; - u8 line; -+ struct regmap *regmap; - struct kthread_work tx_work; - struct kthread_work reg_work; - struct sc16is7xx_one_config config; -@@ -344,46 +346,35 @@ static struct uart_driver sc16is7xx_uart - #define to_sc16is7xx_port(p,e) ((container_of((p), struct sc16is7xx_port, e))) - #define to_sc16is7xx_one(p,e) ((container_of((p), struct sc16is7xx_one, e))) - --static int sc16is7xx_line(struct uart_port *port) --{ -- struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); -- -- return one->line; --} -- - static u8 sc16is7xx_port_read(struct uart_port *port, u8 reg) - { -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - unsigned int val = 0; -- const u8 line = sc16is7xx_line(port); - -- regmap_read(s->regmap, (reg << SC16IS7XX_REG_SHIFT) | line, &val); -+ regmap_read(one->regmap, reg, &val); - - return val; - } - - static void sc16is7xx_port_write(struct uart_port *port, u8 reg, u8 val) - { -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -- const u8 line = sc16is7xx_line(port); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - -- regmap_write(s->regmap, (reg << SC16IS7XX_REG_SHIFT) | line, val); -+ regmap_write(one->regmap, reg, val); - } - - static void sc16is7xx_fifo_read(struct uart_port *port, unsigned int rxlen) - { - struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -- const u8 line = sc16is7xx_line(port); -- u8 addr = (SC16IS7XX_RHR_REG << SC16IS7XX_REG_SHIFT) | line; -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - -- regmap_noinc_read(s->regmap, addr, s->buf, rxlen); -+ regmap_noinc_read(one->regmap, SC16IS7XX_RHR_REG, s->buf, rxlen); - } - - static void sc16is7xx_fifo_write(struct uart_port *port, u8 to_send) - { - struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -- const u8 line = sc16is7xx_line(port); -- u8 addr = (SC16IS7XX_THR_REG << SC16IS7XX_REG_SHIFT) | line; -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - - /* - * Don't send zero-length data, at least on SPI it confuses the chip -@@ -392,17 +383,15 @@ static void sc16is7xx_fifo_write(struct - if (unlikely(!to_send)) - return; - -- regmap_noinc_write(s->regmap, addr, s->buf, to_send); -+ regmap_noinc_write(one->regmap, SC16IS7XX_THR_REG, s->buf, to_send); - } - - static void sc16is7xx_port_update(struct uart_port *port, u8 reg, - u8 mask, u8 val) - { -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -- const u8 line = sc16is7xx_line(port); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - -- regmap_update_bits(s->regmap, (reg << SC16IS7XX_REG_SHIFT) | line, -- mask, val); -+ regmap_update_bits(one->regmap, reg, mask, val); - } - - static int sc16is7xx_alloc_line(void) -@@ -457,7 +446,7 @@ static const struct sc16is7xx_devtype sc - - static bool sc16is7xx_regmap_volatile(struct device *dev, unsigned int reg) - { -- switch (reg >> SC16IS7XX_REG_SHIFT) { -+ switch (reg) { - case SC16IS7XX_RHR_REG: - case SC16IS7XX_IIR_REG: - case SC16IS7XX_LSR_REG: -@@ -475,7 +464,7 @@ static bool sc16is7xx_regmap_volatile(st - - static bool sc16is7xx_regmap_precious(struct device *dev, unsigned int reg) - { -- switch (reg >> SC16IS7XX_REG_SHIFT) { -+ switch (reg) { - case SC16IS7XX_RHR_REG: - return true; - default: -@@ -505,6 +494,7 @@ static bool sc16is7xx_regmap_noinc(struc - static int sc16is7xx_set_baud(struct uart_port *port, int baud) - { - struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - u8 lcr; - unsigned int prescaler = 1; - unsigned long clk = port->uartclk, div = clk / 16 / baud; -@@ -536,10 +526,10 @@ static int sc16is7xx_set_baud(struct uar - SC16IS7XX_LCR_CONF_MODE_B); - - /* Enable enhanced features */ -- regcache_cache_bypass(s->regmap, true); -+ regcache_cache_bypass(one->regmap, true); - sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, - SC16IS7XX_EFR_ENABLE_BIT); -- regcache_cache_bypass(s->regmap, false); -+ regcache_cache_bypass(one->regmap, false); - - /* Put LCR back to the normal mode */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); -@@ -556,10 +546,10 @@ static int sc16is7xx_set_baud(struct uar - SC16IS7XX_LCR_CONF_MODE_A); - - /* Write the new divisor */ -- regcache_cache_bypass(s->regmap, true); -+ regcache_cache_bypass(one->regmap, true); - sc16is7xx_port_write(port, SC16IS7XX_DLH_REG, div / 256); - sc16is7xx_port_write(port, SC16IS7XX_DLL_REG, div % 256); -- regcache_cache_bypass(s->regmap, false); -+ regcache_cache_bypass(one->regmap, false); - - /* Put LCR back to the normal mode */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); -@@ -891,6 +881,7 @@ static void sc16is7xx_set_termios(struct - struct ktermios *old) - { - struct sc16is7xx_port *s = dev_get_drvdata(port->dev); -+ struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); - unsigned int lcr, flow = 0; - int baud; - -@@ -951,7 +942,7 @@ static void sc16is7xx_set_termios(struct - SC16IS7XX_LCR_CONF_MODE_B); - - /* Configure flow control */ -- regcache_cache_bypass(s->regmap, true); -+ regcache_cache_bypass(one->regmap, true); - sc16is7xx_port_write(port, SC16IS7XX_XON1_REG, termios->c_cc[VSTART]); - sc16is7xx_port_write(port, SC16IS7XX_XOFF1_REG, termios->c_cc[VSTOP]); - if (termios->c_cflag & CRTSCTS) -@@ -963,7 +954,7 @@ static void sc16is7xx_set_termios(struct - flow |= SC16IS7XX_EFR_SWFLOW1_BIT; - - sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, flow); -- regcache_cache_bypass(s->regmap, false); -+ regcache_cache_bypass(one->regmap, false); - - /* Update LCR register */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, lcr); -@@ -1018,7 +1009,6 @@ static int sc16is7xx_config_rs485(struct - static int sc16is7xx_startup(struct uart_port *port) - { - struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); -- struct sc16is7xx_port *s = dev_get_drvdata(port->dev); - unsigned int val; - - sc16is7xx_power(port, 1); -@@ -1034,7 +1024,7 @@ static int sc16is7xx_startup(struct uart - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, - SC16IS7XX_LCR_CONF_MODE_B); - -- regcache_cache_bypass(s->regmap, true); -+ regcache_cache_bypass(one->regmap, true); - - /* Enable write access to enhanced features and internal clock div */ - sc16is7xx_port_write(port, SC16IS7XX_EFR_REG, -@@ -1051,7 +1041,7 @@ static int sc16is7xx_startup(struct uart - SC16IS7XX_TCR_RX_RESUME(24) | - SC16IS7XX_TCR_RX_HALT(48)); - -- regcache_cache_bypass(s->regmap, false); -+ regcache_cache_bypass(one->regmap, false); - - /* Now, initialize the UART */ - sc16is7xx_port_write(port, SC16IS7XX_LCR_REG, SC16IS7XX_LCR_WORD_LEN_8); -@@ -1216,7 +1206,7 @@ static int sc16is7xx_gpio_direction_outp - - static int sc16is7xx_probe(struct device *dev, - const struct sc16is7xx_devtype *devtype, -- struct regmap *regmap, int irq) -+ struct regmap *regmaps[], int irq) - { - unsigned long freq = 0, *pfreq = dev_get_platdata(dev); - unsigned int val; -@@ -1224,16 +1214,16 @@ static int sc16is7xx_probe(struct device - int i, ret; - struct sc16is7xx_port *s; - -- if (IS_ERR(regmap)) -- return PTR_ERR(regmap); -+ for (i = 0; i < devtype->nr_uart; i++) -+ if (IS_ERR(regmaps[i])) -+ return PTR_ERR(regmaps[i]); - - /* - * This device does not have an identification register that would - * tell us if we are really connected to the correct device. - * The best we can do is to check if communication is at all possible. - */ -- ret = regmap_read(regmap, -- SC16IS7XX_LSR_REG << SC16IS7XX_REG_SHIFT, &val); -+ ret = regmap_read(regmaps[0], SC16IS7XX_LSR_REG, &val); - if (ret < 0) - return -EPROBE_DEFER; - -@@ -1267,7 +1257,7 @@ static int sc16is7xx_probe(struct device - return -EINVAL; - } - -- s->regmap = regmap; -+ s->regmap = regmaps[0]; - s->devtype = devtype; - dev_set_drvdata(dev, s); - mutex_init(&s->efr_lock); -@@ -1282,8 +1272,8 @@ static int sc16is7xx_probe(struct device - sched_set_fifo(s->kworker_task); - - /* reset device, purging any pending irq / data */ -- regmap_write(s->regmap, SC16IS7XX_IOCONTROL_REG << SC16IS7XX_REG_SHIFT, -- SC16IS7XX_IOCONTROL_SRESET_BIT); -+ regmap_write(s->regmap, SC16IS7XX_IOCONTROL_REG, -+ SC16IS7XX_IOCONTROL_SRESET_BIT); - - for (i = 0; i < devtype->nr_uart; ++i) { - s->p[i].line = i; -@@ -1305,6 +1295,8 @@ static int sc16is7xx_probe(struct device - s->p[i].port.rs485_config = sc16is7xx_config_rs485; - s->p[i].port.ops = &sc16is7xx_ops; - s->p[i].port.line = sc16is7xx_alloc_line(); -+ s->p[i].regmap = regmaps[i]; -+ - if (s->p[i].port.line >= SC16IS7XX_MAX_DEVS) { - ret = -ENOMEM; - goto out_ports; -@@ -1326,13 +1318,13 @@ static int sc16is7xx_probe(struct device - sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_LCR_REG, - SC16IS7XX_LCR_CONF_MODE_B); - -- regcache_cache_bypass(s->regmap, true); -+ regcache_cache_bypass(regmaps[i], true); - - /* Enable write access to enhanced features */ - sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_EFR_REG, - SC16IS7XX_EFR_ENABLE_BIT); - -- regcache_cache_bypass(s->regmap, false); -+ regcache_cache_bypass(regmaps[i], false); - - /* Restore access to general registers */ - sc16is7xx_port_write(&s->p[i].port, SC16IS7XX_LCR_REG, 0x00); -@@ -1447,21 +1439,38 @@ static const struct of_device_id __maybe - MODULE_DEVICE_TABLE(of, sc16is7xx_dt_ids); - - static struct regmap_config regcfg = { -- .reg_bits = 7, -- .pad_bits = 1, -+ .reg_bits = 5, -+ .pad_bits = 3, - .val_bits = 8, - .cache_type = REGCACHE_RBTREE, - .volatile_reg = sc16is7xx_regmap_volatile, - .precious_reg = sc16is7xx_regmap_precious, - .writeable_noinc_reg = sc16is7xx_regmap_noinc, - .readable_noinc_reg = sc16is7xx_regmap_noinc, -+ .max_register = SC16IS7XX_EFCR_REG, - }; - -+static const char *sc16is7xx_regmap_name(unsigned int port_id) -+{ -+ static char buf[6]; -+ -+ snprintf(buf, sizeof(buf), "port%d", port_id); -+ -+ return buf; -+} -+ -+static unsigned int sc16is7xx_regmap_port_mask(unsigned int port_id) -+{ -+ /* CH1,CH0 are at bits 2:1. */ -+ return port_id << 1; -+} -+ - #ifdef CONFIG_SERIAL_SC16IS7XX_SPI - static int sc16is7xx_spi_probe(struct spi_device *spi) - { - const struct sc16is7xx_devtype *devtype; -- struct regmap *regmap; -+ struct regmap *regmaps[2]; -+ unsigned int i; - int ret; - - /* Setup SPI bus */ -@@ -1486,11 +1495,20 @@ static int sc16is7xx_spi_probe(struct sp - devtype = (struct sc16is7xx_devtype *)id_entry->driver_data; - } - -- regcfg.max_register = (0xf << SC16IS7XX_REG_SHIFT) | -- (devtype->nr_uart - 1); -- regmap = devm_regmap_init_spi(spi, ®cfg); -+ for (i = 0; i < devtype->nr_uart; i++) { -+ regcfg.name = sc16is7xx_regmap_name(i); -+ /* -+ * If read_flag_mask is 0, the regmap code sets it to a default -+ * of 0x80. Since we specify our own mask, we must add the READ -+ * bit ourselves: -+ */ -+ regcfg.read_flag_mask = sc16is7xx_regmap_port_mask(i) | -+ SC16IS7XX_SPI_READ_BIT; -+ regcfg.write_flag_mask = sc16is7xx_regmap_port_mask(i); -+ regmaps[i] = devm_regmap_init_spi(spi, ®cfg); -+ } - -- return sc16is7xx_probe(&spi->dev, devtype, regmap, spi->irq); -+ return sc16is7xx_probe(&spi->dev, devtype, regmaps, spi->irq); - } - - static int sc16is7xx_spi_remove(struct spi_device *spi) -@@ -1529,7 +1547,8 @@ static int sc16is7xx_i2c_probe(struct i2 - const struct i2c_device_id *id) - { - const struct sc16is7xx_devtype *devtype; -- struct regmap *regmap; -+ struct regmap *regmaps[2]; -+ unsigned int i; - - if (i2c->dev.of_node) { - devtype = device_get_match_data(&i2c->dev); -@@ -1539,11 +1558,14 @@ static int sc16is7xx_i2c_probe(struct i2 - devtype = (struct sc16is7xx_devtype *)id->driver_data; - } - -- regcfg.max_register = (0xf << SC16IS7XX_REG_SHIFT) | -- (devtype->nr_uart - 1); -- regmap = devm_regmap_init_i2c(i2c, ®cfg); -+ for (i = 0; i < devtype->nr_uart; i++) { -+ regcfg.name = sc16is7xx_regmap_name(i); -+ regcfg.read_flag_mask = sc16is7xx_regmap_port_mask(i); -+ regcfg.write_flag_mask = sc16is7xx_regmap_port_mask(i); -+ regmaps[i] = devm_regmap_init_i2c(i2c, ®cfg); -+ } - -- return sc16is7xx_probe(&i2c->dev, devtype, regmap, i2c->irq); -+ return sc16is7xx_probe(&i2c->dev, devtype, regmaps, i2c->irq); - } - - static int sc16is7xx_i2c_remove(struct i2c_client *client) diff --git a/queue-5.15/serial-sc16is7xx-remove-global-regmap-from-struct-sc16is7xx_port.patch b/queue-5.15/serial-sc16is7xx-remove-global-regmap-from-struct-sc16is7xx_port.patch deleted file mode 100644 index 303936622f6..00000000000 --- a/queue-5.15/serial-sc16is7xx-remove-global-regmap-from-struct-sc16is7xx_port.patch +++ /dev/null @@ -1,64 +0,0 @@ -From f6959c5217bd799bcb770b95d3c09b3244e175c6 Mon Sep 17 00:00:00 2001 -From: Hugo Villeneuve -Date: Mon, 11 Dec 2023 12:13:49 -0500 -Subject: serial: sc16is7xx: remove global regmap from struct sc16is7xx_port - -From: Hugo Villeneuve - -commit f6959c5217bd799bcb770b95d3c09b3244e175c6 upstream. - -Remove global struct regmap so that it is more obvious that this -regmap is to be used only in the probe function. - -Also add a comment to that effect in probe function. - -Fixes: 3837a0379533 ("serial: sc16is7xx: improve regmap debugfs by using one regmap per port") -Cc: -Suggested-by: Andy Shevchenko -Signed-off-by: Hugo Villeneuve -Link: https://lore.kernel.org/r/20231211171353.2901416-3-hugo@hugovil.com -[Hui: fixed some conflict when backporting to 5.15.y] -Signed-off-by: Hui Wang -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/serial/sc16is7xx.c | 8 +++++--- - 1 file changed, 5 insertions(+), 3 deletions(-) - ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -323,7 +323,6 @@ struct sc16is7xx_one { - - struct sc16is7xx_port { - const struct sc16is7xx_devtype *devtype; -- struct regmap *regmap; - struct clk *clk; - #ifdef CONFIG_GPIOLIB - struct gpio_chip gpio; -@@ -1222,6 +1221,10 @@ static int sc16is7xx_probe(struct device - * This device does not have an identification register that would - * tell us if we are really connected to the correct device. - * The best we can do is to check if communication is at all possible. -+ * -+ * Note: regmap[0] is used in the probe function to access registers -+ * common to all channels/ports, as it is guaranteed to be present on -+ * all variants. - */ - ret = regmap_read(regmaps[0], SC16IS7XX_LSR_REG, &val); - if (ret < 0) -@@ -1257,7 +1260,6 @@ static int sc16is7xx_probe(struct device - return -EINVAL; - } - -- s->regmap = regmaps[0]; - s->devtype = devtype; - dev_set_drvdata(dev, s); - mutex_init(&s->efr_lock); -@@ -1272,7 +1274,7 @@ static int sc16is7xx_probe(struct device - sched_set_fifo(s->kworker_task); - - /* reset device, purging any pending irq / data */ -- regmap_write(s->regmap, SC16IS7XX_IOCONTROL_REG, -+ regmap_write(regmaps[0], SC16IS7XX_IOCONTROL_REG, - SC16IS7XX_IOCONTROL_SRESET_BIT); - - for (i = 0; i < devtype->nr_uart; ++i) { diff --git a/queue-5.15/serial-sc16is7xx-remove-unused-line-structure-member.patch b/queue-5.15/serial-sc16is7xx-remove-unused-line-structure-member.patch deleted file mode 100644 index 68dba99b5b5..00000000000 --- a/queue-5.15/serial-sc16is7xx-remove-unused-line-structure-member.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 41a308cbedb2a68a6831f0f2e992e296c4b8aff0 Mon Sep 17 00:00:00 2001 -From: Hugo Villeneuve -Date: Mon, 11 Dec 2023 12:13:50 -0500 -Subject: serial: sc16is7xx: remove unused line structure member - -From: Hugo Villeneuve - -commit 41a308cbedb2a68a6831f0f2e992e296c4b8aff0 upstream. - -Now that the driver has been converted to use one regmap per port, the line -structure member is no longer used, so remove it. - -Fixes: 3837a0379533 ("serial: sc16is7xx: improve regmap debugfs by using one regmap per port") -Cc: -Signed-off-by: Hugo Villeneuve -Link: https://lore.kernel.org/r/20231211171353.2901416-4-hugo@hugovil.com -Signed-off-by: Hui Wang -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/serial/sc16is7xx.c | 2 -- - 1 file changed, 2 deletions(-) - ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -313,7 +313,6 @@ struct sc16is7xx_one_config { - - struct sc16is7xx_one { - struct uart_port port; -- u8 line; - struct regmap *regmap; - struct kthread_work tx_work; - struct kthread_work reg_work; -@@ -1278,7 +1277,6 @@ static int sc16is7xx_probe(struct device - SC16IS7XX_IOCONTROL_SRESET_BIT); - - for (i = 0; i < devtype->nr_uart; ++i) { -- s->p[i].line = i; - /* Initialize port data */ - s->p[i].port.dev = dev; - s->p[i].port.irq = irq; diff --git a/queue-5.15/serial-sc16is7xx-remove-wasteful-static-buffer-in-sc16is7xx_regmap_name.patch b/queue-5.15/serial-sc16is7xx-remove-wasteful-static-buffer-in-sc16is7xx_regmap_name.patch deleted file mode 100644 index 2cf804dd19e..00000000000 --- a/queue-5.15/serial-sc16is7xx-remove-wasteful-static-buffer-in-sc16is7xx_regmap_name.patch +++ /dev/null @@ -1,54 +0,0 @@ -From 6bcab3c8acc88e265c570dea969fd04f137c8a4c Mon Sep 17 00:00:00 2001 -From: Hugo Villeneuve -Date: Mon, 11 Dec 2023 12:13:48 -0500 -Subject: serial: sc16is7xx: remove wasteful static buffer in sc16is7xx_regmap_name() - -From: Hugo Villeneuve - -commit 6bcab3c8acc88e265c570dea969fd04f137c8a4c upstream. - -Using a static buffer inside sc16is7xx_regmap_name() was a convenient and -simple way to set the regmap name without having to allocate and free a -buffer each time it is called. The drawback is that the static buffer -wastes memory for nothing once regmap is fully initialized. - -Remove static buffer and use constant strings instead. - -This also avoids a truncation warning when using "%d" or "%u" in snprintf -which was flagged by kernel test robot. - -Fixes: 3837a0379533 ("serial: sc16is7xx: improve regmap debugfs by using one regmap per port") -Cc: # 6.1.x: 3837a03 serial: sc16is7xx: improve regmap debugfs by using one regmap per port -Suggested-by: Andy Shevchenko -Signed-off-by: Hugo Villeneuve -Link: https://lore.kernel.org/r/20231211171353.2901416-2-hugo@hugovil.com -Signed-off-by: Hui Wang -Signed-off-by: Greg Kroah-Hartman ---- - drivers/tty/serial/sc16is7xx.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -1450,13 +1450,15 @@ static struct regmap_config regcfg = { - .max_register = SC16IS7XX_EFCR_REG, - }; - --static const char *sc16is7xx_regmap_name(unsigned int port_id) -+static const char *sc16is7xx_regmap_name(u8 port_id) - { -- static char buf[6]; -- -- snprintf(buf, sizeof(buf), "port%d", port_id); -- -- return buf; -+ switch (port_id) { -+ case 0: return "port0"; -+ case 1: return "port1"; -+ default: -+ WARN_ON(true); -+ return NULL; -+ } - } - - static unsigned int sc16is7xx_regmap_port_mask(unsigned int port_id) diff --git a/queue-5.15/series b/queue-5.15/series index c88188f6bdc..290ef1e5218 100644 --- a/queue-5.15/series +++ b/queue-5.15/series @@ -553,11 +553,6 @@ ima-fix-use-after-free-on-a-dentry-s-dname.name.patch fou-remove-warn-in-gue_gro_receive-on-unsupported-protocol.patch revert-drm-amdgpu-add-missing-size-check-in-amdgpu_debugfs_gprwave_read.patch scsi-core-fix-scsi_mode_select-buffer-length-handling.patch -serial-sc16is7xx-improve-regmap-debugfs-by-using-one-regmap-per-port.patch -serial-sc16is7xx-remove-wasteful-static-buffer-in-sc16is7xx_regmap_name.patch -serial-sc16is7xx-remove-global-regmap-from-struct-sc16is7xx_port.patch -serial-sc16is7xx-remove-unused-line-structure-member.patch -serial-sc16is7xx-change-efr-lock-to-operate-on-each-channels.patch gve-fixes-for-napi_poll-when-budget-is-0.patch arm64-sve-discard-stale-cpu-state-when-handling-sve-traps.patch arm64-smccc-remove-broken-support-for-smcccv1.3-sve-discard-hint.patch