| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * omap_device headers | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2009 Nokia Corporation | 
					
						
							|  |  |  |  * Paul Walmsley | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Developed in collaboration with (alphabetical order): Benoit | 
					
						
							|  |  |  |  * Cousson, Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram | 
					
						
							|  |  |  |  * Pandita, Sakari Poussa, Anand Sawant, Santosh Shilimkar, Richard | 
					
						
							|  |  |  |  * Woodruff | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  |  * This type of functionality should be implemented as a proper | 
					
						
							|  |  |  |  * omap_bus/omap_device in Linux. | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  |  * | 
					
						
							|  |  |  |  * omap_device differs from omap_hwmod in that it includes external | 
					
						
							|  |  |  |  * (e.g., board- and system-level) integration details.  omap_hwmod | 
					
						
							|  |  |  |  * stores hardware data that is invariant for a given OMAP chip. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H
 | 
					
						
							|  |  |  | #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 17:41:35 -07:00
										 |  |  | #include "omap_hwmod.h"
 | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-15 11:47:45 -08:00
										 |  |  | extern struct dev_pm_domain omap_device_pm_domain; | 
					
						
							| 
									
										
										
										
											2010-08-23 08:10:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | /* omap_device._state values */ | 
					
						
							|  |  |  | #define OMAP_DEVICE_STATE_UNKNOWN	0
 | 
					
						
							|  |  |  | #define OMAP_DEVICE_STATE_ENABLED	1
 | 
					
						
							|  |  |  | #define OMAP_DEVICE_STATE_IDLE		2
 | 
					
						
							|  |  |  | #define OMAP_DEVICE_STATE_SHUTDOWN	3
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-12 22:48:19 +02:00
										 |  |  | /* omap_device.flags values */ | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  | #define OMAP_DEVICE_SUSPENDED		BIT(0)
 | 
					
						
							| 
									
										
										
										
											2011-07-12 22:48:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * struct omap_device - omap_device wrapper for platform_devices | 
					
						
							|  |  |  |  * @pdev: platform_device | 
					
						
							|  |  |  |  * @hwmods: (one .. many per omap_device) | 
					
						
							|  |  |  |  * @hwmods_cnt: ARRAY_SIZE() of @hwmods | 
					
						
							|  |  |  |  * @_state: one of OMAP_DEVICE_STATE_* (see above) | 
					
						
							|  |  |  |  * @flags: device flags | 
					
						
							| 
									
										
										
										
											2012-07-10 11:13:16 -07:00
										 |  |  |  * @_driver_status: one of BUS_NOTIFY_*_DRIVER from <linux/device.h> | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Integrates omap_hwmod data into Linux platform_device. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Field names beginning with underscores are for the internal use of | 
					
						
							|  |  |  |  * the omap_device code. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct omap_device { | 
					
						
							| 
									
										
										
										
											2011-07-21 13:58:51 -07:00
										 |  |  | 	struct platform_device		*pdev; | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 	struct omap_hwmod		**hwmods; | 
					
						
							| 
									
										
										
										
											2012-07-10 11:13:16 -07:00
										 |  |  | 	unsigned long			_driver_status; | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 	u8				hwmods_cnt; | 
					
						
							|  |  |  | 	u8				_state; | 
					
						
							| 
									
										
										
										
											2011-07-12 22:48:19 +02:00
										 |  |  | 	u8                              flags; | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Device driver interface (call via platform_data fn ptrs) */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int omap_device_enable(struct platform_device *pdev); | 
					
						
							|  |  |  | int omap_device_idle(struct platform_device *pdev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Core code interface */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-21 13:48:45 -07:00
										 |  |  | struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  | 					  struct omap_hwmod *oh, void *pdata, | 
					
						
							|  |  |  | 					  int pdata_len); | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-21 13:48:45 -07:00
										 |  |  | struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 					 struct omap_hwmod **oh, int oh_cnt, | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  | 					 void *pdata, int pdata_len); | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												ARM: OMAP: omap_device: Expose omap_device_{alloc, delete, register}
