@@ -68,8 +68,8 @@ struct rockchip_pmu {
#define DOMAIN(pwr, status, req, idle, ack) \
{ \
- .pwr_mask = BIT(pwr), \
- .status_mask = BIT(status), \
+ .pwr_mask = (pwr >= 0) ? BIT(pwr) : OVERFLOW_MASK, \
+ .status_mask = (status >= 0) ? BIT(status) : OVERFLOW_MASK,\
.req_mask = (req >= 0) ? BIT(req) : OVERFLOW_MASK, \
.idle_mask = (idle >= 0) ? BIT(idle) : OVERFLOW_MASK, \
.ack_mask = (ack >= 0) ? BIT(ack) : OVERFLOW_MASK, \
@@ -121,6 +121,10 @@ static bool rockchip_pmu_domain_is_on(struct rockchip_pm_domain *pd)
struct rockchip_pmu *pmu = pd->pmu;
unsigned int val;
+ /* check idle status for idle-only domains */
+ if (pd->info->status_mask >= OVERFLOW_MASK)
+ return !rockchip_pmu_domain_is_idle(pd);
+
regmap_read(pmu->regmap, pmu->info->status_offset, &val);
/* 1'b0: power on, 1'b1: power off */
@@ -132,6 +136,9 @@ static void rockchip_do_pmu_set_power_domain(struct rockchip_pm_domain *pd,
{
struct rockchip_pmu *pmu = pd->pmu;
+ if (pd->info->pwr_mask >= OVERFLOW_MASK)
+ return;
+
regmap_update_bits(pmu->regmap, pmu->info->pwr_offset,
pd->info->pwr_mask, on ? 0 : -1U);