All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joao Pinto <Joao.Pinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
To: Akinobu Mita
	<akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	Joao Pinto <Joao.Pinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
Cc: vinayak holikatti
	<vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
	julian.calaby-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
	Christoph Hellwig <hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
	Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
	Gilad Broner <gbroner-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
	Subhash Jadavani
	<subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
	CARLOS.PALMINHA-HKixBCOQz3hWk0Htik3J/w@public.gmane.org,
	Ian Campbell
	<ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org>,
	LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org"
	<linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	"open list:OPEN FIRMWARE AND..."
	<devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: Re: [PATCH 2/2] add support for DWC UFS Host Controller
Date: Wed, 10 Feb 2016 10:08:12 +0000	[thread overview]
Message-ID: <56BB0C0C.3000406@synopsys.com> (raw)
In-Reply-To: <CAC5umyhA+KQUA=U+EotY4FTGao9_qUBopNNeUswNj1Ed2eQHng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>


Hi Akinobu,

Thanks for the comments!
I will put the internal functions static and check your notify suggestion.
Do you know who the maintainer of UFS is?

Thanks,
Joao

On 2/9/2016 12:05 PM, Akinobu Mita wrote:
> Hi Joao,
> 
> 2016-02-09 4:07 GMT+09:00 Joao Pinto <Joao.Pinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>:
>> diff --git a/drivers/scsi/ufs/ufshcd-dwc.c b/drivers/scsi/ufs/ufshcd-dwc.c
>> new file mode 100644
>> index 0000000..b12b1a8
>> --- /dev/null
>> +++ b/drivers/scsi/ufs/ufshcd-dwc.c
>> @@ -0,0 +1,768 @@
>> +/*
>> + * UFS Host driver for Synopsys Designware Core
>> + *
>> + * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
>> + *
>> + * Authors: Joao Pinto <jpinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + */
>> +
>> +#include "ufshcd.h"
>> +#include "unipro.h"
>> +
>> +#include "ufshcd-dwc.h"
>> +#include "ufshci-dwc.h"
>> +
>> +/**
>> + * ufshcd_dwc_program_clk_div()
>> + * This function programs the clk divider value. This value is needed to
>> + * provide 1 microsecond tick to unipro layer.
>> + * @hba: Private Structure pointer
>> + * @divider_val: clock divider value to be programmed
>> + *
>> + */
>> +void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val)
>> +{
>> +       ufshcd_writel(hba, divider_val, DWC_UFS_REG_HCLKDIV);
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_program_clk_div);
>> +
>> +/**
>> + * ufshcd_dwc_link_is_up()
>> + * Check if link is up
>> + * @hba: private structure poitner
>> + *
>> + * Returns 0 on success, non-zero value on failure
>> + */
>> +int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
>> +{
>> +       int dme_result = 0;
>> +
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(VS_POWERSTATE), &dme_result);
>> +
>> +       if (dme_result == UFSHCD_LINK_IS_UP) {
>> +               ufshcd_set_link_active(hba);
>> +               return 0;
>> +       }
>> +
>> +       return 1;
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_link_is_up);
>> +
>> +/**
>> + * ufshcd_dwc_connection_setup()
>> + * This function configures both the local side (host) and the peer side
>> + * (device) unipro attributes to establish the connection to application/
>> + * cport.
>> + * This function is not required if the hardware is properly configured to
>> + * have this connection setup on reset. But invoking this function does no
>> + * harm and should be fine even working with any ufs device.
>> + *
>> + * @hba: pointer to drivers private data
>> + *
>> + * Returns 0 on success non-zero value on failure
>> + */
>> +int ufshcd_dwc_connection_setup(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Local side Configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(N_DEVICEID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(N_DEVICEID_VALID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERDEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERCPORTID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_TRAFFICCLASS), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTFLAGS), 0x6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTMODE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +
>> +       /* Peer side Configuration */
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(N_DEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(N_DEVICEID_VALID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_PEERDEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_PEERCPORTID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_TRAFFICCLASS), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CPORTFLAGS), 0x6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CPORTMODE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi_lane0()
>> + * This function configures Synopsys MPHY 20-bit RMMI Lane 0
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* TX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN0_TX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_TX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_RX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX 20-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN0_TX), 0x12);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX dither configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX 20-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN0_RX), 2);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 10 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL10), 0x04);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 19 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL19), 0x02);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN0_RX), 0x03);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGRXOVR8 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN0_RX), 0x16);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXDIRECTCTRL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN0_RX), 0x42);
>> +
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG3 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN0_RX), 0xa4);
>> +
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXCALCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN0_RX), 0x28);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXSQCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN0_RX), 0x1E);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR6 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN0_RX), 0x2f);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CBPRGPLL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGPLL2), 0x00);
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi_lane1()
>> + * This function configures Synopsys MPHY 20-bit RMMI Lane 1
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
>> +{
>> +       int connected_rx_lanes = 0;
>> +       int connected_tx_lanes = 0;
>> +       int ret = 0;
>> +
>> +       /* Get the available lane count */
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
>> +                       &connected_rx_lanes);
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
>> +                       &connected_tx_lanes);
>> +
>> +       if (connected_tx_lanes == 2) {
>> +
>> +               /* TX Reference Clock 26MHz */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN1_TX), 0x0d);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX Configuration Clock Frequency Val; Divider setting */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN1_TX), 0x19);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX 20-bit RMMI Interface */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN1_TX), 0x12);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX dither configuration */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +               if (ret)
>> +                       goto out;
>> +       }
>> +
>> +       if (connected_rx_lanes == 2) {
>> +
>> +               /* RX Reference Clock 26MHz */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX Configuration Clock Frequency Val; Divider setting */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN1_RX), 0x19);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX 20-bit RMMI Interface */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN1_RX), 2);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX Squelch Detector output is routed to RX hibern8 exit
>> +                * signal
>> +                */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN1_RX), 0x80);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG4 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN1_RX), 0x03);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGRXOVR8 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN1_RX), 0x16);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXDIRECTCTRL2 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN1_RX), 0x42);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG3 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN1_RX), 0xa4);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXCALCTRL */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG2 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGOVR4 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN1_RX), 0x28);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXSQCTRL */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN1_RX), 0x1E);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGOVR6 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN1_RX), 0x2f);
>> +               if (ret)
>> +                       goto out;
>> +       }
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi()
>> + * This function configures Synopsys MPHY specific atributes (20-bit RMMI)
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Common block Tx Global Hibernate Exit */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Reference Clock Mode 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(REFCLKMODE), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block DCO Target Frequency MAX PWM G1:9Mpbs */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CDIRECTCTRL6), 0xc0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block TX and RX Div Factor is 4 7Mbps/20 = 350KHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDIVFACTOR), 0x44);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block DC0 Ctrl 5*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDCOCTRL5), 0x64);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Program Tunning*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGTUNING), 0x09);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Real Time Observe Select - for debugging */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(RTOBSERVESELECT), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 0 configuration*/
>> +       ret = ufshcd_dwc_setup_20bit_rmmi_lane0(hba);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 1 configuration*/
>> +       ret = ufshcd_dwc_setup_20bit_rmmi_lane1(hba);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_40bit_rmmi()
>> + * This function configures Synopsys MPHY specific atributes (40-bit RMMI)
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_40bit_rmmi(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Common block Tx Global Hibernate Exit */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Reference Clock Mode 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(REFCLKMODE), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block DCO Target Frequency MAX PWM G1:7Mpbs */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CDIRECTCTRL6), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block TX and RX Div Factor is 4 7Mbps/40 = 175KHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDIVFACTOR), 0x08);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block DC0 Ctrl 5*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDCOCTRL5), 0x64);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Program Tunning*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGTUNING), 0x09);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Real Time Observe Select - for debugging */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(RTOBSERVESELECT), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 0 configuration*/
>> +
>> +       /* TX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN0_TX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_TX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX 40-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN0_TX), 0x14);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX dither configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_RX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX 40-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN0_RX), 4);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 10 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL10), 0x04);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 19 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL19), 0x02);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN0_RX), 0x03);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGRXOVR8 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN0_RX), 0x16);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXDIRECTCTRL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN0_RX), 0x42);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG3 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN0_RX), 0xa4);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXCALCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN0_RX), 0x28);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXSQCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN0_RX), 0x1E);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR6 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN0_RX), 0x2f);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CBPRGPLL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGPLL2), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_mphy()
>> + * This function configures Local (host) Synopsys MPHY specific attributes
>> + *
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_mphy(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +#ifdef CONFIG_SCSI_UFS_DWC_40BIT_RMMI
>> +       dev_info(hba->dev, "Configuring MPHY 40-bit RMMI");
>> +       ret = ufshcd_dwc_setup_40bit_rmmi(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "40-bit RMMI configuration failed");
>> +               goto out;
>> +       }
>> +#else
>> +#ifdef CONFIG_SCSI_UFS_DWC_20BIT_RMMI
>> +       dev_info(hba->dev, "Configuring MPHY 20-bit RMMI");
>> +       ret = ufshcd_dwc_setup_20bit_rmmi(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "20-bit RMMI configuration failed");
>> +               goto out;
>> +       }
>> +#endif
>> +#endif
>> +       /* To write Shadow register bank to effective configuration block */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* To configure Debug OMC */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
>> +
>> +out:
>> +       return ret;
>> +}
> 
> These functions are only used in this file.
> 
> ufshcd_dwc_program_clk_div
> ufshcd_dwc_link_is_up
> ufshcd_dwc_connection_setup
> ufshcd_dwc_setup_20bit_rmmi_lane0
> ufshcd_dwc_setup_20bit_rmmi_lane1
> ufshcd_dwc_setup_20bit_rmmi
> ufshcd_dwc_setup_40bit_rmmi
> ufshcd_dwc_setup_mphy
> 
> So you can make them static functions.
> 
>> +/**
>> + * ufshcd_dwc_configuration()
>> + * UFS Host DWC specific configuration
>> + * @hba: private structure poitner
>> + *
>> + * Returns 0 on success, non-zero value on failure
>> + */
>> +int ufshcd_dwc_configuration(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Program Clock Divider Value */
>> +       ufshcd_dwc_program_clk_div(hba, UFSHCD_CLK_DIV_125);
>> +
>> +#ifdef CONFIG_SCSI_UFS_DWC_MPHY_TC
>> +       ret = ufshcd_dwc_setup_mphy(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "MPHY configuration failed (%d)", ret);
>> +               goto out;
>> +       }
>> +#endif
>> +       ret = ufshcd_dme_link_startup(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Link Startup command failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_dwc_link_is_up(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Link is not up");
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_dwc_connection_setup(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Connection setup failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_make_hba_operational(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "HBA kick start failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_verify_dev_init(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Device init failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_complete_dev_init(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Device final init failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ufshcd_set_ufs_dev_active(hba);
>> +       hba->wlun_dev_clr_ua = false;
>> +
>> +       if (hba->ufshcd_state == UFSHCD_STATE_RESET)
>> +               scsi_unblock_requests(hba->host);
>> +
>> +       hba->ufshcd_state = UFSHCD_STATE_OPERATIONAL;
>> +
>> +       scsi_scan_host(hba->host);
>> +
>> +out:
>> +       return ret;
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_configuration);
> 
> Do you really need this alternative initialization by
> adding new custom_probe_hba() in vops?  I think you only need to write
> link_startup_notify() callback for ufs_dwc_hba_vops like below.
> 
> ufshcd_dwc_link_startup_notify(struct ufs_hba *hba,
>                                 enum ufs_notify_change_status status)
> {
>         if (status == PRE_CHANGE) {
>                 ufshcd_dwc_program_clk_div();
>                 ufshcd_dwc_setup_mphy();
>         } else { /* POST_CHANGE */
>                 err = ufshcd_dwc_link_is_up(hba);
>                 if (err)
>                         return err;
>                 ufshcd_dwc_connection_setup();
>         }
> }
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: Joao Pinto <Joao.Pinto@synopsys.com>
To: Akinobu Mita <akinobu.mita@gmail.com>,
	Joao Pinto <Joao.Pinto@synopsys.com>
Cc: vinayak holikatti <vinholikatti@gmail.com>,
	<julian.calaby@gmail.com>, Christoph Hellwig <hch@infradead.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Gilad Broner <gbroner@codeaurora.org>,
	Subhash Jadavani <subhashj@codeaurora.org>,
	<CARLOS.PALMINHA@synopsys.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	LKML <linux-kernel@vger.kernel.org>,
	"linux-scsi@vger.kernel.org" <linux-scsi@vger.kernel.org>,
	"open list:OPEN FIRMWARE AND..." <devicetree@vger.kernel.org>
Subject: Re: [PATCH 2/2] add support for DWC UFS Host Controller
Date: Wed, 10 Feb 2016 10:08:12 +0000	[thread overview]
Message-ID: <56BB0C0C.3000406@synopsys.com> (raw)
In-Reply-To: <CAC5umyhA+KQUA=U+EotY4FTGao9_qUBopNNeUswNj1Ed2eQHng@mail.gmail.com>


Hi Akinobu,

Thanks for the comments!
I will put the internal functions static and check your notify suggestion.
Do you know who the maintainer of UFS is?

Thanks,
Joao

On 2/9/2016 12:05 PM, Akinobu Mita wrote:
> Hi Joao,
> 
> 2016-02-09 4:07 GMT+09:00 Joao Pinto <Joao.Pinto@synopsys.com>:
>> diff --git a/drivers/scsi/ufs/ufshcd-dwc.c b/drivers/scsi/ufs/ufshcd-dwc.c
>> new file mode 100644
>> index 0000000..b12b1a8
>> --- /dev/null
>> +++ b/drivers/scsi/ufs/ufshcd-dwc.c
>> @@ -0,0 +1,768 @@
>> +/*
>> + * UFS Host driver for Synopsys Designware Core
>> + *
>> + * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
>> + *
>> + * Authors: Joao Pinto <jpinto@synopsys.com>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License version 2 as
>> + * published by the Free Software Foundation.
>> + */
>> +
>> +#include "ufshcd.h"
>> +#include "unipro.h"
>> +
>> +#include "ufshcd-dwc.h"
>> +#include "ufshci-dwc.h"
>> +
>> +/**
>> + * ufshcd_dwc_program_clk_div()
>> + * This function programs the clk divider value. This value is needed to
>> + * provide 1 microsecond tick to unipro layer.
>> + * @hba: Private Structure pointer
>> + * @divider_val: clock divider value to be programmed
>> + *
>> + */
>> +void ufshcd_dwc_program_clk_div(struct ufs_hba *hba, u32 divider_val)
>> +{
>> +       ufshcd_writel(hba, divider_val, DWC_UFS_REG_HCLKDIV);
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_program_clk_div);
>> +
>> +/**
>> + * ufshcd_dwc_link_is_up()
>> + * Check if link is up
>> + * @hba: private structure poitner
>> + *
>> + * Returns 0 on success, non-zero value on failure
>> + */
>> +int ufshcd_dwc_link_is_up(struct ufs_hba *hba)
>> +{
>> +       int dme_result = 0;
>> +
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(VS_POWERSTATE), &dme_result);
>> +
>> +       if (dme_result == UFSHCD_LINK_IS_UP) {
>> +               ufshcd_set_link_active(hba);
>> +               return 0;
>> +       }
>> +
>> +       return 1;
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_link_is_up);
>> +
>> +/**
>> + * ufshcd_dwc_connection_setup()
>> + * This function configures both the local side (host) and the peer side
>> + * (device) unipro attributes to establish the connection to application/
>> + * cport.
>> + * This function is not required if the hardware is properly configured to
>> + * have this connection setup on reset. But invoking this function does no
>> + * harm and should be fine even working with any ufs device.
>> + *
>> + * @hba: pointer to drivers private data
>> + *
>> + * Returns 0 on success non-zero value on failure
>> + */
>> +int ufshcd_dwc_connection_setup(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Local side Configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(N_DEVICEID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(N_DEVICEID_VALID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERDEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_PEERCPORTID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_TRAFFICCLASS), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTFLAGS), 0x6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CPORTMODE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +
>> +       /* Peer side Configuration */
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(N_DEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(N_DEVICEID_VALID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_PEERDEVICEID), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_PEERCPORTID), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_TRAFFICCLASS), 0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CPORTFLAGS), 0x6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CPORTMODE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +       ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(T_CONNECTIONSTATE), 1);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi_lane0()
>> + * This function configures Synopsys MPHY 20-bit RMMI Lane 0
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi_lane0(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* TX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN0_TX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_TX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_RX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX 20-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN0_TX), 0x12);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX dither configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX 20-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN0_RX), 2);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 10 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL10), 0x04);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 19 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL19), 0x02);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN0_RX), 0x03);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGRXOVR8 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN0_RX), 0x16);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXDIRECTCTRL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN0_RX), 0x42);
>> +
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG3 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN0_RX), 0xa4);
>> +
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXCALCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN0_RX), 0x28);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXSQCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN0_RX), 0x1E);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR6 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN0_RX), 0x2f);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CBPRGPLL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGPLL2), 0x00);
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi_lane1()
>> + * This function configures Synopsys MPHY 20-bit RMMI Lane 1
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi_lane1(struct ufs_hba *hba)
>> +{
>> +       int connected_rx_lanes = 0;
>> +       int connected_tx_lanes = 0;
>> +       int ret = 0;
>> +
>> +       /* Get the available lane count */
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDRXDATALANES),
>> +                       &connected_rx_lanes);
>> +       ufshcd_dme_get(hba, UIC_ARG_MIB(PA_CONNECTEDTXDATALANES),
>> +                       &connected_tx_lanes);
>> +
>> +       if (connected_tx_lanes == 2) {
>> +
>> +               /* TX Reference Clock 26MHz */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN1_TX), 0x0d);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX Configuration Clock Frequency Val; Divider setting */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN1_TX), 0x19);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX 20-bit RMMI Interface */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN1_TX), 0x12);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* TX dither configuration */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +               if (ret)
>> +                       goto out;
>> +       }
>> +
>> +       if (connected_rx_lanes == 2) {
>> +
>> +               /* RX Reference Clock 26MHz */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX Configuration Clock Frequency Val; Divider setting */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN1_RX), 0x19);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX 20-bit RMMI Interface */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN1_RX), 2);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RX Squelch Detector output is routed to RX hibern8 exit
>> +                * signal
>> +                */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN1_RX), 0x80);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG4 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN1_RX), 0x03);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGRXOVR8 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN1_RX), 0x16);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXDIRECTCTRL2 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN1_RX), 0x42);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG3 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN1_RX), 0xa4);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXCALCTRL */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* ENARXDIRECTCFG2 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN1_RX), 0x01);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGOVR4 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN1_RX), 0x28);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* RXSQCTRL */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN1_RX), 0x1E);
>> +               if (ret)
>> +                       goto out;
>> +
>> +               /* CFGOVR6 */
>> +               ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN1_RX), 0x2f);
>> +               if (ret)
>> +                       goto out;
>> +       }
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_20bit_rmmi()
>> + * This function configures Synopsys MPHY specific atributes (20-bit RMMI)
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_20bit_rmmi(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Common block Tx Global Hibernate Exit */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Reference Clock Mode 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(REFCLKMODE), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block DCO Target Frequency MAX PWM G1:9Mpbs */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CDIRECTCTRL6), 0xc0);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block TX and RX Div Factor is 4 7Mbps/20 = 350KHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDIVFACTOR), 0x44);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block DC0 Ctrl 5*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDCOCTRL5), 0x64);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Program Tunning*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGTUNING), 0x09);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Real Time Observe Select - for debugging */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(RTOBSERVESELECT), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 0 configuration*/
>> +       ret = ufshcd_dwc_setup_20bit_rmmi_lane0(hba);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 1 configuration*/
>> +       ret = ufshcd_dwc_setup_20bit_rmmi_lane1(hba);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_40bit_rmmi()
>> + * This function configures Synopsys MPHY specific atributes (40-bit RMMI)
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success or non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_40bit_rmmi(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Common block Tx Global Hibernate Exit */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(TX_GLOBALHIBERNATE), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Reference Clock Mode 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(REFCLKMODE), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block DCO Target Frequency MAX PWM G1:7Mpbs */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CDIRECTCTRL6), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block TX and RX Div Factor is 4 7Mbps/40 = 175KHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDIVFACTOR), 0x08);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block DC0 Ctrl 5*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBDCOCTRL5), 0x64);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Program Tunning*/
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGTUNING), 0x09);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common Block Real Time Observe Select - for debugging */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(RTOBSERVESELECT), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Lane 0 configuration*/
>> +
>> +       /* TX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_REFCLKFREQ,
>> +                                                       SELIND_LN0_TX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(TX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_TX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX 40-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGEXTRATTR,
>> +                                                       SELIND_LN0_TX), 0x14);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* TX dither configuration */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(DITHERCTRL2,
>> +                                                       SELIND_LN0_TX), 0xd6);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Reference Clock 26MHz */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_REFCLKFREQ,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Configuration Clock Frequency Val; Divider setting */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RX_CFGCLKFREQVAL,
>> +                                                       SELIND_LN0_RX), 0x19);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX 40-bit RMMI Interface */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGWIDEINLN,
>> +                                                       SELIND_LN0_RX), 4);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 10 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL10), 0x04);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* Common block Direct Control 19 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(DIRECTCTRL19), 0x02);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RX Squelch Detector output is routed to RX hibern8 exit signal */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXCDR8,
>> +                                                       SELIND_LN0_RX), 0x80);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG4,
>> +                                                       SELIND_LN0_RX), 0x03);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGRXOVR8 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR8,
>> +                                                       SELIND_LN0_RX), 0x16);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXDIRECTCTRL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXDIRECTCTRL2,
>> +                                                       SELIND_LN0_RX), 0x42);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG3 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG3,
>> +                                                       SELIND_LN0_RX), 0xa4);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXCALCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXCALCTRL,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* ENARXDIRECTCFG2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(ENARXDIRECTCFG2,
>> +                                                       SELIND_LN0_RX), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR4 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR4,
>> +                                                       SELIND_LN0_RX), 0x28);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* RXSQCTRL */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(RXSQCTRL,
>> +                                                       SELIND_LN0_RX), 0x1E);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CFGOVR6 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB_SEL(CFGRXOVR6,
>> +                                                       SELIND_LN0_RX), 0x2f);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* CBPRGPLL2 */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(CBPRGPLL2), 0x00);
>> +       if (ret)
>> +               goto out;
>> +
>> +out:
>> +       return ret;
>> +}
>> +
>> +/**
>> + * ufshcd_dwc_setup_mphy()
>> + * This function configures Local (host) Synopsys MPHY specific attributes
>> + *
>> + * @hba: Pointer to drivers structure
>> + *
>> + * Returns 0 on success non-zero value on failure
>> + */
>> +int ufshcd_dwc_setup_mphy(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +#ifdef CONFIG_SCSI_UFS_DWC_40BIT_RMMI
>> +       dev_info(hba->dev, "Configuring MPHY 40-bit RMMI");
>> +       ret = ufshcd_dwc_setup_40bit_rmmi(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "40-bit RMMI configuration failed");
>> +               goto out;
>> +       }
>> +#else
>> +#ifdef CONFIG_SCSI_UFS_DWC_20BIT_RMMI
>> +       dev_info(hba->dev, "Configuring MPHY 20-bit RMMI");
>> +       ret = ufshcd_dwc_setup_20bit_rmmi(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "20-bit RMMI configuration failed");
>> +               goto out;
>> +       }
>> +#endif
>> +#endif
>> +       /* To write Shadow register bank to effective configuration block */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_MPHYCFGUPDT), 0x01);
>> +       if (ret)
>> +               goto out;
>> +
>> +       /* To configure Debug OMC */
>> +       ret = ufshcd_dme_set(hba, UIC_ARG_MIB(VS_DEBUGOMC), 0x01);
>> +
>> +out:
>> +       return ret;
>> +}
> 
> These functions are only used in this file.
> 
> ufshcd_dwc_program_clk_div
> ufshcd_dwc_link_is_up
> ufshcd_dwc_connection_setup
> ufshcd_dwc_setup_20bit_rmmi_lane0
> ufshcd_dwc_setup_20bit_rmmi_lane1
> ufshcd_dwc_setup_20bit_rmmi
> ufshcd_dwc_setup_40bit_rmmi
> ufshcd_dwc_setup_mphy
> 
> So you can make them static functions.
> 
>> +/**
>> + * ufshcd_dwc_configuration()
>> + * UFS Host DWC specific configuration
>> + * @hba: private structure poitner
>> + *
>> + * Returns 0 on success, non-zero value on failure
>> + */
>> +int ufshcd_dwc_configuration(struct ufs_hba *hba)
>> +{
>> +       int ret = 0;
>> +
>> +       /* Program Clock Divider Value */
>> +       ufshcd_dwc_program_clk_div(hba, UFSHCD_CLK_DIV_125);
>> +
>> +#ifdef CONFIG_SCSI_UFS_DWC_MPHY_TC
>> +       ret = ufshcd_dwc_setup_mphy(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "MPHY configuration failed (%d)", ret);
>> +               goto out;
>> +       }
>> +#endif
>> +       ret = ufshcd_dme_link_startup(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Link Startup command failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_dwc_link_is_up(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Link is not up");
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_dwc_connection_setup(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Connection setup failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_make_hba_operational(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "HBA kick start failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_verify_dev_init(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Device init failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ret = ufshcd_complete_dev_init(hba);
>> +       if (ret) {
>> +               dev_err(hba->dev, "Device final init failed (%d)", ret);
>> +               goto out;
>> +       }
>> +
>> +       ufshcd_set_ufs_dev_active(hba);
>> +       hba->wlun_dev_clr_ua = false;
>> +
>> +       if (hba->ufshcd_state == UFSHCD_STATE_RESET)
>> +               scsi_unblock_requests(hba->host);
>> +
>> +       hba->ufshcd_state = UFSHCD_STATE_OPERATIONAL;
>> +
>> +       scsi_scan_host(hba->host);
>> +
>> +out:
>> +       return ret;
>> +}
>> +EXPORT_SYMBOL(ufshcd_dwc_configuration);
> 
> Do you really need this alternative initialization by
> adding new custom_probe_hba() in vops?  I think you only need to write
> link_startup_notify() callback for ufs_dwc_hba_vops like below.
> 
> ufshcd_dwc_link_startup_notify(struct ufs_hba *hba,
>                                 enum ufs_notify_change_status status)
> {
>         if (status == PRE_CHANGE) {
>                 ufshcd_dwc_program_clk_div();
>                 ufshcd_dwc_setup_mphy();
>         } else { /* POST_CHANGE */
>                 err = ufshcd_dwc_link_is_up(hba);
>                 if (err)
>                         return err;
>                 ufshcd_dwc_connection_setup();
>         }
> }
> 

  parent reply	other threads:[~2016-02-10 10:08 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-08 19:07 [PATCH v4 0/2] add support for DWC UFS Controller Joao Pinto
2016-02-08 19:07 ` [PATCH v4 1/2] fixed typo in ufshcd-pltfrm Joao Pinto
2016-02-08 19:07 ` [PATCH v4 2/2] add support for DWC UFS Host Controller Joao Pinto
     [not found]   ` <a84bdc440a45995ace888213468c55a36513a9cb.1454957580.git.jpinto-HKixBCOQz3hWk0Htik3J/w@public.gmane.org>
2016-02-09 12:05     ` [PATCH " Akinobu Mita
2016-02-09 12:05       ` Akinobu Mita
     [not found]       ` <CAC5umyhA+KQUA=U+EotY4FTGao9_qUBopNNeUswNj1Ed2eQHng-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-02-10 10:08         ` Joao Pinto [this message]
2016-02-10 10:08           ` Joao Pinto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56BB0C0C.3000406@synopsys.com \
    --to=joao.pinto-hkixbcoqz3hwk0htik3j/w@public.gmane.org \
    --cc=CARLOS.PALMINHA-HKixBCOQz3hWk0Htik3J/w@public.gmane.org \
    --cc=akinobu.mita-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=gbroner-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=hch-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
    --cc=ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg@public.gmane.org \
    --cc=julian.calaby-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-scsi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=mark.rutland-5wv7dgnIgG8@public.gmane.org \
    --cc=subhashj-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
    --cc=vinholikatti-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.