omap-iommu.c 3.4 KB
Newer Older
1
/*
2
 * omap iommu: omap device registration
3 4 5 6 7 8 9 10 11 12 13 14
 *
 * Copyright (C) 2008-2009 Nokia Corporation
 *
 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/platform_device.h>

15
#include <plat/iommu.h>
K
Kanigeri, Hari 已提交
16
#include <plat/irqs.h>
17

F
Felipe Contreras 已提交
18 19 20 21 22
struct iommu_device {
	resource_size_t base;
	int irq;
	struct iommu_platform_data pdata;
	struct resource res[2];
23
};
K
Kanigeri, Hari 已提交
24 25
static struct iommu_device *devices;
static int num_iommu_devices;
26

27
#ifdef CONFIG_ARCH_OMAP3
K
Kanigeri, Hari 已提交
28
static struct iommu_device omap3_devices[] = {
29
	{
F
Felipe Contreras 已提交
30 31 32 33 34 35 36
		.base = 0x480bd400,
		.irq = 24,
		.pdata = {
			.name = "isp",
			.nr_tlb_entries = 8,
			.clk_name = "cam_ick",
		},
37
	},
38
#if defined(CONFIG_MPU_BRIDGE_IOMMU)
39
	{
F
Felipe Contreras 已提交
40 41 42 43 44 45 46
		.base = 0x5d000000,
		.irq = 28,
		.pdata = {
			.name = "iva2",
			.nr_tlb_entries = 32,
			.clk_name = "iva2_ck",
		},
47
	},
48
#endif
49
};
K
Kanigeri, Hari 已提交
50 51 52 53 54 55
#define NR_OMAP3_IOMMU_DEVICES ARRAY_SIZE(omap3_devices)
static struct platform_device *omap3_iommu_pdev[NR_OMAP3_IOMMU_DEVICES];
#else
#define omap3_devices		NULL
#define NR_OMAP3_IOMMU_DEVICES	0
#define omap3_iommu_pdev	NULL
56 57
#endif

K
Kanigeri, Hari 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
#ifdef CONFIG_ARCH_OMAP4
static struct iommu_device omap4_devices[] = {
	{
		.base = OMAP4_MMU1_BASE,
		.irq = INT_44XX_DUCATI_MMU_IRQ,
		.pdata = {
			.name = "ducati",
			.nr_tlb_entries = 32,
			.clk_name = "ducati_ick",
		},
	},
#if defined(CONFIG_MPU_TESLA_IOMMU)
	{
		.base = OMAP4_MMU2_BASE,
		.irq = INT_44XX_DSP_MMU,
		.pdata = {
			.name = "tesla",
			.nr_tlb_entries = 32,
			.clk_name = "tesla_ick",
		},
	},
#endif
};
#define NR_OMAP4_IOMMU_DEVICES ARRAY_SIZE(omap4_devices)
static struct platform_device *omap4_iommu_pdev[NR_OMAP4_IOMMU_DEVICES];
#else
#define omap4_devices		NULL
#define NR_OMAP4_IOMMU_DEVICES	0
#define omap4_iommu_pdev	NULL
#endif
88

K
Kanigeri, Hari 已提交
89
static struct platform_device **omap_iommu_pdev;
90

91
static int __init omap_iommu_init(void)
92 93
{
	int i, err;
F
Felipe Contreras 已提交
94 95 96 97
	struct resource res[] = {
		{ .flags = IORESOURCE_MEM },
		{ .flags = IORESOURCE_IRQ },
	};
98

K
Kanigeri, Hari 已提交
99 100 101 102 103 104 105 106 107 108 109 110
	if (cpu_is_omap34xx()) {
		devices = omap3_devices;
		omap_iommu_pdev = omap3_iommu_pdev;
		num_iommu_devices = NR_OMAP3_IOMMU_DEVICES;
	} else if (cpu_is_omap44xx()) {
		devices = omap4_devices;
		omap_iommu_pdev = omap4_iommu_pdev;
		num_iommu_devices = NR_OMAP4_IOMMU_DEVICES;
	} else
		return -ENODEV;

	for (i = 0; i < num_iommu_devices; i++) {
111
		struct platform_device *pdev;
F
Felipe Contreras 已提交
112
		const struct iommu_device *d = &devices[i];
113 114 115 116 117 118 119

		pdev = platform_device_alloc("omap-iommu", i);
		if (!pdev) {
			err = -ENOMEM;
			goto err_out;
		}

F
Felipe Contreras 已提交
120 121 122
		res[0].start = d->base;
		res[0].end = d->base + MMU_REG_SIZE - 1;
		res[1].start = res[1].end = d->irq;
123 124 125 126 127

		err = platform_device_add_resources(pdev, res,
						    ARRAY_SIZE(res));
		if (err)
			goto err_out;
F
Felipe Contreras 已提交
128 129
		err = platform_device_add_data(pdev, &d->pdata,
					       sizeof(d->pdata));
130 131 132 133 134
		if (err)
			goto err_out;
		err = platform_device_add(pdev);
		if (err)
			goto err_out;
135
		omap_iommu_pdev[i] = pdev;
136 137 138 139 140
	}
	return 0;

err_out:
	while (i--)
141
		platform_device_put(omap_iommu_pdev[i]);
142 143
	return err;
}
144
module_init(omap_iommu_init);
145

146
static void __exit omap_iommu_exit(void)
147 148 149
{
	int i;

K
Kanigeri, Hari 已提交
150
	for (i = 0; i < num_iommu_devices; i++)
151
		platform_device_unregister(omap_iommu_pdev[i]);
152
}
153
module_exit(omap_iommu_exit);
154 155

MODULE_AUTHOR("Hiroshi DOYU");
156
MODULE_DESCRIPTION("omap iommu: omap device registration");
157
MODULE_LICENSE("GPL v2");