Hi,

-----Original Message-----
From: Michal Simek <michal.si...@xilinx.com> 
Sent: Tuesday, September 22, 2020 3:00 PM
To: Zulkifli, Muhammad Husaini <muhammad.husaini.zulki...@intel.com>; Michal 
Simek <michal.si...@xilinx.com>; Hunter, Adrian <adrian.hun...@intel.com>; 
ulf.hans...@linaro.org; linux-...@vger.kernel.org; 
linux-arm-ker...@lists.infradead.org; linux-kernel@vger.kernel.org; Arnd 
Bergmann <a...@arndb.de>
Cc: Raja Subramanian, Lakshmi Bai <lakshmi.bai.raja.subraman...@intel.com>; Wan 
Mohamad, Wan Ahmad Zainie <wan.ahmad.zainie.wan.moha...@intel.com>
Subject: Re: [PATCH v1 1/1] mmc: sdhci-of-arasan: Enable UHS-1 support for Keem 
Bay SOC

Hi,

On 22. 09. 20 2:47, Zulkifli, Muhammad Husaini wrote:
> 
> -----Original Message-----
> From: Michal Simek <michal.si...@xilinx.com>
> Sent: Monday, September 14, 2020 9:40 PM
> To: Zulkifli, Muhammad Husaini <muhammad.husaini.zulki...@intel.com>; 
> Michal Simek <michal.si...@xilinx.com>; Hunter, Adrian 
> <adrian.hun...@intel.com>; ulf.hans...@linaro.org; 
> linux-...@vger.kernel.org; linux-arm-ker...@lists.infradead.org; 
> linux-kernel@vger.kernel.org; Arnd Bergmann <a...@arndb.de>
> Cc: Raja Subramanian, Lakshmi Bai 
> <lakshmi.bai.raja.subraman...@intel.com>; Wan Mohamad, Wan Ahmad 
> Zainie <wan.ahmad.zainie.wan.moha...@intel.com>
> Subject: Re: [PATCH v1 1/1] mmc: sdhci-of-arasan: Enable UHS-1 support 
> for Keem Bay SOC
> 
> Hi,
> 
> On 14. 09. 20 15:26, Zulkifli, Muhammad Husaini wrote:
>> HI Michal,
>>
>> Thanks for the comments.
>> I replied inline
>>
>> -----Original Message-----
>> From: Michal Simek <michal.si...@xilinx.com>
>> Sent: Monday, September 14, 2020 2:46 PM
>> To: Zulkifli, Muhammad Husaini <muhammad.husaini.zulki...@intel.com>;
>> Hunter, Adrian <adrian.hun...@intel.com>; michal.si...@xilinx.com; 
>> ulf.hans...@linaro.org; linux-...@vger.kernel.org; 
>> linux-arm-ker...@lists.infradead.org; linux-kernel@vger.kernel.org; 
>> Arnd Bergmann <a...@arndb.de>
>> Cc: Raja Subramanian, Lakshmi Bai
>> <lakshmi.bai.raja.subraman...@intel.com>
>> Subject: Re: [PATCH v1 1/1] mmc: sdhci-of-arasan: Enable UHS-1 
>> support for Keem Bay SOC
>>
>> Hi, +Arnd,
>>
>> On 14. 09. 20 7:12, muhammad.husaini.zulki...@intel.com wrote:
>>> From: Muhammad Husaini Zulkifli 
>>> <muhammad.husaini.zulki...@intel.com>
>>>
>>> Voltage switching sequence is needed to support UHS-1 interface as 
>>> Keem Bay EVM is using external voltage regulator to switch between 
>>> 1.8V and 3.3V.
>>>
>>> Signed-off-by: Muhammad Husaini Zulkifli 
>>> <muhammad.husaini.zulki...@intel.com>
>>> Reviewed-by: Andy Shevchenko <andriy.shevche...@intel.com>
>>> Reviewed-by: Adrian Hunter <adrian.hun...@intel.com>
>>> ---
>>>  drivers/mmc/host/sdhci-of-arasan.c | 140
>>> +++++++++++++++++++++++++++++
>>>  1 file changed, 140 insertions(+)
>>>
>>> diff --git a/drivers/mmc/host/sdhci-of-arasan.c
>>> b/drivers/mmc/host/sdhci-of-arasan.c
>>> index f186fbd016b1..c133408d0c74 100644
>>> --- a/drivers/mmc/host/sdhci-of-arasan.c
>>> +++ b/drivers/mmc/host/sdhci-of-arasan.c
>>> @@ -16,7 +16,9 @@
>>>   */
>>>  
>>>  #include <linux/clk-provider.h>
>>> +#include <linux/gpio/consumer.h>
>>>  #include <linux/mfd/syscon.h>
>>> +#include <linux/arm-smccc.h>
>>>  #include <linux/module.h>
>>>  #include <linux/of_device.h>
>>>  #include <linux/phy/phy.h>
>>> @@ -41,6 +43,11 @@
>>>  #define SDHCI_ITAPDLY_ENABLE               0x100
>>>  #define SDHCI_OTAPDLY_ENABLE               0x40
>>>  
>>> +/* Setting for Keem Bay IO Pad 1.8 Voltage Selection */
>>> +#define KEEMBAY_AON_SIP_FUNC_ID            0x8200ff26
>>> +#define KEEMBAY_AON_SET_1V8_VOLT   0x01
>>> +#define KEEMBAY_AON_SET_3V3_VOLT   0x00
>>> +
>>>  /* Default settings for ZynqMP Clock Phases */
>>>  #define ZYNQMP_ICLK_PHASE {0, 63, 63, 0, 63,  0,   0, 183, 54,  0, 0}
>>>  #define ZYNQMP_OCLK_PHASE {0, 72, 60, 0, 60, 72, 135, 48, 72, 135, 
>>> 0} @@ -150,6 +157,7 @@ struct sdhci_arasan_data {
>>>     struct regmap   *soc_ctl_base;
>>>     const struct sdhci_arasan_soc_ctl_map *soc_ctl_map;
>>>     unsigned int    quirks;
>>> +   struct gpio_desc *uhs_gpio;
>>>  
>>>  /* Controller does not have CD wired and will not function normally 
>>> without */
>>>  #define SDHCI_ARASAN_QUIRK_FORCE_CDTEST    BIT(0)
>>> @@ -361,6 +369,121 @@ static int sdhci_arasan_voltage_switch(struct 
>>> mmc_host *mmc,
>>>     return -EINVAL;
>>>  }
>>>  
>>> +static int sdhci_arasan_keembay_set_voltage(int volt) { #if
>>> +IS_ENABLED(CONFIG_HAVE_ARM_SMCCC)
>>> +   struct arm_smccc_res res;
>>> +
>>> +   arm_smccc_smc(KEEMBAY_AON_SIP_FUNC_ID, volt, 0, 0, 0, 0, 0, 0, &res);
>>> +   if (res.a0)
>>> +           return -EINVAL;
>>> +   return 0;
>>
>> I am just curious about calling this smc directly from device driver. I see 
>> that several drivers are doing this but isn't it better to hide these in 
>> firmware driver?
>> [Husaini] In order to change the voltage selection for IO Pads voltage 
>> switching level control, I need to access/write to AON register. 
>> Due to security concern, U-Boot Team provided an interface using this SIP 
>> Service for me to call during kernel driver voltage switching operation. 
> 
> I expect U-Boot team is any internal team not U-Boot upstream folks.
> [Husaini] I requote my statement. It is ATF that provided the services. They 
> are in the process of upstreaming the code as well. 
> That is a great idea to hide these in firmware driver.
> I created one firmware driver under /drivers/firmware. This firmware driver 
> provide an api for device driver to call for the operations.
> 
> 
>> Also the part of FUNC_ID is smc32, sip service call (0x82000000) function 
>> identifier which is likely something what should be used as macro in shared 
>> location that others can use it too.
>> [Husaini] The only thing provided was the FUNC_ID value and argument.
>>
>> Another part is that based on description you are talking to external 
>> voltage regulator without using regulator framework at all. Isn't it better 
>> just to create firmware based regulator for this purpose?
>> [Husaini] This is for Keembay specific and we did not use regulator 
>> framework. 
>> During the voltage switching, this SIP function need to be executed to 
>> change the Keem Bay IO Pad Switching Level Control to 1.8V for UHS or 3.3v 
>> for default mode.
>> To be specific, below line of code must come together during the voltage 
>> switching operation.
>>
>> For 1.8V
>> +            /* Set VDDIO_B voltage to Low for 1.8V */
>> +            gpiod_set_value_cansleep(sdhci_arasan->uhs_gpio, 0);
>> +
>> +            ret = 
>> sdhci_arasan_keembay_set_voltage(KEEMBAY_AON_SET_1V8_VOLT);
>> +            if (ret)
>> +                    return ret;
>>
>> For 3.3V
>>              /* Set VDDIO_B voltage to High for 3.3V */
>> +            gpiod_set_value_cansleep(sdhci_arasan->uhs_gpio, 1);
>> +
>> +            ret = 
>> sdhci_arasan_keembay_set_voltage(KEEMBAY_AON_SET_3V3_VOLT);
>> +            if (ret)
>> +                    return ret;
> 
> 
> I understand that you need to change voltage here but I don't think the code 
> you have written is how this should be done. I understand that this is the 
> quickest and direct way how to do it but I don't think this is done via 
> proper interface. I pretty much dislike that you are putting Func IDs to 
> drivers instead of adding them to central place that it is visible what your 
> platform needs.
> [Husaini] let me rephase my sentences . I make some confusion here and in 
> commit message. To summarize there are 2 places to final generate the IO 
> Voltage.
> 
> 1) Setting the V_VDDIO_B . AON Register for IO PADS Voltage Switching Level 
> Control.
> This register defines the IO Voltage for particular GPIOs pin for 
> clk,cmd,data1-2.
> 
> 2) Setting the GPIO expander pin value to drive either 1.8V or 3.3V.
> SD card IO can operate at 3.3V (default) or 1.8V. 
> Keem Bay has a bank of IO that can be switched between 3.3V or 1.8V for this 
> reason.
> The output V_VDDIO_B_MAIN be either 3.3v (in) or 1.8v(in), depending on the 
> state of GPIO expander PIN value. 
> 
> The final IO voltage is set by V_VDDIO_B (= V_VDDIO_B_MAIN after passing 
> through voltage sense resistor).
> I will use the gpio consumer interface to specify a direction and value for 
> the gpio expander pin.
> Is this OK with these 2 implementation?

Ok. This more sounds like changing IO state which targets pin control driver. 
Take a look at sdhci-tegra.c and trace pinctrl_state_3v3 and
pinctrl_state_1v8 and pinctrl_select_state and corresponding DT binding.

IMHO you should create pin control driver which will call firmware driver to 
change voltage.
[Husaini] Thank you for suggesting that. Is it Ok to move with current 
implementation first without the pinctrl driver.
That one consider another next implementation.

If ok, I will send out the next patch version.

Thanks

Thanks,
Michal

Reply via email to