msm: peripheral-reset-8960: Cleanup initialization function
Reorganize the initialization such that:
- Code is shared for initializing PIL for the three Q6
- A failure to initialize PIL for one subsystem does not prevent
previously initialized ones from working
Signed-off-by: Matt Wagantall <mattw@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-msm8960-regulator.c b/arch/arm/mach-msm/board-msm8960-regulator.c
index d4b6643..7e33c28 100644
--- a/arch/arm/mach-msm/board-msm8960-regulator.c
+++ b/arch/arm/mach-msm/board-msm8960-regulator.c
@@ -115,15 +115,15 @@
};
VREG_CONSUMERS(L26) = {
REGULATOR_SUPPLY("8921_l26", NULL),
- REGULATOR_SUPPLY("lpass_q6", NULL),
+ REGULATOR_SUPPLY("q6_lpass", NULL),
};
VREG_CONSUMERS(L27) = {
REGULATOR_SUPPLY("8921_l27", NULL),
- REGULATOR_SUPPLY("modem_sw_q6", NULL),
+ REGULATOR_SUPPLY("q6_modem_sw", NULL),
};
VREG_CONSUMERS(L28) = {
REGULATOR_SUPPLY("8921_l28", NULL),
- REGULATOR_SUPPLY("modem_fw_q6", NULL),
+ REGULATOR_SUPPLY("q6_modem_fw", NULL),
};
VREG_CONSUMERS(L29) = {
REGULATOR_SUPPLY("8921_l29", NULL),
diff --git a/arch/arm/mach-msm/peripheral-reset-8960.c b/arch/arm/mach-msm/peripheral-reset-8960.c
index 19fe1c5..007d22c 100644
--- a/arch/arm/mach-msm/peripheral-reset-8960.c
+++ b/arch/arm/mach-msm/peripheral-reset-8960.c
@@ -120,6 +120,7 @@
const unsigned strap_tcm_base;
const unsigned strap_ahb_upper;
const unsigned strap_ahb_lower;
+ const unsigned reg_base_phys;
void __iomem *reg_base;
void __iomem *aclk_reg;
void __iomem *jtag_clk_reg;
@@ -133,6 +134,7 @@
.strap_tcm_base = (0x146 << 16),
.strap_ahb_upper = (0x029 << 16),
.strap_ahb_lower = (0x028 << 4),
+ .reg_base_phys = MSM_LPASS_QDSP6SS_PHYS,
.aclk_reg = SFAB_LPASS_Q6_ACLK_CTL,
.name = "q6_lpass",
};
@@ -141,6 +143,7 @@
.strap_tcm_base = (0x40 << 16),
.strap_ahb_upper = (0x09 << 16),
.strap_ahb_lower = (0x08 << 4),
+ .reg_base_phys = MSM_FW_QDSP6SS_PHYS,
.aclk_reg = SFAB_MSS_Q6_FW_ACLK_CTL,
.jtag_clk_reg = MSS_Q6FW_JTAG_CLK_CTL,
.name = "q6_modem_fw",
@@ -150,6 +153,7 @@
.strap_tcm_base = (0x42 << 16),
.strap_ahb_upper = (0x09 << 16),
.strap_ahb_lower = (0x08 << 4),
+ .reg_base_phys = MSM_SW_QDSP6SS_PHYS,
.aclk_reg = SFAB_MSS_Q6_SW_ACLK_CTL,
.jtag_clk_reg = MSS_Q6SW_JTAG_CLK_CTL,
.name = "q6_modem_sw",
@@ -523,54 +527,79 @@
.shutdown = shutdown_dsps_untrusted,
};
-static struct pil_device peripherals[] = {
- {
- .name = "q6",
- .pdev = {
- .name = "pil_lpass_q6",
- .id = -1,
- },
- .ops = &pil_lpass_q6_ops,
+static struct pil_device pil_lpass_q6 = {
+ .name = "q6",
+ .pdev = {
+ .name = "pil_lpass_q6",
+ .id = -1,
},
- {
- .name = "modem_fw",
- .depends_on = "q6",
- .pdev = {
- .name = "pil_modem_fw_q6",
- .id = -1,
- },
- .ops = &pil_modem_fw_q6_ops,
- },
- {
- .name = "modem",
- .depends_on = "modem_fw",
- .pdev = {
- .name = "pil_modem_sw_q6",
- .id = -1,
- },
- .ops = &pil_modem_sw_q6_ops,
- },
- {
- .name = "wcnss",
- .pdev = {
- .name = "pil_riva",
- .id = -1,
- },
- .ops = &pil_riva_ops,
- },
- {
- .name = "dsps",
- .pdev = {
- .name = "pil_dsps",
- .id = -1,
- },
- .ops = &pil_dsps_ops,
- },
+ .ops = &pil_lpass_q6_ops,
};
+static struct pil_device pil_modem_fw_q6 = {
+ .name = "modem_fw",
+ .depends_on = "q6",
+ .pdev = {
+ .name = "pil_modem_fw_q6",
+ .id = -1,
+ },
+ .ops = &pil_modem_fw_q6_ops,
+};
+
+static struct pil_device pil_modem_sw_q6 = {
+ .name = "modem",
+ .depends_on = "modem_fw",
+ .pdev = {
+ .name = "pil_modem_sw_q6",
+ .id = -1,
+ },
+ .ops = &pil_modem_sw_q6_ops,
+};
+
+static struct pil_device pil_riva = {
+ .name = "wcnss",
+ .pdev = {
+ .name = "pil_riva",
+ .id = -1,
+ },
+ .ops = &pil_riva_ops,
+};
+
+static struct pil_device pil_dsps = {
+ .name = "dsps",
+ .pdev = {
+ .name = "pil_dsps",
+ .id = -1,
+ },
+ .ops = &pil_dsps_ops,
+};
+
+static int __init q6_reset_init(struct q6_data *q6)
+{
+ int err;
+
+ q6->reg_base = ioremap(q6->reg_base_phys, SZ_256);
+ if (!q6->reg_base) {
+ err = -ENOMEM;
+ goto err_map;
+ }
+
+ q6->vreg = regulator_get(NULL, q6->name);
+ if (IS_ERR(q6->vreg)) {
+ err = PTR_ERR(q6->vreg);
+ goto err_vreg;
+ }
+
+ return 0;
+
+err_vreg:
+ iounmap(q6->reg_base);
+err_map:
+ return err;
+}
+
static int __init msm_peripheral_reset_init(void)
{
- unsigned i;
int err;
/*
@@ -580,74 +609,34 @@
if (machine_is_msm8960_sim() || machine_is_msm8960_rumi3())
return 0;
- mss_enable_reg = ioremap(MSM_MSS_ENABLE_PHYS, 1);
- if (!mss_enable_reg) {
- err = -ENOMEM;
- goto err_map_mss;
- }
+ err = q6_reset_init(&q6_lpass);
+ if (err)
+ return err;
+ msm_pil_add_device(&pil_lpass_q6);
- q6_lpass.reg_base = ioremap(MSM_LPASS_QDSP6SS_PHYS, SZ_256);
- if (!q6_lpass.reg_base) {
- err = -ENOMEM;
- goto err_map_lpass_q6;
- }
+ mss_enable_reg = ioremap(MSM_MSS_ENABLE_PHYS, 4);
+ if (!mss_enable_reg)
+ return -ENOMEM;
- q6_modem_fw.reg_base = ioremap(MSM_FW_QDSP6SS_PHYS, SZ_256);
- if (!q6_modem_fw.reg_base) {
- err = -ENOMEM;
- goto err_map_modem_fw_q6;
+ err = q6_reset_init(&q6_modem_fw);
+ if (err) {
+ iounmap(mss_enable_reg);
+ return err;
}
+ msm_pil_add_device(&pil_modem_fw_q6);
- q6_modem_sw.reg_base = ioremap(MSM_SW_QDSP6SS_PHYS, SZ_256);
- if (!q6_modem_sw.reg_base) {
- err = -ENOMEM;
- goto err_map_modem_sw_q6;
- }
+ err = q6_reset_init(&q6_modem_sw);
+ if (err)
+ return err;
+ msm_pil_add_device(&pil_modem_sw_q6);
+
+ msm_pil_add_device(&pil_dsps);
msm_riva_base = ioremap(MSM_RIVA_PHYS, SZ_256);
- if (!msm_riva_base) {
- err = -ENOMEM;
- goto err_map_riva;
- }
-
- q6_lpass.vreg = regulator_get(NULL, "lpass_q6");
- if (IS_ERR(q6_lpass.vreg)) {
- err = PTR_ERR(q6_lpass.vreg);
- goto err_vreg_lpass;
- }
-
- q6_modem_fw.vreg = regulator_get(NULL, "modem_fw_q6");
- if (IS_ERR(q6_modem_fw.vreg)) {
- err = PTR_ERR(q6_modem_fw.vreg);
- goto err_vreg_modem_fw_q6;
- }
-
- q6_modem_sw.vreg = regulator_get(NULL, "modem_sw_q6");
- if (IS_ERR(q6_modem_sw.vreg)) {
- err = PTR_ERR(q6_modem_sw.vreg);
- goto err_vreg_modem_sw_q6;
- }
-
- for (i = 0; i < ARRAY_SIZE(peripherals); i++)
- msm_pil_add_device(&peripherals[i]);
+ if (!msm_riva_base)
+ return -ENOMEM;
+ msm_pil_add_device(&pil_riva);
return 0;
-
-err_vreg_modem_sw_q6:
- regulator_put(q6_modem_fw.vreg);
-err_vreg_modem_fw_q6:
- regulator_put(q6_lpass.vreg);
-err_vreg_lpass:
- iounmap(msm_riva_base);
-err_map_riva:
- iounmap(q6_modem_sw.reg_base);
-err_map_modem_sw_q6:
- iounmap(q6_modem_fw.reg_base);
-err_map_modem_fw_q6:
- iounmap(q6_lpass.reg_base);
-err_map_lpass_q6:
- iounmap(mss_enable_reg);
-err_map_mss:
- return err;
}
arch_initcall(msm_peripheral_reset_init);