[PATCH 09/13] HID: ft260: gpio: group sysfs attrs per HID interface
Michael Zaidman <[email protected]>
| Newsgroups | org.kernel.vger.linux-input,org.kernel.vger.linux-gpio,org.kernel.vger.linux-i2c,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Split the single sysfs attribute group into per-interface groups based on chip mode (DCNF0/DCNF1): - I2C-only (mode 1): full I2C + GPIO attributes on the I2C HID iface - Dual mode (0/3): I2C-facing attrs on the I2C iface; GPIO and UART attrs on the UART iface - UART-only (mode 2): GPIO and UART attrs on the UART iface Signed-off-by: Michael Zaidman <[email protected]> --- drivers/hid/hid-ft260.c | 58 +++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/drivers/hid/hid-ft260.c b/drivers/hid/hid-ft260.c index 554d8e3ddb6d..0a1875a1a7ec 100644 --- a/drivers/hid/hid-ft260.c +++ b/drivers/hid/hid-ft260.c @@ -1592,7 +1592,7 @@ static ssize_t i2c_reset_store(struct device *kdev, } static DEVICE_ATTR_WO(i2c_reset); -static const struct attribute_group ft260_attr_group = { +static const struct attribute_group ft260_i2c_chip_mode_1_attr_group = { .attrs = (struct attribute *[]) { &dev_attr_chip_mode.attr, &dev_attr_pwren_status.attr, @@ -1603,11 +1603,35 @@ static const struct attribute_group ft260_attr_group = { &dev_attr_gpio2_func.attr, &dev_attr_gpioa_func.attr, &dev_attr_gpiog_func.attr, + &dev_attr_clock_ctl.attr, + &dev_attr_i2c_reset.attr, + &dev_attr_clock.attr, + NULL + } +}; + +static const struct attribute_group ft260_i2c_chip_mode_0_3_attr_group = { + .attrs = (struct attribute *[]) { + &dev_attr_hid_over_i2c_en.attr, + &dev_attr_i2c_reset.attr, + &dev_attr_clock.attr, + NULL + } +}; + +static const struct attribute_group ft260_uart_chip_mode_0_2_3_attr_group = { + .attrs = (struct attribute *[]) { + &dev_attr_chip_mode.attr, + &dev_attr_pwren_status.attr, + &dev_attr_suspend_status.attr, + &dev_attr_power_saving_en.attr, + &dev_attr_gpio2_func.attr, + &dev_attr_gpioa_func.attr, + &dev_attr_gpiog_func.attr, &dev_attr_uart_mode.attr, &dev_attr_uart_dcd_ri.attr, &dev_attr_clock_ctl.attr, &dev_attr_i2c_reset.attr, - &dev_attr_clock.attr, NULL } }; @@ -2240,7 +2264,16 @@ static int ft260_i2c_probe(struct ft260_device *dev, if (ret) goto err_i2c_free; - ret = sysfs_create_group(&hdev->dev.kobj, &ft260_attr_group); + ret = sysfs_create_group(&hdev->dev.kobj, + &ft260_i2c_chip_mode_1_attr_group); + if (ret < 0) { + hid_err(hdev, "failed to create sysfs attrs\n"); + goto err_i2c_free; + } + } else if (cfg->chip_mode == FT260_MODE_ALL || + cfg->chip_mode == FT260_MODE_BOTH) { + ret = sysfs_create_group(&hdev->dev.kobj, + &ft260_i2c_chip_mode_0_3_attr_group); if (ret < 0) { hid_err(hdev, "failed to create sysfs attrs\n"); goto err_i2c_free; @@ -2306,12 +2339,14 @@ static int ft260_uart_probe(struct ft260_device *dev, cfg->uart_mode = FT260_UART_CFG_FLOW_CTRL_NONE; if (dev->chip_mode & FT260_MODE_UART || - dev->chip_mode == FT260_MODE_ALL) { + dev->chip_mode == FT260_MODE_ALL || + dev->chip_mode == FT260_MODE_BOTH) { ret = ft260_gpio_init(dev, cfg); if (ret) goto err_hid_report; - ret = sysfs_create_group(&hdev->dev.kobj, &ft260_attr_group); + ret = sysfs_create_group(&hdev->dev.kobj, + &ft260_uart_chip_mode_0_2_3_attr_group); if (ret < 0) { hid_err(hdev, "failed to create sysfs attrs\n"); goto err_hid_report; @@ -2418,12 +2453,19 @@ static void ft260_remove(struct hid_device *hdev) ft260_uart_port_remove(dev); /* dev is still needed, so we will free it in _destroy func */ if (dev->chip_mode & FT260_MODE_UART || - dev->chip_mode == FT260_MODE_ALL) - sysfs_remove_group(&hdev->dev.kobj, &ft260_attr_group); + dev->chip_mode == FT260_MODE_ALL || + dev->chip_mode == FT260_MODE_BOTH) + sysfs_remove_group(&hdev->dev.kobj, + &ft260_uart_chip_mode_0_2_3_attr_group); } else { if (dev->chip_mode == FT260_MODE_I2C) - sysfs_remove_group(&hdev->dev.kobj, &ft260_attr_group); + sysfs_remove_group(&hdev->dev.kobj, + &ft260_i2c_chip_mode_1_attr_group); + else if (dev->chip_mode == FT260_MODE_ALL || + dev->chip_mode == FT260_MODE_BOTH) + sysfs_remove_group(&hdev->dev.kobj, + &ft260_i2c_chip_mode_0_3_attr_group); i2c_del_adapter(&dev->adap); kfree(dev); } -- 2.43.0