1/* 2 * Remote processor messaging - sample client driver 3 * 4 * Copyright (C) 2011 Texas Instruments, Inc. 5 * Copyright (C) 2011 Google, Inc. 6 * 7 * Ohad Ben-Cohen <ohad@wizery.com> 8 * Brian Swetland <swetland@google.com> 9 * 10 * This software is licensed under the terms of the GNU General Public 11 * License version 2, as published by the Free Software Foundation, and 12 * may be copied, distributed, and modified under those terms. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 */ 19 20#include <linux/kernel.h> 21#include <linux/module.h> 22#include <linux/rpmsg.h> 23 24#define MSG "hello world!" 25#define MSG_LIMIT 100 26 27static void rpmsg_sample_cb(struct rpmsg_channel *rpdev, void *data, int len, 28 void *priv, u32 src) 29{ 30 int ret; 31 static int rx_count; 32 33 dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n", ++rx_count, src); 34 35 print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1, 36 data, len, true); 37 38 /* samples should not live forever */ 39 if (rx_count >= MSG_LIMIT) { 40 dev_info(&rpdev->dev, "goodbye!\n"); 41 return; 42 } 43 44 /* send a new message now */ 45 ret = rpmsg_send(rpdev, MSG, strlen(MSG)); 46 if (ret) 47 dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); 48} 49 50static int rpmsg_sample_probe(struct rpmsg_channel *rpdev) 51{ 52 int ret; 53 54 dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n", 55 rpdev->src, rpdev->dst); 56 57 /* send a message to our remote processor */ 58 ret = rpmsg_send(rpdev, MSG, strlen(MSG)); 59 if (ret) { 60 dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret); 61 return ret; 62 } 63 64 return 0; 65} 66 67static void rpmsg_sample_remove(struct rpmsg_channel *rpdev) 68{ 69 dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n"); 70} 71 72static struct rpmsg_device_id rpmsg_driver_sample_id_table[] = { 73 { .name = "rpmsg-client-sample" }, 74 { }, 75}; 76MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_sample_id_table); 77 78static struct rpmsg_driver rpmsg_sample_client = { 79 .drv.name = KBUILD_MODNAME, 80 .drv.owner = THIS_MODULE, 81 .id_table = rpmsg_driver_sample_id_table, 82 .probe = rpmsg_sample_probe, 83 .callback = rpmsg_sample_cb, 84 .remove = rpmsg_sample_remove, 85}; 86 87static int __init rpmsg_client_sample_init(void) 88{ 89 return register_rpmsg_driver(&rpmsg_sample_client); 90} 91module_init(rpmsg_client_sample_init); 92 93static void __exit rpmsg_client_sample_fini(void) 94{ 95 unregister_rpmsg_driver(&rpmsg_sample_client); 96} 97module_exit(rpmsg_client_sample_fini); 98 99MODULE_DESCRIPTION("Remote processor messaging sample client driver"); 100MODULE_LICENSE("GPL v2"); 101