rust-for-linux.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).