From: Guenter Roeck <linux@roeck-us.net>
To: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Cc: lee.jones@linaro.org, gwendal@chromium.org,
drinkcat@chromium.org, linux-kernel@vger.kernel.org,
groeck@chromium.org, kernel@collabora.com, bleung@chromium.org,
Olof Johansson <olof@lixom.net>
Subject: Re: [PATCH 5/7] mfd / platform: cros_ec: move device sysfs attributes to its own driver.
Date: Thu, 22 Nov 2018 11:09:55 -0800 [thread overview]
Message-ID: <20181122190955.GA1707@roeck-us.net> (raw)
In-Reply-To: <20181122113356.23610-6-enric.balletbo@collabora.com>
On Thu, Nov 22, 2018 at 12:33:54PM +0100, Enric Balletbo i Serra wrote:
> The entire way how cros debugfs attibutes are created is broken.
> cros_ec_sysfs should be its own driver and its attributes should be
> associated with the sysfs driver not the mfd driver.
>
> The patch also adds the sysfs documentation.
>
> Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
> ---
>
> .../ABI/testing/sysfs-class-chromeos | 32 ++++++++++++++
> drivers/mfd/Kconfig | 1 -
> drivers/mfd/cros_ec_dev.c | 7 +--
> drivers/platform/chrome/Kconfig | 14 ++++--
> drivers/platform/chrome/Makefile | 3 +-
> drivers/platform/chrome/cros_ec_sysfs.c | 43 ++++++++++++++++++-
> include/linux/mfd/cros_ec.h | 3 --
> 7 files changed, 87 insertions(+), 16 deletions(-)
> create mode 100644 Documentation/ABI/testing/sysfs-class-chromeos
>
> diff --git a/Documentation/ABI/testing/sysfs-class-chromeos b/Documentation/ABI/testing/sysfs-class-chromeos
> new file mode 100644
> index 000000000000..a5399c4ca82d
> --- /dev/null
> +++ b/Documentation/ABI/testing/sysfs-class-chromeos
> @@ -0,0 +1,32 @@
> +What: /sys/class/chromeos/<cros-ec>/flashinfo
> +Date: August 2015
> +KernelVersion: 4.2
> +Description:
> + Show the EC flash information.
> +
> +What: /sys/class/chromeos/<cros-ec>/kb_wake_angle
> +Date: March 2018
> +KernelVersion: 4.17
> +Description:
> + Control the keyboard wake lid angle. Values are between
> + 0 and 360. This file will also show the keyboard wake lid
> + angle by querying the hardware.
> +
> +What: /sys/class/chromeos/<cros-ec>/reboot
> +Date: August 2015
> +KernelVersion: 4.2
> +Description:
> + Tell the EC to reboot in various ways. Options are:
> + "cancel": Cancel a pending reboot.
> + "ro": Jump to RO without rebooting.
> + "rw": Jump to RW without rebooting.
> + "cold": Cold reboot.
> + "disable-jump": Disable jump until next reboot.
> + "hibernate": Hibernate the EC.
> + "at-shutdown": Reboot after an AP shutdown.
> +
> +What: /sys/class/chromeos/<cros-ec>/version
> +Date: August 2015
> +KernelVersion: 4.2
> +Description:
> + Show the information about the EC software and hardware.
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> index 8c5dfdce4326..089ffb408918 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -214,7 +214,6 @@ config MFD_CROS_EC
> config MFD_CROS_EC_CHARDEV
> tristate "Chrome OS Embedded Controller userspace device interface"
> depends on MFD_CROS_EC
> - select CROS_EC_CTL
> ---help---
> This driver adds support to talk with the ChromeOS EC from userspace.
>
> diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c
> index 8c7ee2a0b50a..fc235af6da65 100644
> --- a/drivers/mfd/cros_ec_dev.c
> +++ b/drivers/mfd/cros_ec_dev.c
> @@ -34,15 +34,9 @@
> #define CROS_MAX_DEV 128
> static int ec_major;
>
> -static const struct attribute_group *cros_ec_groups[] = {
> - &cros_ec_attr_group,
> - NULL,
> -};
> -
> static struct class cros_class = {
> .owner = THIS_MODULE,
> .name = "chromeos",
> - .dev_groups = cros_ec_groups,
> };
>
> int cros_ec_attach_attribute_group(struct cros_ec_dev *ec,
> @@ -405,6 +399,7 @@ static const struct mfd_cell cros_usbpd_charger_cells[] = {
> static const struct mfd_cell cros_ec_platform_cells[] = {
> { .name = "cros-ec-debugfs" },
> { .name = "cros-ec-lightbar" },
> + { .name = "cros-ec-sysfs" },
> { .name = "cros-ec-vbc" },
> };
>
> diff --git a/drivers/platform/chrome/Kconfig b/drivers/platform/chrome/Kconfig
> index a1239d48c46f..2ef51520766a 100644
> --- a/drivers/platform/chrome/Kconfig
> +++ b/drivers/platform/chrome/Kconfig
> @@ -49,9 +49,6 @@ config CHROMEOS_TBMC
> To compile this driver as a module, choose M here: the
> module will be called chromeos_tbmc.
>
> -config CROS_EC_CTL
> - tristate
> -
> config CROS_EC_I2C
> tristate "ChromeOS Embedded Controller (I2C)"
> depends on MFD_CROS_EC && I2C
> @@ -141,4 +138,15 @@ config CROS_EC_DEBUGFS
> To compile this driver as a module, choose M here: the
> module will be called cros_ec_debugfs.
>
> +config CROS_EC_SYSFS
> + tristate "ChromeOS EC control and information through sysfs"
> + depends on MFD_CROS_EC_CHARDEV && SYSFS
> + default y
> + help
> + This option exposes some sysfs attributes to control and get
> + information from ChromeOS EC.
> +
> + To compile this driver as a module, choose M here: the
> + module will be called cros_ec_sysfs.
> +
> endif # CHROMEOS_PLATFORMS
> diff --git a/drivers/platform/chrome/Makefile b/drivers/platform/chrome/Makefile
> index 12a5c4d18c17..fdbee501931b 100644
> --- a/drivers/platform/chrome/Makefile
> +++ b/drivers/platform/chrome/Makefile
> @@ -3,8 +3,6 @@
> obj-$(CONFIG_CHROMEOS_LAPTOP) += chromeos_laptop.o
> obj-$(CONFIG_CHROMEOS_PSTORE) += chromeos_pstore.o
> obj-$(CONFIG_CHROMEOS_TBMC) += chromeos_tbmc.o
> -cros_ec_ctl-objs := cros_ec_sysfs.o
> -obj-$(CONFIG_CROS_EC_CTL) += cros_ec_ctl.o
> obj-$(CONFIG_CROS_EC_I2C) += cros_ec_i2c.o
> obj-$(CONFIG_CROS_EC_SPI) += cros_ec_spi.o
> cros_ec_lpcs-objs := cros_ec_lpc.o cros_ec_lpc_reg.o
> @@ -15,3 +13,4 @@ obj-$(CONFIG_CROS_KBD_LED_BACKLIGHT) += cros_kbd_led_backlight.o
> obj-$(CONFIG_CROS_EC_LIGHTBAR) += cros_ec_lightbar.o
> obj-$(CONFIG_CROS_EC_VBC) += cros_ec_vbc.o
> obj-$(CONFIG_CROS_EC_DEBUGFS) += cros_ec_debugfs.o
> +obj-$(CONFIG_CROS_EC_SYSFS) += cros_ec_sysfs.o
> diff --git a/drivers/platform/chrome/cros_ec_sysfs.c b/drivers/platform/chrome/cros_ec_sysfs.c
> index f34a50121064..47d08a8f0542 100644
> --- a/drivers/platform/chrome/cros_ec_sysfs.c
> +++ b/drivers/platform/chrome/cros_ec_sysfs.c
> @@ -34,6 +34,8 @@
> #include <linux/types.h>
> #include <linux/uaccess.h>
>
> +#define DRV_NAME "cros-ec-sysfs"
> +
> /* Accessor functions */
>
> static ssize_t reboot_show(struct device *dev,
> @@ -353,7 +355,46 @@ struct attribute_group cros_ec_attr_group = {
> .attrs = __ec_attrs,
> .is_visible = cros_ec_ctrl_visible,
I think the .is_visible evaluation should now happen in the probe fuction.
> };
> -EXPORT_SYMBOL(cros_ec_attr_group);
> +
> +static int cros_ec_sysfs_probe(struct platform_device *pd)
> +{
> + struct cros_ec_dev *ec_dev = dev_get_drvdata(pd->dev.parent);
> + struct cros_ec_platform *ec_platform = dev_get_platdata(ec_dev->dev);
> + struct device *dev = &pd->dev;
> + int ret;
> +
> + if (!ec_dev) {
> + dev_err(dev, "No EC dev found\n");
> + return -EINVAL;
> + }
Above:
struct cros_ec_platform *ec_platform = dev_get_platdata(ec_dev->dev);
so if ec_dev is ever NULL, we'll never get to this point (and static
analyzers will have a field day). I think the check is unnecessary.
> +
> + ret = cros_ec_attach_attribute_group(ec_dev, &cros_ec_attr_group);
> + if (ret < 0)
> + dev_err(dev, "failed to create %s attributes. err=%d\n",
> + ec_platform->ec_name, ret);
Does it really make sense to display ec_platform->ec_name here ?
"Failed to create sysfs attributes" with dev_err should be good enough.
Also, again, I think we should create the attribute directly and drop
cros_ec_attach_attribute_group().
> +
> + return ret;
> +}
> +
> +static int cros_ec_sysfs_remove(struct platform_device *pd)
> +{
> + struct cros_ec_dev *ec_dev = dev_get_drvdata(pd->dev.parent);
> +
> + cros_ec_detach_attribute_group(ec_dev, &cros_ec_attr_group);
> +
> + return 0;
> +}
> +
> +static struct platform_driver cros_ec_sysfs_driver = {
> + .driver = {
> + .name = DRV_NAME,
> + },
> + .probe = cros_ec_sysfs_probe,
> + .remove = cros_ec_sysfs_remove,
> +};
> +
> +module_platform_driver(cros_ec_sysfs_driver);
>
> MODULE_LICENSE("GPL");
> MODULE_DESCRIPTION("ChromeOS EC control driver");
> +MODULE_ALIAS("platform:" DRV_NAME);
> diff --git a/include/linux/mfd/cros_ec.h b/include/linux/mfd/cros_ec.h
> index 1722c2c26143..6d8618894a45 100644
> --- a/include/linux/mfd/cros_ec.h
> +++ b/include/linux/mfd/cros_ec.h
> @@ -333,9 +333,6 @@ int cros_ec_get_next_event(struct cros_ec_device *ec_dev, bool *wake_event);
> */
> u32 cros_ec_get_host_event(struct cros_ec_device *ec_dev);
>
> -/* sysfs stuff */
> -extern struct attribute_group cros_ec_attr_group;
> -
> /* Attach/detach attributes to the cros_class */
> extern int cros_ec_attach_attribute_group(struct cros_ec_dev *ec,
> struct attribute_group *attrs);
next prev parent reply other threads:[~2018-11-22 19:10 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-22 11:33 [PATCH 0/7] mfd / platform: cros_ec: move cros_ec sysfs attributes to its own drivers Enric Balletbo i Serra
2018-11-22 11:33 ` [PATCH 1/7] mfd: cros_ec: use devm_mfd_add_devices Enric Balletbo i Serra
2018-11-22 11:33 ` [PATCH 2/7] mfd / platform: cros_ec: move lightbar attributes to its own driver Enric Balletbo i Serra
2018-11-22 17:41 ` Guenter Roeck
2018-11-23 11:52 ` Enric Balletbo i Serra
2018-11-23 12:03 ` Guenter Roeck
2018-11-22 11:33 ` [PATCH 3/7] mfd / platform: cros_ec: move vbc " Enric Balletbo i Serra
2018-11-22 11:33 ` [PATCH 4/7] mfd / platform: cros_ec: move debugfs " Enric Balletbo i Serra
2018-11-22 18:52 ` Guenter Roeck
2018-11-22 11:33 ` [PATCH 5/7] mfd / platform: cros_ec: move device sysfs " Enric Balletbo i Serra
2018-11-22 19:09 ` Guenter Roeck [this message]
2018-11-29 11:21 ` Dan Carpenter
2018-11-29 14:43 ` Enric Balletbo i Serra
2018-11-29 14:56 ` Dan Carpenter
2018-11-22 11:33 ` [PATCH 6/7] mfd / platform: cros_ec: instantiate only if th EC has a VBC NVRAM Enric Balletbo i Serra
2018-11-22 19:14 ` Guenter Roeck
2018-11-23 10:37 ` Enric Balletbo i Serra
2018-11-22 11:33 ` [PATCH 7/7] platform/chrome: cros_ec_lightbar: instantiate only if the EC has a lightbar Enric Balletbo i Serra
2018-11-22 19:25 ` Guenter Roeck
2018-11-23 11:10 ` Enric Balletbo i Serra
2018-11-23 11:39 ` Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181122190955.GA1707@roeck-us.net \
--to=linux@roeck-us.net \
--cc=bleung@chromium.org \
--cc=drinkcat@chromium.org \
--cc=enric.balletbo@collabora.com \
--cc=groeck@chromium.org \
--cc=gwendal@chromium.org \
--cc=kernel@collabora.com \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=olof@lixom.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.