Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 1 | /* |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 2 | * omap iommu: omap device registration |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 3 | * |
| 4 | * Copyright (C) 2008-2009 Nokia Corporation |
| 5 | * |
| 6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify |
| 9 | * it under the terms of the GNU General Public License version 2 as |
| 10 | * published by the Free Software Foundation. |
| 11 | */ |
| 12 | |
| 13 | #include <linux/platform_device.h> |
| 14 | |
Tony Lindgren | ce491cf | 2009-10-20 09:40:47 -0700 | [diff] [blame] | 15 | #include <plat/iommu.h> |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 16 | #include <plat/irqs.h> |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 17 | |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 18 | struct iommu_device { |
| 19 | resource_size_t base; |
| 20 | int irq; |
| 21 | struct iommu_platform_data pdata; |
| 22 | struct resource res[2]; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 23 | }; |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 24 | static struct iommu_device *devices; |
| 25 | static int num_iommu_devices; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 26 | |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 27 | #ifdef CONFIG_ARCH_OMAP3 |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 28 | static struct iommu_device omap3_devices[] = { |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 29 | { |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 30 | .base = 0x480bd400, |
| 31 | .irq = 24, |
| 32 | .pdata = { |
| 33 | .name = "isp", |
| 34 | .nr_tlb_entries = 8, |
| 35 | .clk_name = "cam_ick", |
Guzman Lugo, Fernando | c7f4ab2 | 2010-12-15 00:54:03 +0000 | [diff] [blame] | 36 | .da_start = 0x0, |
| 37 | .da_end = 0xFFFFF000, |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 38 | }, |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 39 | }, |
Felipe Contreras | 1cd25df | 2010-10-11 09:53:49 +0000 | [diff] [blame] | 40 | #if defined(CONFIG_OMAP_IOMMU_IVA2) |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 41 | { |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 42 | .base = 0x5d000000, |
| 43 | .irq = 28, |
| 44 | .pdata = { |
| 45 | .name = "iva2", |
| 46 | .nr_tlb_entries = 32, |
| 47 | .clk_name = "iva2_ck", |
Guzman Lugo, Fernando | c7f4ab2 | 2010-12-15 00:54:03 +0000 | [diff] [blame] | 48 | .da_start = 0x11000000, |
| 49 | .da_end = 0xFFFFF000, |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 50 | }, |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 51 | }, |
Hiroshi DOYU | 5c651ff | 2009-05-19 09:07:55 +0300 | [diff] [blame] | 52 | #endif |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 53 | }; |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 54 | #define NR_OMAP3_IOMMU_DEVICES ARRAY_SIZE(omap3_devices) |
| 55 | static struct platform_device *omap3_iommu_pdev[NR_OMAP3_IOMMU_DEVICES]; |
| 56 | #else |
| 57 | #define omap3_devices NULL |
| 58 | #define NR_OMAP3_IOMMU_DEVICES 0 |
| 59 | #define omap3_iommu_pdev NULL |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 60 | #endif |
| 61 | |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 62 | #ifdef CONFIG_ARCH_OMAP4 |
| 63 | static struct iommu_device omap4_devices[] = { |
| 64 | { |
| 65 | .base = OMAP4_MMU1_BASE, |
Kanigeri, Hari | 1fd7f46 | 2010-05-14 22:55:41 +0000 | [diff] [blame] | 66 | .irq = OMAP44XX_IRQ_DUCATI_MMU, |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 67 | .pdata = { |
| 68 | .name = "ducati", |
| 69 | .nr_tlb_entries = 32, |
| 70 | .clk_name = "ducati_ick", |
Guzman Lugo, Fernando | c7f4ab2 | 2010-12-15 00:54:03 +0000 | [diff] [blame] | 71 | .da_start = 0x0, |
| 72 | .da_end = 0xFFFFF000, |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 73 | }, |
| 74 | }, |
| 75 | #if defined(CONFIG_MPU_TESLA_IOMMU) |
| 76 | { |
| 77 | .base = OMAP4_MMU2_BASE, |
| 78 | .irq = INT_44XX_DSP_MMU, |
| 79 | .pdata = { |
| 80 | .name = "tesla", |
| 81 | .nr_tlb_entries = 32, |
| 82 | .clk_name = "tesla_ick", |
Guzman Lugo, Fernando | c7f4ab2 | 2010-12-15 00:54:03 +0000 | [diff] [blame] | 83 | .da_start = 0x0, |
| 84 | .da_end = 0xFFFFF000, |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 85 | }, |
| 86 | }, |
| 87 | #endif |
| 88 | }; |
| 89 | #define NR_OMAP4_IOMMU_DEVICES ARRAY_SIZE(omap4_devices) |
| 90 | static struct platform_device *omap4_iommu_pdev[NR_OMAP4_IOMMU_DEVICES]; |
| 91 | #else |
| 92 | #define omap4_devices NULL |
| 93 | #define NR_OMAP4_IOMMU_DEVICES 0 |
| 94 | #define omap4_iommu_pdev NULL |
| 95 | #endif |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 96 | |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 97 | static struct platform_device **omap_iommu_pdev; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 98 | |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 99 | static int __init omap_iommu_init(void) |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 100 | { |
| 101 | int i, err; |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 102 | struct resource res[] = { |
| 103 | { .flags = IORESOURCE_MEM }, |
| 104 | { .flags = IORESOURCE_IRQ }, |
| 105 | }; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 106 | |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 107 | if (cpu_is_omap34xx()) { |
| 108 | devices = omap3_devices; |
| 109 | omap_iommu_pdev = omap3_iommu_pdev; |
| 110 | num_iommu_devices = NR_OMAP3_IOMMU_DEVICES; |
| 111 | } else if (cpu_is_omap44xx()) { |
| 112 | devices = omap4_devices; |
| 113 | omap_iommu_pdev = omap4_iommu_pdev; |
| 114 | num_iommu_devices = NR_OMAP4_IOMMU_DEVICES; |
| 115 | } else |
| 116 | return -ENODEV; |
| 117 | |
| 118 | for (i = 0; i < num_iommu_devices; i++) { |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 119 | struct platform_device *pdev; |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 120 | const struct iommu_device *d = &devices[i]; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 121 | |
| 122 | pdev = platform_device_alloc("omap-iommu", i); |
| 123 | if (!pdev) { |
| 124 | err = -ENOMEM; |
| 125 | goto err_out; |
| 126 | } |
| 127 | |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 128 | res[0].start = d->base; |
| 129 | res[0].end = d->base + MMU_REG_SIZE - 1; |
| 130 | res[1].start = res[1].end = d->irq; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 131 | |
| 132 | err = platform_device_add_resources(pdev, res, |
| 133 | ARRAY_SIZE(res)); |
| 134 | if (err) |
| 135 | goto err_out; |
Felipe Contreras | a76e9a9 | 2009-11-22 10:11:04 -0800 | [diff] [blame] | 136 | err = platform_device_add_data(pdev, &d->pdata, |
| 137 | sizeof(d->pdata)); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 138 | if (err) |
| 139 | goto err_out; |
| 140 | err = platform_device_add(pdev); |
| 141 | if (err) |
| 142 | goto err_out; |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 143 | omap_iommu_pdev[i] = pdev; |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 144 | } |
| 145 | return 0; |
| 146 | |
| 147 | err_out: |
| 148 | while (i--) |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 149 | platform_device_put(omap_iommu_pdev[i]); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 150 | return err; |
| 151 | } |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 152 | module_init(omap_iommu_init); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 153 | |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 154 | static void __exit omap_iommu_exit(void) |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 155 | { |
| 156 | int i; |
| 157 | |
Kanigeri, Hari | f779f92 | 2010-04-22 23:26:09 +0000 | [diff] [blame] | 158 | for (i = 0; i < num_iommu_devices; i++) |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 159 | platform_device_unregister(omap_iommu_pdev[i]); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 160 | } |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 161 | module_exit(omap_iommu_exit); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 162 | |
| 163 | MODULE_AUTHOR("Hiroshi DOYU"); |
Kanigeri, Hari | 44da397 | 2010-04-22 23:26:08 +0000 | [diff] [blame] | 164 | MODULE_DESCRIPTION("omap iommu: omap device registration"); |
Hiroshi DOYU | 066aa9c | 2009-01-28 21:32:04 +0200 | [diff] [blame] | 165 | MODULE_LICENSE("GPL v2"); |