Skip to content

Commit

Permalink
rpmsg: Move helper for finding rpmsg devices to core
Browse files Browse the repository at this point in the history
Extract and move the helper function for finding rpmsg child devices to
the core.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
  • Loading branch information
andersson committed Sep 9, 2016
1 parent c9bd6f4 commit 8b881c0
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 25 deletions.
33 changes: 33 additions & 0 deletions drivers/rpmsg/rpmsg_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#include <linux/kernel.h>
#include <linux/rpmsg.h>

#include "rpmsg_internal.h"

/**
* rpmsg_create_ept() - create a new rpmsg_endpoint
* @rpdev: rpmsg channel device
Expand Down Expand Up @@ -229,3 +231,34 @@ int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, u32 src, u32 dst,
return ept->ops->trysend_offchannel(ept, src, dst, data, len);
}
EXPORT_SYMBOL(rpmsg_trysend_offchannel);

/*
* match an rpmsg channel with a channel info struct.
* this is used to make sure we're not creating rpmsg devices for channels
* that already exist.
*/
static int rpmsg_device_match(struct device *dev, void *data)
{
struct rpmsg_channel_info *chinfo = data;
struct rpmsg_device *rpdev = to_rpmsg_device(dev);

if (chinfo->src != RPMSG_ADDR_ANY && chinfo->src != rpdev->src)
return 0;

if (chinfo->dst != RPMSG_ADDR_ANY && chinfo->dst != rpdev->dst)
return 0;

if (strncmp(chinfo->name, rpdev->id.name, RPMSG_NAME_SIZE))
return 0;

/* found a match ! */
return 1;
}

struct device *rpmsg_find_device(struct device *parent,
struct rpmsg_channel_info *chinfo)
{
return device_find_child(parent, chinfo, rpmsg_device_match);

}
EXPORT_SYMBOL(rpmsg_find_device);
31 changes: 31 additions & 0 deletions drivers/rpmsg/rpmsg_internal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* remote processor messaging bus internals
*
* 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.
*/

#ifndef __RPMSG_INTERNAL_H__
#define __RPMSG_INTERNAL_H__

#include <linux/rpmsg.h>

#define to_rpmsg_device(d) container_of(d, struct rpmsg_device, dev)
#define to_rpmsg_driver(d) container_of(d, struct rpmsg_driver, drv)

struct device *rpmsg_find_device(struct device *parent,
struct rpmsg_channel_info *chinfo);

#endif
29 changes: 4 additions & 25 deletions drivers/rpmsg/virtio_rpmsg_bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include <linux/mutex.h>
#include <linux/of_device.h>

#include "rpmsg_internal.h"

/**
* struct virtproc_info - virtual remote processor state
* @vdev: the virtio device
Expand Down Expand Up @@ -452,29 +454,6 @@ static void rpmsg_release_device(struct device *dev)
kfree(rpdev);
}

/*
* match an rpmsg channel with a channel info struct.
* this is used to make sure we're not creating rpmsg devices for channels
* that already exist.
*/
static int rpmsg_device_match(struct device *dev, void *data)
{
struct rpmsg_channel_info *chinfo = data;
struct rpmsg_device *rpdev = to_rpmsg_device(dev);

if (chinfo->src != RPMSG_ADDR_ANY && chinfo->src != rpdev->src)
return 0;

if (chinfo->dst != RPMSG_ADDR_ANY && chinfo->dst != rpdev->dst)
return 0;

if (strncmp(chinfo->name, rpdev->id.name, RPMSG_NAME_SIZE))
return 0;

/* found a match ! */
return 1;
}

static const struct rpmsg_device_ops virtio_rpmsg_ops = {
.create_ept = virtio_rpmsg_create_ept,
.announce_create = virtio_rpmsg_announce_create,
Expand All @@ -494,7 +473,7 @@ static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp,
int ret;

/* make sure a similar channel doesn't already exist */
tmp = device_find_child(dev, chinfo, rpmsg_device_match);
tmp = rpmsg_find_device(dev, chinfo);
if (tmp) {
/* decrement the matched device's refcount back */
put_device(tmp);
Expand Down Expand Up @@ -547,7 +526,7 @@ static int rpmsg_destroy_channel(struct virtproc_info *vrp,
struct virtio_device *vdev = vrp->vdev;
struct device *dev;

dev = device_find_child(&vdev->dev, chinfo, rpmsg_device_match);
dev = rpmsg_find_device(&vdev->dev, chinfo);
if (!dev)
return -EINVAL;

Expand Down

0 comments on commit 8b881c0

Please sign in to comment.