diff options
| -rw-r--r-- | arch/arm/mach-omap2/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/common.h | 8 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/id.c | 65 | ||||
| -rw-r--r-- | arch/arm/mach-omap2/io.c | 1 | 
4 files changed, 75 insertions, 0 deletions
| diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 8111cd9ff3e..68b1802879e 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -15,6 +15,7 @@ config ARCH_OMAP2PLUS  	select OMAP_DM_TIMER  	select PINCTRL  	select PROC_DEVICETREE if PROC_FS +	select SOC_BUS  	select SPARSE_IRQ  	select USE_OF  	help diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index d6ba13e1c54..1ddd0cb5fab 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h @@ -110,6 +110,14 @@ void am35xx_init_late(void);  void ti81xx_init_late(void);  int omap2_common_pm_late_init(void); +#ifdef CONFIG_SOC_BUS +void omap_soc_device_init(void); +#else +static inline void omap_soc_device_init(void) +{ +} +#endif +  #if defined(CONFIG_SOC_OMAP2420) || defined(CONFIG_SOC_OMAP2430)  void omap2xxx_restart(char mode, const char *cmd);  #else 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 */ diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index 865688e6933..3241f23afe0 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c @@ -389,6 +389,7 @@ static void __init omap_common_late_init(void)  {  	omap_mux_late_init();  	omap2_common_pm_late_init(); +	omap_soc_device_init();  }  #ifdef CONFIG_SOC_OMAP2420 |