Message ID | 20230403200530.2103099-1-abel.vesa@linaro.org |
---|---|
Headers | show |
Series | Add dedicated Qcom ICE driver | expand |
On Mon, Apr 03, 2023 at 11:05:29PM +0300, Abel Vesa wrote: > diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c > index 8ac81d57a3df..1a6e63b7af12 100644 > --- a/drivers/mmc/host/sdhci-msm.c > +++ b/drivers/mmc/host/sdhci-msm.c > @@ -19,6 +19,8 @@ > #include <linux/firmware/qcom/qcom_scm.h> > #include <linux/regulator/consumer.h> > #include <linux/interconnect.h> > #include <linux/pinctrl/consumer.h> > #include <linux/reset.h> > > +#include <soc/qcom/ice.h> The include of <linux/firmware/qcom/qcom_scm.h> should be removed. > static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host, > struct cqhci_host *cq_host) > { > struct mmc_host *mmc = msm_host->mmc; > struct device *dev = mmc_dev(mmc); > - struct resource *res; > > if (!(cqhci_readl(cq_host, CQHCI_CAP) & CQHCI_CAP_CS)) > return 0; > > - res = platform_get_resource_byname(msm_host->pdev, IORESOURCE_MEM, > - "ice"); > - if (!res) { > - dev_warn(dev, "ICE registers not found\n"); > - goto disable; > - } > - > - if (!qcom_scm_ice_available()) { > - dev_warn(dev, "ICE SCM interface not found\n"); > - goto disable; > + msm_host->ice = of_qcom_ice_get(dev); > + if (msm_host->ice == ERR_PTR(-EOPNOTSUPP)) { > + dev_warn(dev, "Disabling inline encryption support\n"); > + msm_host->ice = NULL; > } > > - msm_host->ice_mem = devm_ioremap_resource(dev, res); > - if (IS_ERR(msm_host->ice_mem)) > - return PTR_ERR(msm_host->ice_mem); > - > - if (!sdhci_msm_ice_supported(msm_host)) > - goto disable; > + if (IS_ERR(msm_host->ice)) > + return PTR_ERR(msm_host->ice); > > mmc->caps2 |= MMC_CAP2_CRYPTO; > - return 0; > > -disable: > - dev_warn(dev, "Disabling inline encryption support\n"); > return 0; > } This is sometimes setting MMC_CAP2_CRYPTO when ICE is unsupported. BTW, it would be better to set not msm_host->ice until it's known that it will have a valid value: ice = of_qcom_ice_get(dev); if (ice == ERR_PTR(-EOPNOTSUPP)) { dev_warn(dev, "Disabling inline encryption support\n"); return 0; } if (IS_ERR_OR_NULL(ice)) return PTR_ERR_OR_ZERO(ice); msm_host->ice = ice; mmc->caps2 |= MMC_CAP2_CRYPTO; return 0; - Eric
On Mon, Apr 03, 2023 at 11:05:27PM +0300, Abel Vesa wrote: > This takes the already existing duplicated support in both ufs-qcom > and sdhci-msm drivers and makes it a dedicated driver that can be used > by both mentioned drivers. The reason for this is because, staring with > SM8550, the ICE IP block is shared between UFS and SDCC, which means we > need to probe a dedicated device and share it between those two > consumers. So let's add the ICE dedicated driver as a soc driver. > Platforms that already have ICE supported, will use it as a library > as the of_qcom_ice_get will return an ICE instance created for the > consumer device. This allows the backwards compatibility with old-style > devicetree approach. Also, add support to HW version 4.x since it > works out-of-the-box with the current driver. The 4.x HW version is > found on SM8550 platform. Can you please split up long paragraphs like this into multiple paragraphs? > + pdev = of_find_device_by_node(node); > + if (!pdev) { > + dev_err(dev, "Cannot find device node %s\n", node->name); > + ice = ERR_PTR(-EPROBE_DEFER); > + goto out; > + } > + > + ice = platform_get_drvdata(pdev); > + if (!ice) { > + dev_err(dev, "Cannot get ice instance from %s\n", > + dev_name(&pdev->dev)); > + platform_device_put(pdev); > + ice = ERR_PTR(-EPROBE_DEFER); > + goto out; > + } > + > + ice->link = device_link_add(dev, &pdev->dev, DL_FLAG_AUTOREMOVE_SUPPLIER); > + if (!ice->link) { > + dev_err(&pdev->dev, > + "Failed to create device link to consumer %s\n", > + dev_name(dev)); > + ice = ERR_PTR(-EINVAL); > + } Is a call to platform_device_put() missing above? - Eric