diff options
Diffstat (limited to 'arch/arm/mach-omap2/devices.c')
| -rw-r--r-- | arch/arm/mach-omap2/devices.c | 115 | 
1 files changed, 85 insertions, 30 deletions
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 6cd0c2a36a2..3cff7dc514d 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -19,14 +19,16 @@  #include <linux/of.h>  #include <linux/pinctrl/machine.h>  #include <linux/platform_data/omap4-keypad.h> +#include <linux/platform_data/omap_ocp2scp.h>  #include <asm/mach-types.h>  #include <asm/mach/map.h> +#include <plat-omap/dma-omap.h> +  #include "iomap.h" -#include <plat/dma.h> -#include <plat/omap_hwmod.h> -#include <plat/omap_device.h> +#include "omap_hwmod.h" +#include "omap_device.h"  #include "omap4-keypad.h"  #include "soc.h" @@ -34,6 +36,7 @@  #include "mux.h"  #include "control.h"  #include "devices.h" +#include "dma.h"  #define L3_MODULES_MAX_LEN 12  #define L3_MODULES 3 @@ -341,7 +344,7 @@ static void __init omap_init_dmic(void)  	oh = omap_hwmod_lookup("dmic");  	if (!oh) { -		printk(KERN_ERR "Could not look up mcpdm hw_mod\n"); +		pr_err("Could not look up dmic hw_mod\n");  		return;  	} @@ -613,6 +616,83 @@ static void omap_init_vout(void)  static inline void omap_init_vout(void) {}  #endif +#if defined(CONFIG_OMAP_OCP2SCP) || defined(CONFIG_OMAP_OCP2SCP_MODULE) +static int count_ocp2scp_devices(struct omap_ocp2scp_dev *ocp2scp_dev) +{ +	int cnt	= 0; + +	while (ocp2scp_dev->drv_name != NULL) { +		cnt++; +		ocp2scp_dev++; +	} + +	return cnt; +} + +static void omap_init_ocp2scp(void) +{ +	struct omap_hwmod	*oh; +	struct platform_device	*pdev; +	int			bus_id = -1, dev_cnt = 0, i; +	struct omap_ocp2scp_dev	*ocp2scp_dev; +	const char		*oh_name, *name; +	struct omap_ocp2scp_platform_data *pdata; + +	if (!cpu_is_omap44xx()) +		return; + +	oh_name = "ocp2scp_usb_phy"; +	name	= "omap-ocp2scp"; + +	oh = omap_hwmod_lookup(oh_name); +	if (!oh) { +		pr_err("%s: could not find omap_hwmod for %s\n", __func__, +								oh_name); +		return; +	} + +	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); +	if (!pdata) { +		pr_err("%s: No memory for ocp2scp pdata\n", __func__); +		return; +	} + +	ocp2scp_dev = oh->dev_attr; +	dev_cnt = count_ocp2scp_devices(ocp2scp_dev); + +	if (!dev_cnt) { +		pr_err("%s: No devices connected to ocp2scp\n", __func__); +		kfree(pdata); +		return; +	} + +	pdata->devices = kzalloc(sizeof(struct omap_ocp2scp_dev *) +					* dev_cnt, GFP_KERNEL); +	if (!pdata->devices) { +		pr_err("%s: No memory for ocp2scp pdata devices\n", __func__); +		kfree(pdata); +		return; +	} + +	for (i = 0; i < dev_cnt; i++, ocp2scp_dev++) +		pdata->devices[i] = ocp2scp_dev; + +	pdata->dev_cnt	= dev_cnt; + +	pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), NULL, +								0, false); +	if (IS_ERR(pdev)) { +		pr_err("Could not build omap_device for %s %s\n", +						name, oh_name); +		kfree(pdata->devices); +		kfree(pdata); +		return; +	} +} +#else +static inline void omap_init_ocp2scp(void) { } +#endif +  /*-------------------------------------------------------------------------*/  static int __init omap2_init_devices(void) @@ -640,33 +720,8 @@ static int __init omap2_init_devices(void)  	omap_init_sham();  	omap_init_aes();  	omap_init_vout(); +	omap_init_ocp2scp();  	return 0;  }  arch_initcall(omap2_init_devices); - -#if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE) -static int __init omap_init_wdt(void) -{ -	int id = -1; -	struct platform_device *pdev; -	struct omap_hwmod *oh; -	char *oh_name = "wd_timer2"; -	char *dev_name = "omap_wdt"; - -	if (!cpu_class_is_omap2() || of_have_populated_dt()) -		return 0; - -	oh = omap_hwmod_lookup(oh_name); -	if (!oh) { -		pr_err("Could not look up wd_timer%d hwmod\n", id); -		return -EINVAL; -	} - -	pdev = omap_device_build(dev_name, id, oh, NULL, 0, NULL, 0, 0); -	WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", -				dev_name, oh->name); -	return 0; -} -subsys_initcall(omap_init_wdt); -#endif  |