1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Texas Instruments TI-SCI Processor Controller Helper Functions
5 * Copyright (C) 2018-2020 Texas Instruments Incorporated - https://www.ti.com/
6 * Suman Anna <s-anna@ti.com>
9 #ifndef REMOTEPROC_TI_SCI_PROC_H
10 #define REMOTEPROC_TI_SCI_PROC_H
12 #include <linux/soc/ti/ti_sci_protocol.h>
15 * struct ti_sci_proc - structure representing a processor control client
16 * @sci: cached TI-SCI protocol handle
17 * @ops: cached TI-SCI proc ops
18 * @dev: cached client device pointer
19 * @proc_id: processor id for the consumer remoteproc device
20 * @host_id: host id to pass the control over for this consumer remoteproc
24 const struct ti_sci_handle
*sci
;
25 const struct ti_sci_proc_ops
*ops
;
32 struct ti_sci_proc
*ti_sci_proc_of_get_tsp(struct device
*dev
,
33 const struct ti_sci_handle
*sci
)
35 struct ti_sci_proc
*tsp
;
39 ret
= of_property_read_u32_array(dev_of_node(dev
), "ti,sci-proc-ids",
44 tsp
= devm_kzalloc(dev
, sizeof(*tsp
), GFP_KERNEL
);
46 return ERR_PTR(-ENOMEM
);
50 tsp
->ops
= &sci
->ops
.proc_ops
;
51 tsp
->proc_id
= temp
[0];
52 tsp
->host_id
= temp
[1];
57 static inline int ti_sci_proc_request(struct ti_sci_proc
*tsp
)
61 ret
= tsp
->ops
->request(tsp
->sci
, tsp
->proc_id
);
63 dev_err(tsp
->dev
, "ti-sci processor request failed: %d\n",
68 static inline int ti_sci_proc_release(struct ti_sci_proc
*tsp
)
72 ret
= tsp
->ops
->release(tsp
->sci
, tsp
->proc_id
);
74 dev_err(tsp
->dev
, "ti-sci processor release failed: %d\n",
79 static inline int ti_sci_proc_handover(struct ti_sci_proc
*tsp
)
83 ret
= tsp
->ops
->handover(tsp
->sci
, tsp
->proc_id
, tsp
->host_id
);
85 dev_err(tsp
->dev
, "ti-sci processor handover of %d to %d failed: %d\n",
86 tsp
->proc_id
, tsp
->host_id
, ret
);
90 static inline int ti_sci_proc_set_config(struct ti_sci_proc
*tsp
,
92 u32 cfg_set
, u32 cfg_clr
)
96 ret
= tsp
->ops
->set_config(tsp
->sci
, tsp
->proc_id
, boot_vector
,
99 dev_err(tsp
->dev
, "ti-sci processor set_config failed: %d\n",
104 static inline int ti_sci_proc_set_control(struct ti_sci_proc
*tsp
,
105 u32 ctrl_set
, u32 ctrl_clr
)
109 ret
= tsp
->ops
->set_control(tsp
->sci
, tsp
->proc_id
, ctrl_set
, ctrl_clr
);
111 dev_err(tsp
->dev
, "ti-sci processor set_control failed: %d\n",
116 static inline int ti_sci_proc_get_status(struct ti_sci_proc
*tsp
,
117 u64
*boot_vector
, u32
*cfg_flags
,
118 u32
*ctrl_flags
, u32
*status_flags
)
122 ret
= tsp
->ops
->get_status(tsp
->sci
, tsp
->proc_id
, boot_vector
,
123 cfg_flags
, ctrl_flags
, status_flags
);
125 dev_err(tsp
->dev
, "ti-sci processor get_status failed: %d\n",
130 #endif /* REMOTEPROC_TI_SCI_PROC_H */