soc/tegra: move soc_device_register call out of arch/arm
Subsystems (3)
PATCH 1/1 soc/tegra: move soc_device_register call out of arch/arm
Expending the usage for both Tegra & Tegra64 SoCs.
--- arch/arm/mach-tegra/tegra.c | 31 +------------------------------ drivers/soc/tegra/common.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 30 deletions(-)
arch/arm/mach-tegra/tegra.c +1 -30
@@ -87,36 +87,7 @@ static void __init tegra_dt_init_irq(void)static void __init tegra_dt_init (void ) { -struct soc_device_attribute *soc_dev_attr; -struct soc_device *soc_dev; -struct device *parent =NULL ; - - soc_dev_attr =kzalloc (sizeof (*soc_dev_attr),GFP_KERNEL ); -if (!soc_dev_attr) - goto out; - - soc_dev_attr->family =kasprintf (GFP_KERNEL ,"Tegra" ); - soc_dev_attr->revision =kasprintf (GFP_KERNEL ,"%d" , - tegra_sku_info.revision); - soc_dev_attr->soc_id =kasprintf (GFP_KERNEL ,"%u" ,tegra_get_chip_id ()); - - soc_dev =soc_device_register (soc_dev_attr); -if (IS_ERR (soc_dev)) { -kfree (soc_dev_attr->family); -kfree (soc_dev_attr->revision); -kfree (soc_dev_attr->soc_id); -kfree (soc_dev_attr); - goto out; - } - - parent =soc_device_to_device (soc_dev); - -/* -* Finished with the static registrations now; fill in the missing -* devices -*/ -out: -of_platform_populate (NULL , of_default_bus_match_table,NULL , parent); +of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }static void __init paz00_init (void )
drivers/soc/tegra/common.c +33 -0
@@ -7,8 +7,11 @@*/ #include <linux/of.h> +#include <linux/slab.h> +#include <linux/sys_soc.h> #include <soc/tegra/common.h> +#include <soc/tegra/fuse.h> static const struct of_device_id tegra_machine_match[] = { { .compatible ="nvidia,tegra20" , },
@@ -28,3 +31,33 @@ bool soc_is_tegra(void)return of_match_node (tegra_machine_match, root) !=NULL ; } + +static int __init tegra_soc_init (void ) +{ +struct soc_device_attribute *soc_dev_attr; +struct soc_device *soc_dev; + +if (!soc_is_tegra ()) +return 0 ; + + soc_dev_attr =kzalloc (sizeof (*soc_dev_attr),GFP_KERNEL ); +if (!soc_dev_attr) +return -ENOMEM ; + + soc_dev_attr->family =kasprintf (GFP_KERNEL ,"Tegra" ); + soc_dev_attr->revision =kasprintf (GFP_KERNEL ,"%d" , + tegra_sku_info.revision); + soc_dev_attr->soc_id =kasprintf (GFP_KERNEL ,"%u" ,tegra_get_chip_id ()); + + soc_dev =soc_device_register (soc_dev_attr); +if (IS_ERR (soc_dev)) { +kfree (soc_dev_attr->family); +kfree (soc_dev_attr->revision); +kfree (soc_dev_attr->soc_id); +kfree (soc_dev_attr); +return -ENODEV ; + } + +return 0 ; +} +device_initcall (tegra_soc_init);
Signature · 1 line
2.3.1
PATCH 1/1 soc/tegra: move soc_device_register call out of arch/arm
Quoted 37 lines · Joseph Lo
Expending the usage for both Tegra & Tegra64 SoCs.
Signed-off-by Joseph Lo <[email protected]>--- arch/arm/mach-tegra/tegra.c | 31 +------------------------------ drivers/soc/tegra/common.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 30 deletions(-)arch/arm/mach-tegra/tegra.c +0
-21@@ -87,36 +87,7 @@ static void __init tegra_dt_init_irq(void)static void __init tegra_dt_init (void ) { -struct soc_device_attribute *soc_dev_attr; -struct soc_device *soc_dev; -struct device *parent =NULL ; - - soc_dev_attr =kzalloc (sizeof (*soc_dev_attr),GFP_KERNEL ); -if (!soc_dev_attr) - goto out; - - soc_dev_attr->family =kasprintf (GFP_KERNEL ,"Tegra" ); - soc_dev_attr->revision =kasprintf (GFP_KERNEL ,"%d" , - tegra_sku_info.revision); - soc_dev_attr->soc_id =kasprintf (GFP_KERNEL ,"%u" ,tegra_get_chip_id ()); - - soc_dev =soc_device_register (soc_dev_attr); -if (IS_ERR (soc_dev)) { -kfree (soc_dev_attr->family); -kfree (soc_dev_attr->revision); -kfree (soc_dev_attr->soc_id); -kfree (soc_dev_attr); - goto out; - }
arch/arm/mach-tegra/tegra.c static void __init tegra_dt_init_irq(void) · line 90
Quoted 10 lines
arch/arm/mach-tegra/tegra.c +1
-9- - parent =soc_device_to_device (soc_dev); - -/* -* Finished with the static registrations now; fill in the missing -* devices -*/ -out: -of_platform_populate (NULL , of_default_bus_match_table,NULL , parent); +of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL );
One of the reasons for adding the soc_device in the first place was so that it would be possible to use it as the parent for all devices that are instantiated from device tree. You remove that here, and break the ABI in the process. Arguably no userspace should be relying on the exact path in sysfs, but I'd still like to keep the top-level parent.
Which reminds me of a discussion a while back about introducing a top- level driver for the SoC. I'm not sure if anything came of that.
Stephen, do you know if there was a conclusion on that discussion? As far as I remember this sparked around the time when we moved drivers to drivers/soc and started splitting things up into initcalls. I'm thinking that if nothing like that was created yet, perhaps soc_device and soc_bus_type would be good candidates to implement this on top of.
Thierry
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20150311/2a5fc161/attachment.sig>
PATCH 1/1 soc/tegra: move soc_device_register call out of arch/arm
Quoted 48 lines · Thierry Reding
* PGP Signed by an unknown key
Quoted 45 lines · Joseph Lo
Expending the usage for both Tegra & Tegra64 SoCs.
Signed-off-by Joseph Lo <[email protected]>--- arch/arm/mach-tegra/tegra.c | 31 +------------------------------ drivers/soc/tegra/common.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 30 deletions(-)arch/arm/mach-tegra/tegra.c +0
-29@@ -87,36 +87,7 @@ static void __init tegra_dt_init_irq(void)static void __init tegra_dt_init (void ) { -struct soc_device_attribute *soc_dev_attr; -struct soc_device *soc_dev; -struct device *parent =NULL ; - - soc_dev_attr =kzalloc (sizeof (*soc_dev_attr),GFP_KERNEL ); -if (!soc_dev_attr) - goto out; - - soc_dev_attr->family =kasprintf (GFP_KERNEL ,"Tegra" ); - soc_dev_attr->revision =kasprintf (GFP_KERNEL ,"%d" , - tegra_sku_info.revision); - soc_dev_attr->soc_id =kasprintf (GFP_KERNEL ,"%u" ,tegra_get_chip_id ()); - - soc_dev =soc_device_register (soc_dev_attr); -if (IS_ERR (soc_dev)) { -kfree (soc_dev_attr->family); -kfree (soc_dev_attr->revision); -kfree (soc_dev_attr->soc_id); -kfree (soc_dev_attr); - goto out; - } - - parent =soc_device_to_device (soc_dev); - -/* -* Finished with the static registrations now; fill in the missing -* devices -*/ -out:
Quoted 9 lines
arch/arm/mach-tegra/tegra.c static void __init tegra_dt_init_irq(void) · line 90
Quoted 2 lines
arch/arm/mach-tegra/tegra.c +1
-1-of_platform_populate (NULL , of_default_bus_match_table,NULL , parent); +of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL );One of the reasons for adding the
soc_devicein the first place was so that it would be possible to use it as the parent for all devices that are instantiated from device tree. You remove that here, and break the ABI in the process. Arguably no userspace should be relying on the exact path in sysfs, but I'd still like to keep the top-level parent.
That would be a problem if you want to keep the same "ABI" in ARM64 kernel.
Quoted 14 lines
Which reminds me of a discussion a while back about introducing a top- level driver for the SoC. I'm not sure if anything came of that.
Stephen, do you know if there was a conclusion on that discussion? As far as I remember this sparked around the time when we moved drivers to
drivers/socand started splitting things up into initcalls. I'm thinking that if nothing like that was created yet, perhapssoc_deviceandsoc_bus_typewould be good candidates to implement this on top of.Thierry
* Unknown Key
*0x7F3EB3A1
PATCH 1/1 soc/tegra: move soc_device_register call out of arch/arm
In reply to Joseph LoQuoted 1 line · Joseph Lo
Expending the usage for both Tegra & Tegra64 SoCs.
Expanding? Mabe better: Moving this code to drivers/soc/tegra allows the aarch64 SoCs to use it, too.
Best regards
Uwe
Signature · 2 lines
Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |
PATCH 1/1 soc/tegra: move soc_device_register call out of arch/arm
Oops, sorry for typo. Thanks, Uwe.
Quoted 8 lines · Uwe Kleine-K?nig
Quoted 1 line · Joseph Lo
Expending the usage for both Tegra & Tegra64 SoCs.
Expanding? Mabe better: Moving this code to
drivers/soc/tegraallows the aarch64 SoCs to use it, too.Best regards
Uwe