Expose omap_device_{alloc, delete, register} so we can use them outside
of omap_device.c.
This approach allows users, which need to manipulate an archdata member
of a device before it is registered, to do so. This is also useful
for users who have their devices created very early so they can be used
at ->reserve() time to reserve CMA memory.
The immediate use case for this is to set the private iommu archdata
member, which binds a device to its associated iommu controller.
This way, generic code will be able to attach omap devices to their
iommus, without calling any omap-specific API.
With this in hand, we can further clean the existing mainline OMAP iommu
driver and its mainline users, and focus on generic IOMMU approaches
for future users (rpmsg/remoteproc and the upcoming generic DMA API).
This patch is still considered an interim solution until DT fully materializes
for omap; at that point, this functionality will be removed as DT will
take care of creating the devices and configuring them correctly.
Tested on OMAP4 with a generic rpmsg/remoteproc that doesn't use any
omap-specific IOMMU API anymore.
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
											
										 
											2012-02-20 09:43:29 -08:00
										 |  |  | struct omap_device *omap_device_alloc(struct platform_device *pdev, | 
					
						
							| 
									
										
										
										
											2013-01-26 00:48:53 -07:00
										 |  |  | 				      struct omap_hwmod **ohs, int oh_cnt); | 
					
						
							| 
									
										
											  
											
												ARM: OMAP: omap_device: Expose omap_device_{alloc, delete, register}
Expose omap_device_{alloc, delete, register} so we can use them outside
of omap_device.c.
This approach allows users, which need to manipulate an archdata member
of a device before it is registered, to do so. This is also useful
for users who have their devices created very early so they can be used
at ->reserve() time to reserve CMA memory.
The immediate use case for this is to set the private iommu archdata
member, which binds a device to its associated iommu controller.
This way, generic code will be able to attach omap devices to their
iommus, without calling any omap-specific API.
With this in hand, we can further clean the existing mainline OMAP iommu
driver and its mainline users, and focus on generic IOMMU approaches
for future users (rpmsg/remoteproc and the upcoming generic DMA API).
This patch is still considered an interim solution until DT fully materializes
for omap; at that point, this functionality will be removed as DT will
take care of creating the devices and configuring them correctly.
Tested on OMAP4 with a generic rpmsg/remoteproc that doesn't use any
omap-specific IOMMU API anymore.
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
											
										 
											2012-02-20 09:43:29 -08:00
										 |  |  | void omap_device_delete(struct omap_device *od); | 
					
						
							|  |  |  | int omap_device_register(struct platform_device *pdev); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-27 15:02:32 -05:00
										 |  |  | struct device *omap_device_get_by_hwmod_name(const char *oh_name); | 
					
						
							| 
									
										
										
										
											2010-07-26 16:34:33 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | /* OMAP PM interface */ | 
					
						
							| 
									
										
										
										
											2011-06-09 16:56:23 +03:00
										 |  |  | int omap_device_get_context_loss_count(struct platform_device *pdev); | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Other */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-09-23 17:28:18 -06:00
										 |  |  | int omap_device_assert_hardreset(struct platform_device *pdev, | 
					
						
							|  |  |  | 				 const char *name); | 
					
						
							|  |  |  | int omap_device_deassert_hardreset(struct platform_device *pdev, | 
					
						
							|  |  |  | 				 const char *name); | 
					
						
							| 
									
										
										
										
											2009-09-03 20:14:05 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 16:34:17 -07:00
										 |  |  | /* Get omap_device pointer from platform_device pointer */ | 
					
						
							| 
									
										
										
										
											2011-07-21 13:58:51 -07:00
										 |  |  | static inline struct omap_device *to_omap_device(struct platform_device *pdev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return pdev ? pdev->archdata.od : NULL; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-12-08 16:34:17 -07:00
										 |  |  | #endif
 |