From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Johan Hovold <johan@kernel.org>,
lkml <linux-kernel@vger.kernel.org>,
Richard Gong <richard.gong@linux.intel.com>,
Romain Izard <romain.izard.pro@gmail.com>,
"Rafael J. Wysocki" <rafael@kernel.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Mans Rullgard <mans@mansr.com>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>,
Randy Dunlap <rdunlap@infradead.org>
Subject: Re: [PATCH 01/12 v2] Platform: add a dev_groups pointer to struct platform_driver
Date: Sat, 20 Jul 2019 07:38:57 +0300 [thread overview]
Message-ID: <20190720043857.GA14290@penguin> (raw)
In-Reply-To: <20190719115220.GD20044@kroah.com>
On Fri, Jul 19, 2019 at 08:52:20PM +0900, Greg Kroah-Hartman wrote:
> On Sat, Jul 06, 2019 at 10:39:38AM -0700, Dmitry Torokhov wrote:
> > On Sat, Jul 6, 2019 at 10:19 AM Greg Kroah-Hartman
> > <gregkh@linuxfoundation.org> wrote:
> > >
> > > On Sat, Jul 06, 2019 at 10:04:39AM -0700, Dmitry Torokhov wrote:
> > > > Hi Greg,
> > > >
> > > > On Sat, Jul 6, 2019 at 1:32 AM Greg Kroah-Hartman
> > > > <gregkh@linuxfoundation.org> wrote:
> > > > >
> > > > > On Thu, Jul 04, 2019 at 02:17:22PM -0700, Dmitry Torokhov wrote:
> > > > > > Hi Greg,
> > > > > >
> > > > > > On Thu, Jul 4, 2019 at 5:15 AM Greg Kroah-Hartman
> > > > > > <gregkh@linuxfoundation.org> wrote:
> > > > > > >
> > > > > > > Platform drivers like to add sysfs groups to their device, but right now
> > > > > > > they have to do it "by hand". The driver core should handle this for
> > > > > > > them, but there is no way to get to the bus-default attribute groups as
> > > > > > > all platform devices are "special and unique" one-off drivers/devices.
> > > > > > >
> > > > > > > To combat this, add a dev_groups pointer to platform_driver which allows
> > > > > > > a platform driver to set up a list of default attributes that will be
> > > > > > > properly created and removed by the platform driver core when a probe()
> > > > > > > function is successful and removed right before the device is unbound.
> > > > > >
> > > > > > Why is this limited to platform bus? Drivers for other buses also
> > > > > > often want to augment list of their attributes during probe(). I'd
> > > > > > move it to generic probe handling.
> > > > >
> > > > > This is not limited to the platform at all, the driver core supports
> > > > > this for any bus type today, but it's then up to the bus-specific code
> > > > > to pass that on to the driver core. That's usually set for the
> > > > > bus-specific attributes that they want exposed for all devices of that
> > > > > bus type (see the bus_groups, dev_groups, and drv_groups pointers in
> > > > > struct bus_type).
> > > > >
> > > > > For the platform devices, the problem is that this is something that the
> > > > > individual drivers want after they bind to the device. And as all
> > > > > platform devices are "different" they can't be a "common" set of
> > > > > attributes, so they need to be created after the device is bound to the
> > > > > driver.
> > > >
> > > > I believe that your assertion that only platform devices want to
> > > > install custom attributes is incorrect.
> > >
> > > Sorry, I didn't mean to imply that only platform drivers want to do
> > > this, as you say, many other drivers do as well.
> > >
> > > > Drivers for devices attached
> > > > to serio, i2c, USB, spi, etc, etc, all have additional attributes:
> > > >
> > > > dtor@dtor-ws:~/kernel/work (master *)$ grep -l '\(i2c\|usb\|spi\)'
> > > > `git grep -l '\(device_add_group\|sysfs_create_group\)' -- drivers` |
> > > > wc -l
> > > > 170
> > > >
> > > > I am pretty sure some of this count is false positives, but majority
> > > > is actually proper hits.
> > >
> > > Yeah, I know, we need to add this type of functionality to those busses
> > > as well. I don't see a way of doing it other than this bus-by-bus
> > > conversion, do you?
> >
> > Can't you push the **dev_groups from platform driver down to the
> > generic driver structure and handle them in driver_sysfs_add()?
>
> Sorry for the delay, got busy with the merge window...
>
> Anyway, no, we can't call this then, because driver_sysfs_add() is
> called before probe() is called. So if probe() fails, we don't bind the
> device to the driver. We also should not be creating sysfs files for a
> driver that has not had probe() called yet, as internal structures will
> not be set up at that time.
Ah, yes, I got confused by the fact that driver_sysfs_remove is called
early. Anyway, I think you want something like this:
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 0df9b4461766..61d9d650d890 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -515,9 +515,17 @@ static int really_probe(struct device *dev, struct device_driver *drv)
goto probe_failed;
}
+ if (device_add_groups(dev, drv->dev_groups)) {
+ printk(KERN_ERR "%s: device_add_groups(%s) failed\n",
+ __func__, dev_name(dev));
+ goto dev_groups_failed;
+ }
+
if (test_remove) {
test_remove = false;
+ device_remove_groups(dev, drv->dev_groups);
+
if (dev->bus->remove)
dev->bus->remove(dev);
else if (drv->remove)
@@ -545,6 +553,11 @@ static int really_probe(struct device *dev, struct device_driver *drv)
drv->bus->name, __func__, dev_name(dev), drv->name);
goto done;
+dev_groups_failed:
+ if (dev->bus->remove)
+ dev->bus->remove(dev);
+ else if (drv->remove)
+ drv->remove(dev);
probe_failed:
if (dev->bus)
blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
@@ -1075,6 +1088,8 @@ static void __device_release_driver(struct device *dev, struct device *parent)
pm_runtime_put_sync(dev);
+ device_remove_groups(dev, drv->dev_groups);
+
if (dev->bus && dev->bus->remove)
dev->bus->remove(dev);
else if (drv->remove)
diff --git a/include/linux/device.h b/include/linux/device.h
index 4a295e324ac5..12aa8c687404 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -259,6 +259,8 @@ enum probe_type {
* @resume: Called to bring a device from sleep mode.
* @groups: Default attributes that get created by the driver core
* automatically.
+ * @dev_groups: Additional attributes attached to device instance once the
+ * it is bound to the driver.
* @pm: Power management operations of the device which matched
* this driver.
* @coredump: Called when sysfs entry is written to. The device driver
@@ -293,6 +295,7 @@ struct device_driver {
int (*suspend) (struct device *dev, pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
+ const struct attribute_group **dev_groups;
const struct dev_pm_ops *pm;
void (*coredump) (struct device *dev);
Thanks.
--
Dmitry
next prev parent reply other threads:[~2019-07-20 4:39 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-04 8:46 [PATCH 00/11] Platform drivers, provide a way to add sysfs groups easily Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 01/11] Platform: add a dev_groups pointer to struct platform_driver Greg Kroah-Hartman
2019-07-04 9:32 ` Johan Hovold
2019-07-04 10:43 ` Greg Kroah-Hartman
2019-07-04 12:11 ` [PATCH 01/12 v2] " Greg Kroah-Hartman
2019-07-04 21:17 ` Dmitry Torokhov
2019-07-06 8:32 ` Greg Kroah-Hartman
2019-07-06 17:04 ` Dmitry Torokhov
2019-07-06 17:19 ` Greg Kroah-Hartman
2019-07-06 17:39 ` Dmitry Torokhov
2019-07-19 11:52 ` Greg Kroah-Hartman
2019-07-20 4:38 ` Dmitry Torokhov [this message]
2019-07-25 13:44 ` Greg Kroah-Hartman
2019-07-25 19:02 ` Richard Gong
2019-07-25 19:04 ` Greg Kroah-Hartman
2019-07-25 19:13 ` Dmitry Torokhov
2019-07-25 19:18 ` Dmitry Torokhov
2019-07-04 8:46 ` [PATCH 02/11] uio: uio_fsl_elbc_gpcm: convert platform driver to use dev_groups Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 03/11] serial: sh-sci: use driver core functions, not sysfs ones Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 04/11] firmware: arm_scpi: convert platform driver to use dev_groups Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 9:10 ` Sudeep Holla
2019-07-04 9:10 ` Sudeep Holla
2019-07-31 12:28 ` Greg Kroah-Hartman
2019-07-31 12:28 ` Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 05/11] olpc: x01: " Greg Kroah-Hartman
2019-07-04 13:28 ` Andy Shevchenko
2019-07-04 8:46 ` [PATCH 06/11] platform: x86: hp-wmi: " Greg Kroah-Hartman
2019-07-04 13:29 ` Andy Shevchenko
2019-07-04 8:46 ` [PATCH 07/11] video: fbdev: wm8505fb: " Greg Kroah-Hartman
2019-07-04 13:29 ` Andy Shevchenko
2019-07-04 14:25 ` Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 08/11] video: fbdev: w100fb: " Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-04 8:46 ` [PATCH 09/11] video: fbdev: sm501fb: " Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:01 ` Bartlomiej Zolnierkiewicz
2019-07-04 8:46 ` [PATCH 10/11] input: keyboard: gpio_keys: " Greg Kroah-Hartman
2019-07-04 8:46 ` Greg Kroah-Hartman
2019-07-04 8:46 ` [PATCH 11/11] input: axp20x-pek: " Greg Kroah-Hartman
2019-07-04 14:26 ` [PATCH 07/11] video: fbdev: wm8505fb: " Greg Kroah-Hartman
2019-07-04 14:26 ` Greg Kroah-Hartman
2019-07-04 14:26 ` Greg Kroah-Hartman
2019-07-05 15:00 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:00 ` Bartlomiej Zolnierkiewicz
2019-07-05 15:00 ` Bartlomiej Zolnierkiewicz
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=20190720043857.GA14290@penguin \
--to=dmitry.torokhov@gmail.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bgolaszewski@baylibre.com \
--cc=gregkh@linuxfoundation.org \
--cc=johan@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mans@mansr.com \
--cc=rafael@kernel.org \
--cc=rdunlap@infradead.org \
--cc=richard.gong@linux.intel.com \
--cc=romain.izard.pro@gmail.com \
/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.