Hi Simon

Some question/comment from me

about new flags "TMIO_MMC_HAS_UHS_SCC",
you added it on [1/3] patch with this comment
"Remove unused TMIO_MMC_HAS_UHS_SCC define"
but, [1/3] patch adds it, not removed ?

> +static void sh_mobile_sdhi_hw_reset(struct tmio_mmc_host *host)
> +{
> +     struct tmio_mmc_data *pdata = host->pdata;
> +
> +     if (pdata->flags & TMIO_MMC_HAS_UHS_SCC) {
> +             /* Reset SCC */
(snip)
> +     if (mmc_data->capabilities & MMC_CAP_UHS_SDR104) {
> +             mmc_data->capabilities |= MMC_CAP_HW_RESET;
> +             mmc_data->flags |= TMIO_MMC_HAS_UHS_SCC;
> +     }

And, how about this on sh_mobile_sdhi_hw_reset() ?
We can avoid to add new flags TMIO_MMC_HAS_UHS_SCC ?

static void sh_mobile_sdhi_hw_reset(struct tmio_mmc_host *host)
{
        ...

        if (pdata->capabilities & MMC_CAP_UHS_SDR104) {
                ...
        }


> +static inline void sd_scc_write32(struct tmio_mmc_host *host, int addr,
> +                               u32 val)
> +{
> +     struct platform_device *pdev = host->pdev;
> +     const struct of_device_id *of_id =
> +             of_match_device(sh_mobile_sdhi_of_match, &pdev->dev);
> +     const struct sh_mobile_sdhi_of_data *of_data = of_id->data;
> +
> +     writel(val, host->ctl + of_data->scc_offset +
> +            (addr << host->bus_shift));
> +}
(snip)
>  static const struct sh_mobile_sdhi_of_data of_rcar_gen2_compatible = {
>       .tmio_flags     = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE |
>                         TMIO_MMC_CLK_ACTUAL | TMIO_MMC_MIN_RCAR2,
>       .capabilities   = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
>       .dma_buswidth   = DMA_SLAVE_BUSWIDTH_4_BYTES,
>       .dma_rx_offset  = 0x2000,
> +     .scc_offset     = 0x0300,
> +     .taps           = rcar_gen2_scc_taps,
> +     .taps_num       = ARRAY_SIZE(rcar_gen2_scc_taps),
>  };
(snip)
> +     host->set_clk_div       = sh_mobile_sdhi_set_clk_div;
>       host->dma               = dma_priv;
>       host->write16_hook      = sh_mobile_sdhi_write16_hook;
>       host->clk_enable        = sh_mobile_sdhi_clk_enable;
> @@ -364,6 +596,12 @@ static int sh_mobile_sdhi_probe(struct platform_device 
> *pdev)
>       host->clk_disable       = sh_mobile_sdhi_clk_disable;
>       host->multi_io_quirk    = sh_mobile_sdhi_multi_io_quirk;
>       host->start_signal_voltage_switch = 
> sh_mobile_sdhi_start_signal_voltage_switch;
> +     host->inquiry_tuning    = sh_mobile_sdhi_inquiry_tuning;
> +     host->init_tuning       = sh_mobile_sdhi_init_tuning;
> +     host->prepare_tuning    = sh_mobile_sdhi_prepare_tuning;
> +     host->select_tuning     = sh_mobile_sdhi_select_tuning;
> +     host->retuning          = sh_mobile_sdhi_retuning;
> +     host->hw_reset          = sh_mobile_sdhi_hw_reset;

You registered new callback functions on this driver,
and it is using sd_scc_read/write function, and it is based on "scc_offset".
This driver is used from not only Gen2, but also Gen1/Gen3/SH-Mobile.
But you added .scc_offset only on of_rcar_gen2_compatible.
What's happen on Gen1/Gen3/SH-Mobile ?

> +static bool sh_mobile_sdhi_inquiry_tuning(struct tmio_mmc_host *host)
> +{
> +     /* SDHI should be tuning only SDR104 */
> +     if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104)
> +             return true;
> +     else
> +             return false;
> +}

How about this ?

        return (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104);

Reply via email to