|
@@ -889,3 +889,197 @@ static struct resource s5p_mfc_resource[] = {
|
|
|
struct platform_device s5p_device_mfc = {
|
|
|
.name = "s5p-mfc",
|
|
|
.id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(s5p_mfc_resource),
|
|
|
+ .resource = s5p_mfc_resource,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * MFC hardware has 2 memory interfaces which are modelled as two separate
|
|
|
+ * platform devices to let dma-mapping distinguish between them.
|
|
|
+ *
|
|
|
+ * MFC parent device (s5p_device_mfc) must be registered before memory
|
|
|
+ * interface specific devices (s5p_device_mfc_l and s5p_device_mfc_r).
|
|
|
+ */
|
|
|
+
|
|
|
+struct platform_device s5p_device_mfc_l = {
|
|
|
+ .name = "s5p-mfc-l",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .parent = &s5p_device_mfc.dev,
|
|
|
+ .dma_mask = &samsung_device_dma_mask,
|
|
|
+ .coherent_dma_mask = DMA_BIT_MASK(32),
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s5p_device_mfc_r = {
|
|
|
+ .name = "s5p-mfc-r",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .parent = &s5p_device_mfc.dev,
|
|
|
+ .dma_mask = &samsung_device_dma_mask,
|
|
|
+ .coherent_dma_mask = DMA_BIT_MASK(32),
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+#endif /* CONFIG_S5P_DEV_MFC */
|
|
|
+
|
|
|
+/* MIPI CSIS */
|
|
|
+
|
|
|
+#ifdef CONFIG_S5P_DEV_CSIS0
|
|
|
+static struct resource s5p_mipi_csis0_resource[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_16K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS0),
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s5p_device_mipi_csis0 = {
|
|
|
+ .name = "s5p-mipi-csis",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = ARRAY_SIZE(s5p_mipi_csis0_resource),
|
|
|
+ .resource = s5p_mipi_csis0_resource,
|
|
|
+};
|
|
|
+#endif /* CONFIG_S5P_DEV_CSIS0 */
|
|
|
+
|
|
|
+#ifdef CONFIG_S5P_DEV_CSIS1
|
|
|
+static struct resource s5p_mipi_csis1_resource[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_16K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS1),
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s5p_device_mipi_csis1 = {
|
|
|
+ .name = "s5p-mipi-csis",
|
|
|
+ .id = 1,
|
|
|
+ .num_resources = ARRAY_SIZE(s5p_mipi_csis1_resource),
|
|
|
+ .resource = s5p_mipi_csis1_resource,
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+/* NAND */
|
|
|
+
|
|
|
+#ifdef CONFIG_S3C_DEV_NAND
|
|
|
+static struct resource s3c_nand_resource[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(S3C_PA_NAND, SZ_1M),
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s3c_device_nand = {
|
|
|
+ .name = "s3c2410-nand",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = ARRAY_SIZE(s3c_nand_resource),
|
|
|
+ .resource = s3c_nand_resource,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * s3c_nand_copy_set() - copy nand set data
|
|
|
+ * @set: The new structure, directly copied from the old.
|
|
|
+ *
|
|
|
+ * Copy all the fields from the NAND set field from what is probably __initdata
|
|
|
+ * to new kernel memory. The code returns 0 if the copy happened correctly or
|
|
|
+ * an error code for the calling function to display.
|
|
|
+ *
|
|
|
+ * Note, we currently do not try and look to see if we've already copied the
|
|
|
+ * data in a previous set.
|
|
|
+ */
|
|
|
+static int __init s3c_nand_copy_set(struct s3c2410_nand_set *set)
|
|
|
+{
|
|
|
+ void *ptr;
|
|
|
+ int size;
|
|
|
+
|
|
|
+ size = sizeof(struct mtd_partition) * set->nr_partitions;
|
|
|
+ if (size) {
|
|
|
+ ptr = kmemdup(set->partitions, size, GFP_KERNEL);
|
|
|
+ set->partitions = ptr;
|
|
|
+
|
|
|
+ if (!ptr)
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (set->nr_map && set->nr_chips) {
|
|
|
+ size = sizeof(int) * set->nr_chips;
|
|
|
+ ptr = kmemdup(set->nr_map, size, GFP_KERNEL);
|
|
|
+ set->nr_map = ptr;
|
|
|
+
|
|
|
+ if (!ptr)
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (set->ecc_layout) {
|
|
|
+ ptr = kmemdup(set->ecc_layout,
|
|
|
+ sizeof(struct nand_ecclayout), GFP_KERNEL);
|
|
|
+ set->ecc_layout = ptr;
|
|
|
+
|
|
|
+ if (!ptr)
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void __init s3c_nand_set_platdata(struct s3c2410_platform_nand *nand)
|
|
|
+{
|
|
|
+ struct s3c2410_platform_nand *npd;
|
|
|
+ int size;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /* note, if we get a failure in allocation, we simply drop out of the
|
|
|
+ * function. If there is so little memory available at initialisation
|
|
|
+ * time then there is little chance the system is going to run.
|
|
|
+ */
|
|
|
+
|
|
|
+ npd = s3c_set_platdata(nand, sizeof(struct s3c2410_platform_nand),
|
|
|
+ &s3c_device_nand);
|
|
|
+ if (!npd)
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* now see if we need to copy any of the nand set data */
|
|
|
+
|
|
|
+ size = sizeof(struct s3c2410_nand_set) * npd->nr_sets;
|
|
|
+ if (size) {
|
|
|
+ struct s3c2410_nand_set *from = npd->sets;
|
|
|
+ struct s3c2410_nand_set *to;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ to = kmemdup(from, size, GFP_KERNEL);
|
|
|
+ npd->sets = to; /* set, even if we failed */
|
|
|
+
|
|
|
+ if (!to) {
|
|
|
+ printk(KERN_ERR "%s: no memory for sets\n", __func__);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < npd->nr_sets; i++) {
|
|
|
+ ret = s3c_nand_copy_set(to);
|
|
|
+ if (ret) {
|
|
|
+ printk(KERN_ERR "%s: failed to copy set %d\n",
|
|
|
+ __func__, i);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ to++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif /* CONFIG_S3C_DEV_NAND */
|
|
|
+
|
|
|
+/* ONENAND */
|
|
|
+
|
|
|
+#ifdef CONFIG_S3C_DEV_ONENAND
|
|
|
+static struct resource s3c_onenand_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(S3C_PA_ONENAND, SZ_1K),
|
|
|
+ [1] = DEFINE_RES_MEM(S3C_PA_ONENAND_BUF, S3C_SZ_ONENAND_BUF),
|
|
|
+ [2] = DEFINE_RES_IRQ(IRQ_ONENAND),
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s3c_device_onenand = {
|
|
|
+ .name = "samsung-onenand",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = ARRAY_SIZE(s3c_onenand_resources),
|
|
|
+ .resource = s3c_onenand_resources,
|
|
|
+};
|
|
|
+#endif /* CONFIG_S3C_DEV_ONENAND */
|
|
|
+
|
|
|
+#ifdef CONFIG_S3C64XX_DEV_ONENAND1
|
|
|
+static struct resource s3c64xx_onenand1_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1, SZ_1K),
|
|
|
+ [1] = DEFINE_RES_MEM(S3C64XX_PA_ONENAND1_BUF, S3C64XX_SZ_ONENAND1_BUF),
|
|
|
+ [2] = DEFINE_RES_IRQ(IRQ_ONENAND1),
|
|
|
+};
|
|
|
+
|
|
|
+struct platform_device s3c64xx_device_onenand1 = {
|