realtek: stc8: use flexible array member

Simplifies allocation. Also addeed __counted_by for extra runtime
analysis.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22506
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
Rosen Penev 2026-03-18 16:39:49 -07:00 committed by Hauke Mehrtens
parent 3158f18538
commit 04328df9b9

View File

@ -74,7 +74,7 @@ Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
+ defaults: 0x40
+ required: false
+
+ hasivo,execute-bit-regs:
+ hasivo,execute-bit-registers:
+ description: >
+ Array of registers for which the execute-bit mask should be
+ applied. Writes to other registers will not have the execute-bit mask
@ -160,7 +160,7 @@ Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
+obj-$(CONFIG_MFD_HASIVO_STC8) += hasivo-stc8-mfd.o
--- /dev/null
+++ b/drivers/mfd/hasivo-stc8-mfd.c
@@ -0,0 +1,182 @@
@@ -0,0 +1,169 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Hasivo STC8 MFD driver with configurable write ORing for execute bit
@ -180,8 +180,8 @@ Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
+ struct regmap *parent_regmap;
+ struct regmap *child_regmap;
+ u32 exec_bit;
+ u32 *exec_regs;
+ size_t num_exec_regs;
+ u32 exec_regs[] __counted_by(num_exec_regs);
+};
+
+/* Check if register requires execute bit */
@ -232,26 +232,30 @@ Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
+ .reg_write = stc8_child_reg_write,
+};
+
+static int stc8_parse_dt(struct stc8_mfd *mfd, struct device_node *np)
+static int stc8_i2c_probe(struct i2c_client *client)
+{
+ int ret, count;
+ struct device_node *np = client->dev.of_node;
+ struct stc8_mfd *mfd;
+ u32 exec_bit;
+ int count;
+ int ret;
+
+ /* Get execute bit value (default 0x40) */
+ mfd->exec_bit = 0x40;
+ ret = of_property_read_u32(np, "hasivo,execute-bit", &mfd->exec_bit);
+ if (of_property_read_u32(np, "hasivo,execute-bit", &exec_bit))
+ exec_bit = 0x40;
+
+ /* Get count of execute registers */
+ count = of_property_count_u32_elems(np, "hasivo,execute-bit-registers");
+ if (count <= 0) {
+ mfd->num_exec_regs = 0;
+ }
+ else {
+ mfd->num_exec_regs = count;
+ mfd->exec_regs = devm_kcalloc(mfd->dev, count, sizeof(u32),
+ GFP_KERNEL);
+ if (!mfd->exec_regs)
+ return -ENOMEM;
+ if (count < 0)
+ count = 0;
+
+ mfd = devm_kzalloc(&client->dev, struct_size(mfd, exec_regs, count), GFP_KERNEL);
+ if (!mfd)
+ return -ENOMEM;
+
+ mfd->num_exec_regs = count;
+ mfd->dev = &client->dev;
+ if (count > 0) {
+ ret = of_property_read_u32_array(np, "hasivo,execute-bit-registers",
+ mfd->exec_regs, count);
+ if (ret) {
@ -260,31 +264,14 @@ Signed-off-by: Bevan Weiss <bevan.weiss@gmail.com>
+ }
+ }
+
+ mfd->exec_bit = exec_bit;
+ dev_info(mfd->dev, "execute-bit=0x%02x, %zu execute-bit-registers\n",
+ mfd->exec_bit, mfd->num_exec_regs);
+
+ return 0;
+}
+ dev_dbg(mfd->dev, "Hasivo STC8 MFD driver probed started\n");
+
+static int stc8_i2c_probe(struct i2c_client *client)
+{
+ struct stc8_mfd *mfd;
+ int ret;
+
+ dev_dbg(&client->dev, "Hasivo STC8 MFD driver probed started\n");
+
+ mfd = devm_kzalloc(&client->dev, sizeof(struct stc8_mfd), GFP_KERNEL);
+ if (!mfd)
+ return -ENOMEM;
+
+ mfd->dev = &client->dev;
+ i2c_set_clientdata(client, mfd);
+
+ /* Parse device tree properties */
+ ret = stc8_parse_dt(mfd, mfd->dev->of_node);
+ if (ret)
+ return ret;
+
+ /* Create parent regmap for direct I2C access */
+ mfd->parent_regmap = devm_regmap_init_i2c(client,
+ &stc8_parent_regmap_config);