Loading drivers/soc/qcom/qcom_aoss.c +53 −1 Original line number Diff line number Diff line Loading @@ -8,10 +8,12 @@ #include <linux/io.h> #include <linux/mailbox_client.h> #include <linux/module.h> #include <linux/of_platform.h> #include <linux/platform_device.h> #include <linux/pm_domain.h> #include <linux/thermal.h> #include <linux/slab.h> #include <linux/soc/qcom/qcom_aoss.h> #define QMP_DESC_MAGIC 0x0 #define QMP_DESC_VERSION 0x4 Loading Loading @@ -223,11 +225,14 @@ static bool qmp_message_empty(struct qmp *qmp) * * Return: 0 on success, negative errno on failure */ static int qmp_send(struct qmp *qmp, const void *data, size_t len) int qmp_send(struct qmp *qmp, const void *data, size_t len) { long time_left; int ret; if (WARN_ON(IS_ERR_OR_NULL(qmp) || !data)) return -EINVAL; if (WARN_ON(len + sizeof(u32) > qmp->size)) return -EINVAL; Loading Loading @@ -261,6 +266,7 @@ static int qmp_send(struct qmp *qmp, const void *data, size_t len) return ret; } EXPORT_SYMBOL(qmp_send); static int qmp_qdss_clk_prepare(struct clk_hw *hw) { Loading Loading @@ -519,6 +525,51 @@ static void qmp_cooling_devices_remove(struct qmp *qmp) thermal_cooling_device_unregister(qmp->cooling_devs[i].cdev); } /** * qmp_get() - get a qmp handle from a device * @dev: client device pointer * * Return: handle to qmp device on success, ERR_PTR() on failure */ struct qmp *qmp_get(struct device *dev) { struct platform_device *pdev; struct device_node *np; struct qmp *qmp; if (!dev || !dev->of_node) return ERR_PTR(-EINVAL); np = of_parse_phandle(dev->of_node, "qcom,qmp", 0); if (!np) return ERR_PTR(-ENODEV); pdev = of_find_device_by_node(np); of_node_put(np); if (!pdev) return ERR_PTR(-EINVAL); qmp = platform_get_drvdata(pdev); return qmp ? qmp : ERR_PTR(-EPROBE_DEFER); } EXPORT_SYMBOL(qmp_get); /** * qmp_put() - release a qmp handle * @qmp: qmp handle obtained from qmp_get() */ void qmp_put(struct qmp *qmp) { /* * Match get_device() inside of_find_device_by_node() in * qmp_get() */ if (!IS_ERR_OR_NULL(qmp)) put_device(qmp->dev); } EXPORT_SYMBOL(qmp_put); static int qmp_probe(struct platform_device *pdev) { struct qmp *qmp; Loading Loading @@ -613,6 +664,7 @@ static struct platform_driver qmp_driver = { .driver = { .name = "qcom_aoss_qmp", .of_match_table = qmp_dt_match, .suppress_bind_attrs = true, }, .probe = qmp_probe, .remove = qmp_remove, Loading include/linux/soc/qcom/qcom_aoss.h 0 → 100644 +38 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. */ #ifndef __QCOM_AOSS_H__ #define __QCOM_AOSS_H__ #include <linux/err.h> #include <linux/device.h> struct qmp; #if IS_ENABLED(CONFIG_QCOM_AOSS_QMP) int qmp_send(struct qmp *qmp, const void *data, size_t len); struct qmp *qmp_get(struct device *dev); void qmp_put(struct qmp *qmp); #else static inline int qmp_send(struct qmp *qmp, const void *data, size_t len) { return -ENODEV; } static inline struct qmp *qmp_get(struct device *dev) { return ERR_PTR(-ENODEV); } static inline void qmp_put(struct qmp *qmp) { } #endif #endif Loading
drivers/soc/qcom/qcom_aoss.c +53 −1 Original line number Diff line number Diff line Loading @@ -8,10 +8,12 @@ #include <linux/io.h> #include <linux/mailbox_client.h> #include <linux/module.h> #include <linux/of_platform.h> #include <linux/platform_device.h> #include <linux/pm_domain.h> #include <linux/thermal.h> #include <linux/slab.h> #include <linux/soc/qcom/qcom_aoss.h> #define QMP_DESC_MAGIC 0x0 #define QMP_DESC_VERSION 0x4 Loading Loading @@ -223,11 +225,14 @@ static bool qmp_message_empty(struct qmp *qmp) * * Return: 0 on success, negative errno on failure */ static int qmp_send(struct qmp *qmp, const void *data, size_t len) int qmp_send(struct qmp *qmp, const void *data, size_t len) { long time_left; int ret; if (WARN_ON(IS_ERR_OR_NULL(qmp) || !data)) return -EINVAL; if (WARN_ON(len + sizeof(u32) > qmp->size)) return -EINVAL; Loading Loading @@ -261,6 +266,7 @@ static int qmp_send(struct qmp *qmp, const void *data, size_t len) return ret; } EXPORT_SYMBOL(qmp_send); static int qmp_qdss_clk_prepare(struct clk_hw *hw) { Loading Loading @@ -519,6 +525,51 @@ static void qmp_cooling_devices_remove(struct qmp *qmp) thermal_cooling_device_unregister(qmp->cooling_devs[i].cdev); } /** * qmp_get() - get a qmp handle from a device * @dev: client device pointer * * Return: handle to qmp device on success, ERR_PTR() on failure */ struct qmp *qmp_get(struct device *dev) { struct platform_device *pdev; struct device_node *np; struct qmp *qmp; if (!dev || !dev->of_node) return ERR_PTR(-EINVAL); np = of_parse_phandle(dev->of_node, "qcom,qmp", 0); if (!np) return ERR_PTR(-ENODEV); pdev = of_find_device_by_node(np); of_node_put(np); if (!pdev) return ERR_PTR(-EINVAL); qmp = platform_get_drvdata(pdev); return qmp ? qmp : ERR_PTR(-EPROBE_DEFER); } EXPORT_SYMBOL(qmp_get); /** * qmp_put() - release a qmp handle * @qmp: qmp handle obtained from qmp_get() */ void qmp_put(struct qmp *qmp) { /* * Match get_device() inside of_find_device_by_node() in * qmp_get() */ if (!IS_ERR_OR_NULL(qmp)) put_device(qmp->dev); } EXPORT_SYMBOL(qmp_put); static int qmp_probe(struct platform_device *pdev) { struct qmp *qmp; Loading Loading @@ -613,6 +664,7 @@ static struct platform_driver qmp_driver = { .driver = { .name = "qcom_aoss_qmp", .of_match_table = qmp_dt_match, .suppress_bind_attrs = true, }, .probe = qmp_probe, .remove = qmp_remove, Loading
include/linux/soc/qcom/qcom_aoss.h 0 → 100644 +38 −0 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. */ #ifndef __QCOM_AOSS_H__ #define __QCOM_AOSS_H__ #include <linux/err.h> #include <linux/device.h> struct qmp; #if IS_ENABLED(CONFIG_QCOM_AOSS_QMP) int qmp_send(struct qmp *qmp, const void *data, size_t len); struct qmp *qmp_get(struct device *dev); void qmp_put(struct qmp *qmp); #else static inline int qmp_send(struct qmp *qmp, const void *data, size_t len) { return -ENODEV; } static inline struct qmp *qmp_get(struct device *dev) { return ERR_PTR(-ENODEV); } static inline void qmp_put(struct qmp *qmp) { } #endif #endif