|
@@ -565,3 +565,173 @@ static struct resource omap3_aes_resources[] = {
|
|
|
.flags = IORESOURCE_DMA,
|
|
|
},
|
|
|
{
|
|
|
+ .start = OMAP34XX_DMA_AES2_RX,
|
|
|
+ .flags = IORESOURCE_DMA,
|
|
|
+ }
|
|
|
+};
|
|
|
+static int omap3_aes_resources_sz = ARRAY_SIZE(omap3_aes_resources);
|
|
|
+#else
|
|
|
+#define omap3_aes_resources NULL
|
|
|
+#define omap3_aes_resources_sz 0
|
|
|
+#endif
|
|
|
+
|
|
|
+static struct platform_device aes_device = {
|
|
|
+ .name = "omap-aes",
|
|
|
+ .id = -1,
|
|
|
+};
|
|
|
+
|
|
|
+static void omap_init_aes(void)
|
|
|
+{
|
|
|
+ if (cpu_is_omap24xx()) {
|
|
|
+ aes_device.resource = omap2_aes_resources;
|
|
|
+ aes_device.num_resources = omap2_aes_resources_sz;
|
|
|
+ } else if (cpu_is_omap34xx()) {
|
|
|
+ aes_device.resource = omap3_aes_resources;
|
|
|
+ aes_device.num_resources = omap3_aes_resources_sz;
|
|
|
+ } else {
|
|
|
+ pr_err("%s: platform not supported\n", __func__);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ platform_device_register(&aes_device);
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+static inline void omap_init_aes(void) { }
|
|
|
+#endif
|
|
|
+
|
|
|
+/*-------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+#if defined(CONFIG_VIDEO_OMAP2_VOUT) || \
|
|
|
+ defined(CONFIG_VIDEO_OMAP2_VOUT_MODULE)
|
|
|
+#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
|
|
|
+static struct resource omap_vout_resource[3 - CONFIG_FB_OMAP2_NUM_FBS] = {
|
|
|
+};
|
|
|
+#else
|
|
|
+static struct resource omap_vout_resource[2] = {
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+static struct platform_device omap_vout_device = {
|
|
|
+ .name = "omap_vout",
|
|
|
+ .num_resources = ARRAY_SIZE(omap_vout_resource),
|
|
|
+ .resource = &omap_vout_resource[0],
|
|
|
+ .id = -1,
|
|
|
+};
|
|
|
+static void omap_init_vout(void)
|
|
|
+{
|
|
|
+ if (platform_device_register(&omap_vout_device) < 0)
|
|
|
+ printk(KERN_ERR "Unable to register OMAP-VOUT device\n");
|
|
|
+}
|
|
|
+#else
|
|
|
+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 __init 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)
|
|
|
+{
|
|
|
+ /* Enable dummy states for those platforms without pinctrl support */
|
|
|
+ if (!of_have_populated_dt())
|
|
|
+ pinctrl_provide_dummies();
|
|
|
+
|
|
|
+ /*
|
|
|
+ * please keep these calls, and their implementations above,
|
|
|
+ * in alphabetical order so they're easier to sort through.
|
|
|
+ */
|
|
|
+ omap_init_audio();
|
|
|
+ omap_init_camera();
|
|
|
+ omap_init_hdmi_audio();
|
|
|
+ omap_init_mbox();
|
|
|
+ /* If dtb is there, the devices will be created dynamically */
|
|
|
+ if (!of_have_populated_dt()) {
|
|
|
+ omap_init_dmic();
|
|
|
+ omap_init_mcpdm();
|
|
|
+ omap_init_mcspi();
|
|
|
+ }
|
|
|
+ omap_init_sti();
|
|
|
+ omap_init_rng();
|
|
|
+ omap_init_sham();
|
|
|
+ omap_init_aes();
|
|
|
+ omap_init_vout();
|
|
|
+ omap_init_ocp2scp();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+arch_initcall(omap2_init_devices);
|