diff options
Diffstat (limited to 'drivers/mfd/db8500-prcmu.c')
| -rw-r--r-- | drivers/mfd/db8500-prcmu.c | 72 | 
1 files changed, 45 insertions, 27 deletions
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 21434beb420..319b8abe742 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c @@ -24,6 +24,7 @@  #include <linux/jiffies.h>  #include <linux/bitops.h>  #include <linux/fs.h> +#include <linux/of.h>  #include <linux/platform_device.h>  #include <linux/uaccess.h>  #include <linux/mfd/core.h> @@ -2704,6 +2705,7 @@ static void dbx500_fw_version_init(struct platform_device *pdev,  {  	struct resource *res;  	void __iomem *tcpm_base; +	u32 version;  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM,  					   "prcmu-tcpm"); @@ -2713,26 +2715,27 @@ static void dbx500_fw_version_init(struct platform_device *pdev,  		return;  	}  	tcpm_base = ioremap(res->start, resource_size(res)); -	if (tcpm_base != NULL) { -		u32 version; - -		version = readl(tcpm_base + version_offset); -		fw_info.version.project = (version & 0xFF); -		fw_info.version.api_version = (version >> 8) & 0xFF; -		fw_info.version.func_version = (version >> 16) & 0xFF; -		fw_info.version.errata = (version >> 24) & 0xFF; -		strncpy(fw_info.version.project_name, -			fw_project_name(fw_info.version.project), -			PRCMU_FW_PROJECT_NAME_LEN); -		fw_info.valid = true; -		pr_info("PRCMU firmware: %s(%d), version %d.%d.%d\n", -			fw_info.version.project_name, -			fw_info.version.project, -			fw_info.version.api_version, -			fw_info.version.func_version, -			fw_info.version.errata); -		iounmap(tcpm_base); +	if (!tcpm_base) { +		dev_err(&pdev->dev, "no prcmu tcpm mem region provided\n"); +		return;  	} + +	version = readl(tcpm_base + version_offset); +	fw_info.version.project = (version & 0xFF); +	fw_info.version.api_version = (version >> 8) & 0xFF; +	fw_info.version.func_version = (version >> 16) & 0xFF; +	fw_info.version.errata = (version >> 24) & 0xFF; +	strncpy(fw_info.version.project_name, +		fw_project_name(fw_info.version.project), +		PRCMU_FW_PROJECT_NAME_LEN); +	fw_info.valid = true; +	pr_info("PRCMU firmware: %s(%d), version %d.%d.%d\n", +		fw_info.version.project_name, +		fw_info.version.project, +		fw_info.version.api_version, +		fw_info.version.func_version, +		fw_info.version.errata); +	iounmap(tcpm_base);  }  void __init db8500_prcmu_early_init(u32 phy_base, u32 size) @@ -3065,6 +3068,15 @@ static struct db8500_thsens_platform_data db8500_thsens_data = {  	.num_trips = 4,  }; +static struct mfd_cell common_prcmu_devs[] = { +	{ +		.name = "ux500_wdt", +		.platform_data = &db8500_wdt_pdata, +		.pdata_size = sizeof(db8500_wdt_pdata), +		.id = -1, +	}, +}; +  static struct mfd_cell db8500_prcmu_devs[] = {  	{  		.name = "db8500-prcmu-regulators", @@ -3079,12 +3091,6 @@ static struct mfd_cell db8500_prcmu_devs[] = {  		.pdata_size = sizeof(db8500_cpufreq_table),  	},  	{ -		.name = "ux500_wdt", -		.platform_data = &db8500_wdt_pdata, -		.pdata_size = sizeof(db8500_wdt_pdata), -		.id = -1, -	}, -	{  		.name = "db8500-thermal",  		.num_resources = ARRAY_SIZE(db8500_thsens_resources),  		.resources = db8500_thsens_resources, @@ -3173,13 +3179,25 @@ static int db8500_prcmu_probe(struct platform_device *pdev)  	db8500_prcmu_update_cpufreq(); -	err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, -			      ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, db8500_irq_domain); +	err = mfd_add_devices(&pdev->dev, 0, common_prcmu_devs, +			      ARRAY_SIZE(common_prcmu_devs), NULL, 0, db8500_irq_domain);  	if (err) {  		pr_err("prcmu: Failed to add subdevices\n");  		return err;  	} +	/* TODO: Remove restriction when clk definitions are available. */ +	if (!of_machine_is_compatible("st-ericsson,u8540")) { +		err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, +				      ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, +				      db8500_irq_domain); +		if (err) { +			mfd_remove_devices(&pdev->dev); +			pr_err("prcmu: Failed to add subdevices\n"); +			goto no_irq_return; +		} +	} +  	err = db8500_prcmu_register_ab8500(&pdev->dev, pdata->ab_platdata,  					   pdata->ab_irq);  	if (err) {  |