On 10/11/2022 14:36, Zhe Wang wrote: > From: Zhe Wang <zhe.wang1@xxxxxxxxxx> > > Add driver code for Unisoc ufs host controller, along with ufs > initialization. (...) > + > +static struct platform_driver ufs_sprd_pltform = { > + .probe = ufs_sprd_probe, > + .remove = ufs_sprd_remove, > + .shutdown = ufshcd_pltfrm_shutdown, > + .driver = { > + .name = "ufshcd-sprd", > + .pm = &ufs_sprd_pm_ops, > + .of_match_table = of_match_ptr(ufs_sprd_of_match), Drop of_match_ptr > + }, > +}; > +module_platform_driver(ufs_sprd_pltform); > + > +MODULE_AUTHOR("Zhe Wang <zhe.wang1@xxxxxxxxxx>"); > +MODULE_DESCRIPTION("Unisoc UFS Host Driver"); > +MODULE_LICENSE("GPL v2"); > diff --git a/drivers/ufs/host/ufs-sprd.h b/drivers/ufs/host/ufs-sprd.h > new file mode 100644 > index 000000000000..215e7483d1e8 > --- /dev/null > +++ b/drivers/ufs/host/ufs-sprd.h > @@ -0,0 +1,125 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * UNISOC UFS Host Controller driver > + * > + * Copyright (C) 2022 Unisoc, Inc. > + * Author: Zhe Wang <zhe.wang1@xxxxxxxxxx> > + */ > + > +#ifndef _UFS_SPRD_H_ > +#define _UFS_SPRD_H_ > + > +#define APB_UFSDEV_REG 0xCE8 > +#define APB_UFSDEV_REFCLK_EN 0x2 > +#define APB_USB31PLL_CTRL 0xCFC > +#define APB_USB31PLLV_REF2MPHY 0x1 > + > +#define SPRD_SIP_SVC_STORAGE_UFS_CRYPTO_ENABLE \ > + ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \ > + ARM_SMCCC_SMC_32, \ > + ARM_SMCCC_OWNER_SIP, \ > + 0x0301) > + > +enum SPRD_UFS_CLK_INDEX { > + SPRD_UFS_HCLK, > + SPRD_UFS_HCLK_SOURCE, > + > + SPRD_UFS_CLK_MAX > +}; > + > +enum SPRD_UFS_RST_INDEX { > + SPRD_UFSHCI_SOFT_RST, > + SPRD_UFS_DEV_RST, > + > + SPRD_UFS_RST_MAX > +}; > + > +enum SPRD_UFS_SYSCON_INDEX { > + SPRD_UFS_ANLG_REG, > + SPRD_UFS_AON_APB, > + > + SPRD_UFS_SYSCON_MAX > +}; > + > +enum SPRD_UFS_VREG_INDEX { > + SPRD_UFS_VDD_MPHY, > + > + SPRD_UFS_VREG_MAX > +}; > + > +struct ufs_sprd_clk { > + const char *name; > + struct clk *clk; > +}; > + > +struct ufs_sprd_rst { > + const char *name; > + struct reset_control *rc; > +}; > + > +struct ufs_sprd_syscon { > + const char *name; > + struct regmap *regmap; > +}; > + > +struct ufs_sprd_vreg { > + const char *name; > + struct regulator *vreg; > +}; > + > +struct ufs_sprd_priv { > + struct ufs_sprd_clk clki[SPRD_UFS_CLK_MAX]; > + struct ufs_sprd_rst rci[SPRD_UFS_RST_MAX]; > + struct ufs_sprd_syscon sysci[SPRD_UFS_SYSCON_MAX]; > + struct ufs_sprd_vreg vregi[SPRD_UFS_VREG_MAX]; > + const struct ufs_hba_variant_ops ufs_hba_sprd_vops; > +}; > + > +struct ufs_sprd_host { > + struct ufs_hba *hba; > + struct ufs_sprd_priv *priv; > + void __iomem *ufs_dbg_mmio; > + > + enum ufs_unipro_ver unipro_ver; > +}; > + > +static inline struct ufs_sprd_priv *ufs_sprd_get_priv_data(struct ufs_hba *hba) > +{ > + struct ufs_sprd_host *host = ufshcd_get_variant(hba); > + > + WARN_ON(!host->priv); > + return host->priv; > +} > + > +static inline void ufs_sprd_regmap_update(struct ufs_sprd_priv *priv, unsigned int index, > + unsigned int reg, unsigned int bits, unsigned int val) > +{ > + regmap_update_bits(priv->sysci[index].regmap, reg, bits, val); > +} > + > +static inline void ufs_sprd_regmap_read(struct ufs_sprd_priv *priv, unsigned int index, > + unsigned int reg, unsigned int *val) > +{ > + regmap_read(priv->sysci[index].regmap, reg, val); > +} > + > +static inline void ufs_sprd_get_unipro_ver(struct ufs_hba *hba) > +{ > + struct ufs_sprd_host *host = ufshcd_get_variant(hba); > + > + if (ufshcd_dme_get(hba, UIC_ARG_MIB(PA_LOCALVERINFO), &host->unipro_ver)) > + host->unipro_ver = 0; > +} > + > +static inline void ufs_sprd_ctrl_uic_compl(struct ufs_hba *hba, bool enable) > +{ > + u32 set = ufshcd_readl(hba, REG_INTERRUPT_ENABLE); > + > + if (enable == true) > + set |= UIC_COMMAND_COMPL; > + else > + set &= ~UIC_COMMAND_COMPL; > + ufshcd_writel(hba, set, REG_INTERRUPT_ENABLE); > +} Drop functions from headers. These are not stubs and your task is not to micro-optimize code. > + > +#endif /* _UFS_SPRD_H_ */ Best regards, Krzysztof