2006-12-07 15:43:59 -08:00
/*
2010-06-11 15:51:48 +00:00
* Mailbox reservation modules for OMAP1
2006-12-07 15:43:59 -08:00
*
2009-03-23 18:07:25 -07:00
* Copyright ( C ) 2006 - 2009 Nokia Corporation
2006-12-07 15:43:59 -08:00
* Written by : Hiroshi DOYU < Hiroshi . DOYU @ nokia . com >
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
2011-07-31 16:14:14 -04:00
# include <linux/module.h>
2006-12-07 15:43:59 -08:00
# include <linux/interrupt.h>
# include <linux/platform_device.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2013-03-12 17:55:29 -05:00
# include "omap-mbox.h"
2006-12-07 15:43:59 -08:00
# define MAILBOX_ARM2DSP1 0x00
# define MAILBOX_ARM2DSP1b 0x04
# define MAILBOX_DSP2ARM1 0x08
# define MAILBOX_DSP2ARM1b 0x0c
# define MAILBOX_DSP2ARM2 0x10
# define MAILBOX_DSP2ARM2b 0x14
# define MAILBOX_ARM2DSP1_Flag 0x18
# define MAILBOX_DSP2ARM1_Flag 0x1c
# define MAILBOX_DSP2ARM2_Flag 0x20
2009-03-23 18:07:25 -07:00
static void __iomem * mbox_base ;
2006-12-07 15:43:59 -08:00
struct omap_mbox1_fifo {
unsigned long cmd ;
unsigned long data ;
unsigned long flag ;
} ;
struct omap_mbox1_priv {
struct omap_mbox1_fifo tx_fifo ;
struct omap_mbox1_fifo rx_fifo ;
} ;
2009-03-23 18:07:25 -07:00
static inline int mbox_read_reg ( size_t ofs )
2006-12-07 15:43:59 -08:00
{
2009-03-23 18:07:25 -07:00
return __raw_readw ( mbox_base + ofs ) ;
2006-12-07 15:43:59 -08:00
}
2009-03-23 18:07:25 -07:00
static inline void mbox_write_reg ( u32 val , size_t ofs )
2006-12-07 15:43:59 -08:00
{
2009-03-23 18:07:25 -07:00
__raw_writew ( val , mbox_base + ofs ) ;
2006-12-07 15:43:59 -08:00
}
/* msg */
2007-12-18 20:58:32 -08:00
static mbox_msg_t omap1_mbox_fifo_read ( struct omap_mbox * mbox )
2006-12-07 15:43:59 -08:00
{
struct omap_mbox1_fifo * fifo =
& ( ( struct omap_mbox1_priv * ) mbox - > priv ) - > rx_fifo ;
mbox_msg_t msg ;
msg = mbox_read_reg ( fifo - > data ) ;
msg | = ( ( mbox_msg_t ) mbox_read_reg ( fifo - > cmd ) ) < < 16 ;
return msg ;
}
2007-12-18 20:58:32 -08:00
static void
2006-12-07 15:43:59 -08:00
omap1_mbox_fifo_write ( struct omap_mbox * mbox , mbox_msg_t msg )
{
struct omap_mbox1_fifo * fifo =
& ( ( struct omap_mbox1_priv * ) mbox - > priv ) - > tx_fifo ;
mbox_write_reg ( msg & 0xffff , fifo - > data ) ;
mbox_write_reg ( msg > > 16 , fifo - > cmd ) ;
}
2007-12-18 20:58:32 -08:00
static int omap1_mbox_fifo_empty ( struct omap_mbox * mbox )
2006-12-07 15:43:59 -08:00
{
return 0 ;
}
2007-12-18 20:58:32 -08:00
static int omap1_mbox_fifo_full ( struct omap_mbox * mbox )
2006-12-07 15:43:59 -08:00
{
struct omap_mbox1_fifo * fifo =
& ( ( struct omap_mbox1_priv * ) mbox - > priv ) - > rx_fifo ;
2010-06-11 15:51:37 +00:00
return mbox_read_reg ( fifo - > flag ) ;
2006-12-07 15:43:59 -08:00
}
/* irq */
2007-12-18 20:58:32 -08:00
static void
2013-06-07 16:27:45 -05:00
omap1_mbox_enable_irq ( struct omap_mbox * mbox , omap_mbox_irq_t irq )
2006-12-07 15:43:59 -08:00
{
if ( irq = = IRQ_RX )
enable_irq ( mbox - > irq ) ;
}
2007-12-18 20:58:32 -08:00
static void
2013-06-07 16:27:45 -05:00
omap1_mbox_disable_irq ( struct omap_mbox * mbox , omap_mbox_irq_t irq )
2006-12-07 15:43:59 -08:00
{
if ( irq = = IRQ_RX )
disable_irq ( mbox - > irq ) ;
}
2007-12-18 20:58:32 -08:00
static int
2013-06-07 16:27:45 -05:00
omap1_mbox_is_irq ( struct omap_mbox * mbox , omap_mbox_irq_t irq )
2006-12-07 15:43:59 -08:00
{
if ( irq = = IRQ_TX )
return 0 ;
return 1 ;
}
static struct omap_mbox_ops omap1_mbox_ops = {
. type = OMAP_MBOX_TYPE1 ,
. fifo_read = omap1_mbox_fifo_read ,
. fifo_write = omap1_mbox_fifo_write ,
. fifo_empty = omap1_mbox_fifo_empty ,
. fifo_full = omap1_mbox_fifo_full ,
. enable_irq = omap1_mbox_enable_irq ,
. disable_irq = omap1_mbox_disable_irq ,
. is_irq = omap1_mbox_is_irq ,
} ;
/* FIXME: the following struct should be created automatically by the user id */
/* DSP */
static struct omap_mbox1_priv omap1_mbox_dsp_priv = {
. tx_fifo = {
. cmd = MAILBOX_ARM2DSP1b ,
. data = MAILBOX_ARM2DSP1 ,
. flag = MAILBOX_ARM2DSP1_Flag ,
} ,
. rx_fifo = {
. cmd = MAILBOX_DSP2ARM1b ,
. data = MAILBOX_DSP2ARM1 ,
. flag = MAILBOX_DSP2ARM1_Flag ,
} ,
} ;
2010-11-18 19:59:48 +02:00
static struct omap_mbox mbox_dsp_info = {
2006-12-07 15:43:59 -08:00
. name = " dsp " ,
. ops = & omap1_mbox_ops ,
. priv = & omap1_mbox_dsp_priv ,
} ;
2010-11-18 19:59:48 +02:00
static struct omap_mbox * omap1_mboxes [ ] = { & mbox_dsp_info , NULL } ;
2010-06-11 15:51:45 +00:00
2012-12-21 14:02:24 -08:00
static int omap1_mbox_probe ( struct platform_device * pdev )
2006-12-07 15:43:59 -08:00
{
2010-06-11 15:51:45 +00:00
struct resource * mem ;
2010-06-11 15:51:41 +00:00
int ret ;
2010-06-11 15:51:46 +00:00
struct omap_mbox * * list ;
2006-12-07 15:43:59 -08:00
2010-06-11 15:51:45 +00:00
list = omap1_mboxes ;
list [ 0 ] - > irq = platform_get_irq_byname ( pdev , " dsp " ) ;
2010-02-15 10:03:33 -08:00
2010-06-11 15:51:45 +00:00
mem = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
2013-02-01 20:24:51 -06:00
if ( ! mem )
return - ENOENT ;
2010-06-11 15:51:45 +00:00
mbox_base = ioremap ( mem - > start , resource_size ( mem ) ) ;
2010-06-11 15:51:41 +00:00
if ( ! mbox_base )
return - ENOMEM ;
2006-12-07 15:43:59 -08:00
2010-06-11 15:51:46 +00:00
ret = omap_mbox_register ( & pdev - > dev , list ) ;
if ( ret ) {
iounmap ( mbox_base ) ;
return ret ;
2006-12-07 15:43:59 -08:00
}
2010-06-11 15:51:41 +00:00
2010-06-11 15:51:46 +00:00
return 0 ;
2006-12-07 15:43:59 -08:00
}
2012-12-21 14:02:24 -08:00
static int omap1_mbox_remove ( struct platform_device * pdev )
2006-12-07 15:43:59 -08:00
{
2010-06-11 15:51:46 +00:00
omap_mbox_unregister ( ) ;
2010-06-11 15:51:41 +00:00
iounmap ( mbox_base ) ;
2006-12-07 15:43:59 -08:00
return 0 ;
}
static struct platform_driver omap1_mbox_driver = {
. probe = omap1_mbox_probe ,
2012-12-21 14:02:24 -08:00
. remove = omap1_mbox_remove ,
2006-12-07 15:43:59 -08:00
. driver = {
2010-06-11 15:51:48 +00:00
. name = " omap-mailbox " ,
2006-12-07 15:43:59 -08:00
} ,
} ;
static int __init omap1_mbox_init ( void )
{
return platform_driver_register ( & omap1_mbox_driver ) ;
}
static void __exit omap1_mbox_exit ( void )
{
platform_driver_unregister ( & omap1_mbox_driver ) ;
}
module_init ( omap1_mbox_init ) ;
module_exit ( omap1_mbox_exit ) ;
2009-03-23 18:07:25 -07:00
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_DESCRIPTION ( " omap mailbox: omap1 architecture specific functions " ) ;
2009-06-23 13:30:21 +03:00
MODULE_AUTHOR ( " Hiroshi DOYU <Hiroshi.DOYU@nokia.com> " ) ;
2009-03-23 18:07:25 -07:00
MODULE_ALIAS ( " platform:omap1-mailbox " ) ;