All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>,
	"Danilo Krummrich" <dakr@kernel.org>,
	"Lyude Paul" <lyude@redhat.com>,
	"Alexander Lobakin" <aleksander.lobakin@intel.com>,
	"Bjorn Helgaas" <bhelgaas@google.com>,
	"Jonathan Cameron" <Jonathan.Cameron@huawei.com>,
	"Liam Girdwood" <lgirdwood@gmail.com>,
	"Lukas Wunner" <lukas@wunner.de>,
	"Mark Brown" <broonie@kernel.org>,
	"Maíra Canal" <mairacanal@riseup.net>,
	"Robin Murphy" <robin.murphy@arm.com>,
	"Simona Vetter" <simona.vetter@ffwll.ch>,
	"Zijun Hu" <quic_zijuhu@quicinc.com>,
	linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
	rust-for-linux@vger.kernel.org
Subject: Re: [PATCH 1/3] driver core: add a faux bus for use when a simple device/bus is needed
Date: Mon, 3 Feb 2025 17:11:03 +0200	[thread overview]
Message-ID: <Z6DchyPieQKBJ0SN@smile.fi.intel.com> (raw)
In-Reply-To: <2025020326-backer-vendetta-7094@gregkh>

On Mon, Feb 03, 2025 at 03:25:17PM +0100, Greg Kroah-Hartman wrote:
> Many drivers abuse the platform driver/bus system as it provides a
> simple way to create and bind a device to a driver-specific set of
> probe/release functions.  Instead of doing that, and wasting all of the
> memory associated with a platform device, here is a "faux" bus that
> can be used instead.

...

> +#include <linux/device/faux.h>

I would rather think that this goes after generic inclusions...

> +#include <linux/err.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/string.h>

...somewhere here.

But looking into organisation of device.h and device/*.h,
I would rather think of the linux/faux_device.h.

> +#include "base.h"

I don't remember by heart what it does include, I would go with IWYU principle
and list above all what we use.

container_of.h
device.h
export.h
printk.h
types.h

...

> +static int faux_match(struct device *dev, const struct device_driver *drv)
> +{
> +	struct faux_object *faux_obj = to_faux_object(dev);
> +
> +	/* Match is simple, strcmp()! */
> +	return (strcmp(faux_obj->name, drv->name) == 0);

Outer parentheses are not needed.

> +}

...

> +/**
> + * __faux_device_create - create and register a faux device and driver
> + * @name: name of the device and driver we are adding
> + * @faux_ops: struct faux_driver_ops that the new device will call back into, can be NULL
> + * @owner: module owner of the device/driver
> + *
> + * Create a new faux device and driver, both with the same name, and register
> + * them in the driver core properly.  The probe() callback of @faux_ops will be
> + * called with the new device that is created for the caller to do something
> + * with.

The kernel-doc will complain on missing Return: section.

> + */
> +struct faux_device *__faux_device_create(const char *name,
> +					       struct faux_driver_ops *faux_ops,
> +					       struct module *owner)
> +{
> +	struct device_driver *drv;
> +	struct device *dev;
> +	struct faux_object *faux_obj;
> +	struct faux_device *faux_dev;
> +	int ret;

> +	faux_obj = kzalloc(sizeof(*faux_obj) + strlen(name) + 1, GFP_KERNEL);

Potential overflow. To avoid one may use struct_size() from overflow.h.

> +	if (!faux_obj)
> +		return NULL;
> +
> +	/* Save off the name of the object into local memory */
> +	strcpy(faux_obj->name, name);
> +
> +	/* Initialize the driver portion and register it with the driver core */
> +	faux_obj->faux_ops = faux_ops;
> +	drv = &faux_obj->driver;
> +
> +	drv->owner = owner;
> +	drv->name = faux_obj->name;
> +	drv->bus = &faux_bus_type;
> +	drv->probe_type = PROBE_PREFER_ASYNCHRONOUS;
> +
> +	ret = driver_register(drv);
> +	if (ret) {
> +		pr_err("%s: driver_register for %s faux driver failed with %d\n",
> +		       __func__, name, ret);
> +		kfree(faux_obj);
> +		return NULL;
> +	}
> +
> +	/* Initialize the device portion and register it with the driver core */
> +	faux_dev = &faux_obj->faux_dev;
> +	dev = &faux_dev->dev;
> +
> +	device_initialize(dev);
> +	dev->release = faux_device_release;
> +	dev->parent = &faux_bus_root;
> +	dev->bus = &faux_bus_type;
> +	dev_set_name(dev, "%s", name);
> +
> +	ret = device_add(dev);
> +	if (ret) {
> +		pr_err("%s: device_add for %s faux device failed with %d\n",
> +		       __func__, name, ret);
> +		put_device(dev);
> +		return NULL;
> +	}
> +
> +	return faux_dev;
> +}
> +EXPORT_SYMBOL_GPL(__faux_device_create);

