diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index be8928bedb0b..1e5eb3ddd7c4 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -1049,6 +1049,32 @@ static inline int ufshcd_dme_peer_get(struct ufs_hba *hba, return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER); } +/** + * ufshcd_dme_rmw - get modify set a dme attribute + * @hba - per adapter instance + * @mask - mask to apply on read value + * @val - actual value to write + * @attr - dme attribute + */ +static inline int ufshcd_dme_rmw(struct ufs_hba *hba, u32 mask, + u32 val, u32 attr) +{ + u32 cfg = 0; + int err = 0; + + err = ufshcd_dme_get(hba, UIC_ARG_MIB(attr), &cfg); + if (err) + goto out; + + cfg &= ~mask; + cfg |= (val & mask); + + err = ufshcd_dme_set(hba, UIC_ARG_MIB(attr), cfg); + +out: + return err; +} + int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size); static inline bool ufshcd_is_hs_mode(struct ufs_pa_layer_attr *pwr_info)