Thread (17 messages) 17 messages, 5 authors, 2026-03-26

Re: [PATCH v27 3/4] i2c: ast2600: Add controller driver for AST2600 new register set

From: Jeremy Kerr <jk@codeconstruct.com.au>
Date: 2026-03-25 09:15:59
Also in: linux-aspeed, linux-devicetree, linux-i2c, lkml, openbmc

Hi Ryan,
quoted
I would suggest separating the string parsing from the "is the mode available"
logic, more on that below.
I will separate with following.
 
static int ast2600_i2c_xfer_mode_parse(const char *buf, enum xfer_mode *mode)
{
    if (sysfs_streq(buf, "byte"))   { *mode = BYTE_MODE; return 0; }
    if (sysfs_streq(buf, "buffer")) { *mode = BUFF_MODE; return 0; }
    if (sysfs_streq(buf, "dma"))    { *mode = DMA_MODE;  return 0; }
    return -EINVAL;
}
OK, but with kernel-style formatting.
static int ast2600_i2c_xfer_mode_check(struct ast2600_i2c_bus *i2c_bus,
                                       enum xfer_mode mode)
{
    if (mode == BUFF_MODE && !i2c_bus->buf_base)
        return -EINVAL;
    if (mode == DMA_MODE && !i2c_bus->dma_available)
        return -EINVAL;
    return 0;
}
quoted
quoted
+
+static const char *ast2600_i2c_xfer_mode_name(enum xfer_mode mode) {
+       switch (mode) {
+       case BYTE_MODE:
+               return "byte";
+       case DMA_MODE:
+               return "dma";
+       case BUFF_MODE:
+       default:
+               return "buffer";
+       }
+}
+
+static ssize_t xfer_mode_show(struct device *dev, struct
+device_attribute *attr, char *buf) {
+       struct ast2600_i2c_bus *i2c_bus = dev_get_drvdata(dev);
+
+       return sysfs_emit(buf, "%s\n",
+ast2600_i2c_xfer_mode_name(i2c_bus->mode));
+}
+
+static ssize_t xfer_mode_store(struct device *dev,
+                              struct device_attribute *attr,
+                              const char *buf, size_t count)
{
quoted
+       struct ast2600_i2c_bus *i2c_bus = dev_get_drvdata(dev);
+       enum xfer_mode mode;
+       int ret;
+
+       ret = ast2600_i2c_xfer_mode_parse(i2c_bus, buf, &mode);
+       if (ret)
+               return ret;
+
+       i2c_lock_bus(&i2c_bus->adap, I2C_LOCK_ROOT_ADAPTER);
+       ast2600_i2c_set_xfer_mode(i2c_bus, mode);
+       i2c_unlock_bus(&i2c_bus->adap, I2C_LOCK_ROOT_ADAPTER);
+
+       return count;
+}
+
+static DEVICE_ATTR_RW(xfer_mode);
This will need sysfs ABI documentation.
Since it is in sysfs /sys/bus/platform/drivers/i2c_ast2600
So I add Documentation/ABI/testing/sysfs-bus-platform-drivers-i2c-ast2600 
am I right?
I would suggest Documentation/ABI/testing/sysfs-driver-ast2600-i2c
What:           /sys/bus/platform/drivers/i2c-ast2600/.../xfer_mode
Date:           March 2026
KernelVersion:  6.x
KernelVersion is optional, but if you include it, it would be 7.x.
Contact:        Ryan Chen [off-list ref]
Description:
Keep the first line of the description on the same line.
                Shows or sets the transfer mode for the ASPEED AST2600 I2C
                controller. Valid values are:

                - "byte":   Programmed I/O, one byte at a time.
                - "buffer": Programmed I/O using the hardware FIFO buffer.
                - "dma":    DMA transfer (only available if aspeed,enable-dma
                            is set in the device tree).
Decouple this from the device tree configuration mechanism:

                 - "dma":    DMA transfer (if DMA is available for this
                             controller)
i2c_bus->buf_base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
if (!IS_ERR(i2c_bus->buf_base))
    i2c_bus->buf_size = resource_size(res) / 2;
else
    i2c_bus->buf_base = NULL;
I would suggest a temporary, so there's no chance that future changes
could see an ERR_PTR value in i2c_bus->buf_base:

    buf_base = devm_platform_get_and_ioremap_resource(pdev, 1, &res);
    if (!IS_ERR(buf_base)) {
        i2c_bus->buf_base = buf_base
        i2c_bus->buf_size = resource_size(res) / 2;
    }

and you have kzalloc()ed, so no need for the NULL init in the error path.

Cheers,


Jeremy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help