* [PATCH] ti: sci: Drop fake 'const' on handle pointer
@ 2026-02-23 20:24 Krzysztof Kozlowski
2026-03-02 16:58 ` Mathieu Poirier
2026-03-02 19:12 ` Andrew Davis
0 siblings, 2 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-02-23 20:24 UTC (permalink / raw)
To: Nishanth Menon, Tero Kristo, Santosh Shilimkar, Michael Turquette,
Stephen Boyd, Peter Ujfalusi, Vinod Koul, Frank Li,
Thomas Gleixner, Ulf Hansson, Bjorn Andersson, Mathieu Poirier,
Philipp Zabel, Dave Gerlach, linux-arm-kernel, linux-kernel,
linux-clk, dmaengine, linux-pm, linux-remoteproc
Cc: Krzysztof Kozlowski, stable
All the functions operating on the 'handle' pointer are claiming it is a
pointer to const thus they should not modify the handle. In fact that's
a false statement, because first thing these functions do is drop the
cast to const with container_of:
struct ti_sci_info *info = handle_to_ti_sci_info(handle);
And with such cast the handle is easily writable with simple:
info->handle.version.abi_major = 0;
The code is not correct logically, either, because functions like
ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
handle reference counting, thus they must modify the handle.
Modification here happens anyway, even if the reference counting is
stored in the container which the handle is part of.
The code does not have actual visible bug, but incorrect 'const'
annotations could lead to incorrect compiler decisions.
Fixes: 9e7d756da7a5 ("firmware: ti_sci: Add support for Device control")
Cc: <stable@vger.kernel.org>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
---
I fixed Samsung, here TI and I still think there is one more user of
this pattern - SCMI.
---
drivers/clk/keystone/sci-clk.c | 4 +-
drivers/dma/ti/k3-udma.h | 2 +-
drivers/firmware/ti_sci.c | 161 ++++++++++++------------
drivers/irqchip/irq-ti-sci-inta.c | 2 +-
drivers/irqchip/irq-ti-sci-intr.c | 2 +-
drivers/pmdomain/ti/ti_sci_pm_domains.c | 10 +-
drivers/remoteproc/ti_k3_common.h | 2 +-
drivers/remoteproc/ti_sci_proc.h | 4 +-
drivers/reset/reset-ti-sci.c | 6 +-
drivers/soc/ti/k3-ringacc.c | 2 +-
include/linux/soc/ti/k3-ringacc.h | 2 +-
include/linux/soc/ti/ti_sci_protocol.h | 131 ++++++++++---------
12 files changed, 163 insertions(+), 165 deletions(-)
diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c
index 9d5071223f4c..adf87e2d63b2 100644
--- a/drivers/clk/keystone/sci-clk.c
+++ b/drivers/clk/keystone/sci-clk.c
@@ -29,7 +29,7 @@
* @num_clocks: Total number of clocks for this provider
*/
struct sci_clk_provider {
- const struct ti_sci_handle *sci;
+ struct ti_sci_handle *sci;
const struct ti_sci_clk_ops *ops;
struct device *dev;
struct sci_clk **clocks;
@@ -651,7 +651,7 @@ static int ti_sci_clk_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct device_node *np = dev->of_node;
struct sci_clk_provider *provider;
- const struct ti_sci_handle *handle;
+ struct ti_sci_handle *handle;
int ret;
handle = devm_ti_sci_get_handle(dev);
diff --git a/drivers/dma/ti/k3-udma.h b/drivers/dma/ti/k3-udma.h
index 9062a237cd16..120b6e1bd629 100644
--- a/drivers/dma/ti/k3-udma.h
+++ b/drivers/dma/ti/k3-udma.h
@@ -112,7 +112,7 @@ enum udma_rm_range {
};
struct udma_tisci_rm {
- const struct ti_sci_handle *tisci;
+ struct ti_sci_handle *tisci;
const struct ti_sci_rm_udmap_ops *tisci_udmap_ops;
u32 tisci_dev_id;
diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
index e027a2bd8f26..de33893e6d26 100644
--- a/drivers/firmware/ti_sci.c
+++ b/drivers/firmware/ti_sci.c
@@ -511,7 +511,7 @@ static inline bool ti_sci_is_response_ack(void *r)
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
+static int ti_sci_set_device_state(struct ti_sci_handle *handle,
u32 id, u32 flags, u8 state)
{
struct ti_sci_info *info;
@@ -568,7 +568,7 @@ static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
+static int ti_sci_get_device_state(struct ti_sci_handle *handle,
u32 id, u32 *clcnt, u32 *resets,
u8 *p_state, u8 *c_state)
{
@@ -639,7 +639,7 @@ static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
+static int ti_sci_cmd_get_device(struct ti_sci_handle *handle, u32 id)
{
return ti_sci_set_device_state(handle, id, 0,
MSG_DEVICE_SW_STATE_ON);
@@ -658,7 +658,7 @@ static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_get_device_exclusive(struct ti_sci_handle *handle,
u32 id)
{
return ti_sci_set_device_state(handle, id,
@@ -677,7 +677,7 @@ static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
+static int ti_sci_cmd_idle_device(struct ti_sci_handle *handle, u32 id)
{
return ti_sci_set_device_state(handle, id, 0,
MSG_DEVICE_SW_STATE_RETENTION);
@@ -696,7 +696,7 @@ static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_idle_device_exclusive(struct ti_sci_handle *handle,
u32 id)
{
return ti_sci_set_device_state(handle, id,
@@ -715,7 +715,7 @@ static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
+static int ti_sci_cmd_put_device(struct ti_sci_handle *handle, u32 id)
{
return ti_sci_set_device_state(handle, id,
0, MSG_DEVICE_SW_STATE_AUTO_OFF);
@@ -729,7 +729,7 @@ static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
* Return: 0 if all went fine and the device ID is valid, else return
* appropriate error.
*/
-static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
+static int ti_sci_cmd_dev_is_valid(struct ti_sci_handle *handle, u32 id)
{
u8 unused;
@@ -745,7 +745,7 @@ static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
+static int ti_sci_cmd_dev_get_clcnt(struct ti_sci_handle *handle, u32 id,
u32 *count)
{
return ti_sci_get_device_state(handle, id, count, NULL, NULL, NULL);
@@ -759,7 +759,7 @@ static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
+static int ti_sci_cmd_dev_is_idle(struct ti_sci_handle *handle, u32 id,
bool *r_state)
{
int ret;
@@ -786,7 +786,7 @@ static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
+static int ti_sci_cmd_dev_is_stop(struct ti_sci_handle *handle, u32 id,
bool *r_state, bool *curr_state)
{
int ret;
@@ -817,7 +817,7 @@ static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
+static int ti_sci_cmd_dev_is_on(struct ti_sci_handle *handle, u32 id,
bool *r_state, bool *curr_state)
{
int ret;
@@ -847,7 +847,7 @@ static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
+static int ti_sci_cmd_dev_is_trans(struct ti_sci_handle *handle, u32 id,
bool *curr_state)
{
int ret;
@@ -874,7 +874,7 @@ static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_set_device_resets(struct ti_sci_handle *handle,
u32 id, u32 reset_state)
{
struct ti_sci_info *info;
@@ -929,7 +929,7 @@ static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_get_device_resets(struct ti_sci_handle *handle,
u32 id, u32 *reset_state)
{
return ti_sci_get_device_state(handle, id, NULL, reset_state, NULL,
@@ -948,7 +948,7 @@ static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
+static int ti_sci_set_clock_state(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id,
u32 flags, u8 state)
{
@@ -1013,7 +1013,7 @@ static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_get_clock_state(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id,
u8 *programmed_state, u8 *current_state)
{
@@ -1089,7 +1089,7 @@ static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
+static int ti_sci_cmd_get_clock(struct ti_sci_handle *handle, u32 dev_id,
u32 clk_id, bool needs_ssc,
bool can_change_freq, bool enable_input_term)
{
@@ -1115,7 +1115,7 @@ static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_idle_clock(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id)
{
return ti_sci_set_clock_state(handle, dev_id, clk_id,
@@ -1135,8 +1135,8 @@ static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
- u32 dev_id, u32 clk_id)
+static int ti_sci_cmd_put_clock(struct ti_sci_handle *handle, u32 dev_id,
+ u32 clk_id)
{
return ti_sci_set_clock_state(handle, dev_id, clk_id,
MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE,
@@ -1154,8 +1154,8 @@ static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
- u32 dev_id, u32 clk_id, bool *req_state)
+static int ti_sci_cmd_clk_is_auto(struct ti_sci_handle *handle, u32 dev_id,
+ u32 clk_id, bool *req_state)
{
u8 state = 0;
int ret;
@@ -1183,7 +1183,7 @@ static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
+static int ti_sci_cmd_clk_is_on(struct ti_sci_handle *handle, u32 dev_id,
u32 clk_id, bool *req_state, bool *curr_state)
{
u8 c_state = 0, r_state = 0;
@@ -1216,7 +1216,7 @@ static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
+static int ti_sci_cmd_clk_is_off(struct ti_sci_handle *handle, u32 dev_id,
u32 clk_id, bool *req_state, bool *curr_state)
{
u8 c_state = 0, r_state = 0;
@@ -1248,7 +1248,7 @@ static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_set_parent(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id, u32 parent_id)
{
struct ti_sci_info *info;
@@ -1316,7 +1316,7 @@ static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_get_parent(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id, u32 *parent_id)
{
struct ti_sci_info *info;
@@ -1385,7 +1385,7 @@ static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_get_num_parents(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id,
u32 *num_parents)
{
@@ -1463,7 +1463,7 @@ static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_get_match_freq(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id, u64 min_freq,
u64 target_freq, u64 max_freq,
u64 *match_freq)
@@ -1540,7 +1540,7 @@ static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_set_freq(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id, u64 min_freq,
u64 target_freq, u64 max_freq)
{
@@ -1606,7 +1606,7 @@ static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_clk_get_freq(struct ti_sci_handle *handle,
u32 dev_id, u32 clk_id, u64 *freq)
{
struct ti_sci_info *info;
@@ -1670,7 +1670,7 @@ static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
+static int ti_sci_cmd_prepare_sleep(struct ti_sci_handle *handle, u8 mode,
u32 ctx_lo, u32 ctx_hi, u32 debug_flags)
{
u32 msg_flags = mode == TISCI_MSG_VALUE_SLEEP_MODE_PARTIAL_IO ?
@@ -1737,7 +1737,7 @@ static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
+static int ti_sci_msg_cmd_query_fw_caps(struct ti_sci_handle *handle,
u64 *fw_caps)
{
struct ti_sci_info *info;
@@ -1794,8 +1794,7 @@ static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
- u8 state)
+static int ti_sci_cmd_set_io_isolation(struct ti_sci_handle *handle, u8 state)
{
struct ti_sci_info *info;
struct ti_sci_msg_req_set_io_isolation *req;
@@ -1852,7 +1851,7 @@ static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
+static int ti_sci_msg_cmd_lpm_wake_reason(struct ti_sci_handle *handle,
u32 *source, u64 *timestamp, u8 *pin, u8 *mode)
{
struct ti_sci_info *info;
@@ -1916,7 +1915,7 @@ static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_set_device_constraint(struct ti_sci_handle *handle,
u32 id, u8 state)
{
struct ti_sci_info *info;
@@ -1973,7 +1972,7 @@ static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_set_latency_constraint(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_set_latency_constraint(struct ti_sci_handle *handle,
u16 latency, u8 state)
{
struct ti_sci_info *info;
@@ -2063,7 +2062,7 @@ static int ti_sci_cmd_lpm_abort(struct device *dev)
return ret;
}
-static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
+static int ti_sci_cmd_core_reboot(struct ti_sci_handle *handle)
{
struct ti_sci_info *info;
struct ti_sci_msg_req_reboot *req;
@@ -2123,7 +2122,7 @@ static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
+static int ti_sci_get_resource_range(struct ti_sci_handle *handle,
u32 dev_id, u8 subtype, u8 s_host,
struct ti_sci_resource_desc *desc)
{
@@ -2194,7 +2193,7 @@ static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_get_resource_range(struct ti_sci_handle *handle,
u32 dev_id, u8 subtype,
struct ti_sci_resource_desc *desc)
{
@@ -2217,7 +2216,7 @@ static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
* Return: 0 if all went fine, else return appropriate error.
*/
static
-int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
+int ti_sci_cmd_get_resource_range_from_shost(struct ti_sci_handle *handle,
u32 dev_id, u8 subtype, u8 s_host,
struct ti_sci_resource_desc *desc)
{
@@ -2243,7 +2242,7 @@ int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
+static int ti_sci_manage_irq(struct ti_sci_handle *handle,
u32 valid_params, u16 src_id, u16 src_index,
u16 dst_id, u16 dst_host_irq, u16 ia_id, u16 vint,
u16 global_event, u8 vint_status_bit, u8 s_host,
@@ -2317,7 +2316,7 @@ static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
+static int ti_sci_set_irq(struct ti_sci_handle *handle, u32 valid_params,
u16 src_id, u16 src_index, u16 dst_id,
u16 dst_host_irq, u16 ia_id, u16 vint,
u16 global_event, u8 vint_status_bit, u8 s_host)
@@ -2351,7 +2350,7 @@ static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
+static int ti_sci_free_irq(struct ti_sci_handle *handle, u32 valid_params,
u16 src_id, u16 src_index, u16 dst_id,
u16 dst_host_irq, u16 ia_id, u16 vint,
u16 global_event, u8 vint_status_bit, u8 s_host)
@@ -2378,7 +2377,7 @@ static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
+static int ti_sci_cmd_set_irq(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 dst_id, u16 dst_host_irq)
{
u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
@@ -2400,7 +2399,7 @@ static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_set_event_map(struct ti_sci_handle *handle,
u16 src_id, u16 src_index, u16 ia_id,
u16 vint, u16 global_event,
u8 vint_status_bit)
@@ -2424,7 +2423,7 @@ static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
+static int ti_sci_cmd_free_irq(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 dst_id, u16 dst_host_irq)
{
u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
@@ -2446,7 +2445,7 @@ static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
*
* Return: 0 if all went fine, else return appropriate error.
*/
-static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_free_event_map(struct ti_sci_handle *handle,
u16 src_id, u16 src_index, u16 ia_id,
u16 vint, u16 global_event,
u8 vint_status_bit)
@@ -2469,7 +2468,7 @@ static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
* See @ti_sci_msg_rm_ring_cfg and @ti_sci_msg_rm_ring_cfg_req for
* more info.
*/
-static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_ring_cfg(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_ring_cfg *params)
{
struct ti_sci_msg_rm_ring_cfg_req *req;
@@ -2531,7 +2530,7 @@ static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_psil_pair(struct ti_sci_handle *handle,
u32 nav_id, u32 src_thread, u32 dst_thread)
{
struct ti_sci_msg_psil_pair *req;
@@ -2587,7 +2586,7 @@ static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_psil_unpair(struct ti_sci_handle *handle,
u32 nav_id, u32 src_thread, u32 dst_thread)
{
struct ti_sci_msg_psil_unpair *req;
@@ -2644,7 +2643,7 @@ static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
* See @ti_sci_msg_rm_udmap_tx_ch_cfg and @ti_sci_msg_rm_udmap_tx_ch_cfg_req for
* more info.
*/
-static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_udmap_tx_ch_cfg(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params)
{
struct ti_sci_msg_rm_udmap_tx_ch_cfg_req *req;
@@ -2716,7 +2715,7 @@ static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
* See @ti_sci_msg_rm_udmap_rx_ch_cfg and @ti_sci_msg_rm_udmap_rx_ch_cfg_req for
* more info.
*/
-static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_udmap_rx_ch_cfg(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params)
{
struct ti_sci_msg_rm_udmap_rx_ch_cfg_req *req;
@@ -2785,7 +2784,7 @@ static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
* See @ti_sci_msg_rm_udmap_flow_cfg and @ti_sci_msg_rm_udmap_flow_cfg_req for
* more info.
*/
-static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_rm_udmap_rx_flow_cfg(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_flow_cfg *params)
{
struct ti_sci_msg_rm_udmap_flow_cfg_req *req;
@@ -2855,8 +2854,7 @@ static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
- u8 proc_id)
+static int ti_sci_cmd_proc_request(struct ti_sci_handle *handle, u8 proc_id)
{
struct ti_sci_msg_req_proc_request *req;
struct ti_sci_msg_hdr *resp;
@@ -2907,8 +2905,7 @@ static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
- u8 proc_id)
+static int ti_sci_cmd_proc_release(struct ti_sci_handle *handle, u8 proc_id)
{
struct ti_sci_msg_req_proc_release *req;
struct ti_sci_msg_hdr *resp;
@@ -2962,8 +2959,8 @@ static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
- u8 proc_id, u8 host_id)
+static int ti_sci_cmd_proc_handover(struct ti_sci_handle *handle, u8 proc_id,
+ u8 host_id)
{
struct ti_sci_msg_req_proc_handover *req;
struct ti_sci_msg_hdr *resp;
@@ -3019,7 +3016,7 @@ static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_proc_set_config(struct ti_sci_handle *handle,
u8 proc_id, u64 bootvector,
u32 config_flags_set,
u32 config_flags_clear)
@@ -3081,7 +3078,7 @@ static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_proc_set_control(struct ti_sci_handle *handle,
u8 proc_id, u32 control_flags_set,
u32 control_flags_clear)
{
@@ -3140,7 +3137,7 @@ static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
*
* Return: 0 if all went well, else returns appropriate error value.
*/
-static int ti_sci_cmd_proc_get_status(const struct ti_sci_handle *handle,
+static int ti_sci_cmd_proc_get_status(struct ti_sci_handle *handle,
u8 proc_id, u64 *bv, u32 *cfg_flags,
u32 *ctrl_flags, u32 *sts_flags)
{
@@ -3290,7 +3287,7 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
* -ENODEV if the required node handler is missing
* -EINVAL if invalid conditions are encountered.
*/
-const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
+struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
{
struct device_node *ti_sci_np;
struct ti_sci_handle *handle = NULL;
@@ -3336,7 +3333,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_handle);
* if an error pointer was passed, it returns the error value back,
* if null was passed, it returns -EINVAL;
*/
-int ti_sci_put_handle(const struct ti_sci_handle *handle)
+int ti_sci_put_handle(struct ti_sci_handle *handle)
{
struct ti_sci_info *info;
@@ -3357,8 +3354,8 @@ EXPORT_SYMBOL_GPL(ti_sci_put_handle);
static void devm_ti_sci_release(struct device *dev, void *res)
{
- const struct ti_sci_handle **ptr = res;
- const struct ti_sci_handle *handle = *ptr;
+ struct ti_sci_handle **ptr = res;
+ struct ti_sci_handle *handle = *ptr;
int ret;
ret = ti_sci_put_handle(handle);
@@ -3375,12 +3372,14 @@ static void devm_ti_sci_release(struct device *dev, void *res)
* The function does not track individual clients of the framework
* and is expected to be maintained by caller of TI SCI protocol library.
*
+ * Do not change handle pointer to pointer to const.
+ *
* Return: 0 if all went fine, else corresponding error.
*/
-const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
+struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
{
- const struct ti_sci_handle **ptr;
- const struct ti_sci_handle *handle;
+ struct ti_sci_handle **ptr;
+ struct ti_sci_handle *handle;
ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
@@ -3411,8 +3410,8 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_handle);
* -ENODEV if the required node handler is missing
* -EINVAL if invalid conditions are encountered.
*/
-const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
- const char *property)
+struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
+ const char *property)
{
struct ti_sci_handle *handle = NULL;
struct device_node *ti_sci_np;
@@ -3457,10 +3456,10 @@ EXPORT_SYMBOL_GPL(ti_sci_get_by_phandle);
*
* Return: 0 if all went fine, else corresponding error.
*/
-const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
- const char *property)
+struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
+ const char *property)
{
- const struct ti_sci_handle *handle;
+ struct ti_sci_handle *handle;
const struct ti_sci_handle **ptr;
ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
@@ -3566,7 +3565,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_num_resources);
* error pointer.
*/
static struct ti_sci_resource *
-devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
+devm_ti_sci_get_resource_sets(struct ti_sci_handle *handle,
struct device *dev, u32 dev_id, u32 *sub_types,
u32 sets)
{
@@ -3626,7 +3625,7 @@ devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
* error pointer.
*/
struct ti_sci_resource *
-devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
struct device *dev, u32 dev_id, char *of_prop)
{
struct ti_sci_resource *res;
@@ -3664,7 +3663,7 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_of_resource);
* error pointer.
*/
struct ti_sci_resource *
-devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
+devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
u32 dev_id, u32 sub_type)
{
return devm_ti_sci_get_resource_sets(handle, dev, dev_id, &sub_type, 1);
@@ -3720,7 +3719,7 @@ static bool ti_sci_partial_io_wakeup_enabled(struct ti_sci_info *info)
static int ti_sci_sys_off_handler(struct sys_off_data *data)
{
struct ti_sci_info *info = data->cb_data;
- const struct ti_sci_handle *handle = &info->handle;
+ struct ti_sci_handle *handle = &info->handle;
bool enter_partial_io = ti_sci_partial_io_wakeup_enabled(info);
int ret;
@@ -3746,7 +3745,7 @@ static int ti_sci_sys_off_handler(struct sys_off_data *data)
static int tisci_reboot_handler(struct sys_off_data *data)
{
struct ti_sci_info *info = data->cb_data;
- const struct ti_sci_handle *handle = &info->handle;
+ struct ti_sci_handle *handle = &info->handle;
ti_sci_cmd_core_reboot(handle);
diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c
index 01963d36cfaf..88617a0ce794 100644
--- a/drivers/irqchip/irq-ti-sci-inta.c
+++ b/drivers/irqchip/irq-ti-sci-inta.c
@@ -98,7 +98,7 @@ struct ti_sci_inta_vint_desc {
* Global Event number.
*/
struct ti_sci_inta_irq_domain {
- const struct ti_sci_handle *sci;
+ struct ti_sci_handle *sci;
struct ti_sci_resource *vint;
struct ti_sci_resource *global_event;
struct list_head vint_list;
diff --git a/drivers/irqchip/irq-ti-sci-intr.c b/drivers/irqchip/irq-ti-sci-intr.c
index 0ea17040e934..9a13adbdac48 100644
--- a/drivers/irqchip/irq-ti-sci-intr.c
+++ b/drivers/irqchip/irq-ti-sci-intr.c
@@ -27,7 +27,7 @@
* @type: Specifies the trigger type supported by this Interrupt Router
*/
struct ti_sci_intr_irq_domain {
- const struct ti_sci_handle *sci;
+ struct ti_sci_handle *sci;
struct ti_sci_resource *out_irqs;
struct device *dev;
u32 ti_sci_id;
diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c
index 18d33bc35dee..913373a0b096 100644
--- a/drivers/pmdomain/ti/ti_sci_pm_domains.c
+++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c
@@ -27,7 +27,7 @@
* @data: onecell data for genpd core
*/
struct ti_sci_genpd_provider {
- const struct ti_sci_handle *ti_sci;
+ struct ti_sci_handle *ti_sci;
struct device *dev;
struct list_head pd_list;
struct genpd_onecell_data data;
@@ -63,7 +63,7 @@ static void ti_sci_pd_set_lat_constraint(struct device *dev, s32 val)
{
struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
- const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
+ struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
u16 val_ms;
int ret;
@@ -83,7 +83,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
{
struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
- const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
+ struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
int ret;
if (device_may_wakeup(dev)) {
@@ -111,7 +111,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
{
struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
- const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
+ struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
return ti_sci->ops.dev_ops.put_device(ti_sci, pd->idx);
}
@@ -123,7 +123,7 @@ static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
static int ti_sci_pd_power_on(struct generic_pm_domain *domain)
{
struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
- const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
+ struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
if (pd->exclusive)
return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci,
diff --git a/drivers/remoteproc/ti_k3_common.h b/drivers/remoteproc/ti_k3_common.h
index aee3c28dbe51..3906d006081d 100644
--- a/drivers/remoteproc/ti_k3_common.h
+++ b/drivers/remoteproc/ti_k3_common.h
@@ -88,7 +88,7 @@ struct k3_rproc {
struct reset_control *reset;
const struct k3_rproc_dev_data *data;
struct ti_sci_proc *tsp;
- const struct ti_sci_handle *ti_sci;
+ struct ti_sci_handle *ti_sci;
u32 ti_sci_id;
struct mbox_chan *mbox;
struct mbox_client client;
diff --git a/drivers/remoteproc/ti_sci_proc.h b/drivers/remoteproc/ti_sci_proc.h
index f3911ce75252..d20859a9fb13 100644
--- a/drivers/remoteproc/ti_sci_proc.h
+++ b/drivers/remoteproc/ti_sci_proc.h
@@ -21,7 +21,7 @@
* device
*/
struct ti_sci_proc {
- const struct ti_sci_handle *sci;
+ struct ti_sci_handle *sci;
const struct ti_sci_proc_ops *ops;
struct device *dev;
u8 proc_id;
@@ -30,7 +30,7 @@ struct ti_sci_proc {
static inline
struct ti_sci_proc *ti_sci_proc_of_get_tsp(struct device *dev,
- const struct ti_sci_handle *sci)
+ struct ti_sci_handle *sci)
{
struct ti_sci_proc *tsp;
u32 temp[2];
diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c
index 1dc5b766aac1..7fea18eb350e 100644
--- a/drivers/reset/reset-ti-sci.c
+++ b/drivers/reset/reset-ti-sci.c
@@ -36,7 +36,7 @@ struct ti_sci_reset_control {
struct ti_sci_reset_data {
struct reset_controller_dev rcdev;
struct device *dev;
- const struct ti_sci_handle *sci;
+ struct ti_sci_handle *sci;
struct idr idr;
};
@@ -63,7 +63,7 @@ static int ti_sci_reset_set(struct reset_controller_dev *rcdev,
unsigned long id, bool assert)
{
struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
- const struct ti_sci_handle *sci = data->sci;
+ struct ti_sci_handle *sci = data->sci;
const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
struct ti_sci_reset_control *control;
u32 reset_state;
@@ -144,7 +144,7 @@ static int ti_sci_reset_status(struct reset_controller_dev *rcdev,
unsigned long id)
{
struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
- const struct ti_sci_handle *sci = data->sci;
+ struct ti_sci_handle *sci = data->sci;
const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
struct ti_sci_reset_control *control;
u32 reset_state;
diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c
index 7602b8a909b0..5bc41b838ba4 100644
--- a/drivers/soc/ti/k3-ringacc.c
+++ b/drivers/soc/ti/k3-ringacc.c
@@ -220,7 +220,7 @@ struct k3_ringacc {
struct list_head list;
struct mutex req_lock; /* protect rings allocation */
- const struct ti_sci_handle *tisci;
+ struct ti_sci_handle *tisci;
const struct ti_sci_rm_ringacc_ops *tisci_ring_ops;
u32 tisci_dev_id;
diff --git a/include/linux/soc/ti/k3-ringacc.h b/include/linux/soc/ti/k3-ringacc.h
index 39b022b92598..a254b4243c21 100644
--- a/include/linux/soc/ti/k3-ringacc.h
+++ b/include/linux/soc/ti/k3-ringacc.h
@@ -259,7 +259,7 @@ struct ti_sci_handle;
* struct struct k3_ringacc_init_data - Initialization data for DMA rings
*/
struct k3_ringacc_init_data {
- const struct ti_sci_handle *tisci;
+ struct ti_sci_handle *tisci;
u32 tisci_dev_id;
u32 num_rings;
};
diff --git a/include/linux/soc/ti/ti_sci_protocol.h b/include/linux/soc/ti/ti_sci_protocol.h
index fd104b666836..2c07c0545673 100644
--- a/include/linux/soc/ti/ti_sci_protocol.h
+++ b/include/linux/soc/ti/ti_sci_protocol.h
@@ -34,7 +34,7 @@ struct ti_sci_handle;
* else returns corresponding error value.
*/
struct ti_sci_core_ops {
- int (*reboot_device)(const struct ti_sci_handle *handle);
+ int (*reboot_device)(struct ti_sci_handle *handle);
};
/**
@@ -96,26 +96,25 @@ struct ti_sci_core_ops {
* managed by driver for that purpose.
*/
struct ti_sci_dev_ops {
- int (*get_device)(const struct ti_sci_handle *handle, u32 id);
- int (*get_device_exclusive)(const struct ti_sci_handle *handle, u32 id);
- int (*idle_device)(const struct ti_sci_handle *handle, u32 id);
- int (*idle_device_exclusive)(const struct ti_sci_handle *handle,
- u32 id);
- int (*put_device)(const struct ti_sci_handle *handle, u32 id);
- int (*is_valid)(const struct ti_sci_handle *handle, u32 id);
- int (*get_context_loss_count)(const struct ti_sci_handle *handle,
+ int (*get_device)(struct ti_sci_handle *handle, u32 id);
+ int (*get_device_exclusive)(struct ti_sci_handle *handle, u32 id);
+ int (*idle_device)(struct ti_sci_handle *handle, u32 id);
+ int (*idle_device_exclusive)(struct ti_sci_handle *handle, u32 id);
+ int (*put_device)(struct ti_sci_handle *handle, u32 id);
+ int (*is_valid)(struct ti_sci_handle *handle, u32 id);
+ int (*get_context_loss_count)(struct ti_sci_handle *handle,
u32 id, u32 *count);
- int (*is_idle)(const struct ti_sci_handle *handle, u32 id,
+ int (*is_idle)(struct ti_sci_handle *handle, u32 id,
bool *requested_state);
- int (*is_stop)(const struct ti_sci_handle *handle, u32 id,
+ int (*is_stop)(struct ti_sci_handle *handle, u32 id,
bool *req_state, bool *current_state);
- int (*is_on)(const struct ti_sci_handle *handle, u32 id,
+ int (*is_on)(struct ti_sci_handle *handle, u32 id,
bool *req_state, bool *current_state);
- int (*is_transitioning)(const struct ti_sci_handle *handle, u32 id,
+ int (*is_transitioning)(struct ti_sci_handle *handle, u32 id,
bool *current_state);
- int (*set_device_resets)(const struct ti_sci_handle *handle, u32 id,
+ int (*set_device_resets)(struct ti_sci_handle *handle, u32 id,
u32 reset_state);
- int (*get_device_resets)(const struct ti_sci_handle *handle, u32 id,
+ int (*get_device_resets)(struct ti_sci_handle *handle, u32 id,
u32 *reset_state);
};
@@ -169,29 +168,29 @@ struct ti_sci_dev_ops {
* managed by driver for that purpose.
*/
struct ti_sci_clk_ops {
- int (*get_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*get_clock)(struct ti_sci_handle *handle, u32 did, u32 cid,
bool needs_ssc, bool can_change_freq,
bool enable_input_term);
- int (*idle_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
- int (*put_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
- int (*is_auto)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*idle_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
+ int (*put_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
+ int (*is_auto)(struct ti_sci_handle *handle, u32 did, u32 cid,
bool *req_state);
- int (*is_on)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*is_on)(struct ti_sci_handle *handle, u32 did, u32 cid,
bool *req_state, bool *current_state);
- int (*is_off)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*is_off)(struct ti_sci_handle *handle, u32 did, u32 cid,
bool *req_state, bool *current_state);
- int (*set_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*set_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
u32 parent_id);
- int (*get_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*get_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
u32 *parent_id);
- int (*get_num_parents)(const struct ti_sci_handle *handle, u32 did,
+ int (*get_num_parents)(struct ti_sci_handle *handle, u32 did,
u32 cid, u32 *num_parents);
- int (*get_best_match_freq)(const struct ti_sci_handle *handle, u32 did,
+ int (*get_best_match_freq)(struct ti_sci_handle *handle, u32 did,
u32 cid, u64 min_freq, u64 target_freq,
u64 max_freq, u64 *match_freq);
- int (*set_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*set_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
u64 min_freq, u64 target_freq, u64 max_freq);
- int (*get_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
+ int (*get_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
u64 *current_freq);
};
@@ -216,11 +215,11 @@ struct ti_sci_clk_ops {
* - state: The desired state of latency constraint: set or clear.
*/
struct ti_sci_pm_ops {
- int (*lpm_wake_reason)(const struct ti_sci_handle *handle,
+ int (*lpm_wake_reason)(struct ti_sci_handle *handle,
u32 *source, u64 *timestamp, u8 *pin, u8 *mode);
- int (*set_device_constraint)(const struct ti_sci_handle *handle,
+ int (*set_device_constraint)(struct ti_sci_handle *handle,
u32 id, u8 state);
- int (*set_latency_constraint)(const struct ti_sci_handle *handle,
+ int (*set_latency_constraint)(struct ti_sci_handle *handle,
u16 latency, u8 state);
};
@@ -258,9 +257,9 @@ struct ti_sci_resource_desc {
* range start index and number of resources
*/
struct ti_sci_rm_core_ops {
- int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id,
+ int (*get_range)(struct ti_sci_handle *handle, u32 dev_id,
u8 subtype, struct ti_sci_resource_desc *desc);
- int (*get_range_from_shost)(const struct ti_sci_handle *handle,
+ int (*get_range_from_shost)(struct ti_sci_handle *handle,
u32 dev_id, u8 subtype, u8 s_host,
struct ti_sci_resource_desc *desc);
};
@@ -280,14 +279,14 @@ struct ti_sci_rm_core_ops {
* Aggregator.
*/
struct ti_sci_rm_irq_ops {
- int (*set_irq)(const struct ti_sci_handle *handle, u16 src_id,
+ int (*set_irq)(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 dst_id, u16 dst_host_irq);
- int (*set_event_map)(const struct ti_sci_handle *handle, u16 src_id,
+ int (*set_event_map)(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 ia_id, u16 vint,
u16 global_event, u8 vint_status_bit);
- int (*free_irq)(const struct ti_sci_handle *handle, u16 src_id,
+ int (*free_irq)(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 dst_id, u16 dst_host_irq);
- int (*free_event_map)(const struct ti_sci_handle *handle, u16 src_id,
+ int (*free_event_map)(struct ti_sci_handle *handle, u16 src_id,
u16 src_index, u16 ia_id, u16 vint,
u16 global_event, u8 vint_status_bit);
};
@@ -342,7 +341,7 @@ struct ti_sci_msg_rm_ring_cfg {
* @set_cfg: configure the SoC Navigator Subsystem Ring Accelerator ring
*/
struct ti_sci_rm_ringacc_ops {
- int (*set_cfg)(const struct ti_sci_handle *handle,
+ int (*set_cfg)(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_ring_cfg *params);
};
@@ -360,9 +359,9 @@ struct ti_sci_rm_ringacc_ops {
* RCHAN_THRD_ID register is cleared.
*/
struct ti_sci_rm_psil_ops {
- int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
+ int (*pair)(struct ti_sci_handle *handle, u32 nav_id,
u32 src_thread, u32 dst_thread);
- int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
+ int (*unpair)(struct ti_sci_handle *handle, u32 nav_id,
u32 src_thread, u32 dst_thread);
};
@@ -519,11 +518,11 @@ struct ti_sci_msg_rm_udmap_flow_cfg {
* @rx_flow_cfg1: configure SoC Navigator Subsystem UDMA receive flow.
*/
struct ti_sci_rm_udmap_ops {
- int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
+ int (*tx_ch_cfg)(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
- int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
+ int (*rx_ch_cfg)(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
- int (*rx_flow_cfg)(const struct ti_sci_handle *handle,
+ int (*rx_flow_cfg)(struct ti_sci_handle *handle,
const struct ti_sci_msg_rm_udmap_flow_cfg *params);
};
@@ -544,14 +543,14 @@ struct ti_sci_rm_udmap_ops {
* -hid: Host ID
*/
struct ti_sci_proc_ops {
- int (*request)(const struct ti_sci_handle *handle, u8 pid);
- int (*release)(const struct ti_sci_handle *handle, u8 pid);
- int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
- int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
+ int (*request)(struct ti_sci_handle *handle, u8 pid);
+ int (*release)(struct ti_sci_handle *handle, u8 pid);
+ int (*handover)(struct ti_sci_handle *handle, u8 pid, u8 hid);
+ int (*set_config)(struct ti_sci_handle *handle, u8 pid,
u64 boot_vector, u32 cfg_set, u32 cfg_clr);
- int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
+ int (*set_control)(struct ti_sci_handle *handle, u8 pid,
u32 ctrl_set, u32 ctrl_clr);
- int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
+ int (*get_status)(struct ti_sci_handle *handle, u8 pid,
u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
u32 *status_flags);
};
@@ -603,51 +602,51 @@ struct ti_sci_resource {
};
#if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
-const struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
-int ti_sci_put_handle(const struct ti_sci_handle *handle);
-const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
-const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
- const char *property);
-const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
- const char *property);
+struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
+int ti_sci_put_handle(struct ti_sci_handle *handle);
+struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
+struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
+ const char *property);
+struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
+ const char *property);
u16 ti_sci_get_free_resource(struct ti_sci_resource *res);
void ti_sci_release_resource(struct ti_sci_resource *res, u16 id);
u32 ti_sci_get_num_resources(struct ti_sci_resource *res);
struct ti_sci_resource *
-devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
struct device *dev, u32 dev_id, char *of_prop);
struct ti_sci_resource *
-devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
+devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
u32 dev_id, u32 sub_type);
#else /* CONFIG_TI_SCI_PROTOCOL */
-static inline const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
+static inline struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
{
return ERR_PTR(-EINVAL);
}
-static inline int ti_sci_put_handle(const struct ti_sci_handle *handle)
+static inline int ti_sci_put_handle(struct ti_sci_handle *handle)
{
return -EINVAL;
}
static inline
-const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
+struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
{
return ERR_PTR(-EINVAL);
}
static inline
-const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
- const char *property)
+struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
+ const char *property)
{
return ERR_PTR(-EINVAL);
}
static inline
-const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
- const char *property)
+struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
+ const char *property)
{
return ERR_PTR(-EINVAL);
}
@@ -667,14 +666,14 @@ static inline u32 ti_sci_get_num_resources(struct ti_sci_resource *res)
}
static inline struct ti_sci_resource *
-devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
+devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
struct device *dev, u32 dev_id, char *of_prop)
{
return ERR_PTR(-EINVAL);
}
static inline struct ti_sci_resource *
-devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
+devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
u32 dev_id, u32 sub_type)
{
return ERR_PTR(-EINVAL);
--
2.51.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-02-23 20:24 [PATCH] ti: sci: Drop fake 'const' on handle pointer Krzysztof Kozlowski
@ 2026-03-02 16:58 ` Mathieu Poirier
2026-03-02 19:12 ` Andrew Davis
1 sibling, 0 replies; 9+ messages in thread
From: Mathieu Poirier @ 2026-03-02 16:58 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Nishanth Menon, Tero Kristo, Santosh Shilimkar, Michael Turquette,
Stephen Boyd, Peter Ujfalusi, Vinod Koul, Frank Li,
Thomas Gleixner, Ulf Hansson, Bjorn Andersson, Philipp Zabel,
Dave Gerlach, linux-arm-kernel, linux-kernel, linux-clk,
dmaengine, linux-pm, linux-remoteproc, stable
On Mon, Feb 23, 2026 at 09:24:27PM +0100, Krzysztof Kozlowski wrote:
> All the functions operating on the 'handle' pointer are claiming it is a
> pointer to const thus they should not modify the handle. In fact that's
> a false statement, because first thing these functions do is drop the
> cast to const with container_of:
>
> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
>
> And with such cast the handle is easily writable with simple:
>
> info->handle.version.abi_major = 0;
>
> The code is not correct logically, either, because functions like
> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
> handle reference counting, thus they must modify the handle.
> Modification here happens anyway, even if the reference counting is
> stored in the container which the handle is part of.
>
> The code does not have actual visible bug, but incorrect 'const'
> annotations could lead to incorrect compiler decisions.
>
> Fixes: 9e7d756da7a5 ("firmware: ti_sci: Add support for Device control")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
>
> ---
>
> I fixed Samsung, here TI and I still think there is one more user of
> this pattern - SCMI.
> ---
> drivers/clk/keystone/sci-clk.c | 4 +-
> drivers/dma/ti/k3-udma.h | 2 +-
> drivers/firmware/ti_sci.c | 161 ++++++++++++------------
> drivers/irqchip/irq-ti-sci-inta.c | 2 +-
> drivers/irqchip/irq-ti-sci-intr.c | 2 +-
> drivers/pmdomain/ti/ti_sci_pm_domains.c | 10 +-
> drivers/remoteproc/ti_k3_common.h | 2 +-
> drivers/remoteproc/ti_sci_proc.h | 4 +-
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
> drivers/reset/reset-ti-sci.c | 6 +-
> drivers/soc/ti/k3-ringacc.c | 2 +-
> include/linux/soc/ti/k3-ringacc.h | 2 +-
> include/linux/soc/ti/ti_sci_protocol.h | 131 ++++++++++---------
> 12 files changed, 163 insertions(+), 165 deletions(-)
>
> diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c
> index 9d5071223f4c..adf87e2d63b2 100644
> --- a/drivers/clk/keystone/sci-clk.c
> +++ b/drivers/clk/keystone/sci-clk.c
> @@ -29,7 +29,7 @@
> * @num_clocks: Total number of clocks for this provider
> */
> struct sci_clk_provider {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> const struct ti_sci_clk_ops *ops;
> struct device *dev;
> struct sci_clk **clocks;
> @@ -651,7 +651,7 @@ static int ti_sci_clk_probe(struct platform_device *pdev)
> struct device *dev = &pdev->dev;
> struct device_node *np = dev->of_node;
> struct sci_clk_provider *provider;
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle *handle;
> int ret;
>
> handle = devm_ti_sci_get_handle(dev);
> diff --git a/drivers/dma/ti/k3-udma.h b/drivers/dma/ti/k3-udma.h
> index 9062a237cd16..120b6e1bd629 100644
> --- a/drivers/dma/ti/k3-udma.h
> +++ b/drivers/dma/ti/k3-udma.h
> @@ -112,7 +112,7 @@ enum udma_rm_range {
> };
>
> struct udma_tisci_rm {
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> const struct ti_sci_rm_udmap_ops *tisci_udmap_ops;
> u32 tisci_dev_id;
>
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index e027a2bd8f26..de33893e6d26 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -511,7 +511,7 @@ static inline bool ti_sci_is_response_ack(void *r)
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
> +static int ti_sci_set_device_state(struct ti_sci_handle *handle,
> u32 id, u32 flags, u8 state)
> {
> struct ti_sci_info *info;
> @@ -568,7 +568,7 @@ static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
> +static int ti_sci_get_device_state(struct ti_sci_handle *handle,
> u32 id, u32 *clcnt, u32 *resets,
> u8 *p_state, u8 *c_state)
> {
> @@ -639,7 +639,7 @@ static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_get_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id, 0,
> MSG_DEVICE_SW_STATE_ON);
> @@ -658,7 +658,7 @@ static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_device_exclusive(struct ti_sci_handle *handle,
> u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> @@ -677,7 +677,7 @@ static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_idle_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id, 0,
> MSG_DEVICE_SW_STATE_RETENTION);
> @@ -696,7 +696,7 @@ static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_idle_device_exclusive(struct ti_sci_handle *handle,
> u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> @@ -715,7 +715,7 @@ static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_put_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> 0, MSG_DEVICE_SW_STATE_AUTO_OFF);
> @@ -729,7 +729,7 @@ static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
> * Return: 0 if all went fine and the device ID is valid, else return
> * appropriate error.
> */
> -static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_dev_is_valid(struct ti_sci_handle *handle, u32 id)
> {
> u8 unused;
>
> @@ -745,7 +745,7 @@ static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_get_clcnt(struct ti_sci_handle *handle, u32 id,
> u32 *count)
> {
> return ti_sci_get_device_state(handle, id, count, NULL, NULL, NULL);
> @@ -759,7 +759,7 @@ static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_idle(struct ti_sci_handle *handle, u32 id,
> bool *r_state)
> {
> int ret;
> @@ -786,7 +786,7 @@ static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_stop(struct ti_sci_handle *handle, u32 id,
> bool *r_state, bool *curr_state)
> {
> int ret;
> @@ -817,7 +817,7 @@ static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_on(struct ti_sci_handle *handle, u32 id,
> bool *r_state, bool *curr_state)
> {
> int ret;
> @@ -847,7 +847,7 @@ static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_trans(struct ti_sci_handle *handle, u32 id,
> bool *curr_state)
> {
> int ret;
> @@ -874,7 +874,7 @@ static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_device_resets(struct ti_sci_handle *handle,
> u32 id, u32 reset_state)
> {
> struct ti_sci_info *info;
> @@ -929,7 +929,7 @@ static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_device_resets(struct ti_sci_handle *handle,
> u32 id, u32 *reset_state)
> {
> return ti_sci_get_device_state(handle, id, NULL, reset_state, NULL,
> @@ -948,7 +948,7 @@ static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
> +static int ti_sci_set_clock_state(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u32 flags, u8 state)
> {
> @@ -1013,7 +1013,7 @@ static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_clock_state(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u8 *programmed_state, u8 *current_state)
> {
> @@ -1089,7 +1089,7 @@ static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_get_clock(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool needs_ssc,
> bool can_change_freq, bool enable_input_term)
> {
> @@ -1115,7 +1115,7 @@ static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_idle_clock(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id)
> {
> return ti_sci_set_clock_state(handle, dev_id, clk_id,
> @@ -1135,8 +1135,8 @@ static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
> - u32 dev_id, u32 clk_id)
> +static int ti_sci_cmd_put_clock(struct ti_sci_handle *handle, u32 dev_id,
> + u32 clk_id)
> {
> return ti_sci_set_clock_state(handle, dev_id, clk_id,
> MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE,
> @@ -1154,8 +1154,8 @@ static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
> - u32 dev_id, u32 clk_id, bool *req_state)
> +static int ti_sci_cmd_clk_is_auto(struct ti_sci_handle *handle, u32 dev_id,
> + u32 clk_id, bool *req_state)
> {
> u8 state = 0;
> int ret;
> @@ -1183,7 +1183,7 @@ static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_clk_is_on(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool *req_state, bool *curr_state)
> {
> u8 c_state = 0, r_state = 0;
> @@ -1216,7 +1216,7 @@ static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_clk_is_off(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool *req_state, bool *curr_state)
> {
> u8 c_state = 0, r_state = 0;
> @@ -1248,7 +1248,7 @@ static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_set_parent(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u32 parent_id)
> {
> struct ti_sci_info *info;
> @@ -1316,7 +1316,7 @@ static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_parent(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u32 *parent_id)
> {
> struct ti_sci_info *info;
> @@ -1385,7 +1385,7 @@ static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_num_parents(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u32 *num_parents)
> {
> @@ -1463,7 +1463,7 @@ static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_match_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 min_freq,
> u64 target_freq, u64 max_freq,
> u64 *match_freq)
> @@ -1540,7 +1540,7 @@ static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_set_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 min_freq,
> u64 target_freq, u64 max_freq)
> {
> @@ -1606,7 +1606,7 @@ static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 *freq)
> {
> struct ti_sci_info *info;
> @@ -1670,7 +1670,7 @@ static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
> +static int ti_sci_cmd_prepare_sleep(struct ti_sci_handle *handle, u8 mode,
> u32 ctx_lo, u32 ctx_hi, u32 debug_flags)
> {
> u32 msg_flags = mode == TISCI_MSG_VALUE_SLEEP_MODE_PARTIAL_IO ?
> @@ -1737,7 +1737,7 @@ static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
> +static int ti_sci_msg_cmd_query_fw_caps(struct ti_sci_handle *handle,
> u64 *fw_caps)
> {
> struct ti_sci_info *info;
> @@ -1794,8 +1794,7 @@ static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
> - u8 state)
> +static int ti_sci_cmd_set_io_isolation(struct ti_sci_handle *handle, u8 state)
> {
> struct ti_sci_info *info;
> struct ti_sci_msg_req_set_io_isolation *req;
> @@ -1852,7 +1851,7 @@ static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
> +static int ti_sci_msg_cmd_lpm_wake_reason(struct ti_sci_handle *handle,
> u32 *source, u64 *timestamp, u8 *pin, u8 *mode)
> {
> struct ti_sci_info *info;
> @@ -1916,7 +1915,7 @@ static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_device_constraint(struct ti_sci_handle *handle,
> u32 id, u8 state)
> {
> struct ti_sci_info *info;
> @@ -1973,7 +1972,7 @@ static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_latency_constraint(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_latency_constraint(struct ti_sci_handle *handle,
> u16 latency, u8 state)
> {
> struct ti_sci_info *info;
> @@ -2063,7 +2062,7 @@ static int ti_sci_cmd_lpm_abort(struct device *dev)
> return ret;
> }
>
> -static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
> +static int ti_sci_cmd_core_reboot(struct ti_sci_handle *handle)
> {
> struct ti_sci_info *info;
> struct ti_sci_msg_req_reboot *req;
> @@ -2123,7 +2122,7 @@ static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
> +static int ti_sci_get_resource_range(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2194,7 +2193,7 @@ static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_resource_range(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2217,7 +2216,7 @@ static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
> * Return: 0 if all went fine, else return appropriate error.
> */
> static
> -int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
> +int ti_sci_cmd_get_resource_range_from_shost(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2243,7 +2242,7 @@ int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
> +static int ti_sci_manage_irq(struct ti_sci_handle *handle,
> u32 valid_params, u16 src_id, u16 src_index,
> u16 dst_id, u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host,
> @@ -2317,7 +2316,7 @@ static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
> +static int ti_sci_set_irq(struct ti_sci_handle *handle, u32 valid_params,
> u16 src_id, u16 src_index, u16 dst_id,
> u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host)
> @@ -2351,7 +2350,7 @@ static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
> +static int ti_sci_free_irq(struct ti_sci_handle *handle, u32 valid_params,
> u16 src_id, u16 src_index, u16 dst_id,
> u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host)
> @@ -2378,7 +2377,7 @@ static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
> +static int ti_sci_cmd_set_irq(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq)
> {
> u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
> @@ -2400,7 +2399,7 @@ static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_event_map(struct ti_sci_handle *handle,
> u16 src_id, u16 src_index, u16 ia_id,
> u16 vint, u16 global_event,
> u8 vint_status_bit)
> @@ -2424,7 +2423,7 @@ static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
> +static int ti_sci_cmd_free_irq(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq)
> {
> u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
> @@ -2446,7 +2445,7 @@ static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_free_event_map(struct ti_sci_handle *handle,
> u16 src_id, u16 src_index, u16 ia_id,
> u16 vint, u16 global_event,
> u8 vint_status_bit)
> @@ -2469,7 +2468,7 @@ static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_ring_cfg and @ti_sci_msg_rm_ring_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_ring_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_ring_cfg *params)
> {
> struct ti_sci_msg_rm_ring_cfg_req *req;
> @@ -2531,7 +2530,7 @@ static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_psil_pair(struct ti_sci_handle *handle,
> u32 nav_id, u32 src_thread, u32 dst_thread)
> {
> struct ti_sci_msg_psil_pair *req;
> @@ -2587,7 +2586,7 @@ static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_psil_unpair(struct ti_sci_handle *handle,
> u32 nav_id, u32 src_thread, u32 dst_thread)
> {
> struct ti_sci_msg_psil_unpair *req;
> @@ -2644,7 +2643,7 @@ static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_tx_ch_cfg and @ti_sci_msg_rm_udmap_tx_ch_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_tx_ch_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_tx_ch_cfg_req *req;
> @@ -2716,7 +2715,7 @@ static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_rx_ch_cfg and @ti_sci_msg_rm_udmap_rx_ch_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_rx_ch_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_rx_ch_cfg_req *req;
> @@ -2785,7 +2784,7 @@ static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_flow_cfg and @ti_sci_msg_rm_udmap_flow_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_rx_flow_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_flow_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_flow_cfg_req *req;
> @@ -2855,8 +2854,7 @@ static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
> - u8 proc_id)
> +static int ti_sci_cmd_proc_request(struct ti_sci_handle *handle, u8 proc_id)
> {
> struct ti_sci_msg_req_proc_request *req;
> struct ti_sci_msg_hdr *resp;
> @@ -2907,8 +2905,7 @@ static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
> - u8 proc_id)
> +static int ti_sci_cmd_proc_release(struct ti_sci_handle *handle, u8 proc_id)
> {
> struct ti_sci_msg_req_proc_release *req;
> struct ti_sci_msg_hdr *resp;
> @@ -2962,8 +2959,8 @@ static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
> - u8 proc_id, u8 host_id)
> +static int ti_sci_cmd_proc_handover(struct ti_sci_handle *handle, u8 proc_id,
> + u8 host_id)
> {
> struct ti_sci_msg_req_proc_handover *req;
> struct ti_sci_msg_hdr *resp;
> @@ -3019,7 +3016,7 @@ static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_set_config(struct ti_sci_handle *handle,
> u8 proc_id, u64 bootvector,
> u32 config_flags_set,
> u32 config_flags_clear)
> @@ -3081,7 +3078,7 @@ static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_set_control(struct ti_sci_handle *handle,
> u8 proc_id, u32 control_flags_set,
> u32 control_flags_clear)
> {
> @@ -3140,7 +3137,7 @@ static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_get_status(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_get_status(struct ti_sci_handle *handle,
> u8 proc_id, u64 *bv, u32 *cfg_flags,
> u32 *ctrl_flags, u32 *sts_flags)
> {
> @@ -3290,7 +3287,7 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
> * -ENODEV if the required node handler is missing
> * -EINVAL if invalid conditions are encountered.
> */
> -const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> {
> struct device_node *ti_sci_np;
> struct ti_sci_handle *handle = NULL;
> @@ -3336,7 +3333,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_handle);
> * if an error pointer was passed, it returns the error value back,
> * if null was passed, it returns -EINVAL;
> */
> -int ti_sci_put_handle(const struct ti_sci_handle *handle)
> +int ti_sci_put_handle(struct ti_sci_handle *handle)
> {
> struct ti_sci_info *info;
>
> @@ -3357,8 +3354,8 @@ EXPORT_SYMBOL_GPL(ti_sci_put_handle);
>
> static void devm_ti_sci_release(struct device *dev, void *res)
> {
> - const struct ti_sci_handle **ptr = res;
> - const struct ti_sci_handle *handle = *ptr;
> + struct ti_sci_handle **ptr = res;
> + struct ti_sci_handle *handle = *ptr;
> int ret;
>
> ret = ti_sci_put_handle(handle);
> @@ -3375,12 +3372,14 @@ static void devm_ti_sci_release(struct device *dev, void *res)
> * The function does not track individual clients of the framework
> * and is expected to be maintained by caller of TI SCI protocol library.
> *
> + * Do not change handle pointer to pointer to const.
> + *
> * Return: 0 if all went fine, else corresponding error.
> */
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> {
> - const struct ti_sci_handle **ptr;
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle **ptr;
> + struct ti_sci_handle *handle;
>
> ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
> if (!ptr)
> @@ -3411,8 +3410,8 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_handle);
> * -ENODEV if the required node handler is missing
> * -EINVAL if invalid conditions are encountered.
> */
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property)
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property)
> {
> struct ti_sci_handle *handle = NULL;
> struct device_node *ti_sci_np;
> @@ -3457,10 +3456,10 @@ EXPORT_SYMBOL_GPL(ti_sci_get_by_phandle);
> *
> * Return: 0 if all went fine, else corresponding error.
> */
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property)
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property)
> {
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle *handle;
> const struct ti_sci_handle **ptr;
>
> ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
> @@ -3566,7 +3565,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_num_resources);
> * error pointer.
> */
> static struct ti_sci_resource *
> -devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_resource_sets(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, u32 *sub_types,
> u32 sets)
> {
> @@ -3626,7 +3625,7 @@ devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
> * error pointer.
> */
> struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop)
> {
> struct ti_sci_resource *res;
> @@ -3664,7 +3663,7 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_of_resource);
> * error pointer.
> */
> struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type)
> {
> return devm_ti_sci_get_resource_sets(handle, dev, dev_id, &sub_type, 1);
> @@ -3720,7 +3719,7 @@ static bool ti_sci_partial_io_wakeup_enabled(struct ti_sci_info *info)
> static int ti_sci_sys_off_handler(struct sys_off_data *data)
> {
> struct ti_sci_info *info = data->cb_data;
> - const struct ti_sci_handle *handle = &info->handle;
> + struct ti_sci_handle *handle = &info->handle;
> bool enter_partial_io = ti_sci_partial_io_wakeup_enabled(info);
> int ret;
>
> @@ -3746,7 +3745,7 @@ static int ti_sci_sys_off_handler(struct sys_off_data *data)
> static int tisci_reboot_handler(struct sys_off_data *data)
> {
> struct ti_sci_info *info = data->cb_data;
> - const struct ti_sci_handle *handle = &info->handle;
> + struct ti_sci_handle *handle = &info->handle;
>
> ti_sci_cmd_core_reboot(handle);
>
> diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c
> index 01963d36cfaf..88617a0ce794 100644
> --- a/drivers/irqchip/irq-ti-sci-inta.c
> +++ b/drivers/irqchip/irq-ti-sci-inta.c
> @@ -98,7 +98,7 @@ struct ti_sci_inta_vint_desc {
> * Global Event number.
> */
> struct ti_sci_inta_irq_domain {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct ti_sci_resource *vint;
> struct ti_sci_resource *global_event;
> struct list_head vint_list;
> diff --git a/drivers/irqchip/irq-ti-sci-intr.c b/drivers/irqchip/irq-ti-sci-intr.c
> index 0ea17040e934..9a13adbdac48 100644
> --- a/drivers/irqchip/irq-ti-sci-intr.c
> +++ b/drivers/irqchip/irq-ti-sci-intr.c
> @@ -27,7 +27,7 @@
> * @type: Specifies the trigger type supported by this Interrupt Router
> */
> struct ti_sci_intr_irq_domain {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct ti_sci_resource *out_irqs;
> struct device *dev;
> u32 ti_sci_id;
> diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c
> index 18d33bc35dee..913373a0b096 100644
> --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c
> +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c
> @@ -27,7 +27,7 @@
> * @data: onecell data for genpd core
> */
> struct ti_sci_genpd_provider {
> - const struct ti_sci_handle *ti_sci;
> + struct ti_sci_handle *ti_sci;
> struct device *dev;
> struct list_head pd_list;
> struct genpd_onecell_data data;
> @@ -63,7 +63,7 @@ static void ti_sci_pd_set_lat_constraint(struct device *dev, s32 val)
> {
> struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> u16 val_ms;
> int ret;
>
> @@ -83,7 +83,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
> {
> struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> int ret;
>
> if (device_may_wakeup(dev)) {
> @@ -111,7 +111,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
> static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
> {
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
>
> return ti_sci->ops.dev_ops.put_device(ti_sci, pd->idx);
> }
> @@ -123,7 +123,7 @@ static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
> static int ti_sci_pd_power_on(struct generic_pm_domain *domain)
> {
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
>
> if (pd->exclusive)
> return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci,
> diff --git a/drivers/remoteproc/ti_k3_common.h b/drivers/remoteproc/ti_k3_common.h
> index aee3c28dbe51..3906d006081d 100644
> --- a/drivers/remoteproc/ti_k3_common.h
> +++ b/drivers/remoteproc/ti_k3_common.h
> @@ -88,7 +88,7 @@ struct k3_rproc {
> struct reset_control *reset;
> const struct k3_rproc_dev_data *data;
> struct ti_sci_proc *tsp;
> - const struct ti_sci_handle *ti_sci;
> + struct ti_sci_handle *ti_sci;
> u32 ti_sci_id;
> struct mbox_chan *mbox;
> struct mbox_client client;
> diff --git a/drivers/remoteproc/ti_sci_proc.h b/drivers/remoteproc/ti_sci_proc.h
> index f3911ce75252..d20859a9fb13 100644
> --- a/drivers/remoteproc/ti_sci_proc.h
> +++ b/drivers/remoteproc/ti_sci_proc.h
> @@ -21,7 +21,7 @@
> * device
> */
> struct ti_sci_proc {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> const struct ti_sci_proc_ops *ops;
> struct device *dev;
> u8 proc_id;
> @@ -30,7 +30,7 @@ struct ti_sci_proc {
>
> static inline
> struct ti_sci_proc *ti_sci_proc_of_get_tsp(struct device *dev,
> - const struct ti_sci_handle *sci)
> + struct ti_sci_handle *sci)
> {
> struct ti_sci_proc *tsp;
> u32 temp[2];
> diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c
> index 1dc5b766aac1..7fea18eb350e 100644
> --- a/drivers/reset/reset-ti-sci.c
> +++ b/drivers/reset/reset-ti-sci.c
> @@ -36,7 +36,7 @@ struct ti_sci_reset_control {
> struct ti_sci_reset_data {
> struct reset_controller_dev rcdev;
> struct device *dev;
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct idr idr;
> };
>
> @@ -63,7 +63,7 @@ static int ti_sci_reset_set(struct reset_controller_dev *rcdev,
> unsigned long id, bool assert)
> {
> struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
> - const struct ti_sci_handle *sci = data->sci;
> + struct ti_sci_handle *sci = data->sci;
> const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
> struct ti_sci_reset_control *control;
> u32 reset_state;
> @@ -144,7 +144,7 @@ static int ti_sci_reset_status(struct reset_controller_dev *rcdev,
> unsigned long id)
> {
> struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
> - const struct ti_sci_handle *sci = data->sci;
> + struct ti_sci_handle *sci = data->sci;
> const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
> struct ti_sci_reset_control *control;
> u32 reset_state;
> diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c
> index 7602b8a909b0..5bc41b838ba4 100644
> --- a/drivers/soc/ti/k3-ringacc.c
> +++ b/drivers/soc/ti/k3-ringacc.c
> @@ -220,7 +220,7 @@ struct k3_ringacc {
> struct list_head list;
> struct mutex req_lock; /* protect rings allocation */
>
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> const struct ti_sci_rm_ringacc_ops *tisci_ring_ops;
> u32 tisci_dev_id;
>
> diff --git a/include/linux/soc/ti/k3-ringacc.h b/include/linux/soc/ti/k3-ringacc.h
> index 39b022b92598..a254b4243c21 100644
> --- a/include/linux/soc/ti/k3-ringacc.h
> +++ b/include/linux/soc/ti/k3-ringacc.h
> @@ -259,7 +259,7 @@ struct ti_sci_handle;
> * struct struct k3_ringacc_init_data - Initialization data for DMA rings
> */
> struct k3_ringacc_init_data {
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> u32 tisci_dev_id;
> u32 num_rings;
> };
> diff --git a/include/linux/soc/ti/ti_sci_protocol.h b/include/linux/soc/ti/ti_sci_protocol.h
> index fd104b666836..2c07c0545673 100644
> --- a/include/linux/soc/ti/ti_sci_protocol.h
> +++ b/include/linux/soc/ti/ti_sci_protocol.h
> @@ -34,7 +34,7 @@ struct ti_sci_handle;
> * else returns corresponding error value.
> */
> struct ti_sci_core_ops {
> - int (*reboot_device)(const struct ti_sci_handle *handle);
> + int (*reboot_device)(struct ti_sci_handle *handle);
> };
>
> /**
> @@ -96,26 +96,25 @@ struct ti_sci_core_ops {
> * managed by driver for that purpose.
> */
> struct ti_sci_dev_ops {
> - int (*get_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*get_device_exclusive)(const struct ti_sci_handle *handle, u32 id);
> - int (*idle_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*idle_device_exclusive)(const struct ti_sci_handle *handle,
> - u32 id);
> - int (*put_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*is_valid)(const struct ti_sci_handle *handle, u32 id);
> - int (*get_context_loss_count)(const struct ti_sci_handle *handle,
> + int (*get_device)(struct ti_sci_handle *handle, u32 id);
> + int (*get_device_exclusive)(struct ti_sci_handle *handle, u32 id);
> + int (*idle_device)(struct ti_sci_handle *handle, u32 id);
> + int (*idle_device_exclusive)(struct ti_sci_handle *handle, u32 id);
> + int (*put_device)(struct ti_sci_handle *handle, u32 id);
> + int (*is_valid)(struct ti_sci_handle *handle, u32 id);
> + int (*get_context_loss_count)(struct ti_sci_handle *handle,
> u32 id, u32 *count);
> - int (*is_idle)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_idle)(struct ti_sci_handle *handle, u32 id,
> bool *requested_state);
> - int (*is_stop)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_stop)(struct ti_sci_handle *handle, u32 id,
> bool *req_state, bool *current_state);
> - int (*is_on)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_on)(struct ti_sci_handle *handle, u32 id,
> bool *req_state, bool *current_state);
> - int (*is_transitioning)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_transitioning)(struct ti_sci_handle *handle, u32 id,
> bool *current_state);
> - int (*set_device_resets)(const struct ti_sci_handle *handle, u32 id,
> + int (*set_device_resets)(struct ti_sci_handle *handle, u32 id,
> u32 reset_state);
> - int (*get_device_resets)(const struct ti_sci_handle *handle, u32 id,
> + int (*get_device_resets)(struct ti_sci_handle *handle, u32 id,
> u32 *reset_state);
> };
>
> @@ -169,29 +168,29 @@ struct ti_sci_dev_ops {
> * managed by driver for that purpose.
> */
> struct ti_sci_clk_ops {
> - int (*get_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_clock)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool needs_ssc, bool can_change_freq,
> bool enable_input_term);
> - int (*idle_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
> - int (*put_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
> - int (*is_auto)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*idle_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
> + int (*put_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
> + int (*is_auto)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state);
> - int (*is_on)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*is_on)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state, bool *current_state);
> - int (*is_off)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*is_off)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state, bool *current_state);
> - int (*set_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*set_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u32 parent_id);
> - int (*get_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u32 *parent_id);
> - int (*get_num_parents)(const struct ti_sci_handle *handle, u32 did,
> + int (*get_num_parents)(struct ti_sci_handle *handle, u32 did,
> u32 cid, u32 *num_parents);
> - int (*get_best_match_freq)(const struct ti_sci_handle *handle, u32 did,
> + int (*get_best_match_freq)(struct ti_sci_handle *handle, u32 did,
> u32 cid, u64 min_freq, u64 target_freq,
> u64 max_freq, u64 *match_freq);
> - int (*set_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*set_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u64 min_freq, u64 target_freq, u64 max_freq);
> - int (*get_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u64 *current_freq);
> };
>
> @@ -216,11 +215,11 @@ struct ti_sci_clk_ops {
> * - state: The desired state of latency constraint: set or clear.
> */
> struct ti_sci_pm_ops {
> - int (*lpm_wake_reason)(const struct ti_sci_handle *handle,
> + int (*lpm_wake_reason)(struct ti_sci_handle *handle,
> u32 *source, u64 *timestamp, u8 *pin, u8 *mode);
> - int (*set_device_constraint)(const struct ti_sci_handle *handle,
> + int (*set_device_constraint)(struct ti_sci_handle *handle,
> u32 id, u8 state);
> - int (*set_latency_constraint)(const struct ti_sci_handle *handle,
> + int (*set_latency_constraint)(struct ti_sci_handle *handle,
> u16 latency, u8 state);
> };
>
> @@ -258,9 +257,9 @@ struct ti_sci_resource_desc {
> * range start index and number of resources
> */
> struct ti_sci_rm_core_ops {
> - int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id,
> + int (*get_range)(struct ti_sci_handle *handle, u32 dev_id,
> u8 subtype, struct ti_sci_resource_desc *desc);
> - int (*get_range_from_shost)(const struct ti_sci_handle *handle,
> + int (*get_range_from_shost)(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc);
> };
> @@ -280,14 +279,14 @@ struct ti_sci_rm_core_ops {
> * Aggregator.
> */
> struct ti_sci_rm_irq_ops {
> - int (*set_irq)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*set_irq)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq);
> - int (*set_event_map)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*set_event_map)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit);
> - int (*free_irq)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*free_irq)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq);
> - int (*free_event_map)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*free_event_map)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit);
> };
> @@ -342,7 +341,7 @@ struct ti_sci_msg_rm_ring_cfg {
> * @set_cfg: configure the SoC Navigator Subsystem Ring Accelerator ring
> */
> struct ti_sci_rm_ringacc_ops {
> - int (*set_cfg)(const struct ti_sci_handle *handle,
> + int (*set_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_ring_cfg *params);
> };
>
> @@ -360,9 +359,9 @@ struct ti_sci_rm_ringacc_ops {
> * RCHAN_THRD_ID register is cleared.
> */
> struct ti_sci_rm_psil_ops {
> - int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
> + int (*pair)(struct ti_sci_handle *handle, u32 nav_id,
> u32 src_thread, u32 dst_thread);
> - int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
> + int (*unpair)(struct ti_sci_handle *handle, u32 nav_id,
> u32 src_thread, u32 dst_thread);
> };
>
> @@ -519,11 +518,11 @@ struct ti_sci_msg_rm_udmap_flow_cfg {
> * @rx_flow_cfg1: configure SoC Navigator Subsystem UDMA receive flow.
> */
> struct ti_sci_rm_udmap_ops {
> - int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
> + int (*tx_ch_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
> - int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
> + int (*rx_ch_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
> - int (*rx_flow_cfg)(const struct ti_sci_handle *handle,
> + int (*rx_flow_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_flow_cfg *params);
> };
>
> @@ -544,14 +543,14 @@ struct ti_sci_rm_udmap_ops {
> * -hid: Host ID
> */
> struct ti_sci_proc_ops {
> - int (*request)(const struct ti_sci_handle *handle, u8 pid);
> - int (*release)(const struct ti_sci_handle *handle, u8 pid);
> - int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
> - int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
> + int (*request)(struct ti_sci_handle *handle, u8 pid);
> + int (*release)(struct ti_sci_handle *handle, u8 pid);
> + int (*handover)(struct ti_sci_handle *handle, u8 pid, u8 hid);
> + int (*set_config)(struct ti_sci_handle *handle, u8 pid,
> u64 boot_vector, u32 cfg_set, u32 cfg_clr);
> - int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
> + int (*set_control)(struct ti_sci_handle *handle, u8 pid,
> u32 ctrl_set, u32 ctrl_clr);
> - int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
> + int (*get_status)(struct ti_sci_handle *handle, u8 pid,
> u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
> u32 *status_flags);
> };
> @@ -603,51 +602,51 @@ struct ti_sci_resource {
> };
>
> #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
> -const struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
> -int ti_sci_put_handle(const struct ti_sci_handle *handle);
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property);
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property);
> +struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
> +int ti_sci_put_handle(struct ti_sci_handle *handle);
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property);
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property);
> u16 ti_sci_get_free_resource(struct ti_sci_resource *res);
> void ti_sci_release_resource(struct ti_sci_resource *res, u16 id);
> u32 ti_sci_get_num_resources(struct ti_sci_resource *res);
> struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop);
> struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type);
>
> #else /* CONFIG_TI_SCI_PROTOCOL */
>
> -static inline const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> +static inline struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> {
> return ERR_PTR(-EINVAL);
> }
>
> -static inline int ti_sci_put_handle(const struct ti_sci_handle *handle)
> +static inline int ti_sci_put_handle(struct ti_sci_handle *handle)
> {
> return -EINVAL;
> }
>
> static inline
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property)
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property)
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property)
> {
> return ERR_PTR(-EINVAL);
> }
> @@ -667,14 +666,14 @@ static inline u32 ti_sci_get_num_resources(struct ti_sci_resource *res)
> }
>
> static inline struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type)
> {
> return ERR_PTR(-EINVAL);
> --
> 2.51.0
>
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-02-23 20:24 [PATCH] ti: sci: Drop fake 'const' on handle pointer Krzysztof Kozlowski
2026-03-02 16:58 ` Mathieu Poirier
@ 2026-03-02 19:12 ` Andrew Davis
2026-03-05 14:59 ` Krzysztof Kozlowski
1 sibling, 1 reply; 9+ messages in thread
From: Andrew Davis @ 2026-03-02 19:12 UTC (permalink / raw)
To: Krzysztof Kozlowski, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Michael Turquette, Stephen Boyd,
Peter Ujfalusi, Vinod Koul, Frank Li, Thomas Gleixner,
Ulf Hansson, Bjorn Andersson, Mathieu Poirier, Philipp Zabel,
Dave Gerlach, linux-arm-kernel, linux-kernel, linux-clk,
dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 2/23/26 2:24 PM, Krzysztof Kozlowski wrote:
> All the functions operating on the 'handle' pointer are claiming it is a
> pointer to const thus they should not modify the handle. In fact that's
> a false statement, because first thing these functions do is drop the
> cast to const with container_of:
>
> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
>
> And with such cast the handle is easily writable with simple:
>
> info->handle.version.abi_major = 0;
>
The const is for all the consumers drivers of the handle. Those
consumers cannot do the above becouse both handle_to_ti_sci_info()
and struct ti_sci_info itself are only defined inside ti_sci.c.
> The code is not correct logically, either, because functions like
> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
> handle reference counting, thus they must modify the handle.
The reference counting is handled outside of the ti_sci_handle struct,
the contents of the handle are never modified after it is created.
The const is only added by functions return a handle to consumers.
We cannot return non-const to consumer drivers or then they would
be able to modify the content without a compiler warning, which would
be a real problem.
Andrew
> Modification here happens anyway, even if the reference counting is
> stored in the container which the handle is part of.
>
> The code does not have actual visible bug, but incorrect 'const'
> annotations could lead to incorrect compiler decisions.
>
> Fixes: 9e7d756da7a5 ("firmware: ti_sci: Add support for Device control")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
>
> ---
>
> I fixed Samsung, here TI and I still think there is one more user of
> this pattern - SCMI.
> ---
> drivers/clk/keystone/sci-clk.c | 4 +-
> drivers/dma/ti/k3-udma.h | 2 +-
> drivers/firmware/ti_sci.c | 161 ++++++++++++------------
> drivers/irqchip/irq-ti-sci-inta.c | 2 +-
> drivers/irqchip/irq-ti-sci-intr.c | 2 +-
> drivers/pmdomain/ti/ti_sci_pm_domains.c | 10 +-
> drivers/remoteproc/ti_k3_common.h | 2 +-
> drivers/remoteproc/ti_sci_proc.h | 4 +-
> drivers/reset/reset-ti-sci.c | 6 +-
> drivers/soc/ti/k3-ringacc.c | 2 +-
> include/linux/soc/ti/k3-ringacc.h | 2 +-
> include/linux/soc/ti/ti_sci_protocol.h | 131 ++++++++++---------
> 12 files changed, 163 insertions(+), 165 deletions(-)
>
> diff --git a/drivers/clk/keystone/sci-clk.c b/drivers/clk/keystone/sci-clk.c
> index 9d5071223f4c..adf87e2d63b2 100644
> --- a/drivers/clk/keystone/sci-clk.c
> +++ b/drivers/clk/keystone/sci-clk.c
> @@ -29,7 +29,7 @@
> * @num_clocks: Total number of clocks for this provider
> */
> struct sci_clk_provider {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> const struct ti_sci_clk_ops *ops;
> struct device *dev;
> struct sci_clk **clocks;
> @@ -651,7 +651,7 @@ static int ti_sci_clk_probe(struct platform_device *pdev)
> struct device *dev = &pdev->dev;
> struct device_node *np = dev->of_node;
> struct sci_clk_provider *provider;
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle *handle;
> int ret;
>
> handle = devm_ti_sci_get_handle(dev);
> diff --git a/drivers/dma/ti/k3-udma.h b/drivers/dma/ti/k3-udma.h
> index 9062a237cd16..120b6e1bd629 100644
> --- a/drivers/dma/ti/k3-udma.h
> +++ b/drivers/dma/ti/k3-udma.h
> @@ -112,7 +112,7 @@ enum udma_rm_range {
> };
>
> struct udma_tisci_rm {
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> const struct ti_sci_rm_udmap_ops *tisci_udmap_ops;
> u32 tisci_dev_id;
>
> diff --git a/drivers/firmware/ti_sci.c b/drivers/firmware/ti_sci.c
> index e027a2bd8f26..de33893e6d26 100644
> --- a/drivers/firmware/ti_sci.c
> +++ b/drivers/firmware/ti_sci.c
> @@ -511,7 +511,7 @@ static inline bool ti_sci_is_response_ack(void *r)
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
> +static int ti_sci_set_device_state(struct ti_sci_handle *handle,
> u32 id, u32 flags, u8 state)
> {
> struct ti_sci_info *info;
> @@ -568,7 +568,7 @@ static int ti_sci_set_device_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
> +static int ti_sci_get_device_state(struct ti_sci_handle *handle,
> u32 id, u32 *clcnt, u32 *resets,
> u8 *p_state, u8 *c_state)
> {
> @@ -639,7 +639,7 @@ static int ti_sci_get_device_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_get_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id, 0,
> MSG_DEVICE_SW_STATE_ON);
> @@ -658,7 +658,7 @@ static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_device_exclusive(struct ti_sci_handle *handle,
> u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> @@ -677,7 +677,7 @@ static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_idle_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id, 0,
> MSG_DEVICE_SW_STATE_RETENTION);
> @@ -696,7 +696,7 @@ static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_idle_device_exclusive(struct ti_sci_handle *handle,
> u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> @@ -715,7 +715,7 @@ static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_put_device(struct ti_sci_handle *handle, u32 id)
> {
> return ti_sci_set_device_state(handle, id,
> 0, MSG_DEVICE_SW_STATE_AUTO_OFF);
> @@ -729,7 +729,7 @@ static int ti_sci_cmd_put_device(const struct ti_sci_handle *handle, u32 id)
> * Return: 0 if all went fine and the device ID is valid, else return
> * appropriate error.
> */
> -static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
> +static int ti_sci_cmd_dev_is_valid(struct ti_sci_handle *handle, u32 id)
> {
> u8 unused;
>
> @@ -745,7 +745,7 @@ static int ti_sci_cmd_dev_is_valid(const struct ti_sci_handle *handle, u32 id)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_get_clcnt(struct ti_sci_handle *handle, u32 id,
> u32 *count)
> {
> return ti_sci_get_device_state(handle, id, count, NULL, NULL, NULL);
> @@ -759,7 +759,7 @@ static int ti_sci_cmd_dev_get_clcnt(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_idle(struct ti_sci_handle *handle, u32 id,
> bool *r_state)
> {
> int ret;
> @@ -786,7 +786,7 @@ static int ti_sci_cmd_dev_is_idle(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_stop(struct ti_sci_handle *handle, u32 id,
> bool *r_state, bool *curr_state)
> {
> int ret;
> @@ -817,7 +817,7 @@ static int ti_sci_cmd_dev_is_stop(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_on(struct ti_sci_handle *handle, u32 id,
> bool *r_state, bool *curr_state)
> {
> int ret;
> @@ -847,7 +847,7 @@ static int ti_sci_cmd_dev_is_on(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
> +static int ti_sci_cmd_dev_is_trans(struct ti_sci_handle *handle, u32 id,
> bool *curr_state)
> {
> int ret;
> @@ -874,7 +874,7 @@ static int ti_sci_cmd_dev_is_trans(const struct ti_sci_handle *handle, u32 id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_device_resets(struct ti_sci_handle *handle,
> u32 id, u32 reset_state)
> {
> struct ti_sci_info *info;
> @@ -929,7 +929,7 @@ static int ti_sci_cmd_set_device_resets(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_device_resets(struct ti_sci_handle *handle,
> u32 id, u32 *reset_state)
> {
> return ti_sci_get_device_state(handle, id, NULL, reset_state, NULL,
> @@ -948,7 +948,7 @@ static int ti_sci_cmd_get_device_resets(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
> +static int ti_sci_set_clock_state(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u32 flags, u8 state)
> {
> @@ -1013,7 +1013,7 @@ static int ti_sci_set_clock_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_clock_state(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u8 *programmed_state, u8 *current_state)
> {
> @@ -1089,7 +1089,7 @@ static int ti_sci_cmd_get_clock_state(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_get_clock(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool needs_ssc,
> bool can_change_freq, bool enable_input_term)
> {
> @@ -1115,7 +1115,7 @@ static int ti_sci_cmd_get_clock(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_idle_clock(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id)
> {
> return ti_sci_set_clock_state(handle, dev_id, clk_id,
> @@ -1135,8 +1135,8 @@ static int ti_sci_cmd_idle_clock(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
> - u32 dev_id, u32 clk_id)
> +static int ti_sci_cmd_put_clock(struct ti_sci_handle *handle, u32 dev_id,
> + u32 clk_id)
> {
> return ti_sci_set_clock_state(handle, dev_id, clk_id,
> MSG_FLAG_CLOCK_ALLOW_FREQ_CHANGE,
> @@ -1154,8 +1154,8 @@ static int ti_sci_cmd_put_clock(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
> - u32 dev_id, u32 clk_id, bool *req_state)
> +static int ti_sci_cmd_clk_is_auto(struct ti_sci_handle *handle, u32 dev_id,
> + u32 clk_id, bool *req_state)
> {
> u8 state = 0;
> int ret;
> @@ -1183,7 +1183,7 @@ static int ti_sci_cmd_clk_is_auto(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_clk_is_on(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool *req_state, bool *curr_state)
> {
> u8 c_state = 0, r_state = 0;
> @@ -1216,7 +1216,7 @@ static int ti_sci_cmd_clk_is_on(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
> +static int ti_sci_cmd_clk_is_off(struct ti_sci_handle *handle, u32 dev_id,
> u32 clk_id, bool *req_state, bool *curr_state)
> {
> u8 c_state = 0, r_state = 0;
> @@ -1248,7 +1248,7 @@ static int ti_sci_cmd_clk_is_off(const struct ti_sci_handle *handle, u32 dev_id,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_set_parent(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u32 parent_id)
> {
> struct ti_sci_info *info;
> @@ -1316,7 +1316,7 @@ static int ti_sci_cmd_clk_set_parent(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_parent(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u32 *parent_id)
> {
> struct ti_sci_info *info;
> @@ -1385,7 +1385,7 @@ static int ti_sci_cmd_clk_get_parent(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_num_parents(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id,
> u32 *num_parents)
> {
> @@ -1463,7 +1463,7 @@ static int ti_sci_cmd_clk_get_num_parents(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_match_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 min_freq,
> u64 target_freq, u64 max_freq,
> u64 *match_freq)
> @@ -1540,7 +1540,7 @@ static int ti_sci_cmd_clk_get_match_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_set_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 min_freq,
> u64 target_freq, u64 max_freq)
> {
> @@ -1606,7 +1606,7 @@ static int ti_sci_cmd_clk_set_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_clk_get_freq(struct ti_sci_handle *handle,
> u32 dev_id, u32 clk_id, u64 *freq)
> {
> struct ti_sci_info *info;
> @@ -1670,7 +1670,7 @@ static int ti_sci_cmd_clk_get_freq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
> +static int ti_sci_cmd_prepare_sleep(struct ti_sci_handle *handle, u8 mode,
> u32 ctx_lo, u32 ctx_hi, u32 debug_flags)
> {
> u32 msg_flags = mode == TISCI_MSG_VALUE_SLEEP_MODE_PARTIAL_IO ?
> @@ -1737,7 +1737,7 @@ static int ti_sci_cmd_prepare_sleep(const struct ti_sci_handle *handle, u8 mode,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
> +static int ti_sci_msg_cmd_query_fw_caps(struct ti_sci_handle *handle,
> u64 *fw_caps)
> {
> struct ti_sci_info *info;
> @@ -1794,8 +1794,7 @@ static int ti_sci_msg_cmd_query_fw_caps(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
> - u8 state)
> +static int ti_sci_cmd_set_io_isolation(struct ti_sci_handle *handle, u8 state)
> {
> struct ti_sci_info *info;
> struct ti_sci_msg_req_set_io_isolation *req;
> @@ -1852,7 +1851,7 @@ static int ti_sci_cmd_set_io_isolation(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
> +static int ti_sci_msg_cmd_lpm_wake_reason(struct ti_sci_handle *handle,
> u32 *source, u64 *timestamp, u8 *pin, u8 *mode)
> {
> struct ti_sci_info *info;
> @@ -1916,7 +1915,7 @@ static int ti_sci_msg_cmd_lpm_wake_reason(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_device_constraint(struct ti_sci_handle *handle,
> u32 id, u8 state)
> {
> struct ti_sci_info *info;
> @@ -1973,7 +1972,7 @@ static int ti_sci_cmd_set_device_constraint(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_set_latency_constraint(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_latency_constraint(struct ti_sci_handle *handle,
> u16 latency, u8 state)
> {
> struct ti_sci_info *info;
> @@ -2063,7 +2062,7 @@ static int ti_sci_cmd_lpm_abort(struct device *dev)
> return ret;
> }
>
> -static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
> +static int ti_sci_cmd_core_reboot(struct ti_sci_handle *handle)
> {
> struct ti_sci_info *info;
> struct ti_sci_msg_req_reboot *req;
> @@ -2123,7 +2122,7 @@ static int ti_sci_cmd_core_reboot(const struct ti_sci_handle *handle)
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
> +static int ti_sci_get_resource_range(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2194,7 +2193,7 @@ static int ti_sci_get_resource_range(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_get_resource_range(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2217,7 +2216,7 @@ static int ti_sci_cmd_get_resource_range(const struct ti_sci_handle *handle,
> * Return: 0 if all went fine, else return appropriate error.
> */
> static
> -int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
> +int ti_sci_cmd_get_resource_range_from_shost(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc)
> {
> @@ -2243,7 +2242,7 @@ int ti_sci_cmd_get_resource_range_from_shost(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
> +static int ti_sci_manage_irq(struct ti_sci_handle *handle,
> u32 valid_params, u16 src_id, u16 src_index,
> u16 dst_id, u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host,
> @@ -2317,7 +2316,7 @@ static int ti_sci_manage_irq(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
> +static int ti_sci_set_irq(struct ti_sci_handle *handle, u32 valid_params,
> u16 src_id, u16 src_index, u16 dst_id,
> u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host)
> @@ -2351,7 +2350,7 @@ static int ti_sci_set_irq(const struct ti_sci_handle *handle, u32 valid_params,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
> +static int ti_sci_free_irq(struct ti_sci_handle *handle, u32 valid_params,
> u16 src_id, u16 src_index, u16 dst_id,
> u16 dst_host_irq, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit, u8 s_host)
> @@ -2378,7 +2377,7 @@ static int ti_sci_free_irq(const struct ti_sci_handle *handle, u32 valid_params,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
> +static int ti_sci_cmd_set_irq(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq)
> {
> u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
> @@ -2400,7 +2399,7 @@ static int ti_sci_cmd_set_irq(const struct ti_sci_handle *handle, u16 src_id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_set_event_map(struct ti_sci_handle *handle,
> u16 src_id, u16 src_index, u16 ia_id,
> u16 vint, u16 global_event,
> u8 vint_status_bit)
> @@ -2424,7 +2423,7 @@ static int ti_sci_cmd_set_event_map(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
> +static int ti_sci_cmd_free_irq(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq)
> {
> u32 valid_params = MSG_FLAG_DST_ID_VALID | MSG_FLAG_DST_HOST_IRQ_VALID;
> @@ -2446,7 +2445,7 @@ static int ti_sci_cmd_free_irq(const struct ti_sci_handle *handle, u16 src_id,
> *
> * Return: 0 if all went fine, else return appropriate error.
> */
> -static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_free_event_map(struct ti_sci_handle *handle,
> u16 src_id, u16 src_index, u16 ia_id,
> u16 vint, u16 global_event,
> u8 vint_status_bit)
> @@ -2469,7 +2468,7 @@ static int ti_sci_cmd_free_event_map(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_ring_cfg and @ti_sci_msg_rm_ring_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_ring_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_ring_cfg *params)
> {
> struct ti_sci_msg_rm_ring_cfg_req *req;
> @@ -2531,7 +2530,7 @@ static int ti_sci_cmd_rm_ring_cfg(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_psil_pair(struct ti_sci_handle *handle,
> u32 nav_id, u32 src_thread, u32 dst_thread)
> {
> struct ti_sci_msg_psil_pair *req;
> @@ -2587,7 +2586,7 @@ static int ti_sci_cmd_rm_psil_pair(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_psil_unpair(struct ti_sci_handle *handle,
> u32 nav_id, u32 src_thread, u32 dst_thread)
> {
> struct ti_sci_msg_psil_unpair *req;
> @@ -2644,7 +2643,7 @@ static int ti_sci_cmd_rm_psil_unpair(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_tx_ch_cfg and @ti_sci_msg_rm_udmap_tx_ch_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_tx_ch_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_tx_ch_cfg_req *req;
> @@ -2716,7 +2715,7 @@ static int ti_sci_cmd_rm_udmap_tx_ch_cfg(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_rx_ch_cfg and @ti_sci_msg_rm_udmap_rx_ch_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_rx_ch_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_rx_ch_cfg_req *req;
> @@ -2785,7 +2784,7 @@ static int ti_sci_cmd_rm_udmap_rx_ch_cfg(const struct ti_sci_handle *handle,
> * See @ti_sci_msg_rm_udmap_flow_cfg and @ti_sci_msg_rm_udmap_flow_cfg_req for
> * more info.
> */
> -static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_rm_udmap_rx_flow_cfg(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_flow_cfg *params)
> {
> struct ti_sci_msg_rm_udmap_flow_cfg_req *req;
> @@ -2855,8 +2854,7 @@ static int ti_sci_cmd_rm_udmap_rx_flow_cfg(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
> - u8 proc_id)
> +static int ti_sci_cmd_proc_request(struct ti_sci_handle *handle, u8 proc_id)
> {
> struct ti_sci_msg_req_proc_request *req;
> struct ti_sci_msg_hdr *resp;
> @@ -2907,8 +2905,7 @@ static int ti_sci_cmd_proc_request(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
> - u8 proc_id)
> +static int ti_sci_cmd_proc_release(struct ti_sci_handle *handle, u8 proc_id)
> {
> struct ti_sci_msg_req_proc_release *req;
> struct ti_sci_msg_hdr *resp;
> @@ -2962,8 +2959,8 @@ static int ti_sci_cmd_proc_release(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
> - u8 proc_id, u8 host_id)
> +static int ti_sci_cmd_proc_handover(struct ti_sci_handle *handle, u8 proc_id,
> + u8 host_id)
> {
> struct ti_sci_msg_req_proc_handover *req;
> struct ti_sci_msg_hdr *resp;
> @@ -3019,7 +3016,7 @@ static int ti_sci_cmd_proc_handover(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_set_config(struct ti_sci_handle *handle,
> u8 proc_id, u64 bootvector,
> u32 config_flags_set,
> u32 config_flags_clear)
> @@ -3081,7 +3078,7 @@ static int ti_sci_cmd_proc_set_config(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_set_control(struct ti_sci_handle *handle,
> u8 proc_id, u32 control_flags_set,
> u32 control_flags_clear)
> {
> @@ -3140,7 +3137,7 @@ static int ti_sci_cmd_proc_set_control(const struct ti_sci_handle *handle,
> *
> * Return: 0 if all went well, else returns appropriate error value.
> */
> -static int ti_sci_cmd_proc_get_status(const struct ti_sci_handle *handle,
> +static int ti_sci_cmd_proc_get_status(struct ti_sci_handle *handle,
> u8 proc_id, u64 *bv, u32 *cfg_flags,
> u32 *ctrl_flags, u32 *sts_flags)
> {
> @@ -3290,7 +3287,7 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
> * -ENODEV if the required node handler is missing
> * -EINVAL if invalid conditions are encountered.
> */
> -const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> {
> struct device_node *ti_sci_np;
> struct ti_sci_handle *handle = NULL;
> @@ -3336,7 +3333,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_handle);
> * if an error pointer was passed, it returns the error value back,
> * if null was passed, it returns -EINVAL;
> */
> -int ti_sci_put_handle(const struct ti_sci_handle *handle)
> +int ti_sci_put_handle(struct ti_sci_handle *handle)
> {
> struct ti_sci_info *info;
>
> @@ -3357,8 +3354,8 @@ EXPORT_SYMBOL_GPL(ti_sci_put_handle);
>
> static void devm_ti_sci_release(struct device *dev, void *res)
> {
> - const struct ti_sci_handle **ptr = res;
> - const struct ti_sci_handle *handle = *ptr;
> + struct ti_sci_handle **ptr = res;
> + struct ti_sci_handle *handle = *ptr;
> int ret;
>
> ret = ti_sci_put_handle(handle);
> @@ -3375,12 +3372,14 @@ static void devm_ti_sci_release(struct device *dev, void *res)
> * The function does not track individual clients of the framework
> * and is expected to be maintained by caller of TI SCI protocol library.
> *
> + * Do not change handle pointer to pointer to const.
> + *
> * Return: 0 if all went fine, else corresponding error.
> */
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> {
> - const struct ti_sci_handle **ptr;
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle **ptr;
> + struct ti_sci_handle *handle;
>
> ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
> if (!ptr)
> @@ -3411,8 +3410,8 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_handle);
> * -ENODEV if the required node handler is missing
> * -EINVAL if invalid conditions are encountered.
> */
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property)
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property)
> {
> struct ti_sci_handle *handle = NULL;
> struct device_node *ti_sci_np;
> @@ -3457,10 +3456,10 @@ EXPORT_SYMBOL_GPL(ti_sci_get_by_phandle);
> *
> * Return: 0 if all went fine, else corresponding error.
> */
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property)
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property)
> {
> - const struct ti_sci_handle *handle;
> + struct ti_sci_handle *handle;
> const struct ti_sci_handle **ptr;
>
> ptr = devres_alloc(devm_ti_sci_release, sizeof(*ptr), GFP_KERNEL);
> @@ -3566,7 +3565,7 @@ EXPORT_SYMBOL_GPL(ti_sci_get_num_resources);
> * error pointer.
> */
> static struct ti_sci_resource *
> -devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_resource_sets(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, u32 *sub_types,
> u32 sets)
> {
> @@ -3626,7 +3625,7 @@ devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,
> * error pointer.
> */
> struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop)
> {
> struct ti_sci_resource *res;
> @@ -3664,7 +3663,7 @@ EXPORT_SYMBOL_GPL(devm_ti_sci_get_of_resource);
> * error pointer.
> */
> struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type)
> {
> return devm_ti_sci_get_resource_sets(handle, dev, dev_id, &sub_type, 1);
> @@ -3720,7 +3719,7 @@ static bool ti_sci_partial_io_wakeup_enabled(struct ti_sci_info *info)
> static int ti_sci_sys_off_handler(struct sys_off_data *data)
> {
> struct ti_sci_info *info = data->cb_data;
> - const struct ti_sci_handle *handle = &info->handle;
> + struct ti_sci_handle *handle = &info->handle;
> bool enter_partial_io = ti_sci_partial_io_wakeup_enabled(info);
> int ret;
>
> @@ -3746,7 +3745,7 @@ static int ti_sci_sys_off_handler(struct sys_off_data *data)
> static int tisci_reboot_handler(struct sys_off_data *data)
> {
> struct ti_sci_info *info = data->cb_data;
> - const struct ti_sci_handle *handle = &info->handle;
> + struct ti_sci_handle *handle = &info->handle;
>
> ti_sci_cmd_core_reboot(handle);
>
> diff --git a/drivers/irqchip/irq-ti-sci-inta.c b/drivers/irqchip/irq-ti-sci-inta.c
> index 01963d36cfaf..88617a0ce794 100644
> --- a/drivers/irqchip/irq-ti-sci-inta.c
> +++ b/drivers/irqchip/irq-ti-sci-inta.c
> @@ -98,7 +98,7 @@ struct ti_sci_inta_vint_desc {
> * Global Event number.
> */
> struct ti_sci_inta_irq_domain {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct ti_sci_resource *vint;
> struct ti_sci_resource *global_event;
> struct list_head vint_list;
> diff --git a/drivers/irqchip/irq-ti-sci-intr.c b/drivers/irqchip/irq-ti-sci-intr.c
> index 0ea17040e934..9a13adbdac48 100644
> --- a/drivers/irqchip/irq-ti-sci-intr.c
> +++ b/drivers/irqchip/irq-ti-sci-intr.c
> @@ -27,7 +27,7 @@
> * @type: Specifies the trigger type supported by this Interrupt Router
> */
> struct ti_sci_intr_irq_domain {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct ti_sci_resource *out_irqs;
> struct device *dev;
> u32 ti_sci_id;
> diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c
> index 18d33bc35dee..913373a0b096 100644
> --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c
> +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c
> @@ -27,7 +27,7 @@
> * @data: onecell data for genpd core
> */
> struct ti_sci_genpd_provider {
> - const struct ti_sci_handle *ti_sci;
> + struct ti_sci_handle *ti_sci;
> struct device *dev;
> struct list_head pd_list;
> struct genpd_onecell_data data;
> @@ -63,7 +63,7 @@ static void ti_sci_pd_set_lat_constraint(struct device *dev, s32 val)
> {
> struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> u16 val_ms;
> int ret;
>
> @@ -83,7 +83,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
> {
> struct generic_pm_domain *genpd = pd_to_genpd(dev->pm_domain);
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(genpd);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> int ret;
>
> if (device_may_wakeup(dev)) {
> @@ -111,7 +111,7 @@ static inline void ti_sci_pd_set_wkup_constraint(struct device *dev)
> static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
> {
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
>
> return ti_sci->ops.dev_ops.put_device(ti_sci, pd->idx);
> }
> @@ -123,7 +123,7 @@ static int ti_sci_pd_power_off(struct generic_pm_domain *domain)
> static int ti_sci_pd_power_on(struct generic_pm_domain *domain)
> {
> struct ti_sci_pm_domain *pd = genpd_to_ti_sci_pd(domain);
> - const struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
> + struct ti_sci_handle *ti_sci = pd->parent->ti_sci;
>
> if (pd->exclusive)
> return ti_sci->ops.dev_ops.get_device_exclusive(ti_sci,
> diff --git a/drivers/remoteproc/ti_k3_common.h b/drivers/remoteproc/ti_k3_common.h
> index aee3c28dbe51..3906d006081d 100644
> --- a/drivers/remoteproc/ti_k3_common.h
> +++ b/drivers/remoteproc/ti_k3_common.h
> @@ -88,7 +88,7 @@ struct k3_rproc {
> struct reset_control *reset;
> const struct k3_rproc_dev_data *data;
> struct ti_sci_proc *tsp;
> - const struct ti_sci_handle *ti_sci;
> + struct ti_sci_handle *ti_sci;
> u32 ti_sci_id;
> struct mbox_chan *mbox;
> struct mbox_client client;
> diff --git a/drivers/remoteproc/ti_sci_proc.h b/drivers/remoteproc/ti_sci_proc.h
> index f3911ce75252..d20859a9fb13 100644
> --- a/drivers/remoteproc/ti_sci_proc.h
> +++ b/drivers/remoteproc/ti_sci_proc.h
> @@ -21,7 +21,7 @@
> * device
> */
> struct ti_sci_proc {
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> const struct ti_sci_proc_ops *ops;
> struct device *dev;
> u8 proc_id;
> @@ -30,7 +30,7 @@ struct ti_sci_proc {
>
> static inline
> struct ti_sci_proc *ti_sci_proc_of_get_tsp(struct device *dev,
> - const struct ti_sci_handle *sci)
> + struct ti_sci_handle *sci)
> {
> struct ti_sci_proc *tsp;
> u32 temp[2];
> diff --git a/drivers/reset/reset-ti-sci.c b/drivers/reset/reset-ti-sci.c
> index 1dc5b766aac1..7fea18eb350e 100644
> --- a/drivers/reset/reset-ti-sci.c
> +++ b/drivers/reset/reset-ti-sci.c
> @@ -36,7 +36,7 @@ struct ti_sci_reset_control {
> struct ti_sci_reset_data {
> struct reset_controller_dev rcdev;
> struct device *dev;
> - const struct ti_sci_handle *sci;
> + struct ti_sci_handle *sci;
> struct idr idr;
> };
>
> @@ -63,7 +63,7 @@ static int ti_sci_reset_set(struct reset_controller_dev *rcdev,
> unsigned long id, bool assert)
> {
> struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
> - const struct ti_sci_handle *sci = data->sci;
> + struct ti_sci_handle *sci = data->sci;
> const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
> struct ti_sci_reset_control *control;
> u32 reset_state;
> @@ -144,7 +144,7 @@ static int ti_sci_reset_status(struct reset_controller_dev *rcdev,
> unsigned long id)
> {
> struct ti_sci_reset_data *data = to_ti_sci_reset_data(rcdev);
> - const struct ti_sci_handle *sci = data->sci;
> + struct ti_sci_handle *sci = data->sci;
> const struct ti_sci_dev_ops *dev_ops = &sci->ops.dev_ops;
> struct ti_sci_reset_control *control;
> u32 reset_state;
> diff --git a/drivers/soc/ti/k3-ringacc.c b/drivers/soc/ti/k3-ringacc.c
> index 7602b8a909b0..5bc41b838ba4 100644
> --- a/drivers/soc/ti/k3-ringacc.c
> +++ b/drivers/soc/ti/k3-ringacc.c
> @@ -220,7 +220,7 @@ struct k3_ringacc {
> struct list_head list;
> struct mutex req_lock; /* protect rings allocation */
>
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> const struct ti_sci_rm_ringacc_ops *tisci_ring_ops;
> u32 tisci_dev_id;
>
> diff --git a/include/linux/soc/ti/k3-ringacc.h b/include/linux/soc/ti/k3-ringacc.h
> index 39b022b92598..a254b4243c21 100644
> --- a/include/linux/soc/ti/k3-ringacc.h
> +++ b/include/linux/soc/ti/k3-ringacc.h
> @@ -259,7 +259,7 @@ struct ti_sci_handle;
> * struct struct k3_ringacc_init_data - Initialization data for DMA rings
> */
> struct k3_ringacc_init_data {
> - const struct ti_sci_handle *tisci;
> + struct ti_sci_handle *tisci;
> u32 tisci_dev_id;
> u32 num_rings;
> };
> diff --git a/include/linux/soc/ti/ti_sci_protocol.h b/include/linux/soc/ti/ti_sci_protocol.h
> index fd104b666836..2c07c0545673 100644
> --- a/include/linux/soc/ti/ti_sci_protocol.h
> +++ b/include/linux/soc/ti/ti_sci_protocol.h
> @@ -34,7 +34,7 @@ struct ti_sci_handle;
> * else returns corresponding error value.
> */
> struct ti_sci_core_ops {
> - int (*reboot_device)(const struct ti_sci_handle *handle);
> + int (*reboot_device)(struct ti_sci_handle *handle);
> };
>
> /**
> @@ -96,26 +96,25 @@ struct ti_sci_core_ops {
> * managed by driver for that purpose.
> */
> struct ti_sci_dev_ops {
> - int (*get_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*get_device_exclusive)(const struct ti_sci_handle *handle, u32 id);
> - int (*idle_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*idle_device_exclusive)(const struct ti_sci_handle *handle,
> - u32 id);
> - int (*put_device)(const struct ti_sci_handle *handle, u32 id);
> - int (*is_valid)(const struct ti_sci_handle *handle, u32 id);
> - int (*get_context_loss_count)(const struct ti_sci_handle *handle,
> + int (*get_device)(struct ti_sci_handle *handle, u32 id);
> + int (*get_device_exclusive)(struct ti_sci_handle *handle, u32 id);
> + int (*idle_device)(struct ti_sci_handle *handle, u32 id);
> + int (*idle_device_exclusive)(struct ti_sci_handle *handle, u32 id);
> + int (*put_device)(struct ti_sci_handle *handle, u32 id);
> + int (*is_valid)(struct ti_sci_handle *handle, u32 id);
> + int (*get_context_loss_count)(struct ti_sci_handle *handle,
> u32 id, u32 *count);
> - int (*is_idle)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_idle)(struct ti_sci_handle *handle, u32 id,
> bool *requested_state);
> - int (*is_stop)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_stop)(struct ti_sci_handle *handle, u32 id,
> bool *req_state, bool *current_state);
> - int (*is_on)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_on)(struct ti_sci_handle *handle, u32 id,
> bool *req_state, bool *current_state);
> - int (*is_transitioning)(const struct ti_sci_handle *handle, u32 id,
> + int (*is_transitioning)(struct ti_sci_handle *handle, u32 id,
> bool *current_state);
> - int (*set_device_resets)(const struct ti_sci_handle *handle, u32 id,
> + int (*set_device_resets)(struct ti_sci_handle *handle, u32 id,
> u32 reset_state);
> - int (*get_device_resets)(const struct ti_sci_handle *handle, u32 id,
> + int (*get_device_resets)(struct ti_sci_handle *handle, u32 id,
> u32 *reset_state);
> };
>
> @@ -169,29 +168,29 @@ struct ti_sci_dev_ops {
> * managed by driver for that purpose.
> */
> struct ti_sci_clk_ops {
> - int (*get_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_clock)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool needs_ssc, bool can_change_freq,
> bool enable_input_term);
> - int (*idle_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
> - int (*put_clock)(const struct ti_sci_handle *handle, u32 did, u32 cid);
> - int (*is_auto)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*idle_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
> + int (*put_clock)(struct ti_sci_handle *handle, u32 did, u32 cid);
> + int (*is_auto)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state);
> - int (*is_on)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*is_on)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state, bool *current_state);
> - int (*is_off)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*is_off)(struct ti_sci_handle *handle, u32 did, u32 cid,
> bool *req_state, bool *current_state);
> - int (*set_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*set_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u32 parent_id);
> - int (*get_parent)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_parent)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u32 *parent_id);
> - int (*get_num_parents)(const struct ti_sci_handle *handle, u32 did,
> + int (*get_num_parents)(struct ti_sci_handle *handle, u32 did,
> u32 cid, u32 *num_parents);
> - int (*get_best_match_freq)(const struct ti_sci_handle *handle, u32 did,
> + int (*get_best_match_freq)(struct ti_sci_handle *handle, u32 did,
> u32 cid, u64 min_freq, u64 target_freq,
> u64 max_freq, u64 *match_freq);
> - int (*set_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*set_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u64 min_freq, u64 target_freq, u64 max_freq);
> - int (*get_freq)(const struct ti_sci_handle *handle, u32 did, u32 cid,
> + int (*get_freq)(struct ti_sci_handle *handle, u32 did, u32 cid,
> u64 *current_freq);
> };
>
> @@ -216,11 +215,11 @@ struct ti_sci_clk_ops {
> * - state: The desired state of latency constraint: set or clear.
> */
> struct ti_sci_pm_ops {
> - int (*lpm_wake_reason)(const struct ti_sci_handle *handle,
> + int (*lpm_wake_reason)(struct ti_sci_handle *handle,
> u32 *source, u64 *timestamp, u8 *pin, u8 *mode);
> - int (*set_device_constraint)(const struct ti_sci_handle *handle,
> + int (*set_device_constraint)(struct ti_sci_handle *handle,
> u32 id, u8 state);
> - int (*set_latency_constraint)(const struct ti_sci_handle *handle,
> + int (*set_latency_constraint)(struct ti_sci_handle *handle,
> u16 latency, u8 state);
> };
>
> @@ -258,9 +257,9 @@ struct ti_sci_resource_desc {
> * range start index and number of resources
> */
> struct ti_sci_rm_core_ops {
> - int (*get_range)(const struct ti_sci_handle *handle, u32 dev_id,
> + int (*get_range)(struct ti_sci_handle *handle, u32 dev_id,
> u8 subtype, struct ti_sci_resource_desc *desc);
> - int (*get_range_from_shost)(const struct ti_sci_handle *handle,
> + int (*get_range_from_shost)(struct ti_sci_handle *handle,
> u32 dev_id, u8 subtype, u8 s_host,
> struct ti_sci_resource_desc *desc);
> };
> @@ -280,14 +279,14 @@ struct ti_sci_rm_core_ops {
> * Aggregator.
> */
> struct ti_sci_rm_irq_ops {
> - int (*set_irq)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*set_irq)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq);
> - int (*set_event_map)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*set_event_map)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit);
> - int (*free_irq)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*free_irq)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 dst_id, u16 dst_host_irq);
> - int (*free_event_map)(const struct ti_sci_handle *handle, u16 src_id,
> + int (*free_event_map)(struct ti_sci_handle *handle, u16 src_id,
> u16 src_index, u16 ia_id, u16 vint,
> u16 global_event, u8 vint_status_bit);
> };
> @@ -342,7 +341,7 @@ struct ti_sci_msg_rm_ring_cfg {
> * @set_cfg: configure the SoC Navigator Subsystem Ring Accelerator ring
> */
> struct ti_sci_rm_ringacc_ops {
> - int (*set_cfg)(const struct ti_sci_handle *handle,
> + int (*set_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_ring_cfg *params);
> };
>
> @@ -360,9 +359,9 @@ struct ti_sci_rm_ringacc_ops {
> * RCHAN_THRD_ID register is cleared.
> */
> struct ti_sci_rm_psil_ops {
> - int (*pair)(const struct ti_sci_handle *handle, u32 nav_id,
> + int (*pair)(struct ti_sci_handle *handle, u32 nav_id,
> u32 src_thread, u32 dst_thread);
> - int (*unpair)(const struct ti_sci_handle *handle, u32 nav_id,
> + int (*unpair)(struct ti_sci_handle *handle, u32 nav_id,
> u32 src_thread, u32 dst_thread);
> };
>
> @@ -519,11 +518,11 @@ struct ti_sci_msg_rm_udmap_flow_cfg {
> * @rx_flow_cfg1: configure SoC Navigator Subsystem UDMA receive flow.
> */
> struct ti_sci_rm_udmap_ops {
> - int (*tx_ch_cfg)(const struct ti_sci_handle *handle,
> + int (*tx_ch_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_tx_ch_cfg *params);
> - int (*rx_ch_cfg)(const struct ti_sci_handle *handle,
> + int (*rx_ch_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_rx_ch_cfg *params);
> - int (*rx_flow_cfg)(const struct ti_sci_handle *handle,
> + int (*rx_flow_cfg)(struct ti_sci_handle *handle,
> const struct ti_sci_msg_rm_udmap_flow_cfg *params);
> };
>
> @@ -544,14 +543,14 @@ struct ti_sci_rm_udmap_ops {
> * -hid: Host ID
> */
> struct ti_sci_proc_ops {
> - int (*request)(const struct ti_sci_handle *handle, u8 pid);
> - int (*release)(const struct ti_sci_handle *handle, u8 pid);
> - int (*handover)(const struct ti_sci_handle *handle, u8 pid, u8 hid);
> - int (*set_config)(const struct ti_sci_handle *handle, u8 pid,
> + int (*request)(struct ti_sci_handle *handle, u8 pid);
> + int (*release)(struct ti_sci_handle *handle, u8 pid);
> + int (*handover)(struct ti_sci_handle *handle, u8 pid, u8 hid);
> + int (*set_config)(struct ti_sci_handle *handle, u8 pid,
> u64 boot_vector, u32 cfg_set, u32 cfg_clr);
> - int (*set_control)(const struct ti_sci_handle *handle, u8 pid,
> + int (*set_control)(struct ti_sci_handle *handle, u8 pid,
> u32 ctrl_set, u32 ctrl_clr);
> - int (*get_status)(const struct ti_sci_handle *handle, u8 pid,
> + int (*get_status)(struct ti_sci_handle *handle, u8 pid,
> u64 *boot_vector, u32 *cfg_flags, u32 *ctrl_flags,
> u32 *status_flags);
> };
> @@ -603,51 +602,51 @@ struct ti_sci_resource {
> };
>
> #if IS_ENABLED(CONFIG_TI_SCI_PROTOCOL)
> -const struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
> -int ti_sci_put_handle(const struct ti_sci_handle *handle);
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property);
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property);
> +struct ti_sci_handle *ti_sci_get_handle(struct device *dev);
> +int ti_sci_put_handle(struct ti_sci_handle *handle);
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev);
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property);
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property);
> u16 ti_sci_get_free_resource(struct ti_sci_resource *res);
> void ti_sci_release_resource(struct ti_sci_resource *res, u16 id);
> u32 ti_sci_get_num_resources(struct ti_sci_resource *res);
> struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop);
> struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type);
>
> #else /* CONFIG_TI_SCI_PROTOCOL */
>
> -static inline const struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> +static inline struct ti_sci_handle *ti_sci_get_handle(struct device *dev)
> {
> return ERR_PTR(-EINVAL);
> }
>
> -static inline int ti_sci_put_handle(const struct ti_sci_handle *handle)
> +static inline int ti_sci_put_handle(struct ti_sci_handle *handle)
> {
> return -EINVAL;
> }
>
> static inline
> -const struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> +struct ti_sci_handle *devm_ti_sci_get_handle(struct device *dev)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline
> -const struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> - const char *property)
> +struct ti_sci_handle *ti_sci_get_by_phandle(struct device_node *np,
> + const char *property)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline
> -const struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> - const char *property)
> +struct ti_sci_handle *devm_ti_sci_get_by_phandle(struct device *dev,
> + const char *property)
> {
> return ERR_PTR(-EINVAL);
> }
> @@ -667,14 +666,14 @@ static inline u32 ti_sci_get_num_resources(struct ti_sci_resource *res)
> }
>
> static inline struct ti_sci_resource *
> -devm_ti_sci_get_of_resource(const struct ti_sci_handle *handle,
> +devm_ti_sci_get_of_resource(struct ti_sci_handle *handle,
> struct device *dev, u32 dev_id, char *of_prop)
> {
> return ERR_PTR(-EINVAL);
> }
>
> static inline struct ti_sci_resource *
> -devm_ti_sci_get_resource(const struct ti_sci_handle *handle, struct device *dev,
> +devm_ti_sci_get_resource(struct ti_sci_handle *handle, struct device *dev,
> u32 dev_id, u32 sub_type)
> {
> return ERR_PTR(-EINVAL);
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-02 19:12 ` Andrew Davis
@ 2026-03-05 14:59 ` Krzysztof Kozlowski
2026-03-05 15:52 ` Andrew Davis
0 siblings, 1 reply; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 14:59 UTC (permalink / raw)
To: Andrew Davis, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
Michael Turquette, Stephen Boyd, Peter Ujfalusi, Vinod Koul,
Frank Li, Thomas Gleixner, Ulf Hansson, Bjorn Andersson,
Mathieu Poirier, Philipp Zabel, Dave Gerlach, linux-arm-kernel,
linux-kernel, linux-clk, dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 02/03/2026 20:12, Andrew Davis wrote:
> On 2/23/26 2:24 PM, Krzysztof Kozlowski wrote:
>> All the functions operating on the 'handle' pointer are claiming it is a
>> pointer to const thus they should not modify the handle. In fact that's
>> a false statement, because first thing these functions do is drop the
>> cast to const with container_of:
>>
>> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
>>
>> And with such cast the handle is easily writable with simple:
>>
>> info->handle.version.abi_major = 0;
>>
>
> The const is for all the consumers drivers of the handle. Those
> consumers cannot do the above becouse both handle_to_ti_sci_info()
> and struct ti_sci_info itself are only defined inside ti_sci.c.
>
>> The code is not correct logically, either, because functions like
>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>> handle reference counting, thus they must modify the handle.
>
> The reference counting is handled outside of the ti_sci_handle struct,
> the contents of the handle are never modified after it is created.
>
> The const is only added by functions return a handle to consumers.
> We cannot return non-const to consumer drivers or then they would
> be able to modify the content without a compiler warning, which would
> be a real problem.
This is the same argument as making pointer to const the pointer freed
via kfree() (or free() in userspace). kfree() does not modify the
contents of the pointer, right? The same as getting putting handle does
not modify the handle...
The point is that storing the reference counter outside of handle does
not make the argument correct. Logically when you get a reference, you
increase the counter, so it is not a pointer to const. And the code
agrees, because you must drop the const.
>
> Andrew
>
>> Modification here happens anyway, even if the reference counting is
>> stored in the container which the handle is part of.
>>
>> The code does not have actual visible bug, but incorrect 'const'
>> annotations could lead to incorrect compiler decisions.
>>
Please kindly trim the replies from unnecessary context. It makes it
much easier to find new content.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-05 14:59 ` Krzysztof Kozlowski
@ 2026-03-05 15:52 ` Andrew Davis
2026-03-05 15:59 ` Krzysztof Kozlowski
0 siblings, 1 reply; 9+ messages in thread
From: Andrew Davis @ 2026-03-05 15:52 UTC (permalink / raw)
To: Krzysztof Kozlowski, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Michael Turquette, Stephen Boyd,
Peter Ujfalusi, Vinod Koul, Frank Li, Thomas Gleixner,
Ulf Hansson, Bjorn Andersson, Mathieu Poirier, Philipp Zabel,
Dave Gerlach, linux-arm-kernel, linux-kernel, linux-clk,
dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 3/5/26 8:59 AM, Krzysztof Kozlowski wrote:
> On 02/03/2026 20:12, Andrew Davis wrote:
>> On 2/23/26 2:24 PM, Krzysztof Kozlowski wrote:
>>> All the functions operating on the 'handle' pointer are claiming it is a
>>> pointer to const thus they should not modify the handle. In fact that's
>>> a false statement, because first thing these functions do is drop the
>>> cast to const with container_of:
>>>
>>> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
>>>
>>> And with such cast the handle is easily writable with simple:
>>>
>>> info->handle.version.abi_major = 0;
>>>
>>
>> The const is for all the consumers drivers of the handle. Those
>> consumers cannot do the above becouse both handle_to_ti_sci_info()
>> and struct ti_sci_info itself are only defined inside ti_sci.c.
>>
>>> The code is not correct logically, either, because functions like
>>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>>> handle reference counting, thus they must modify the handle.
>>
>> The reference counting is handled outside of the ti_sci_handle struct,
>> the contents of the handle are never modified after it is created.
>>
>> The const is only added by functions return a handle to consumers.
>> We cannot return non-const to consumer drivers or then they would
>> be able to modify the content without a compiler warning, which would
>> be a real problem.
>
> This is the same argument as making pointer to const the pointer freed
> via kfree() (or free() in userspace). kfree() does not modify the
> contents of the pointer, right? The same as getting putting handle does
> not modify the handle...
>
In that argument, if we wanted the consumer of the pointer to not free()
it we would return a const pointer, free()'ing that would result in the
warning we want (discards const qualifier).
If you could somehow malloc() from a const area in memory then free()
doesn't modify the pointed to values, only the non-const record keeping
which would be stored outside of the const memory. So even in this analogy
there isn't a problem.
> The point is that storing the reference counter outside of handle does
> not make the argument correct. Logically when you get a reference, you
> increase the counter, so it is not a pointer to const. And the code
> agrees, because you must drop the const.
>
The record keeping memory is not const and can be modified.
And where do we drop the const? The outer "struct ti_sci_info" was never
const to begin with, so no dropped const.
If the issue is that the handle is not const inside that outer struct
we could fix that,
struct ti_sci_info {
...
- struct ti_sci_handle handle;
+ const struct ti_sci_handle handle;
...
};
And with that change even your original commit message example issue
goes away,
struct ti_sci_info *info = handle_to_ti_sci_info(handle);
info->handle.version.abi_major = 0;
would now fail to work to compile.
Andrew
>
>>
>> Andrew
>>
>>> Modification here happens anyway, even if the reference counting is
>>> stored in the container which the handle is part of.
>>>
>>> The code does not have actual visible bug, but incorrect 'const'
>>> annotations could lead to incorrect compiler decisions.
>>>
>
>
> Please kindly trim the replies from unnecessary context. It makes it
> much easier to find new content.
>
>
> Best regards,
> Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-05 15:52 ` Andrew Davis
@ 2026-03-05 15:59 ` Krzysztof Kozlowski
2026-03-05 18:44 ` Andrew Davis
0 siblings, 1 reply; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 15:59 UTC (permalink / raw)
To: Andrew Davis, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
Michael Turquette, Stephen Boyd, Peter Ujfalusi, Vinod Koul,
Frank Li, Thomas Gleixner, Ulf Hansson, Bjorn Andersson,
Mathieu Poirier, Philipp Zabel, Dave Gerlach, linux-arm-kernel,
linux-kernel, linux-clk, dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 05/03/2026 16:52, Andrew Davis wrote:
>>>> The code is not correct logically, either, because functions like
>>>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>>>> handle reference counting, thus they must modify the handle.
>>>
>>> The reference counting is handled outside of the ti_sci_handle struct,
>>> the contents of the handle are never modified after it is created.
>>>
>>> The const is only added by functions return a handle to consumers.
>>> We cannot return non-const to consumer drivers or then they would
>>> be able to modify the content without a compiler warning, which would
>>> be a real problem.
>>
>> This is the same argument as making pointer to const the pointer freed
>> via kfree() (or free() in userspace). kfree() does not modify the
>> contents of the pointer, right? The same as getting putting handle does
>> not modify the handle...
>>
>
> In that argument, if we wanted the consumer of the pointer to not free()
> it we would return a const pointer, free()'ing that would result in the
> warning we want (discards const qualifier).
>
> If you could somehow malloc() from a const area in memory then free()
> doesn't modify the pointed to values, only the non-const record keeping
> which would be stored outside of the const memory. So even in this analogy
> there isn't a problem.
I am not saying about malloc. I am saying about free() which does not
modify the freed memory.
>
>> The point is that storing the reference counter outside of handle does
>> not make the argument correct. Logically when you get a reference, you
>> increase the counter, so it is not a pointer to const. And the code
>> agrees, because you must drop the const.
>>
>
> The record keeping memory is not const and can be modified.
>
> And where do we drop the const? The outer "struct ti_sci_info" was never
> const to begin with, so no dropped const.
We discuss about different points. I did not say the outer memory is
const. I said that you drop the const - EXPLICITLY - from the pointer to
handle.
And that API which gets a handle (increases reference count) via pointer
to const is completely illogical, because increasing refcnt is already
modifying it. Just because you store the refcnt outside, does not change
the fact that API is simply confusing.
>
> If the issue is that the handle is not const inside that outer struct
> we could fix that,
>
> struct ti_sci_info {
> ...
> - struct ti_sci_handle handle;
> + const struct ti_sci_handle handle;
> ...
> };
>
> And with that change even your original commit message example issue
> goes away,
>
> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
> info->handle.version.abi_major = 0;
>
> would now fail to work to compile.
But you cannot do that for other reasons in your code because you DO
modify the handle in all the APIs which you call "pointer to const".
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-05 15:59 ` Krzysztof Kozlowski
@ 2026-03-05 18:44 ` Andrew Davis
2026-03-05 19:49 ` Krzysztof Kozlowski
0 siblings, 1 reply; 9+ messages in thread
From: Andrew Davis @ 2026-03-05 18:44 UTC (permalink / raw)
To: Krzysztof Kozlowski, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Michael Turquette, Stephen Boyd,
Peter Ujfalusi, Vinod Koul, Frank Li, Thomas Gleixner,
Ulf Hansson, Bjorn Andersson, Mathieu Poirier, Philipp Zabel,
Dave Gerlach, linux-arm-kernel, linux-kernel, linux-clk,
dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 3/5/26 9:59 AM, Krzysztof Kozlowski wrote:
> On 05/03/2026 16:52, Andrew Davis wrote:
>>>>> The code is not correct logically, either, because functions like
>>>>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>>>>> handle reference counting, thus they must modify the handle.
>>>>
>>>> The reference counting is handled outside of the ti_sci_handle struct,
>>>> the contents of the handle are never modified after it is created.
>>>>
>>>> The const is only added by functions return a handle to consumers.
>>>> We cannot return non-const to consumer drivers or then they would
>>>> be able to modify the content without a compiler warning, which would
>>>> be a real problem.
>>>
>>> This is the same argument as making pointer to const the pointer freed
>>> via kfree() (or free() in userspace). kfree() does not modify the
>>> contents of the pointer, right? The same as getting putting handle does
>>> not modify the handle...
>>>
>>
>> In that argument, if we wanted the consumer of the pointer to not free()
>> it we would return a const pointer, free()'ing that would result in the
>> warning we want (discards const qualifier).
>>
>> If you could somehow malloc() from a const area in memory then free()
>> doesn't modify the pointed to values, only the non-const record keeping
>> which would be stored outside of the const memory. So even in this analogy
>> there isn't a problem.
>
> I am not saying about malloc. I am saying about free() which does not
> modify the freed memory.
>
And if you look, kfree() in Linux takes a const pointer. We also do not
modify the content of the pointer we are given either, so we should
be okay using const by the same reasoning.
>>
>>> The point is that storing the reference counter outside of handle does
>>> not make the argument correct. Logically when you get a reference, you
>>> increase the counter, so it is not a pointer to const. And the code
>>> agrees, because you must drop the const.
>>>
>>
>> The record keeping memory is not const and can be modified.
>>
>> And where do we drop the const? The outer "struct ti_sci_info" was never
>> const to begin with, so no dropped const.
>
> We discuss about different points. I did not say the outer memory is
> const. I said that you drop the const - EXPLICITLY - from the pointer to
> handle.
>
Only because container_of() forces the const to be dropped, that is out
of our control. But we never modify handle though the non-const parent
struct.
> And that API which gets a handle (increases reference count) via pointer
> to const is completely illogical, because increasing refcnt is already
> modifying it. Just because you store the refcnt outside, does not change
> the fact that API is simply confusing.
>
If the refcnt is not inside the const struct, then the contents are not
changed, therefor const is still correct. Even if the content of handle
were in fixed ROM, nothing would break here.
>>
>> If the issue is that the handle is not const inside that outer struct
>> we could fix that,
>>
>> struct ti_sci_info {
>> ...
>> - struct ti_sci_handle handle;
>> + const struct ti_sci_handle handle;
>> ...
>> };
>>
>> And with that change even your original commit message example issue
>> goes away,
>>
>> struct ti_sci_info *info = handle_to_ti_sci_info(handle);
>> info->handle.version.abi_major = 0;
>>
>> would now fail to work to compile.
>
> But you cannot do that for other reasons in your code because you DO
> modify the handle in all the APIs which you call "pointer to const".
>
Show me *any* API that modifies the handle. The *only* time handle
contents are modified is when initialized in probe() and functions
called only by probe(), never in any API function.
If the thing making this confusing is that the const gets dropped
by container_of() then it seems there is a new version of that now
that explicitly fixes that issue we could move to[0] with a small
modification.
Andrew
[0] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/container_of.h#n26
>
> Best regards,
> Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-05 18:44 ` Andrew Davis
@ 2026-03-05 19:49 ` Krzysztof Kozlowski
2026-03-09 13:39 ` Andrew Davis
0 siblings, 1 reply; 9+ messages in thread
From: Krzysztof Kozlowski @ 2026-03-05 19:49 UTC (permalink / raw)
To: Andrew Davis, Nishanth Menon, Tero Kristo, Santosh Shilimkar,
Michael Turquette, Stephen Boyd, Peter Ujfalusi, Vinod Koul,
Frank Li, Thomas Gleixner, Ulf Hansson, Bjorn Andersson,
Mathieu Poirier, Philipp Zabel, Dave Gerlach, linux-arm-kernel,
linux-kernel, linux-clk, dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 05/03/2026 19:44, Andrew Davis wrote:
> On 3/5/26 9:59 AM, Krzysztof Kozlowski wrote:
>> On 05/03/2026 16:52, Andrew Davis wrote:
>>>>>> The code is not correct logically, either, because functions like
>>>>>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>>>>>> handle reference counting, thus they must modify the handle.
>>>>>
>>>>> The reference counting is handled outside of the ti_sci_handle struct,
>>>>> the contents of the handle are never modified after it is created.
>>>>>
>>>>> The const is only added by functions return a handle to consumers.
>>>>> We cannot return non-const to consumer drivers or then they would
>>>>> be able to modify the content without a compiler warning, which would
>>>>> be a real problem.
>>>>
>>>> This is the same argument as making pointer to const the pointer freed
>>>> via kfree() (or free() in userspace). kfree() does not modify the
>>>> contents of the pointer, right? The same as getting putting handle does
>>>> not modify the handle...
>>>>
>>>
>>> In that argument, if we wanted the consumer of the pointer to not free()
>>> it we would return a const pointer, free()'ing that would result in the
>>> warning we want (discards const qualifier).
>>>
>>> If you could somehow malloc() from a const area in memory then free()
>>> doesn't modify the pointed to values, only the non-const record keeping
>>> which would be stored outside of the const memory. So even in this analogy
>>> there isn't a problem.
>>
>> I am not saying about malloc. I am saying about free() which does not
>> modify the freed memory.
>>
>
> And if you look, kfree() in Linux takes a const pointer. We also do not
The slub, but that's the only implementation being I believe frowned
upon. The mistake made long time ago...
> modify the content of the pointer we are given either, so we should
> be okay using const by the same reasoning.
That's a mistake so you cannot use the same reasoning. It's bogus and
bugfree to take a pointer to const for any kfree(). Just poke MM folks...
>
>>>
>>>> The point is that storing the reference counter outside of handle does
>>>> not make the argument correct. Logically when you get a reference, you
>>>> increase the counter, so it is not a pointer to const. And the code
>>>> agrees, because you must drop the const.
>>>>
>>>
>>> The record keeping memory is not const and can be modified.
>>>
>>> And where do we drop the const? The outer "struct ti_sci_info" was never
>>> const to begin with, so no dropped const.
>>
>> We discuss about different points. I did not say the outer memory is
>> const. I said that you drop the const - EXPLICITLY - from the pointer to
>> handle.
>>
>
> Only because container_of() forces the const to be dropped, that is out
> of our control. But we never modify handle though the non-const parent
> struct.
That is not true. You could use container_of_const() if you wanted to
have const. You explicitly drop the const, code would not work without
dropping the const and this is the problem.
>
>> And that API which gets a handle (increases reference count) via pointer
>> to const is completely illogical, because increasing refcnt is already
>> modifying it. Just because you store the refcnt outside, does not change
>> the fact that API is simply confusing.
>>
>
> If the refcnt is not inside the const struct, then the contents are not
> changed, therefor const is still correct. Even if the content of handle
> were in fixed ROM, nothing would break here.
I am talking about API and again you go into memory correctness. So
again, very simple: any refcnt get taking const data is bogus.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] ti: sci: Drop fake 'const' on handle pointer
2026-03-05 19:49 ` Krzysztof Kozlowski
@ 2026-03-09 13:39 ` Andrew Davis
0 siblings, 0 replies; 9+ messages in thread
From: Andrew Davis @ 2026-03-09 13:39 UTC (permalink / raw)
To: Krzysztof Kozlowski, Nishanth Menon, Tero Kristo,
Santosh Shilimkar, Michael Turquette, Stephen Boyd,
Peter Ujfalusi, Vinod Koul, Frank Li, Thomas Gleixner,
Ulf Hansson, Bjorn Andersson, Mathieu Poirier, Philipp Zabel,
Dave Gerlach, linux-arm-kernel, linux-kernel, linux-clk,
dmaengine, linux-pm, linux-remoteproc
Cc: stable
On 3/5/26 1:49 PM, Krzysztof Kozlowski wrote:
> On 05/03/2026 19:44, Andrew Davis wrote:
>> On 3/5/26 9:59 AM, Krzysztof Kozlowski wrote:
>>> On 05/03/2026 16:52, Andrew Davis wrote:
>>>>>>> The code is not correct logically, either, because functions like
>>>>>>> ti_sci_get_handle() and ti_sci_put_handle() are meant to modify the
>>>>>>> handle reference counting, thus they must modify the handle.
>>>>>>
>>>>>> The reference counting is handled outside of the ti_sci_handle struct,
>>>>>> the contents of the handle are never modified after it is created.
>>>>>>
>>>>>> The const is only added by functions return a handle to consumers.
>>>>>> We cannot return non-const to consumer drivers or then they would
>>>>>> be able to modify the content without a compiler warning, which would
>>>>>> be a real problem.
>>>>>
>>>>> This is the same argument as making pointer to const the pointer freed
>>>>> via kfree() (or free() in userspace). kfree() does not modify the
>>>>> contents of the pointer, right? The same as getting putting handle does
>>>>> not modify the handle...
>>>>>
>>>>
>>>> In that argument, if we wanted the consumer of the pointer to not free()
>>>> it we would return a const pointer, free()'ing that would result in the
>>>> warning we want (discards const qualifier).
>>>>
>>>> If you could somehow malloc() from a const area in memory then free()
>>>> doesn't modify the pointed to values, only the non-const record keeping
>>>> which would be stored outside of the const memory. So even in this analogy
>>>> there isn't a problem.
>>>
>>> I am not saying about malloc. I am saying about free() which does not
>>> modify the freed memory.
>>>
>>
>> And if you look, kfree() in Linux takes a const pointer. We also do not
>
> The slub, but that's the only implementation being I believe frowned
> upon. The mistake made long time ago...
>
>> modify the content of the pointer we are given either, so we should
>> be okay using const by the same reasoning.
>
> That's a mistake so you cannot use the same reasoning. It's bogus and
> bugfree to take a pointer to const for any kfree(). Just poke MM folks...
>
Don't act like I'm trying to trick you by picking some bad example, you
picked kfree() and it just happened to showcase my point.
>
>>
>>>>
>>>>> The point is that storing the reference counter outside of handle does
>>>>> not make the argument correct. Logically when you get a reference, you
>>>>> increase the counter, so it is not a pointer to const. And the code
>>>>> agrees, because you must drop the const.
>>>>>
>>>>
>>>> The record keeping memory is not const and can be modified.
>>>>
>>>> And where do we drop the const? The outer "struct ti_sci_info" was never
>>>> const to begin with, so no dropped const.
>>>
>>> We discuss about different points. I did not say the outer memory is
>>> const. I said that you drop the const - EXPLICITLY - from the pointer to
>>> handle.
>>>
>>
>> Only because container_of() forces the const to be dropped, that is out
>> of our control. But we never modify handle though the non-const parent
>> struct.
>
> That is not true. You could use container_of_const() if you wanted to
> have const. You explicitly drop the const, code would not work without
> dropping the const and this is the problem.
>
There is no dropping the const, the parent struct was never const in
the first place. Only the handle inside the parent struct is const and
it can stay const and nothing would stop working in any API function.
>>
>>> And that API which gets a handle (increases reference count) via pointer
>>> to const is completely illogical, because increasing refcnt is already
>>> modifying it. Just because you store the refcnt outside, does not change
>>> the fact that API is simply confusing.
>>>
>>
>> If the refcnt is not inside the const struct, then the contents are not
>> changed, therefor const is still correct. Even if the content of handle
>> were in fixed ROM, nothing would break here.
>
> I am talking about API and again you go into memory correctness. So
> again, very simple: any refcnt get taking const data is bogus.
>
Modifying a refcnt stored *inside* a const struct is bogus. Keeping an
external refcnt about a bit of const data is perfectly sane. When the
refcnt goes to 0 nothing happens, it's not like we go an free() the
const data or anything. The refcnt exists just to print a warning if the
count goes negative, nothing else.
Andrew
>
> Best regards,
> Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-03-09 13:39 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-23 20:24 [PATCH] ti: sci: Drop fake 'const' on handle pointer Krzysztof Kozlowski
2026-03-02 16:58 ` Mathieu Poirier
2026-03-02 19:12 ` Andrew Davis
2026-03-05 14:59 ` Krzysztof Kozlowski
2026-03-05 15:52 ` Andrew Davis
2026-03-05 15:59 ` Krzysztof Kozlowski
2026-03-05 18:44 ` Andrew Davis
2026-03-05 19:49 ` Krzysztof Kozlowski
2026-03-09 13:39 ` Andrew Davis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox