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