On Wed, Jun 18, 2025 at 11:21:00PM +0800, Hans Zhang wrote: > DesignWare PCIe controller drivers implement register bit manipulation > through explicit read-modify-write sequences. These patterns appear > repeatedly across multiple drivers with minor variations, creating > code duplication and maintenance overhead. > > Implement dw_pcie_clear_and_set_dword() helper to encapsulate atomic > register modification. The function reads the current register value, > clears specified bits, sets new bits, and writes back the result in > a single operation. This abstraction hides bitwise manipulation details > while ensuring consistent behavior across all usage sites. > > Centralizing this logic reduces future maintenance effort when modifying > register access patterns and minimizes the risk of implementation > divergence between drivers. > > Signed-off-by: Hans Zhang <18255117159@xxxxxxx> > --- > drivers/pci/controller/dwc/pcie-designware.h | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h > index ce9e18554e42..f401c144df0f 100644 > --- a/drivers/pci/controller/dwc/pcie-designware.h > +++ b/drivers/pci/controller/dwc/pcie-designware.h > @@ -707,6 +707,17 @@ static inline void dw_pcie_ep_writel_dbi2(struct dw_pcie_ep *ep, u8 func_no, > dw_pcie_ep_write_dbi2(ep, func_no, reg, 0x4, val); > } > > +static inline void dw_pcie_clear_and_set_dword(struct dw_pcie *pci, int pos, > + u32 clear, u32 set) Can align with regmap_update_bits() argumnet? dw_pcie_update_dbi_bits()? Frank > +{ > + u32 val; > + > + val = dw_pcie_readl_dbi(pci, pos); > + val &= ~clear; > + val |= set; > + dw_pcie_writel_dbi(pci, pos, val); > +} > + > static inline void dw_pcie_dbi_ro_wr_en(struct dw_pcie *pci) > { > u32 reg; > -- > 2.25.1 >