.. | .. |
---|
24 | 24 | struct reset_control *rsts; |
---|
25 | 25 | phys_addr_t mem_start; |
---|
26 | 26 | size_t mem_size; |
---|
| 27 | + bool mem_no_free; |
---|
27 | 28 | }; |
---|
28 | 29 | |
---|
29 | 30 | static atomic_t mcu_done = ATOMIC_INIT(0); |
---|
.. | .. |
---|
76 | 77 | |
---|
77 | 78 | static void do_mcu_done(struct rk_tb_serv *serv) |
---|
78 | 79 | { |
---|
79 | | - struct rk_tb_client *client, *client_s; |
---|
| 80 | + struct rk_tb_client *client; |
---|
80 | 81 | struct rockchip_mbox_msg msg; |
---|
81 | 82 | |
---|
82 | 83 | rockchip_mbox_read_msg(serv->mbox_rx_chan, &msg); |
---|
.. | .. |
---|
89 | 90 | |
---|
90 | 91 | start = phys_to_virt(serv->mem_start); |
---|
91 | 92 | end = start + serv->mem_size; |
---|
92 | | - free_reserved_area(start, end, -1, "rtos"); |
---|
| 93 | + if (!serv->mem_no_free) |
---|
| 94 | + free_reserved_area(start, end, -1, "rtos"); |
---|
93 | 95 | |
---|
94 | 96 | spin_lock(&lock); |
---|
95 | 97 | if (atomic_read(&mcu_done)) { |
---|
.. | .. |
---|
97 | 99 | return; |
---|
98 | 100 | } |
---|
99 | 101 | |
---|
100 | | - list_for_each_entry_safe(client, client_s, &clients_list, node) { |
---|
| 102 | + while (!list_empty(&clients_list)) { |
---|
| 103 | + client = list_first_entry(&clients_list, struct rk_tb_client, node); |
---|
| 104 | + list_del(&client->node); |
---|
101 | 105 | spin_unlock(&lock); |
---|
102 | 106 | if (client->cb) |
---|
103 | 107 | client->cb(client->data); |
---|
104 | 108 | spin_lock(&lock); |
---|
105 | | - list_del(&client->node); |
---|
106 | 109 | } |
---|
107 | 110 | atomic_set(&mcu_done, 1); |
---|
108 | 111 | spin_unlock(&lock); |
---|
.. | .. |
---|
149 | 152 | if (IS_ERR(serv->rsts) && PTR_ERR(serv->rsts) == -EPROBE_DEFER) |
---|
150 | 153 | return -EPROBE_DEFER; |
---|
151 | 154 | |
---|
| 155 | + serv->mem_no_free = device_property_read_bool(&pdev->dev, "memory-no-free"); |
---|
| 156 | + |
---|
152 | 157 | platform_set_drvdata(pdev, serv); |
---|
153 | 158 | |
---|
154 | 159 | mbox_cl = &serv->mbox_cl; |
---|