Qualcomm ARM Based Driver Updates for v4.10 - Part 2
* Fixup QCOM SCM to support MSM8996 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYNcx2AAoJEFKiBbHx2RXVnLAP/RgEunECmYqMfjJhWE/4o24p 4Yktz9ACNEjAQ/e71t9guyoFjiyHwEXYnrSrCiNFHfFRYQNJKV3du94umEggIQ0p inL3gDR2JdyCqPqDPSHEsbHrM+q/eY6im2DBO52cI3WifvbMomKSTsE3Nj9VnZm4 ZTusDjHML8rns2yxZJ9d86Go5FanmXNXxGH2XS8dtToVxE7+NLDuEfJEbS528Qil ddMVTQo8pO/LkEU14z5yyplQh0VaYKxFADq8srM47cksXdmB5T5rwdwAApZuyGOt a6vSNAsYDTEKAyNtUnGqvrOSUJFlALbLR09edklK6wQW0+irYvzGNFITBnnM0sZf bm9UxcVl2OLlH6oC4mvMfTdgVWM0191afD7y+HWY/RpS5cn0fFF1WzAI+u3z1VYP SUbtIc5v6HniJ5GAb4JCka9kLvZfLVImJC6wHu9nWZOFwTYg0UvZ1V84T1JT3Fda TnDBMwJ7dVeaIjdYVAxbIrXI0ZkiqZMky/3rAc/vbPR4+aKrsfVYTrzHSFqOnHve TeVf1MJzoGxf3qXXySGfVBY10l+1XfIUDFDjCPE64sOQx8SWVD7lxOfUS+sNQzx5 UMcE/OL/QJBluUMJsct9sbBi4LrWjNe7cHyPwnMFg03DXwUyaBlc0sxSP/ZXAfpH QjnT+Og+ZQym+4M3wm8O =6hbH -----END PGP SIGNATURE----- Merge tag 'qcom-drivers-for-4.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux into next/drivers Pull "Qualcomm ARM Based Driver Updates for v4.10 - Part 2" from Andy Gross: * Fixup QCOM SCM to support MSM8996 * tag 'qcom-drivers-for-4.10-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux: firmware: qcom: scm: Return PTR_ERR when devm_clk_get fails firmware: qcom: scm: Remove core, iface and bus clocks dependency dt-bindings: firmware: scm: Add MSM8996 DT bindings
This commit is contained in:
commit
2ada959322
|
@ -10,8 +10,10 @@ Required properties:
|
|||
* "qcom,scm-apq8064" for APQ8064 platforms
|
||||
* "qcom,scm-msm8660" for MSM8660 platforms
|
||||
* "qcom,scm-msm8690" for MSM8690 platforms
|
||||
* "qcom,scm-msm8996" for MSM8996 platforms
|
||||
* "qcom,scm" for later processors (MSM8916, APQ8084, MSM8974, etc)
|
||||
- clocks: One to three clocks may be required based on compatible.
|
||||
* No clock required for "qcom,scm-msm8996"
|
||||
* Only core clock required for "qcom,scm-apq8064", "qcom,scm-msm8660", and "qcom,scm-msm8960"
|
||||
* Core, iface, and bus clocks required for "qcom,scm"
|
||||
- clock-names: Must contain "core" for the core clock, "iface" for the interface
|
||||
|
|
|
@ -28,6 +28,10 @@
|
|||
|
||||
#include "qcom_scm.h"
|
||||
|
||||
#define SCM_HAS_CORE_CLK BIT(0)
|
||||
#define SCM_HAS_IFACE_CLK BIT(1)
|
||||
#define SCM_HAS_BUS_CLK BIT(2)
|
||||
|
||||
struct qcom_scm {
|
||||
struct device *dev;
|
||||
struct clk *core_clk;
|
||||
|
@ -323,32 +327,40 @@ EXPORT_SYMBOL(qcom_scm_is_available);
|
|||
static int qcom_scm_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct qcom_scm *scm;
|
||||
unsigned long clks;
|
||||
int ret;
|
||||
|
||||
scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL);
|
||||
if (!scm)
|
||||
return -ENOMEM;
|
||||
|
||||
scm->core_clk = devm_clk_get(&pdev->dev, "core");
|
||||
if (IS_ERR(scm->core_clk)) {
|
||||
if (PTR_ERR(scm->core_clk) == -EPROBE_DEFER)
|
||||
clks = (unsigned long)of_device_get_match_data(&pdev->dev);
|
||||
if (clks & SCM_HAS_CORE_CLK) {
|
||||
scm->core_clk = devm_clk_get(&pdev->dev, "core");
|
||||
if (IS_ERR(scm->core_clk)) {
|
||||
if (PTR_ERR(scm->core_clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev,
|
||||
"failed to acquire core clk\n");
|
||||
return PTR_ERR(scm->core_clk);
|
||||
|
||||
scm->core_clk = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (of_device_is_compatible(pdev->dev.of_node, "qcom,scm")) {
|
||||
if (clks & SCM_HAS_IFACE_CLK) {
|
||||
scm->iface_clk = devm_clk_get(&pdev->dev, "iface");
|
||||
if (IS_ERR(scm->iface_clk)) {
|
||||
if (PTR_ERR(scm->iface_clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "failed to acquire iface clk\n");
|
||||
dev_err(&pdev->dev,
|
||||
"failed to acquire iface clk\n");
|
||||
return PTR_ERR(scm->iface_clk);
|
||||
}
|
||||
}
|
||||
|
||||
if (clks & SCM_HAS_BUS_CLK) {
|
||||
scm->bus_clk = devm_clk_get(&pdev->dev, "bus");
|
||||
if (IS_ERR(scm->bus_clk)) {
|
||||
if (PTR_ERR(scm->bus_clk) != -EPROBE_DEFER)
|
||||
dev_err(&pdev->dev, "failed to acquire bus clk\n");
|
||||
dev_err(&pdev->dev,
|
||||
"failed to acquire bus clk\n");
|
||||
return PTR_ERR(scm->bus_clk);
|
||||
}
|
||||
}
|
||||
|
@ -374,10 +386,23 @@ static int qcom_scm_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
static const struct of_device_id qcom_scm_dt_match[] = {
|
||||
{ .compatible = "qcom,scm-apq8064",},
|
||||
{ .compatible = "qcom,scm-msm8660",},
|
||||
{ .compatible = "qcom,scm-msm8960",},
|
||||
{ .compatible = "qcom,scm",},
|
||||
{ .compatible = "qcom,scm-apq8064",
|
||||
.data = (void *) SCM_HAS_CORE_CLK,
|
||||
},
|
||||
{ .compatible = "qcom,scm-msm8660",
|
||||
.data = (void *) SCM_HAS_CORE_CLK,
|
||||
},
|
||||
{ .compatible = "qcom,scm-msm8960",
|
||||
.data = (void *) SCM_HAS_CORE_CLK,
|
||||
},
|
||||
{ .compatible = "qcom,scm-msm8996",
|
||||
.data = NULL, /* no clocks */
|
||||
},
|
||||
{ .compatible = "qcom,scm",
|
||||
.data = (void *)(SCM_HAS_CORE_CLK
|
||||
| SCM_HAS_IFACE_CLK
|
||||
| SCM_HAS_BUS_CLK),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue