diff options
Diffstat (limited to 'drivers/firmware/arm_scmi/system.c')
| -rw-r--r-- | drivers/firmware/arm_scmi/system.c | 63 | 
1 files changed, 36 insertions, 27 deletions
| diff --git a/drivers/firmware/arm_scmi/system.c b/drivers/firmware/arm_scmi/system.c index 283e12d5f24b..e5175ef73b40 100644 --- a/drivers/firmware/arm_scmi/system.c +++ b/drivers/firmware/arm_scmi/system.c @@ -2,11 +2,12 @@  /*   * System Control and Management Interface (SCMI) System Power Protocol   * - * Copyright (C) 2020 ARM Ltd. + * Copyright (C) 2020-2021 ARM Ltd.   */  #define pr_fmt(fmt) "SCMI Notifications SYSTEM - " fmt +#include <linux/module.h>  #include <linux/scmi_protocol.h>  #include "common.h" @@ -32,43 +33,44 @@ struct scmi_system_info {  	u32 version;  }; -static int scmi_system_request_notify(const struct scmi_handle *handle, +static int scmi_system_request_notify(const struct scmi_protocol_handle *ph,  				      bool enable)  {  	int ret;  	struct scmi_xfer *t;  	struct scmi_system_power_state_notify *notify; -	ret = scmi_xfer_get_init(handle, SYSTEM_POWER_STATE_NOTIFY, -				 SCMI_PROTOCOL_SYSTEM, sizeof(*notify), 0, &t); +	ret = ph->xops->xfer_get_init(ph, SYSTEM_POWER_STATE_NOTIFY, +				      sizeof(*notify), 0, &t);  	if (ret)  		return ret;  	notify = t->tx.buf;  	notify->notify_enable = enable ? cpu_to_le32(BIT(0)) : 0; -	ret = scmi_do_xfer(handle, t); +	ret = ph->xops->do_xfer(ph, t); -	scmi_xfer_put(handle, t); +	ph->xops->xfer_put(ph, t);  	return ret;  } -static int scmi_system_set_notify_enabled(const struct scmi_handle *handle, +static int scmi_system_set_notify_enabled(const struct scmi_protocol_handle *ph,  					  u8 evt_id, u32 src_id, bool enable)  {  	int ret; -	ret = scmi_system_request_notify(handle, enable); +	ret = scmi_system_request_notify(ph, enable);  	if (ret)  		pr_debug("FAIL_ENABLE - evt[%X] - ret:%d\n", evt_id, ret);  	return ret;  } -static void *scmi_system_fill_custom_report(const struct scmi_handle *handle, -					    u8 evt_id, ktime_t timestamp, -					    const void *payld, size_t payld_sz, -					    void *report, u32 *src_id) +static void * +scmi_system_fill_custom_report(const struct scmi_protocol_handle *ph, +			       u8 evt_id, ktime_t timestamp, +			       const void *payld, size_t payld_sz, +			       void *report, u32 *src_id)  {  	const struct scmi_system_power_state_notifier_payld *p = payld;  	struct scmi_system_power_state_notifier_report *r = report; @@ -101,31 +103,38 @@ static const struct scmi_event_ops system_event_ops = {  	.fill_custom_report = scmi_system_fill_custom_report,  }; -static int scmi_system_protocol_init(struct scmi_handle *handle) +static const struct scmi_protocol_events system_protocol_events = { +	.queue_sz = SCMI_PROTO_QUEUE_SZ, +	.ops = &system_event_ops, +	.evts = system_events, +	.num_events = ARRAY_SIZE(system_events), +	.num_sources = SCMI_SYSTEM_NUM_SOURCES, +}; + +static int scmi_system_protocol_init(const struct scmi_protocol_handle *ph)  {  	u32 version;  	struct scmi_system_info *pinfo; -	scmi_version_get(handle, SCMI_PROTOCOL_SYSTEM, &version); +	ph->xops->version_get(ph, &version); -	dev_dbg(handle->dev, "System Power Version %d.%d\n", +	dev_dbg(ph->dev, "System Power Version %d.%d\n",  		PROTOCOL_REV_MAJOR(version), PROTOCOL_REV_MINOR(version)); -	pinfo = devm_kzalloc(handle->dev, sizeof(*pinfo), GFP_KERNEL); +	pinfo = devm_kzalloc(ph->dev, sizeof(*pinfo), GFP_KERNEL);  	if (!pinfo)  		return -ENOMEM; -	scmi_register_protocol_events(handle, -				      SCMI_PROTOCOL_SYSTEM, SCMI_PROTO_QUEUE_SZ, -				      &system_event_ops, -				      system_events, -				      ARRAY_SIZE(system_events), -				      SCMI_SYSTEM_NUM_SOURCES); -  	pinfo->version = version; -	handle->system_priv = pinfo; - -	return 0; +	return ph->set_priv(ph, pinfo);  } -DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(SCMI_PROTOCOL_SYSTEM, system) +static const struct scmi_protocol scmi_system = { +	.id = SCMI_PROTOCOL_SYSTEM, +	.owner = THIS_MODULE, +	.instance_init = &scmi_system_protocol_init, +	.ops = NULL, +	.events = &system_protocol_events, +}; + +DEFINE_SCMI_PROTOCOL_REGISTER_UNREGISTER(system, scmi_system) | 
