kernel: bump 5.15 to 5.15.139
Changelog: https://cdn.kernel.org/pub/linux/kernel/v5.x/ChangeLog-5.15.139 Removed upstreamed: backport-5.15/830-v6.6-2-leds-turris-omnia-Drop-unnecessary-mutex-locking.patch[1] backport-5.15/830-v6.7-1-leds-turris-omnia-Do-not-use-SMBUS-calls.patch[2] x86/patches-5.15/120-hwrng-geode-fix-accessing-registers.patch[3] All other patches automatically rebased. 1. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.139&id=aec3706971b332af8321b2beccba981b8061489a 2. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.139&id=893eedf596dd81c7a7f0cd80b345956ae000eab9 3. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.139&id=a5c83c8043d70b9a28d1bd78a2dbbab340f43889 Build system: x86_64 Build-tested: ramips/tplink_archer-a6-v3 Run-tested: ramips/tplink_archer-a6-v3 Signed-off-by: John Audia <therealgraysky@proton.me>
This commit is contained in:
parent
2b75f108fb
commit
df167450a5
@ -1,2 +1,2 @@
|
|||||||
LINUX_VERSION-5.15 = .138
|
LINUX_VERSION-5.15 = .139
|
||||||
LINUX_KERNEL_HASH-5.15.138 = af84e54164e1c01f59764ba528448ed36b377d22aafbd81b4b0cf47792ef4aaa
|
LINUX_KERNEL_HASH-5.15.139 = 9c68c10dfe18e59b892e940436dea6a18d167160d55e62563cf7282244d8044e
|
||||||
|
@ -414,7 +414,7 @@ Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
|||||||
/* forking complete and child started to run, tell ptracer */
|
/* forking complete and child started to run, tell ptracer */
|
||||||
--- a/kernel/sched/core.c
|
--- a/kernel/sched/core.c
|
||||||
+++ b/kernel/sched/core.c
|
+++ b/kernel/sched/core.c
|
||||||
@@ -5010,6 +5010,7 @@ context_switch(struct rq *rq, struct tas
|
@@ -5014,6 +5014,7 @@ context_switch(struct rq *rq, struct tas
|
||||||
* finish_task_switch()'s mmdrop().
|
* finish_task_switch()'s mmdrop().
|
||||||
*/
|
*/
|
||||||
switch_mm_irqs_off(prev->active_mm, next->mm, next);
|
switch_mm_irqs_off(prev->active_mm, next->mm, next);
|
||||||
|
@ -37,7 +37,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
|
map->format.val_bytes = DIV_ROUND_UP(config->val_bits, 8);
|
||||||
map->format.buf_size = DIV_ROUND_UP(config->reg_bits +
|
map->format.buf_size = DIV_ROUND_UP(config->reg_bits +
|
||||||
config->val_bits + config->pad_bits, 8);
|
config->val_bits + config->pad_bits, 8);
|
||||||
@@ -1735,6 +1736,7 @@ static int _regmap_raw_write_impl(struct
|
@@ -1737,6 +1738,7 @@ static int _regmap_raw_write_impl(struct
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
map->format.format_reg(map->work_buf, reg, map->reg_shift);
|
map->format.format_reg(map->work_buf, reg, map->reg_shift);
|
||||||
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
|
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
|
||||||
map->write_flag_mask);
|
map->write_flag_mask);
|
||||||
@@ -1905,6 +1907,7 @@ static int _regmap_bus_formatted_write(v
|
@@ -1907,6 +1909,7 @@ static int _regmap_bus_formatted_write(v
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
map->format.format_write(map, reg, val);
|
map->format.format_write(map, reg, val);
|
||||||
|
|
||||||
trace_regmap_hw_write_start(map, reg, 1);
|
trace_regmap_hw_write_start(map, reg, 1);
|
||||||
@@ -2346,6 +2349,7 @@ static int _regmap_raw_multi_reg_write(s
|
@@ -2348,6 +2351,7 @@ static int _regmap_raw_multi_reg_write(s
|
||||||
unsigned int reg = regs[i].reg;
|
unsigned int reg = regs[i].reg;
|
||||||
unsigned int val = regs[i].def;
|
unsigned int val = regs[i].def;
|
||||||
trace_regmap_hw_write_start(map, reg, 1);
|
trace_regmap_hw_write_start(map, reg, 1);
|
||||||
@ -61,7 +61,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
map->format.format_reg(u8, reg, map->reg_shift);
|
map->format.format_reg(u8, reg, map->reg_shift);
|
||||||
u8 += reg_bytes + pad_bytes;
|
u8 += reg_bytes + pad_bytes;
|
||||||
map->format.format_val(u8, val, 0);
|
map->format.format_val(u8, val, 0);
|
||||||
@@ -2673,6 +2677,7 @@ static int _regmap_raw_read(struct regma
|
@@ -2675,6 +2679,7 @@ static int _regmap_raw_read(struct regma
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
|
map->format.reg_bytes = DIV_ROUND_UP(config->reg_bits, 8);
|
||||||
map->format.pad_bytes = config->pad_bits / 8;
|
map->format.pad_bytes = config->pad_bits / 8;
|
||||||
map->format.reg_downshift = config->reg_downshift;
|
map->format.reg_downshift = config->reg_downshift;
|
||||||
@@ -1736,6 +1738,7 @@ static int _regmap_raw_write_impl(struct
|
@@ -1738,6 +1740,7 @@ static int _regmap_raw_write_impl(struct
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
reg >>= map->format.reg_downshift;
|
reg >>= map->format.reg_downshift;
|
||||||
map->format.format_reg(map->work_buf, reg, map->reg_shift);
|
map->format.format_reg(map->work_buf, reg, map->reg_shift);
|
||||||
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
|
regmap_set_work_buf_flag_mask(map, map->format.reg_bytes,
|
||||||
@@ -1907,6 +1910,7 @@ static int _regmap_bus_formatted_write(v
|
@@ -1909,6 +1912,7 @@ static int _regmap_bus_formatted_write(v
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
reg >>= map->format.reg_downshift;
|
reg >>= map->format.reg_downshift;
|
||||||
map->format.format_write(map, reg, val);
|
map->format.format_write(map, reg, val);
|
||||||
|
|
||||||
@@ -2349,6 +2353,7 @@ static int _regmap_raw_multi_reg_write(s
|
@@ -2351,6 +2355,7 @@ static int _regmap_raw_multi_reg_write(s
|
||||||
unsigned int reg = regs[i].reg;
|
unsigned int reg = regs[i].reg;
|
||||||
unsigned int val = regs[i].def;
|
unsigned int val = regs[i].def;
|
||||||
trace_regmap_hw_write_start(map, reg, 1);
|
trace_regmap_hw_write_start(map, reg, 1);
|
||||||
@ -66,7 +66,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
reg >>= map->format.reg_downshift;
|
reg >>= map->format.reg_downshift;
|
||||||
map->format.format_reg(u8, reg, map->reg_shift);
|
map->format.format_reg(u8, reg, map->reg_shift);
|
||||||
u8 += reg_bytes + pad_bytes;
|
u8 += reg_bytes + pad_bytes;
|
||||||
@@ -2677,6 +2682,7 @@ static int _regmap_raw_read(struct regma
|
@@ -2679,6 +2684,7 @@ static int _regmap_raw_read(struct regma
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
|
|
||||||
--- a/drivers/base/regmap/regmap.c
|
--- a/drivers/base/regmap/regmap.c
|
||||||
+++ b/drivers/base/regmap/regmap.c
|
+++ b/drivers/base/regmap/regmap.c
|
||||||
@@ -1929,6 +1929,8 @@ static int _regmap_bus_reg_write(void *c
|
@@ -1931,6 +1931,8 @@ static int _regmap_bus_reg_write(void *c
|
||||||
{
|
{
|
||||||
struct regmap *map = context;
|
struct regmap *map = context;
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
return map->bus->reg_write(map->bus_context, reg, val);
|
return map->bus->reg_write(map->bus_context, reg, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2703,6 +2705,8 @@ static int _regmap_bus_reg_read(void *co
|
@@ -2705,6 +2707,8 @@ static int _regmap_bus_reg_read(void *co
|
||||||
{
|
{
|
||||||
struct regmap *map = context;
|
struct regmap *map = context;
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ Signed-off-by: Mark Brown <broonie@kernel.org>
|
|||||||
return map->bus->reg_read(map->bus_context, reg, val);
|
return map->bus->reg_read(map->bus_context, reg, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3078,6 +3082,8 @@ static int _regmap_update_bits(struct re
|
@@ -3080,6 +3084,8 @@ static int _regmap_update_bits(struct re
|
||||||
*change = false;
|
*change = false;
|
||||||
|
|
||||||
if (regmap_volatile(map, reg) && map->reg_update_bits) {
|
if (regmap_volatile(map, reg) && map->reg_update_bits) {
|
||||||
|
@ -25,7 +25,7 @@ Signed-off-by: Pavel Machek <pavel@ucw.cz>
|
|||||||
|
|
||||||
--- a/drivers/leds/leds-turris-omnia.c
|
--- a/drivers/leds/leds-turris-omnia.c
|
||||||
+++ b/drivers/leds/leds-turris-omnia.c
|
+++ b/drivers/leds/leds-turris-omnia.c
|
||||||
@@ -239,9 +239,6 @@ static int omnia_leds_probe(struct i2c_c
|
@@ -260,9 +260,6 @@ static int omnia_leds_probe(struct i2c_c
|
||||||
led += ret;
|
led += ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ Signed-off-by: Pavel Machek <pavel@ucw.cz>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,6 +280,7 @@ static struct i2c_driver omnia_leds_driv
|
@@ -304,6 +301,7 @@ static struct i2c_driver omnia_leds_driv
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "leds-turris-omnia",
|
.name = "leds-turris-omnia",
|
||||||
.of_match_table = of_omnia_leds_match,
|
.of_match_table = of_omnia_leds_match,
|
||||||
|
@ -20,7 +20,7 @@ Signed-off-by: Lee Jones <lee@kernel.org>
|
|||||||
|
|
||||||
--- a/drivers/leds/leds-turris-omnia.c
|
--- a/drivers/leds/leds-turris-omnia.c
|
||||||
+++ b/drivers/leds/leds-turris-omnia.c
|
+++ b/drivers/leds/leds-turris-omnia.c
|
||||||
@@ -166,7 +166,7 @@ static ssize_t brightness_show(struct de
|
@@ -194,7 +194,7 @@ static ssize_t brightness_show(struct de
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -1,66 +0,0 @@
|
|||||||
From 760b6b7925bf09491aafa4727eef74fc6bf738b0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Marek Behún <kabel@kernel.org>
|
|
||||||
Date: Wed, 2 Aug 2023 18:07:43 +0200
|
|
||||||
Subject: leds: turris-omnia: Drop unnecessary mutex locking
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Do not lock driver mutex in the global LED panel brightness sysfs
|
|
||||||
accessors brightness_show() and brightness_store().
|
|
||||||
|
|
||||||
The mutex locking is unnecessary here. The I2C transfers are guarded by
|
|
||||||
I2C core locking mechanism, and the LED commands itself do not interfere
|
|
||||||
with other commands.
|
|
||||||
|
|
||||||
Fixes: 089381b27abe ("leds: initial support for Turris Omnia LEDs")
|
|
||||||
Signed-off-by: Marek Behún <kabel@kernel.org>
|
|
||||||
Reviewed-by: Lee Jones <lee@kernel.org>
|
|
||||||
Link: https://lore.kernel.org/r/20230802160748.11208-2-kabel@kernel.org
|
|
||||||
Signed-off-by: Lee Jones <lee@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/leds/leds-turris-omnia.c | 11 +----------
|
|
||||||
1 file changed, 1 insertion(+), 10 deletions(-)
|
|
||||||
|
|
||||||
(limited to 'drivers/leds/leds-turris-omnia.c')
|
|
||||||
|
|
||||||
--- a/drivers/leds/leds-turris-omnia.c
|
|
||||||
+++ b/drivers/leds/leds-turris-omnia.c
|
|
||||||
@@ -156,12 +156,9 @@ static ssize_t brightness_show(struct de
|
|
||||||
char *buf)
|
|
||||||
{
|
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
|
||||||
- struct omnia_leds *leds = i2c_get_clientdata(client);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
- mutex_lock(&leds->lock);
|
|
||||||
ret = i2c_smbus_read_byte_data(client, CMD_LED_GET_BRIGHTNESS);
|
|
||||||
- mutex_unlock(&leds->lock);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
@@ -173,7 +170,6 @@ static ssize_t brightness_store(struct d
|
|
||||||
const char *buf, size_t count)
|
|
||||||
{
|
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
|
||||||
- struct omnia_leds *leds = i2c_get_clientdata(client);
|
|
||||||
unsigned long brightness;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
@@ -183,15 +179,10 @@ static ssize_t brightness_store(struct d
|
|
||||||
if (brightness > 100)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
- mutex_lock(&leds->lock);
|
|
||||||
ret = i2c_smbus_write_byte_data(client, CMD_LED_SET_BRIGHTNESS,
|
|
||||||
(u8)brightness);
|
|
||||||
- mutex_unlock(&leds->lock);
|
|
||||||
|
|
||||||
- if (ret < 0)
|
|
||||||
- return ret;
|
|
||||||
-
|
|
||||||
- return count;
|
|
||||||
+ return ret < 0 ? ret : count;
|
|
||||||
}
|
|
||||||
static DEVICE_ATTR_RW(brightness);
|
|
||||||
|
|
@ -1,145 +0,0 @@
|
|||||||
From 28350bc0ac77e17365ba87d3edb2db0a79c98fdd Mon Sep 17 00:00:00 2001
|
|
||||||
From: Marek Behún <kabel@kernel.org>
|
|
||||||
Date: Mon, 18 Sep 2023 18:11:01 +0200
|
|
||||||
Subject: leds: turris-omnia: Do not use SMBUS calls
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
The leds-turris-omnia driver uses three function for I2C access:
|
|
||||||
- i2c_smbus_write_byte_data() and i2c_smbus_read_byte_data(), which
|
|
||||||
cause an emulated SMBUS transfer,
|
|
||||||
- i2c_master_send(), which causes an ordinary I2C transfer.
|
|
||||||
|
|
||||||
The Turris Omnia MCU LED controller is not semantically SMBUS, it
|
|
||||||
operates as a simple I2C bus. It does not implement any of the SMBUS
|
|
||||||
specific features, like PEC, or procedure calls, or anything. Moreover
|
|
||||||
the I2C controller driver also does not implement SMBUS, and so the
|
|
||||||
emulated SMBUS procedure from drivers/i2c/i2c-core-smbus.c is used for
|
|
||||||
the SMBUS calls, which gives an unnecessary overhead.
|
|
||||||
|
|
||||||
When I first wrote the driver, I was unaware of these facts, and I
|
|
||||||
simply used the first function that worked.
|
|
||||||
|
|
||||||
Drop the I2C SMBUS calls and instead use simple I2C transfers.
|
|
||||||
|
|
||||||
Fixes: 089381b27abe ("leds: initial support for Turris Omnia LEDs")
|
|
||||||
Signed-off-by: Marek Behún <kabel@kernel.org>
|
|
||||||
Link: https://lore.kernel.org/r/20230918161104.20860-2-kabel@kernel.org
|
|
||||||
Signed-off-by: Lee Jones <lee@kernel.org>
|
|
||||||
---
|
|
||||||
drivers/leds/leds-turris-omnia.c | 54 +++++++++++++++++++++++++++++++---------
|
|
||||||
1 file changed, 42 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
--- a/drivers/leds/leds-turris-omnia.c
|
|
||||||
+++ b/drivers/leds/leds-turris-omnia.c
|
|
||||||
@@ -2,7 +2,7 @@
|
|
||||||
/*
|
|
||||||
* CZ.NIC's Turris Omnia LEDs driver
|
|
||||||
*
|
|
||||||
- * 2020 by Marek Behún <kabel@kernel.org>
|
|
||||||
+ * 2020, 2023 by Marek Behún <kabel@kernel.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/i2c.h>
|
|
||||||
@@ -41,6 +41,37 @@ struct omnia_leds {
|
|
||||||
struct omnia_led leds[];
|
|
||||||
};
|
|
||||||
|
|
||||||
+static int omnia_cmd_write_u8(const struct i2c_client *client, u8 cmd, u8 val)
|
|
||||||
+{
|
|
||||||
+ u8 buf[2] = { cmd, val };
|
|
||||||
+
|
|
||||||
+ return i2c_master_send(client, buf, sizeof(buf));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int omnia_cmd_read_u8(const struct i2c_client *client, u8 cmd)
|
|
||||||
+{
|
|
||||||
+ struct i2c_msg msgs[2];
|
|
||||||
+ u8 reply;
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ msgs[0].addr = client->addr;
|
|
||||||
+ msgs[0].flags = 0;
|
|
||||||
+ msgs[0].len = 1;
|
|
||||||
+ msgs[0].buf = &cmd;
|
|
||||||
+ msgs[1].addr = client->addr;
|
|
||||||
+ msgs[1].flags = I2C_M_RD;
|
|
||||||
+ msgs[1].len = 1;
|
|
||||||
+ msgs[1].buf = &reply;
|
|
||||||
+
|
|
||||||
+ ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
|
|
||||||
+ if (likely(ret == ARRAY_SIZE(msgs)))
|
|
||||||
+ return reply;
|
|
||||||
+ else if (ret < 0)
|
|
||||||
+ return ret;
|
|
||||||
+ else
|
|
||||||
+ return -EIO;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static int omnia_led_brightness_set_blocking(struct led_classdev *cdev,
|
|
||||||
enum led_brightness brightness)
|
|
||||||
{
|
|
||||||
@@ -64,7 +95,7 @@ static int omnia_led_brightness_set_bloc
|
|
||||||
if (buf[2] || buf[3] || buf[4])
|
|
||||||
state |= CMD_LED_STATE_ON;
|
|
||||||
|
|
||||||
- ret = i2c_smbus_write_byte_data(leds->client, CMD_LED_STATE, state);
|
|
||||||
+ ret = omnia_cmd_write_u8(leds->client, CMD_LED_STATE, state);
|
|
||||||
if (ret >= 0 && (state & CMD_LED_STATE_ON))
|
|
||||||
ret = i2c_master_send(leds->client, buf, 5);
|
|
||||||
|
|
||||||
@@ -114,9 +145,9 @@ static int omnia_led_register(struct i2c
|
|
||||||
cdev->brightness_set_blocking = omnia_led_brightness_set_blocking;
|
|
||||||
|
|
||||||
/* put the LED into software mode */
|
|
||||||
- ret = i2c_smbus_write_byte_data(client, CMD_LED_MODE,
|
|
||||||
- CMD_LED_MODE_LED(led->reg) |
|
|
||||||
- CMD_LED_MODE_USER);
|
|
||||||
+ ret = omnia_cmd_write_u8(client, CMD_LED_MODE,
|
|
||||||
+ CMD_LED_MODE_LED(led->reg) |
|
|
||||||
+ CMD_LED_MODE_USER);
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(dev, "Cannot set LED %pOF to software mode: %i\n", np,
|
|
||||||
ret);
|
|
||||||
@@ -124,8 +155,8 @@ static int omnia_led_register(struct i2c
|
|
||||||
}
|
|
||||||
|
|
||||||
/* disable the LED */
|
|
||||||
- ret = i2c_smbus_write_byte_data(client, CMD_LED_STATE,
|
|
||||||
- CMD_LED_STATE_LED(led->reg));
|
|
||||||
+ ret = omnia_cmd_write_u8(client, CMD_LED_STATE,
|
|
||||||
+ CMD_LED_STATE_LED(led->reg));
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(dev, "Cannot set LED %pOF brightness: %i\n", np, ret);
|
|
||||||
return ret;
|
|
||||||
@@ -158,7 +189,7 @@ static ssize_t brightness_show(struct de
|
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
- ret = i2c_smbus_read_byte_data(client, CMD_LED_GET_BRIGHTNESS);
|
|
||||||
+ ret = omnia_cmd_read_u8(client, CMD_LED_GET_BRIGHTNESS);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
@@ -179,8 +210,7 @@ static ssize_t brightness_store(struct d
|
|
||||||
if (brightness > 100)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
- ret = i2c_smbus_write_byte_data(client, CMD_LED_SET_BRIGHTNESS,
|
|
||||||
- (u8)brightness);
|
|
||||||
+ ret = omnia_cmd_write_u8(client, CMD_LED_SET_BRIGHTNESS, brightness);
|
|
||||||
|
|
||||||
return ret < 0 ? ret : count;
|
|
||||||
}
|
|
||||||
@@ -238,8 +268,8 @@ static int omnia_leds_remove(struct i2c_
|
|
||||||
u8 buf[5];
|
|
||||||
|
|
||||||
/* put all LEDs into default (HW triggered) mode */
|
|
||||||
- i2c_smbus_write_byte_data(client, CMD_LED_MODE,
|
|
||||||
- CMD_LED_MODE_LED(OMNIA_BOARD_LEDS));
|
|
||||||
+ omnia_cmd_write_u8(client, CMD_LED_MODE,
|
|
||||||
+ CMD_LED_MODE_LED(OMNIA_BOARD_LEDS));
|
|
||||||
|
|
||||||
/* set all LEDs color to [255, 255, 255] */
|
|
||||||
buf[0] = CMD_LED_COLOR;
|
|
@ -125,7 +125,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
@@ -3358,3 +3359,5 @@ static int __init regmap_initcall(void)
|
@@ -3360,3 +3361,5 @@ static int __init regmap_initcall(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
postcore_initcall(regmap_initcall);
|
postcore_initcall(regmap_initcall);
|
||||||
|
@ -72,7 +72,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
+MODULE_LICENSE("GPL");
|
+MODULE_LICENSE("GPL");
|
||||||
--- a/kernel/sched/core.c
|
--- a/kernel/sched/core.c
|
||||||
+++ b/kernel/sched/core.c
|
+++ b/kernel/sched/core.c
|
||||||
@@ -4216,6 +4216,7 @@ int wake_up_state(struct task_struct *p,
|
@@ -4220,6 +4220,7 @@ int wake_up_state(struct task_struct *p,
|
||||||
{
|
{
|
||||||
return try_to_wake_up(p, state, 0);
|
return try_to_wake_up(p, state, 0);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
|
|
||||||
--- a/net/netfilter/nf_tables_api.c
|
--- a/net/netfilter/nf_tables_api.c
|
||||||
+++ b/net/netfilter/nf_tables_api.c
|
+++ b/net/netfilter/nf_tables_api.c
|
||||||
@@ -7707,7 +7707,7 @@ static int nft_register_flowtable_net_ho
|
@@ -7703,7 +7703,7 @@ static int nft_register_flowtable_net_ho
|
||||||
err = flowtable->data.type->setup(&flowtable->data,
|
err = flowtable->data.type->setup(&flowtable->data,
|
||||||
hook->ops.dev,
|
hook->ops.dev,
|
||||||
FLOW_BLOCK_BIND);
|
FLOW_BLOCK_BIND);
|
||||||
|
@ -1,47 +0,0 @@
|
|||||||
From 859bd2e0c0052967536f3f902716f204d5a978b1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jonas Gorski <jonas.gorski@gmail.com>
|
|
||||||
Date: Fri, 8 Sep 2023 22:48:33 +0200
|
|
||||||
Subject: [PATCH] hwrng: geode: fix accessing registers
|
|
||||||
|
|
||||||
When the membase and pci_dev pointer were moved to a new struct in priv,
|
|
||||||
the actual membase users were left untouched, and they started reading
|
|
||||||
out arbitrary memory behind the struct instead of registers. This
|
|
||||||
unfortunately turned the RNG into a constant number generator, depending
|
|
||||||
on the content of what was at that offset.
|
|
||||||
|
|
||||||
To fix this, update geode_rng_data_{read,present}() to also get the
|
|
||||||
membase via amd_geode_priv, and properly read from the right addresses
|
|
||||||
again.
|
|
||||||
|
|
||||||
Fixes: 9f6ec8dc574e ("hwrng: geode - Fix PCI device refcount leak")
|
|
||||||
Reported-by: Timur I. Davletshin <timur.davletshin@gmail.com>
|
|
||||||
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217882
|
|
||||||
Tested-by: Timur I. Davletshin <timur.davletshin@gmail.com>
|
|
||||||
Suggested-by: Jo-Philipp Wich <jo@mein.io>
|
|
||||||
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
|
||||||
---
|
|
||||||
drivers/char/hw_random/geode-rng.c | 6 ++++--
|
|
||||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
--- a/drivers/char/hw_random/geode-rng.c
|
|
||||||
+++ b/drivers/char/hw_random/geode-rng.c
|
|
||||||
@@ -58,7 +58,8 @@ struct amd_geode_priv {
|
|
||||||
|
|
||||||
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
|
||||||
{
|
|
||||||
- void __iomem *mem = (void __iomem *)rng->priv;
|
|
||||||
+ struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv;
|
|
||||||
+ void __iomem *mem = priv->membase;
|
|
||||||
|
|
||||||
*data = readl(mem + GEODE_RNG_DATA_REG);
|
|
||||||
|
|
||||||
@@ -67,7 +68,8 @@ static int geode_rng_data_read(struct hw
|
|
||||||
|
|
||||||
static int geode_rng_data_present(struct hwrng *rng, int wait)
|
|
||||||
{
|
|
||||||
- void __iomem *mem = (void __iomem *)rng->priv;
|
|
||||||
+ struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv;
|
|
||||||
+ void __iomem *mem = priv->membase;
|
|
||||||
int data, i;
|
|
||||||
|
|
||||||
for (i = 0; i < 20; i++) {
|
|
Loading…
x
Reference in New Issue
Block a user