From: greg@kroah.com (Greg KH)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/6] drivers/base: add bus for System-on-Chip devices
Date: Fri, 27 Jan 2012 17:05:34 -0800 [thread overview]
Message-ID: <20120128010534.GA20581@kroah.com> (raw)
In-Reply-To: <1327165687-4223-3-git-send-email-lee.jones@linaro.org>
On Sat, Jan 21, 2012 at 05:08:03PM +0000, Lee Jones wrote:
> Traditionally, any System-on-Chip based platform creates a flat list
> of platform_devices directly under /sys/devices/platform.
>
> In order to give these some better structure, this introduces a new
> bus type for soc_devices that are registered with the new
> soc_device_register() function. All devices that are on the same
> chip should then be registered as child devices of the soc device.
>
> The soc bus also exports a few standardised device attributes which
> allow user space to query the specific type of soc.
>
> Signed-off-by: Lee Jones <lee.jones@linaro.org>
> ---
> drivers/base/Kconfig | 3 +
> drivers/base/Makefile | 1 +
> drivers/base/soc.c | 185 +++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/sys_soc.h | 37 ++++++++++
> 4 files changed, 226 insertions(+), 0 deletions(-)
> create mode 100644 drivers/base/soc.c
> create mode 100644 include/linux/sys_soc.h
>
> diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
> index 7be9f79..9aa618a 100644
> --- a/drivers/base/Kconfig
> +++ b/drivers/base/Kconfig
> @@ -176,6 +176,9 @@ config GENERIC_CPU_DEVICES
> bool
> default n
>
> +config SOC_BUS
> + bool
That's nice, but you do need some kind of help text here, right?
> +
> source "drivers/base/regmap/Kconfig"
>
> config DMA_SHARED_BUFFER
> diff --git a/drivers/base/Makefile b/drivers/base/Makefile
> index 2c8272d..4f302a6 100644
> --- a/drivers/base/Makefile
> +++ b/drivers/base/Makefile
> @@ -19,6 +19,7 @@ obj-$(CONFIG_MODULES) += module.o
> endif
> obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor.o
> obj-$(CONFIG_REGMAP) += regmap/
> +obj-$(CONFIG_SOC_BUS) += soc.o
>
> ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG
>
> diff --git a/drivers/base/soc.c b/drivers/base/soc.c
> new file mode 100644
> index 0000000..0c9e350
> --- /dev/null
> +++ b/drivers/base/soc.c
> @@ -0,0 +1,185 @@
> +/*
> + * Copyright (C) ST-Ericsson SA 2011
> + *
> + * Author: Lee Jones <lee.jones@linaro.org> for ST-Ericsson.
> + * License terms: GNU General Public License (GPL), version 2
> + */
> +
> +#include <linux/sysfs.h>
> +#include <linux/module.h>
> +#include <linux/init.h>
> +#include <linux/stat.h>
> +#include <linux/slab.h>
> +#include <linux/idr.h>
> +#include <linux/spinlock.h>
> +#include <linux/sys_soc.h>
> +#include <linux/err.h>
> +
> +static struct ida soc_ida;
> +static spinlock_t soc_lock;
> +
> +static ssize_t soc_info_get(struct device *dev,
> + struct device_attribute *attr,
> + char *buf);
> +
Why not put the whole function here, well a few lines lower, so no
forward declaration is needed, saving a few extra lines.
> +struct soc_device {
> + struct device dev;
> + struct soc_device_attribute *attr;
const?
> + int soc_dev_num;
Why is this needed? What's wrong with dev->id?
> +};
> +
> +static struct bus_type soc_bus_type = {
> + .name = "soc",
> +};
> +
Put the function here.
> +static DEVICE_ATTR(machine, S_IRUGO, soc_info_get, NULL);
> +static DEVICE_ATTR(family, S_IRUGO, soc_info_get, NULL);
> +static DEVICE_ATTR(soc_id, S_IRUGO, soc_info_get, NULL);
> +static DEVICE_ATTR(revision, S_IRUGO, soc_info_get, NULL);
> +
> +struct device *soc_device_to_device(struct soc_device *soc_dev)
> +{
> + return &soc_dev->dev;
> +}
Why is this even needed? Who cares about this?
> +
> +static mode_t soc_attribute_mode(struct kobject *kobj,
> + struct attribute *attr,
> + int index)
> +{
> + struct device *dev = container_of(kobj, struct device, kobj);
> + struct soc_device *soc_dev = container_of(dev, struct soc_device, dev);
> +
> + if ((attr == &dev_attr_machine.attr)
> + && (soc_dev->attr->machine != NULL))
> + return attr->mode;
> + if ((attr == &dev_attr_family.attr)
> + && (soc_dev->attr->family != NULL))
> + return attr->mode;
> + if ((attr == &dev_attr_revision.attr)
> + && (soc_dev->attr->revision != NULL))
> + return attr->mode;
> + if ((attr == &dev_attr_soc_id.attr)
> + && (soc_dev->attr->soc_id != NULL))
> + return attr->mode;
> +
> + /* Unknown or unfilled attribute. */
> + return 0;
> +}
> +
> +static ssize_t soc_info_get(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct soc_device *soc_dev = container_of(dev, struct soc_device, dev);
> +
> + if (attr == &dev_attr_machine)
> + return sprintf(buf, "%s\n", soc_dev->attr->machine);
> + if (attr == &dev_attr_family)
> + return sprintf(buf, "%s\n", soc_dev->attr->family);
> + if (attr == &dev_attr_revision)
> + return sprintf(buf, "%s\n", soc_dev->attr->revision);
> + if (attr == &dev_attr_soc_id)
> + return sprintf(buf, "%s\n", soc_dev->attr->soc_id);
> +
> + return -EINVAL;
> +
> +}
> +
> +static struct attribute *soc_attr[] = {
> + &dev_attr_machine.attr,
> + &dev_attr_family.attr,
> + &dev_attr_soc_id.attr,
> + &dev_attr_revision.attr,
> + NULL,
> +};
> +
> +static const struct attribute_group soc_attr_group = {
> + .attrs = soc_attr,
> + .is_visible = soc_attribute_mode,
Nice, now wasn't that easier? :)
> +};
> +
> +static const struct attribute_group *soc_attr_groups[] = {
> + &soc_attr_group,
> + NULL,
> +};
> +
> +static void soc_release(struct device *dev)
> +{
> + struct soc_device *soc_dev = container_of(dev, struct soc_device, dev);
> +
> + kfree(soc_dev);
> +}
> +
> +struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr)
> +{
> + struct soc_device *soc_dev;
> + int ret;
> +
> + soc_dev = kzalloc(sizeof(*soc_dev), GFP_KERNEL);
> + if (!soc_dev) {
> + ret = -ENOMEM;
> + goto out1;
> + }
> +
> + /* Fetch a unique (reclaimable) SOC ID. */
> + do {
> + if (!ida_pre_get(&soc_ida, GFP_KERNEL)) {
> + ret = -ENOMEM;
> + goto out2;
> + }
> +
> + spin_lock(&soc_lock);
> + ret = ida_get_new(&soc_ida, &soc_dev->soc_dev_num);
> + spin_unlock(&soc_lock);
> +
> + } while (ret == -EAGAIN);
> +
> + if (ret)
> + goto out2;
> +
> + soc_dev->attr = soc_dev_attr;
> + soc_dev->dev.bus = &soc_bus_type;
> + soc_dev->dev.groups = soc_attr_groups;
> + soc_dev->dev.release = soc_release;
> +
> + dev_set_name(&soc_dev->dev, "soc%d", soc_dev->soc_dev_num);
> +
> + ret = device_register(&soc_dev->dev);
> + if (ret)
> + goto out3;
> +
> + return soc_dev;
> +
> +out3:
> + ida_remove(&soc_ida, soc_dev->soc_dev_num);
> +out2:
> + kfree(soc_dev);
> +out1:
> + return ERR_PTR(ret);
> +}
> +
> +/* Ensure soc_dev->attr is freed prior to calling soc_device_unregister. */
> +void soc_device_unregister(struct soc_device *soc_dev)
> +{
> + ida_remove(&soc_ida, soc_dev->soc_dev_num);
> +
> + device_unregister(&soc_dev->dev);
> +}
> +
> +static int __init soc_bus_register(void)
> +{
> + spin_lock_init(&soc_lock);
> +
> + ida_init(&soc_ida);
> +
> + return bus_register(&soc_bus_type);
> +}
> +core_initcall(soc_bus_register);
> +
> +static void __exit soc_bus_unregister(void)
> +{
> + ida_destroy(&soc_ida);
> +
> + bus_unregister(&soc_bus_type);
> +}
> +module_exit(soc_bus_unregister);
> diff --git a/include/linux/sys_soc.h b/include/linux/sys_soc.h
> new file mode 100644
> index 0000000..2739ccb
> --- /dev/null
> +++ b/include/linux/sys_soc.h
> @@ -0,0 +1,37 @@
> +/*
> + * Copyright (C) ST-Ericsson SA 2011
> + * Author: Lee Jones <lee.jones@linaro.org> for ST-Ericsson.
> + * License terms: GNU General Public License (GPL), version 2
> + */
> +#ifndef __SOC_BUS_H
> +#define __SOC_BUS_H
> +
> +#include <linux/device.h>
> +
> +struct soc_device_attribute {
> + const char *machine;
> + const char *family;
> + const char *revision;
> + const char *soc_id;
> +};
> +
> +/**
> + * soc_device_register - register SoC as a device
> + * @soc_plat_dev_attr: Attributes passed from platform to be attributed to a SoC
> + */
> +struct soc_device *soc_device_register(
> + struct soc_device_attribute *soc_plat_dev_attr);
const?
> +
> +/**
> + * soc_device_unregister - unregister SoC device
> + * @dev: SoC device to be unregistered
> + */
> +void soc_device_unregister(struct soc_device *soc_dev);
We need more documentation for these functions.
> +
> +/**
> + * soc_device_to_device - helper function to fetch struct device
> + * @soc: Previously registered SoC device container
> + */
> +struct device *soc_device_to_device(struct soc_device *soc);
Is the reference count incremented when this is called? Why is this
needed at all anyway?
Overall, much nicer, but we need more documentation on how to use this
properly, and what exactly it does.
You are almost there :)
thanks,
greg k-h
next prev parent reply other threads:[~2012-01-28 1:05 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-21 17:08 [PATCH 0/6] ux500: Export SoC information and some platform clean-up Lee Jones
2012-01-21 17:08 ` [PATCH 1/6] mach-ux500: pass parent pointer to each platform device Lee Jones
2012-01-21 17:08 ` [PATCH 2/6] drivers/base: add bus for System-on-Chip devices Lee Jones
2012-01-28 1:05 ` Greg KH [this message]
2012-01-30 17:58 ` Arnd Bergmann
2012-01-30 18:34 ` Greg KH
2012-01-21 17:08 ` [PATCH 3/6] Documentation: add information for new sysfs soc bus functionality Lee Jones
2012-01-21 17:08 ` [PATCH 4/6] mach-ux500: export System-on-Chip information ux500 via sysfs Lee Jones
2012-01-21 17:08 ` [PATCH 5/6] mach-ux500: move top level platform devices in sysfs to /sys/devices/socX Lee Jones
2012-01-21 17:08 ` [PATCH 6/6] mach-ux500: remove intermediary add_platform_device* functions Lee Jones
2012-01-23 15:58 ` [PATCH 0/6] ux500: Export SoC information and some platform clean-up Arnd Bergmann
2012-01-23 16:03 ` Arnd Bergmann
2012-01-24 22:53 ` Linus Walleij
2012-01-25 15:01 ` Arnd Bergmann
2012-01-25 17:16 ` Lee Jones
2012-01-26 15:20 ` Arnd Bergmann
2012-01-27 0:56 ` Greg KH
2012-01-27 14:00 ` Linus Walleij
-- strict thread matches above, loose matches on Subject: below --
2012-02-06 19:22 Lee Jones
2012-02-06 19:22 ` [PATCH 2/6] drivers/base: add bus for System-on-Chip devices Lee Jones
2012-02-01 9:23 [PATCH 0/6] ux500: Export SoC information and some platform clean-up Lee Jones
2012-02-01 9:23 ` [PATCH 2/6] drivers/base: add bus for System-on-Chip devices Lee Jones
2012-02-01 15:52 ` Jamie Iles
2012-02-01 16:55 ` Arnd Bergmann
2012-01-20 16:10 [PATCH 0/6] ux500: Export SoC information and some platform clean-up Lee Jones
2012-01-20 16:10 ` [PATCH 2/6] drivers/base: add bus for System-on-Chip devices Lee Jones
2012-01-20 16:36 ` Greg KH
[not found] ` <CANmRt2gZe7dfRe5T8fS-1LGkeQXOBzcrbzL8xU+J9M7X4ZuDrA@mail.gmail.com>
2012-01-20 18:20 ` Greg KH
2012-01-20 16:39 ` Greg KH
[not found] ` <CANmRt2j4woAAg3dEtyQG4rjxRQ5Sx+4OW84Mathk4_YrFTjChQ@mail.gmail.com>
2012-01-20 18:10 ` Greg KH
2011-10-17 11:52 [PATCH 0/6] ux500: Export SoC information and some platform clean-up Lee Jones
2011-10-17 11:52 ` [PATCH 2/6] drivers/base: add bus for System-on-Chip devices Lee Jones
2011-10-17 11:52 ` Lee Jones
2011-10-17 12:13 ` Jamie Iles
2011-10-17 12:13 ` Jamie Iles
2011-10-17 16:16 ` Greg KH
2011-10-17 16:16 ` Greg KH
2011-10-17 18:03 ` Arnd Bergmann
2011-10-17 18:03 ` Arnd Bergmann
2011-10-17 18:25 ` Greg KH
2011-10-17 18:25 ` Greg KH
2011-10-18 14:00 ` Arnd Bergmann
2011-10-18 14:00 ` Arnd Bergmann
2011-10-18 14:44 ` Greg KH
2011-10-18 14:44 ` Greg KH
2011-10-18 11:12 ` Lee Jones
2011-10-18 11:12 ` Lee Jones
2011-10-18 14:14 ` Arnd Bergmann
2011-10-18 14:14 ` Arnd Bergmann
2011-10-18 14:41 ` Greg KH
2011-10-18 14:41 ` Greg KH
2011-10-18 14:43 ` Greg KH
2011-10-18 14:43 ` Greg KH
2011-10-17 16:18 ` Greg KH
2011-10-17 16:18 ` Greg KH
2011-10-18 11:14 ` Lee Jones
2011-10-18 11:14 ` Lee Jones
2011-10-18 14:05 ` Arnd Bergmann
2011-10-18 14:05 ` Arnd Bergmann
2011-10-18 14:15 ` Jamie Iles
2011-10-18 14:15 ` Jamie Iles
2011-10-18 14:38 ` Greg KH
2011-10-18 14:38 ` Greg KH
2011-10-18 14:53 ` Arnd Bergmann
2011-10-18 14:53 ` Arnd Bergmann
2011-10-18 14:56 ` Jamie Iles
2011-10-18 14:56 ` Jamie Iles
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=20120128010534.GA20581@kroah.com \
--to=greg@kroah.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.