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