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 .
*
* Eventually this type of functionality should either be
* a ) implemented via arch - specific pointers in platform_device
* or
* b ) implemented as a proper omap_bus / omap_device in Linux , no more
* platform_device
*
* 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 .
*
* To do :
* - GPIO integration
* - regulator integration
*
*/
# 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>
2009-10-20 09:40:47 -07:00
# include <plat/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 */
# define OMAP_DEVICE_SUSPENDED BIT(0)
2011-07-12 22:48:29 +02:00
# define OMAP_DEVICE_NO_IDLE_ON_SUSPEND BIT(1)
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
* @ pm_lats : ptr to an omap_device_pm_latency table
* @ pm_lats_cnt : ARRAY_SIZE ( ) of what is passed to @ pm_lats
* @ pm_lat_level : array index of the last odpl entry executed - - 1 if never
2009-12-08 16:34:26 -07:00
* @ dev_wakeup_lat : dev wakeup latency in nanoseconds
* @ _dev_wakeup_lat_limit : dev wakeup latency limit in nsec - set by OMAP PM
2009-09-03 20:14:05 +03:00
* @ _state : one of OMAP_DEVICE_STATE_ * ( see above )
* @ flags : device flags
*
* 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 ;
struct omap_device_pm_latency * pm_lats ;
u32 dev_wakeup_lat ;
u32 _dev_wakeup_lat_limit ;
u8 pm_lats_cnt ;
s8 pm_lat_level ;
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 ) ;
int omap_device_shutdown ( 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 ,
2009-09-03 20:14:05 +03:00
struct omap_hwmod * oh , void * pdata ,
int pdata_len ,
struct omap_device_pm_latency * pm_lats ,
2010-02-24 12:05:58 -07:00
int pm_lats_cnt , int is_early_device ) ;
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 ,
void * pdata , int pdata_len ,
struct omap_device_pm_latency * pm_lats ,
2010-02-24 12:05:58 -07:00
int pm_lats_cnt , int is_early_device ) ;
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 ,
struct omap_hwmod * * ohs , int oh_cnt ,
struct omap_device_pm_latency * pm_lats ,
int pm_lats_cnt ) ;
void omap_device_delete ( struct omap_device * od ) ;
int omap_device_register ( struct platform_device * pdev ) ;
2010-07-26 16:34:33 -06:00
void __iomem * omap_device_get_rt_va ( struct omap_device * od ) ;
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 */
int omap_device_align_pm_lat ( struct platform_device * pdev ,
u32 new_wakeup_lat_limit ) ;
struct powerdomain * omap_device_get_pwrdm ( struct omap_device * od ) ;
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 */
int omap_device_idle_hwmods ( struct omap_device * od ) ;
int omap_device_enable_hwmods ( struct omap_device * od ) ;
int omap_device_disable_clocks ( struct omap_device * od ) ;
int omap_device_enable_clocks ( struct omap_device * od ) ;
/*
* Entries should be kept in latency order ascending
*
* deact_lat is the maximum number of microseconds required to complete
* deactivate_func ( ) at the device ' s slowest OPP .
*
* act_lat is the maximum number of microseconds required to complete
* activate_func ( ) at the device ' s slowest OPP .
*
* This will result in some suboptimal power management decisions at fast
* OPPs , but avoids having to recompute all device power management decisions
* if the system shifts from a fast OPP to a slow OPP ( in order to meet
* latency requirements ) .
*
* XXX should deactivate_func / activate_func ( ) take platform_device pointers
* rather than omap_device pointers ?
*/
struct omap_device_pm_latency {
u32 deactivate_lat ;
2010-01-26 20:13:02 -07:00
u32 deactivate_lat_worst ;
2009-09-03 20:14:05 +03:00
int ( * deactivate_func ) ( struct omap_device * od ) ;
u32 activate_lat ;
2010-01-26 20:13:02 -07:00
u32 activate_lat_worst ;
2009-09-03 20:14:05 +03:00
int ( * activate_func ) ( struct omap_device * od ) ;
2010-01-26 20:13:02 -07:00
u32 flags ;
2009-09-03 20:14:05 +03:00
} ;
2010-01-26 20:13:02 -07:00
# define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1)
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-09-03 20:14:05 +03:00
2011-08-01 09:33:13 -07:00
static inline
void omap_device_disable_idle_on_suspend ( struct platform_device * pdev )
{
struct omap_device * od = to_omap_device ( pdev ) ;
od - > flags | = OMAP_DEVICE_NO_IDLE_ON_SUSPEND ;
}
2009-12-08 16:34:17 -07:00
# endif