|
@@ -12,7 +12,7 @@
|
|
|
*/
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
-#include <linux/dma-mapping.h>
|
|
|
+#include <linux/dma-contiguous.h>
|
|
|
#include <linux/serial_8250.h>
|
|
|
#include <linux/ahci_platform.h>
|
|
|
#include <linux/clk.h>
|
|
@@ -714,6 +714,92 @@ int __init da850_register_mmcsd1(struct davinci_mmc_config *config)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+static struct resource da8xx_rproc_resources[] = {
|
|
|
+ { /* DSP boot address */
|
|
|
+ .start = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG,
|
|
|
+ .end = DA8XX_SYSCFG0_BASE + DA8XX_HOST1CFG_REG + 3,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ { /* DSP interrupt registers */
|
|
|
+ .start = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG,
|
|
|
+ .end = DA8XX_SYSCFG0_BASE + DA8XX_CHIPSIG_REG + 7,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ { /* dsp irq */
|
|
|
+ .start = IRQ_DA8XX_CHIPINT0,
|
|
|
+ .end = IRQ_DA8XX_CHIPINT0,
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device da8xx_dsp = {
|
|
|
+ .name = "davinci-rproc",
|
|
|
+ .dev = {
|
|
|
+ .coherent_dma_mask = DMA_BIT_MASK(32),
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(da8xx_rproc_resources),
|
|
|
+ .resource = da8xx_rproc_resources,
|
|
|
+};
|
|
|
+
|
|
|
+#if IS_ENABLED(CONFIG_DA8XX_REMOTEPROC)
|
|
|
+
|
|
|
+static phys_addr_t rproc_base __initdata;
|
|
|
+static unsigned long rproc_size __initdata;
|
|
|
+
|
|
|
+static int __init early_rproc_mem(char *p)
|
|
|
+{
|
|
|
+ char *endp;
|
|
|
+
|
|
|
+ if (p == NULL)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ rproc_size = memparse(p, &endp);
|
|
|
+ if (*endp == '@')
|
|
|
+ rproc_base = memparse(endp + 1, NULL);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+early_param("rproc_mem", early_rproc_mem);
|
|
|
+
|
|
|
+void __init da8xx_rproc_reserve_cma(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ if (!rproc_base || !rproc_size) {
|
|
|
+ pr_err("%s: 'rproc_mem=nn@address' badly specified\n"
|
|
|
+ " 'nn' and 'address' must both be non-zero\n",
|
|
|
+ __func__);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ pr_info("%s: reserving 0x%lx @ 0x%lx...\n",
|
|
|
+ __func__, rproc_size, (unsigned long)rproc_base);
|
|
|
+
|
|
|
+ ret = dma_declare_contiguous(&da8xx_dsp.dev, rproc_size, rproc_base, 0);
|
|
|
+ if (ret)
|
|
|
+ pr_err("%s: dma_declare_contiguous failed %d\n", __func__, ret);
|
|
|
+}
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+void __init da8xx_rproc_reserve_cma(void)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
+int __init da8xx_register_rproc(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = platform_device_register(&da8xx_dsp);
|
|
|
+ if (ret)
|
|
|
+ pr_err("%s: can't register DSP device: %d\n", __func__, ret);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+};
|
|
|
+
|
|
|
static struct resource da8xx_rtc_resources[] = {
|
|
|
{
|
|
|
.start = DA8XX_RTC_BASE,
|