soc: mediatek: pm-domains: Allow bus protection to ignore clear ack

In some cases the hardware does not create an acknowledgment of the
bus protection clearing. Add a flag to the bus protection indicating
that a clear event will be ignored.

Signed-off-by: Matthias Brugger <mbrugger@suse.com>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Link: https://lore.kernel.org/r/20201030113622.201188-10-enric.balletbo@collabora.com
Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
This commit is contained in:
Matthias Brugger 2020-10-30 12:36:15 +01:00 committed by Matthias Brugger
parent 123e8b4fd0
commit 1d4597fa18
2 changed files with 17 additions and 9 deletions

View File

@ -161,6 +161,9 @@ static int _scpsys_bus_protect_disable(const struct scpsys_bus_prot_data *bpd,
else else
regmap_write(regmap, bpd[i].bus_prot_clr, mask); regmap_write(regmap, bpd[i].bus_prot_clr, mask);
if (bpd[i].ignore_clr_ack)
continue;
ret = regmap_read_poll_timeout(regmap, bpd[i].bus_prot_sta, ret = regmap_read_poll_timeout(regmap, bpd[i].bus_prot_sta,
val, !(val & mask), val, !(val & mask),
MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT); MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT);

View File

@ -35,19 +35,23 @@
#define SPM_MAX_BUS_PROT_DATA 5 #define SPM_MAX_BUS_PROT_DATA 5
#define _BUS_PROT(_mask, _set, _clr, _sta, _update) { \ #define _BUS_PROT(_mask, _set, _clr, _sta, _update, _ignore) { \
.bus_prot_mask = (_mask), \ .bus_prot_mask = (_mask), \
.bus_prot_set = _set, \ .bus_prot_set = _set, \
.bus_prot_clr = _clr, \ .bus_prot_clr = _clr, \
.bus_prot_sta = _sta, \ .bus_prot_sta = _sta, \
.bus_prot_reg_update = _update, \ .bus_prot_reg_update = _update, \
.ignore_clr_ack = _ignore, \
} }
#define BUS_PROT_WR(_mask, _set, _clr, _sta) \ #define BUS_PROT_WR(_mask, _set, _clr, _sta) \
_BUS_PROT(_mask, _set, _clr, _sta, false) _BUS_PROT(_mask, _set, _clr, _sta, false, false)
#define BUS_PROT_WR_IGN(_mask, _set, _clr, _sta) \
_BUS_PROT(_mask, _set, _clr, _sta, false, true)
#define BUS_PROT_UPDATE(_mask, _set, _clr, _sta) \ #define BUS_PROT_UPDATE(_mask, _set, _clr, _sta) \
_BUS_PROT(_mask, _set, _clr, _sta, true) _BUS_PROT(_mask, _set, _clr, _sta, true, false)
#define BUS_PROT_UPDATE_TOPAXI(_mask) \ #define BUS_PROT_UPDATE_TOPAXI(_mask) \
BUS_PROT_UPDATE(_mask, \ BUS_PROT_UPDATE(_mask, \
@ -61,6 +65,7 @@ struct scpsys_bus_prot_data {
u32 bus_prot_clr; u32 bus_prot_clr;
u32 bus_prot_sta; u32 bus_prot_sta;
bool bus_prot_reg_update; bool bus_prot_reg_update;
bool ignore_clr_ack;
}; };
#define MAX_SUBSYS_CLKS 10 #define MAX_SUBSYS_CLKS 10