2019-05-29 17:17:56 +03:00
// SPDX-License-Identifier: GPL-2.0-only
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 >
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/rpmsg.h>
# define MSG "hello world!"
2019-08-09 19:27:10 +03:00
static int count = 100 ;
module_param ( count , int , 0644 ) ;
2011-10-20 23:41:24 +04:00
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
2019-08-09 19:27:09 +03:00
print_hex_dump_debug ( __func__ , DUMP_PREFIX_NONE , 16 , 1 , data , len ,
true ) ;
2011-10-20 23:41:24 +04:00
/* samples should not live forever */
2019-08-09 19:27:10 +03:00
if ( idata - > rx_count > = count ) {
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 " ) ;