diff options
Diffstat (limited to 'arch/arm/mach-omap2/id.c')
| -rw-r--r-- | arch/arm/mach-omap2/id.c | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 3737700529f..098e94e3133 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c @@ -18,6 +18,11 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/io.h> +#include <linux/slab.h> + +#ifdef CONFIG_SOC_BUS +#include <linux/sys_soc.h> +#endif  #include <asm/cputype.h> @@ -583,3 +588,63 @@ void __init omap2_set_globals_tap(u32 class, void __iomem *tap)  	else  		tap_prod_id = 0x0208;  } + +#ifdef CONFIG_SOC_BUS + +static const char const *omap_types[] = { +	[OMAP2_DEVICE_TYPE_TEST]	= "TST", +	[OMAP2_DEVICE_TYPE_EMU]		= "EMU", +	[OMAP2_DEVICE_TYPE_SEC]		= "HS", +	[OMAP2_DEVICE_TYPE_GP]		= "GP", +	[OMAP2_DEVICE_TYPE_BAD]		= "BAD", +}; + +static const char * __init omap_get_family(void) +{ +	if (cpu_is_omap24xx()) +		return kasprintf(GFP_KERNEL, "OMAP2"); +	else if (cpu_is_omap34xx()) +		return kasprintf(GFP_KERNEL, "OMAP3"); +	else if (cpu_is_omap44xx()) +		return kasprintf(GFP_KERNEL, "OMAP4"); +	else if (soc_is_omap54xx()) +		return kasprintf(GFP_KERNEL, "OMAP5"); +	else +		return kasprintf(GFP_KERNEL, "Unknown"); +} + +static ssize_t omap_get_type(struct device *dev, +					struct device_attribute *attr, +					char *buf) +{ +	return sprintf(buf, "%s\n", omap_types[omap_type()]); +} + +static struct device_attribute omap_soc_attr = +	__ATTR(type,  S_IRUGO, omap_get_type,  NULL); + +void __init omap_soc_device_init(void) +{ +	struct device *parent; +	struct soc_device *soc_dev; +	struct soc_device_attribute *soc_dev_attr; + +	soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); +	if (!soc_dev_attr) +		return; + +	soc_dev_attr->machine  = soc_name; +	soc_dev_attr->family   = omap_get_family(); +	soc_dev_attr->revision = soc_rev; + +	soc_dev = soc_device_register(soc_dev_attr); +	if (IS_ERR_OR_NULL(soc_dev)) { +		kfree(soc_dev_attr); +		return; +	} + +	parent = soc_device_to_device(soc_dev); +	if (!IS_ERR_OR_NULL(parent)) +		device_create_file(parent, &omap_soc_attr); +} +#endif /* CONFIG_SOC_BUS */ |