18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Actions Semi Owl Smart Power System (SPS) shared helpers 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2012 Actions Semi Inc. 68c2ecf20Sopenharmony_ci * Author: Actions Semi, Inc. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (c) 2017 Andreas Färber 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/delay.h> 128c2ecf20Sopenharmony_ci#include <linux/io.h> 138c2ecf20Sopenharmony_ci#include <linux/soc/actions/owl-sps.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define OWL_SPS_PG_CTL 0x0 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciint owl_sps_set_pg(void __iomem *base, u32 pwr_mask, u32 ack_mask, bool enable) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci u32 val; 208c2ecf20Sopenharmony_ci bool ack; 218c2ecf20Sopenharmony_ci int timeout; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci val = readl(base + OWL_SPS_PG_CTL); 248c2ecf20Sopenharmony_ci ack = val & ack_mask; 258c2ecf20Sopenharmony_ci if (ack == enable) 268c2ecf20Sopenharmony_ci return 0; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci if (enable) 298c2ecf20Sopenharmony_ci val |= pwr_mask; 308c2ecf20Sopenharmony_ci else 318c2ecf20Sopenharmony_ci val &= ~pwr_mask; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci writel(val, base + OWL_SPS_PG_CTL); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci for (timeout = 5000; timeout > 0; timeout -= 50) { 368c2ecf20Sopenharmony_ci val = readl(base + OWL_SPS_PG_CTL); 378c2ecf20Sopenharmony_ci if ((val & ack_mask) == (enable ? ack_mask : 0)) 388c2ecf20Sopenharmony_ci break; 398c2ecf20Sopenharmony_ci udelay(50); 408c2ecf20Sopenharmony_ci } 418c2ecf20Sopenharmony_ci if (timeout <= 0) 428c2ecf20Sopenharmony_ci return -ETIMEDOUT; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci udelay(10); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci return 0; 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(owl_sps_set_pg); 49