forked from Minki/linux
5abfe5cf0b
Currently there is a single notification chain which is called whenever any remoteproc shuts down. This leads to all the listeners being notified, and is not an optimal design as kernel drivers might only be interested in listening to notifications from a particular remoteproc. Create a global list of remoteproc notification info data structures. This will hold the name and notifier_list information for a particular remoteproc. The API to register for notifications will use name argument to retrieve the notification info data structure and the notifier block will be added to that data structure's notification chain. Also move from blocking notifier to srcu notifer based implementation to support dynamic notifier head creation. Reviewed-by: Alex Elder <elder@linaro.org> Co-developed-by: Siddharth Gupta <sidgup@codeaurora.org> Signed-off-by: Siddharth Gupta <sidgup@codeaurora.org> Signed-off-by: Rishabh Bhatnagar <rishabhb@codeaurora.org> Link: https://lore.kernel.org/r/1592965408-16908-2-git-send-email-rishabhb@codeaurora.org Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
68 lines
1.7 KiB
C
68 lines
1.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __RPROC_QCOM_COMMON_H__
|
|
#define __RPROC_QCOM_COMMON_H__
|
|
|
|
#include <linux/remoteproc.h>
|
|
#include "remoteproc_internal.h"
|
|
#include <linux/soc/qcom/qmi.h>
|
|
|
|
struct qcom_sysmon;
|
|
|
|
struct qcom_rproc_glink {
|
|
struct rproc_subdev subdev;
|
|
|
|
const char *ssr_name;
|
|
|
|
struct device *dev;
|
|
struct device_node *node;
|
|
struct qcom_glink *edge;
|
|
};
|
|
|
|
struct qcom_rproc_subdev {
|
|
struct rproc_subdev subdev;
|
|
|
|
struct device *dev;
|
|
struct device_node *node;
|
|
struct qcom_smd_edge *edge;
|
|
};
|
|
|
|
struct qcom_ssr_subsystem;
|
|
|
|
struct qcom_rproc_ssr {
|
|
struct rproc_subdev subdev;
|
|
struct qcom_ssr_subsystem *info;
|
|
};
|
|
|
|
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink,
|
|
const char *ssr_name);
|
|
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
|
|
|
|
int qcom_register_dump_segments(struct rproc *rproc, const struct firmware *fw);
|
|
|
|
void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
|
|
void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
|
|
|
|
void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr,
|
|
const char *ssr_name);
|
|
void qcom_remove_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr);
|
|
|
|
#if IS_ENABLED(CONFIG_QCOM_SYSMON)
|
|
struct qcom_sysmon *qcom_add_sysmon_subdev(struct rproc *rproc,
|
|
const char *name,
|
|
int ssctl_instance);
|
|
void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon);
|
|
#else
|
|
static inline struct qcom_sysmon *qcom_add_sysmon_subdev(struct rproc *rproc,
|
|
const char *name,
|
|
int ssctl_instance)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#endif
|