From dbd6e84bff1afb8b43ad4a82a526ba6f840a2fec Mon Sep 17 00:00:00 2001 From: Venkat Gopalakrishnan Date: Fri, 15 Apr 2016 17:31:08 -0700 Subject: [PATCH] scsi: ufs: add ufshcd_dme_rmw wrapper Add a wrapper to get/modify/set DME attribute. Change-Id: Ife2ae05950e6c437bef779955432d91d5117d49b Signed-off-by: Venkat Gopalakrishnan --- drivers/scsi/ufs/ufshcd.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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)