static int __uniphier_watchdog_start(struct regmap *regmap, unsigned int sec) { unsigned int val; int ret; ret = regmap_read_poll_timeout(regmap, WDTCTRL, val, !(val & WDTCTRL_STATUS), 0, WDTST_TIMEOUT); if (ret) return ret; /* Setup period */ ret = regmap_write(regmap, WDTTIMSET, SEC_TO_WDTTIMSET_PRD(sec)); if (ret) return ret; /* Enable and clear watchdog */ ret = regmap_write(regmap, WDTCTRL, WDTCTRL_ENABLE | WDTCTRL_CLEAR); if (!ret) /* * As SoC specification, after clear counter, * it needs to wait until counter status is 1. */ ret = regmap_read_poll_timeout(regmap, WDTCTRL, val, (val & WDTCTRL_STATUS), 0, WDTST_TIMEOUT); return ret; }
static int da8xx_usb0_clk48_enable(struct clk_hw *hw) { struct da8xx_usb0_clk48 *usb0 = to_da8xx_usb0_clk48(hw); unsigned int mask, val; int ret; /* Locking the USB 2.O PLL requires that the USB 2.O PSC is enabled * temporaily. It can be turned back off once the PLL is locked. */ clk_enable(usb0->fck); /* Turn on the USB 2.0 PHY, but just the PLL, and not OTG. The USB 1.1 * PHY may use the USB 2.0 PLL clock without USB 2.0 OTG being used. */ mask = CFGCHIP2_RESET | CFGCHIP2_PHYPWRDN | CFGCHIP2_PHY_PLLON; val = CFGCHIP2_PHY_PLLON; regmap_write_bits(usb0->regmap, CFGCHIP(2), mask, val); ret = regmap_read_poll_timeout(usb0->regmap, CFGCHIP(2), val, val & CFGCHIP2_PHYCLKGD, 0, 500000); clk_disable(usb0->fck); return ret; }
static int mt8183_afe_runtime_suspend(struct device *dev) { struct mtk_base_afe *afe = dev_get_drvdata(dev); struct mt8183_afe_private *afe_priv = afe->platform_priv; unsigned int value; int ret; if (!afe->regmap || afe_priv->pm_runtime_bypass_reg_ctl) goto skip_regmap; /* disable AFE */ regmap_update_bits(afe->regmap, AFE_DAC_CON0, AFE_ON_MASK_SFT, 0x0); ret = regmap_read_poll_timeout(afe->regmap, AFE_DAC_MON, value, (value & AFE_ON_RETM_MASK_SFT) == 0, 20, 1 * 1000 * 1000); if (ret) dev_warn(afe->dev, "%s(), ret %d\n", __func__, ret); /* make sure all irq status are cleared, twice intended */ regmap_update_bits(afe->regmap, AFE_IRQ_MCU_CLR, 0xffff, 0xffff); regmap_update_bits(afe->regmap, AFE_IRQ_MCU_CLR, 0xffff, 0xffff); /* cache only */ regcache_cache_only(afe->regmap, true); regcache_mark_dirty(afe->regmap); skip_regmap: return mt8183_afe_disable_clock(afe); }
static int stm32_lptim_set_enable_state(struct stm32_lptim_cnt *priv, int enable) { int ret; u32 val; val = FIELD_PREP(STM32_LPTIM_ENABLE, enable); ret = regmap_write(priv->regmap, STM32_LPTIM_CR, val); if (ret) return ret; if (!enable) { clk_disable(priv->clk); priv->enabled = false; return 0; } /* LP timer must be enabled before writing CMP & ARR */ ret = regmap_write(priv->regmap, STM32_LPTIM_ARR, priv->ceiling); if (ret) return ret; ret = regmap_write(priv->regmap, STM32_LPTIM_CMP, 0); if (ret) return ret; /* ensure CMP & ARR registers are properly written */ ret = regmap_read_poll_timeout(priv->regmap, STM32_LPTIM_ISR, val, (val & STM32_LPTIM_CMPOK_ARROK), 100, 1000); if (ret) return ret; ret = regmap_write(priv->regmap, STM32_LPTIM_ICR, STM32_LPTIM_CMPOKCF_ARROKCF); if (ret) return ret; ret = clk_enable(priv->clk); if (ret) { regmap_write(priv->regmap, STM32_LPTIM_CR, 0); return ret; } priv->enabled = true; /* Start LP timer in continuous mode */ return regmap_update_bits(priv->regmap, STM32_LPTIM_CR, STM32_LPTIM_CNTSTRT, STM32_LPTIM_CNTSTRT); }
static void socfpga_a10_fpga_generate_dclks(struct a10_fpga_priv *priv, u32 count) { u32 val; /* Clear any existing DONE status. */ regmap_write(priv->regmap, A10_FPGAMGR_DCLKSTAT_OFST, A10_FPGAMGR_DCLKSTAT_DCLKDONE); /* Issue the DCLK regmap. */ regmap_write(priv->regmap, A10_FPGAMGR_DCLKCNT_OFST, count); /* wait till the dclkcnt done */ regmap_read_poll_timeout(priv->regmap, A10_FPGAMGR_DCLKSTAT_OFST, val, val, 1, 100); /* Clear DONE status. */ regmap_write(priv->regmap, A10_FPGAMGR_DCLKSTAT_OFST, A10_FPGAMGR_DCLKSTAT_DCLKDONE); }
/* * UniPhier Watchdog operations */ static int uniphier_watchdog_ping(struct watchdog_device *w) { struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); unsigned int val; int ret; /* Clear counter */ ret = regmap_write_bits(wdev->regmap, WDTCTRL, WDTCTRL_CLEAR, WDTCTRL_CLEAR); if (!ret) /* * As SoC specification, after clear counter, * it needs to wait until counter status is 1. */ ret = regmap_read_poll_timeout(wdev->regmap, WDTCTRL, val, (val & WDTCTRL_STATUS), 0, WDTST_TIMEOUT); return ret; }
static int uniphier_clk_cpugear_set_parent(struct clk_hw *hw, u8 index) { struct uniphier_clk_cpugear *gear = to_uniphier_clk_cpugear(hw); int ret; unsigned int val; ret = regmap_write_bits(gear->regmap, gear->regbase + UNIPHIER_CLK_CPUGEAR_SET, gear->mask, index); if (ret) return ret; ret = regmap_write_bits(gear->regmap, gear->regbase + UNIPHIER_CLK_CPUGEAR_SET, UNIPHIER_CLK_CPUGEAR_UPD_BIT, UNIPHIER_CLK_CPUGEAR_UPD_BIT); if (ret) return ret; return regmap_read_poll_timeout(gear->regmap, gear->regbase + UNIPHIER_CLK_CPUGEAR_UPD, val, !(val & UNIPHIER_CLK_CPUGEAR_UPD_BIT), 0, 1); }