| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2010-04-22 23:26:08 +00:00
										 |  |  |  * omap iommu: omap device registration | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-28 14:42:36 -06:00
										 |  |  | #include <linux/of.h>
 | 
					
						
							| 
									
										
										
										
											2011-11-07 12:27:10 -08:00
										 |  |  | #include <linux/module.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | #include <linux/platform_device.h>
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | #include <linux/err.h>
 | 
					
						
							|  |  |  | #include <linux/slab.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-02 12:24:14 -07:00
										 |  |  | #include <linux/platform_data/iommu-omap.h>
 | 
					
						
							| 
									
										
										
										
											2013-02-09 19:20:57 -08:00
										 |  |  | #include "soc.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-20 11:50:34 -08:00
										 |  |  | #include "omap_hwmod.h"
 | 
					
						
							|  |  |  | #include "omap_device.h"
 | 
					
						
							| 
									
										
										
										
											2012-08-27 17:43:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | static int __init omap_iommu_dev_init(struct omap_hwmod *oh, void *unused) | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	struct platform_device *pdev; | 
					
						
							|  |  |  | 	struct iommu_platform_data *pdata; | 
					
						
							|  |  |  | 	struct omap_mmu_dev_attr *a = (struct omap_mmu_dev_attr *)oh->dev_attr; | 
					
						
							|  |  |  | 	static int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | 
					
						
							|  |  |  | 	if (!pdata) | 
					
						
							|  |  |  | 		return -ENOMEM; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pdata->name = oh->name; | 
					
						
							|  |  |  | 	pdata->nr_tlb_entries = a->nr_tlb_entries; | 
					
						
							|  |  |  | 	pdata->da_start = a->da_start; | 
					
						
							|  |  |  | 	pdata->da_end = a->da_end; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (oh->rst_lines_cnt == 1) { | 
					
						
							|  |  |  | 		pdata->reset_name = oh->rst_lines->name; | 
					
						
							|  |  |  | 		pdata->assert_reset = omap_device_assert_hardreset; | 
					
						
							|  |  |  | 		pdata->deassert_reset = omap_device_deassert_hardreset; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  | 	pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata)); | 
					
						
							| 
									
										
										
										
											2010-04-22 23:26:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	kfree(pdata); | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	if (IS_ERR(pdev)) { | 
					
						
							|  |  |  | 		pr_err("%s: device build err: %ld\n", __func__, PTR_ERR(pdev)); | 
					
						
							|  |  |  | 		return PTR_ERR(pdev); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	i++; | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | static int __init omap_iommu_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-28 14:42:36 -06:00
										 |  |  | 	/* If dtb is there, the devices will be created dynamically */ | 
					
						
							|  |  |  | 	if (of_have_populated_dt()) | 
					
						
							|  |  |  | 		return -ENODEV; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL); | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-03-04 12:01:11 +02:00
										 |  |  | /* must be ready before omap3isp is probed */ | 
					
						
							| 
									
										
										
										
											2013-01-11 11:24:18 -08:00
										 |  |  | omap_subsys_initcall(omap_iommu_init); | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-04-22 23:26:08 +00:00
										 |  |  | static void __exit omap_iommu_exit(void) | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-11-19 19:05:50 -06:00
										 |  |  | 	/* Do nothing */ | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2010-04-22 23:26:08 +00:00
										 |  |  | module_exit(omap_iommu_exit); | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | MODULE_AUTHOR("Hiroshi DOYU"); | 
					
						
							| 
									
										
										
										
											2010-04-22 23:26:08 +00:00
										 |  |  | MODULE_DESCRIPTION("omap iommu: omap device registration"); | 
					
						
							| 
									
										
										
										
											2009-01-28 21:32:04 +02:00
										 |  |  | MODULE_LICENSE("GPL v2"); |