2011-10-20 23:41:24 +04:00
/*
* Remote processor messaging - sample client driver
*
* Copyright ( C ) 2011 Texas Instruments , Inc .
* Copyright ( C ) 2011 Google , Inc .
*
* Ohad Ben - Cohen < ohad @ wizery . com >
* Brian Swetland < swetland @ google . com >
*
* This software is licensed under the terms of the GNU General Public
* License version 2 , as published by the Free Software Foundation , and
* may be copied , distributed , and modified under those terms .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/rpmsg.h>
# define MSG "hello world!"
# define MSG_LIMIT 100
2016-08-13 02:42:28 +03:00
struct instance_data {
int rx_count ;
} ;
2016-09-02 01:28:08 +03:00
static int rpmsg_sample_cb ( struct rpmsg_device * rpdev , void * data , int len ,
2011-10-20 23:41:24 +04:00
void * priv , u32 src )
{
int ret ;
2016-08-13 02:42:28 +03:00
struct instance_data * idata = dev_get_drvdata ( & rpdev - > dev ) ;
2011-10-20 23:41:24 +04:00
2016-08-13 02:42:28 +03:00
dev_info ( & rpdev - > dev , " incoming msg %d (src: 0x%x) \n " ,
+ + idata - > rx_count , src ) ;
2011-10-20 23:41:24 +04:00
print_hex_dump ( KERN_DEBUG , __func__ , DUMP_PREFIX_NONE , 16 , 1 ,
data , len , true ) ;
/* samples should not live forever */
2016-08-13 02:42:28 +03:00
if ( idata - > rx_count > = MSG_LIMIT ) {
2011-10-20 23:41:24 +04:00
dev_info ( & rpdev - > dev , " goodbye! \n " ) ;
2016-09-02 01:28:08 +03:00
return 0 ;
2011-10-20 23:41:24 +04:00
}
/* send a new message now */
2016-09-02 01:27:55 +03:00
ret = rpmsg_send ( rpdev - > ept , MSG , strlen ( MSG ) ) ;
2011-10-20 23:41:24 +04:00
if ( ret )
dev_err ( & rpdev - > dev , " rpmsg_send failed: %d \n " , ret ) ;
2016-09-02 01:28:08 +03:00
return 0 ;
2011-10-20 23:41:24 +04:00
}
2016-09-02 01:27:57 +03:00
static int rpmsg_sample_probe ( struct rpmsg_device * rpdev )
2011-10-20 23:41:24 +04:00
{
int ret ;
2016-08-13 02:42:28 +03:00
struct instance_data * idata ;
2011-10-20 23:41:24 +04:00
dev_info ( & rpdev - > dev , " new channel: 0x%x -> 0x%x! \n " ,
rpdev - > src , rpdev - > dst ) ;
2016-08-13 02:42:28 +03:00
idata = devm_kzalloc ( & rpdev - > dev , sizeof ( * idata ) , GFP_KERNEL ) ;
if ( ! idata )
return - ENOMEM ;
dev_set_drvdata ( & rpdev - > dev , idata ) ;
2011-10-20 23:41:24 +04:00
/* send a message to our remote processor */
2016-09-02 01:27:55 +03:00
ret = rpmsg_send ( rpdev - > ept , MSG , strlen ( MSG ) ) ;
2011-10-20 23:41:24 +04:00
if ( ret ) {
dev_err ( & rpdev - > dev , " rpmsg_send failed: %d \n " , ret ) ;
return ret ;
}
return 0 ;
}
2016-09-02 01:27:57 +03:00
static void rpmsg_sample_remove ( struct rpmsg_device * rpdev )
2011-10-20 23:41:24 +04:00
{
dev_info ( & rpdev - > dev , " rpmsg sample client driver is removed \n " ) ;
}
static struct rpmsg_device_id rpmsg_driver_sample_id_table [ ] = {
{ . name = " rpmsg-client-sample " } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( rpmsg , rpmsg_driver_sample_id_table ) ;
static struct rpmsg_driver rpmsg_sample_client = {
. drv . name = KBUILD_MODNAME ,
. id_table = rpmsg_driver_sample_id_table ,
. probe = rpmsg_sample_probe ,
. callback = rpmsg_sample_cb ,
2012-12-22 03:16:45 +04:00
. remove = rpmsg_sample_remove ,
2011-10-20 23:41:24 +04:00
} ;
2016-05-05 01:01:39 +03:00
module_rpmsg_driver ( rpmsg_sample_client ) ;
2011-10-20 23:41:24 +04:00
MODULE_DESCRIPTION ( " Remote processor messaging sample client driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;