From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753777AbbJNNK6 (ORCPT ); Wed, 14 Oct 2015 09:10:58 -0400 Received: from mailout2.samsung.com ([203.254.224.25]:50913 "EHLO mailout2.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932123AbbJNNKx (ORCPT ); Wed, 14 Oct 2015 09:10:53 -0400 X-AuditID: cbfee68e-f791c6d000001498-43-561e545b3e39 From: Alim Akhtar To: linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org Cc: JBottomley@odin.com, vinholikatti@gmail.com, amit.daniel@samsung.com, essuuj@gmail.com, devicetree@vger.kernel.org, alim.akhtar@samsung.com, arnd@arndb.de Subject: [PATCH v4 08/11] scsi: ufs: add add specific callback for hibern8 Date: Wed, 14 Oct 2015 18:25:48 +0530 Message-id: <1444827351-24128-9-git-send-email-alim.akhtar@samsung.com> X-Mailer: git-send-email 1.7.10.4 In-reply-to: <1444827351-24128-1-git-send-email-alim.akhtar@samsung.com> References: <1444827351-24128-1-git-send-email-alim.akhtar@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrKLMWRmVeSWpSXmKPExsWyRsSkWjc6RC7M4OoDE4sH87axWTRcDbH4 O+kYu8X8I+dYLZZfWMJk8X/9bRaLy7vmsFl0X9/BZrFjYZUDp8fvX5MYPXbOusvucfjHD2aP vi2rGD0+b5ILYI3isklJzcksSy3St0vgyjh65j5jwXvFihXHFjA2MC6T6WLk5JAQMJGY8H4R G4QtJnHh3nogm4tDSGAFo8TEP81MMEX9HQeYIRJLGSWOHZ3GDuH8ZJR4/Po9M0gVm4C2xN3p W8A6RARsJM7ffMAEUsQssIhR4sPjeWAJYQEvia1vrjCC2CwCqhJL73aANfMKuEtMOX2MFWKd okT3swlgN3EKeEjMnX+MHcQWAqppPz4dbKiEwDp2iRX/ZjNDDBKQ+Db5EEsXIwdQQlZi0wFm iDmSEgdX3GCZwCi8gJFhFaNoakFyQXFSepGRXnFibnFpXrpecn7uJkZg6J/+96xvB+PNA9aH GAU4GJV4eA+slQ0TYk0sK67MPcRoCrRhIrOUaHI+MMLySuINjc2MLExNTI2NzC3NlMR5E6R+ BgsJpCeWpGanphakFsUXleakFh9iZOLglGpgrNmkzFpYKeX4c2/n+qfaFyesXTNtzX/rfA+H qWJZ2TvDtKe4+q7vmf+59uXk13xyW+8YR2w8c/4jv6dORtzBe2EvCvY+LMybInLF4F346fVq fxYlM5Tsu6y9ccr+R1lu+la529bftN8r3Zxwa82/yWWyE575v+QxPJs6Uywq6ojfopiZxb37 NyqxFGckGmoxFxUnAgBQi6x5eAIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrEIsWRmVeSWpSXmKPExsVy+t9jAd3oELkwgw99uhYP5m1js2i4GmLx d9Ixdov5R86xWiy/sITJ4v/62ywWl3fNYbPovr6DzWLHwioHTo/fvyYxeuycdZfd4/CPH8we fVtWMXp83iQXwBrVwGiTkZqYklqkkJqXnJ+SmZduq+QdHO8cb2pmYKhraGlhrqSQl5ibaqvk 4hOg65aZA3SPkkJZYk4pUCggsbhYSd8O04TQEDddC5jGCF3fkCC4HiMDNJCwhjHj6Jn7jAXv FStWHFvA2MC4TKaLkZNDQsBEor/jADOELSZx4d56ti5GLg4hgaWMEseOTmOHcH4ySjx+/R6s ik1AW+Lu9C1MILaIgI3E+ZsPmECKmAUWMUp8eDwPLCEs4CWx9c0VRhCbRUBVYundDrBmXgF3 iSmnj7FCrFOU6H42gQ3E5hTwkJg7/xg7iC0EVNN+fDrTBEbeBYwMqxglUguSC4qT0nMN81LL 9YoTc4tL89L1kvNzNzGC4+uZ1A7Gg7vcDzEKcDAq8fBmrJYNE2JNLCuuzD3EKMHBrCTC+8dA LkyINyWxsiq1KD++qDQntfgQoynQYROZpUST84Gxn1cSb2hsYm5qbGppYmFiZqkkznvjEEOY kEB6YklqdmpqQWoRTB8TB6dUA+MmmX8MBzTVWJ71z32uu3gmJ5eX7Oy/Zg2L2vsDZH2ect6a JiJhM2Vu43mFiWlz2k0id64941lZ775WY/VsdtvcpbZCcxMm57AEtp5Ov+TzQ70wx51Lr3zZ qtNeE8Xri7Pu8X7Iyv0i/1yaZbvUub8+Mc+v+S3YZ75eqWupqCpPylGZx8eX/ldiKc5INNRi LipOBABIkK8SxQIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Seungwon Jeon Some host controller needs specific handling before/after (un)hibernation, This change adds specific callback function to support vendor's implementation. Signed-off-by: Seungwon Jeon Signed-off-by: Alim Akhtar --- drivers/scsi/ufs/ufshcd.c | 33 +++++++++++++++++++++++++++++---- drivers/scsi/ufs/ufshcd.h | 10 ++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index eeb7835c52ab..075b7bf13080 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -181,8 +181,7 @@ static int ufshcd_probe_hba(struct ufs_hba *hba); static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, bool skip_ref_clk); static int ufshcd_setup_clocks(struct ufs_hba *hba, bool on); -static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba); -static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba); +static int ufshcd_uic_hibern8_ctrl(struct ufs_hba *hba, bool en); static inline void ufshcd_add_delay_before_dme_cmd(struct ufs_hba *hba); static int ufshcd_host_reset_and_restore(struct ufs_hba *hba); static irqreturn_t ufshcd_intr(int irq, void *__hba); @@ -215,6 +214,16 @@ static inline void ufshcd_disable_irq(struct ufs_hba *hba) } } +static inline int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) +{ + return ufshcd_uic_hibern8_ctrl(hba, true); +} + +static inline int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) +{ + return ufshcd_uic_hibern8_ctrl(hba, false); +} + /* * ufshcd_wait_for_register - wait for register value to change * @hba - per-adapter interface @@ -2394,7 +2403,7 @@ out: return ret; } -static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) +static int __ufshcd_uic_hibern8_enter(struct ufs_hba *hba) { struct uic_command uic_cmd = {0}; @@ -2403,7 +2412,7 @@ static int ufshcd_uic_hibern8_enter(struct ufs_hba *hba) return ufshcd_uic_pwr_ctrl(hba, &uic_cmd); } -static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) +static int __ufshcd_uic_hibern8_exit(struct ufs_hba *hba) { struct uic_command uic_cmd = {0}; int ret; @@ -2418,6 +2427,22 @@ static int ufshcd_uic_hibern8_exit(struct ufs_hba *hba) return ret; } +static int ufshcd_uic_hibern8_ctrl(struct ufs_hba *hba, bool en) +{ + int ret; + + ufshcd_vops_hibern8_notify(hba, en, PRE_CHANGE); + ret = en ? __ufshcd_uic_hibern8_enter(hba) : + __ufshcd_uic_hibern8_exit(hba); + if (ret) + goto out; + + ufshcd_vops_hibern8_notify(hba, en, POST_CHANGE); + +out: + return ret; +} + /** * ufshcd_init_pwr_info - setting the POR (power on reset) * values in hba power info diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index b3dd08420100..9c69dd2f3672 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -262,6 +262,8 @@ struct ufs_pwr_mode_info { * @specify_nexus_t_xfer_req: * @specify_nexus_t_tm_req: called before command is issued to allow vendor * specific handling to be set for nexus type. + * @hibern8_notify: called before and after hibernate/unhibernate is carried out + * to allow vendor spesific implementation. * @suspend: called during host controller PM callback * @resume: called during host controller PM callback * @dbg_register_dump: used to dump controller debug information @@ -283,6 +285,7 @@ struct ufs_hba_variant_ops { enum ufs_notify_change_status status, struct ufs_pa_layer_attr *, struct ufs_pa_layer_attr *); + void (*hibern8_notify)(struct ufs_hba *, bool, bool); void (*specify_nexus_t_xfer_req)(struct ufs_hba *, int, struct scsi_cmnd *); void (*specify_nexus_t_tm_req)(struct ufs_hba *, int, u8); @@ -830,4 +833,11 @@ static inline void ufshcd_vops_specify_nexus_t_tm_req(struct ufs_hba *hba, if (hba->vops && hba->vops->specify_nexus_t_tm_req) hba->vops->specify_nexus_t_tm_req(hba, free_slot, tm_function); } + +static inline void ufshcd_vops_hibern8_notify(struct ufs_hba *hba, + bool en, enum ufs_notify_change_status status) +{ + if (hba->vops && hba->vops->hibern8_notify) + hba->vops->hibern8_notify(hba, en, status); +} #endif /* End of Header */ -- 1.7.10.4