...

> +#ifndef _FAUX_DEVICE_H_
> +#define _FAUX_DEVICE_H_

> +#include <linux/module.h>

+ container_of.h

> +#include <linux/device.h>

> +struct faux_device {
> +	struct device dev;
> +};
> +#define to_faux_device(x) container_of_const((x), struct faux_device, dev)
> +
> +struct faux_driver_ops {
> +	int (*probe)(struct faux_device *faux_dev);
> +	void (*remove)(struct faux_device *faux_dev);
> +};
> +
> +#define faux_device_create(name, faux_ops) __faux_device_create(name, faux_ops, THIS_MODULE)
> +struct faux_device *__faux_device_create(const char *name,
> +					       struct faux_driver_ops *faux_ops,
> +					       struct module *module);
> +void faux_device_destroy(struct faux_device *faux_dev);
> +
> +#endif /* _FAUX_DEVICE_H_ */

-- 
With Best Regards,
Andy Shevchenko



  reply	other threads:[~2025-02-03 15:11 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-03 14:25 [PATCH 0/3] Driver core: faux bus Greg Kroah-Hartman
2025-02-03 14:25 ` [PATCH 1/3] driver core: add a faux bus for use when a simple device/bus is needed Greg Kroah-Hartman
2025-02-03 15:11   ` Andy Shevchenko [this message]
2025-02-03 15:13     ` Andy Shevchenko
2025-02-03 15:35     ` Greg Kroah-Hartman
2025-02-03 15:46       ` Greg Kroah-Hartman
2025-02-03 16:05         ` Andy Shevchenko
2025-02-03 16:05       ` Andy Shevchenko
2025-02-03 16:10         ` Andy Shevchenko
2025-02-03 16:13         ` Greg Kroah-Hartman
2025-02-03 16:22           ` Andy Shevchenko
2025-02-04  9:25   ` Jonathan Cameron
2025-02-04 10:14     ` Greg Kroah-Hartman
2025-02-04 10:08   ` Thomas Weißschuh
2025-02-04 10:20     ` Greg Kroah-Hartman
2025-02-04 10:44       ` Thomas Weißschuh
2025-02-04 10:49         ` Greg Kroah-Hartman
2025-02-03 14:25 ` [PATCH 2/3] regulator: dummy: convert to use the faux bus Greg Kroah-Hartman
2025-02-03 15:39   ` Mark Brown
2025-02-03 15:46     ` Greg Kroah-Hartman
2025-02-03 16:11       ` Mark Brown
2025-02-03 14:25 ` [PATCH 3/3] USB: phy: convert usb_phy_generic logic to use a faux device Greg Kroah-Hartman
2025-02-03 15:15   ` Andy Shevchenko

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=Z6DchyPieQKBJ0SN@smile.fi.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=aleksander.lobakin@intel.com \
    --cc=bhelgaas@google.com \
    --cc=broonie@kernel.org \
    --cc=dakr@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=lyude@redhat.com \
    --cc=mairacanal@riseup.net \
    --cc=quic_zijuhu@quicinc.com \
    --cc=rafael@kernel.org \
    --cc=robin.murphy@arm.com \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=simona.vetter@ffwll.ch \
    /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.