On Wed, Feb 15, 2017 at 07:09:41PM +0800, thloh wrote: > From: "Loh, Tien Hock" <tien.hock....@intel.com> > > This patch is to add Altera System ID driver. > User can obtain the system ID and timestamp of the system by > reading the sysfs entry. > > Usage: > cat /sys/bus/platform/devices/[addr].sysid/sysid/id > cat /sys/bus/platform/devices/[addr].sysid/sysid/timestamp
If you add new sysfs attributes, you need to also add a Documentation/ABI/ description as well. > > Signed-off-by: Loh, Tien Hock <tien.hock....@intel.com> > --- > drivers/misc/Kconfig | 5 ++ > drivers/misc/Makefile | 1 + > drivers/misc/intel_sysid.c | 142 > ++++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 148 insertions(+), 0 deletions(-) > create mode 100644 drivers/misc/intel_sysid.c > > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > index b4d6aac..e5552fa 100644 > --- a/drivers/misc/Kconfig > +++ b/drivers/misc/Kconfig > @@ -139,6 +139,11 @@ config INTEL_MID_PTI > an Intel Atom (non-netbook) mobile device containing a MIPI > P1149.7 standard implementation. > > +config INTEL_SYSID > + tristate "Intel System ID" > + help > + This enables Intel System ID soft core driver. > + > config SGI_IOC4 > tristate "SGI IOC4 Base IO support" > depends on PCI > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > index 7a3ea89..24fe724 100644 > --- a/drivers/misc/Makefile > +++ b/drivers/misc/Makefile > @@ -43,6 +43,7 @@ obj-y += ti-st/ > obj-y += lis3lv02d/ > obj-$(CONFIG_USB_SWITCH_FSA9480) += fsa9480.o > obj-$(CONFIG_ALTERA_STAPL) +=altera-stapl/ > +obj-$(CONFIG_INTEL_SYSID) += intel_sysid.o > obj-$(CONFIG_INTEL_MEI) += mei/ > obj-$(CONFIG_VMWARE_VMCI) += vmw_vmci/ > obj-$(CONFIG_LATTICE_ECP3_CONFIG) += lattice-ecp3-config.o > diff --git a/drivers/misc/intel_sysid.c b/drivers/misc/intel_sysid.c > new file mode 100644 > index 0000000..1ef72b8 > --- /dev/null > +++ b/drivers/misc/intel_sysid.c > @@ -0,0 +1,142 @@ > +/* > + * Copyright Intel Corporation (C) 2017. > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms and conditions of the GNU General Public License, > + * version 2, as published by the Free Software Foundation. > + * > + * This program is distributed in the hope it will be useful, but WITHOUT > + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for > + * more details. > + * > + * You should have received a copy of the GNU General Public License along > with > + * this program. If not, see <http://www.gnu.org/licenses/>. > + * > + * Credit: > + * Walter Goossens > + */ > + > +#include <linux/device.h> > +#include <linux/kernel.h> > +#include <linux/io.h> > +#include <linux/module.h> > +#include <linux/of.h> > +#include <linux/platform_device.h> > +#include <linux/slab.h> > + > +#define DRV_NAME "intel_sysid" > + > +struct intel_sysid { > + void __iomem *regs; > +}; > + > +/* System ID Registers*/ > +#define SYSID_REG_ID (0x0) > +#define SYSID_REG_TIMESTAMP (0x4) > + > +static ssize_t intel_sysid_show_id(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct intel_sysid *sysid = dev_get_drvdata(dev); > + > + return sprintf(buf, "%u\n", readl(sysid->regs + SYSID_REG_ID)); > +} > + > +static ssize_t intel_sysid_show_timestamp(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + unsigned int reg; > + struct tm timestamp; > + struct intel_sysid *sysid = dev_get_drvdata(dev); > + > + reg = readl(sysid->regs + SYSID_REG_TIMESTAMP); > + > + time_to_tm(reg, 0, ×tamp); > + > + return sprintf(buf, "%u (%u-%u-%u %u:%u:%u UTC)\n", reg, > + (unsigned int)(timestamp.tm_year + 1900), > + timestamp.tm_mon + 1, timestamp.tm_mday, timestamp.tm_hour, > + timestamp.tm_min, timestamp.tm_sec); > +} > + > +static DEVICE_ATTR(id, S_IRUGO, intel_sysid_show_id, NULL); > +static DEVICE_ATTR(timestamp, S_IRUGO, intel_sysid_show_timestamp, NULL); DEVICE_ATTR_RO()? > +static struct attribute *intel_sysid_attrs[] = { > + &dev_attr_id.attr, > + &dev_attr_timestamp.attr, > + NULL, > +}; > + > +struct attribute_group intel_sysid_attr_group = { > + .name = "sysid", > + .attrs = intel_sysid_attrs, > +}; ATTRIBUTE_GROUP()? thanks, greg k-h