diff options
Diffstat (limited to 'drivers/platform/msm/qpnp-power-on.c')
| -rw-r--r-- | drivers/platform/msm/qpnp-power-on.c | 547 |
1 files changed, 278 insertions, 269 deletions
diff --git a/drivers/platform/msm/qpnp-power-on.c b/drivers/platform/msm/qpnp-power-on.c index 964ecfd483ed..135c484d071e 100644 --- a/drivers/platform/msm/qpnp-power-on.c +++ b/drivers/platform/msm/qpnp-power-on.c @@ -14,9 +14,11 @@ #include <linux/init.h> #include <linux/debugfs.h> #include <linux/kernel.h> +#include <linux/regmap.h> #include <linux/errno.h> #include <linux/slab.h> #include <linux/spmi.h> +#include <linux/platform_device.h> #include <linux/delay.h> #include <linux/of.h> #include <linux/of_device.h> @@ -194,7 +196,8 @@ struct pon_regulator { }; struct qpnp_pon { - struct spmi_device *spmi; + struct platform_device *pdev; + struct regmap *regmap; struct input_dev *pon_input; struct qpnp_pon_config *pon_cfg; struct pon_regulator *pon_reg_cfg; @@ -205,7 +208,6 @@ struct qpnp_pon { int pon_power_off_reason; int num_pon_reg; int num_pon_config; - int reg_count; u32 dbc; u32 uvlo; int warm_reset_poff_type; @@ -302,24 +304,12 @@ static int qpnp_pon_masked_write(struct qpnp_pon *pon, u16 addr, u8 mask, u8 val) { int rc; - u8 reg; - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - addr, ®, 1); - if (rc) { - dev_err(&pon->spmi->dev, - "Unable to read from addr=%hx, rc(%d)\n", - addr, rc); - return rc; - } - - reg &= ~mask; - reg |= val & mask; - rc = spmi_ext_register_writel(pon->spmi->ctrl, pon->spmi->sid, - addr, ®, 1); + rc = regmap_update_bits(pon->regmap, addr, mask, val); if (rc) - dev_err(&pon->spmi->dev, - "Unable to write to addr=%hx, rc(%d)\n", addr, rc); + dev_err(&pon->pdev->dev, + "Unable to regmap_update_bits to addr=%hx, rc(%d)\n", + addr, rc); return rc; } @@ -360,7 +350,7 @@ int qpnp_pon_set_restart_reason(enum pon_restart_reason reason) rc = qpnp_pon_masked_write(pon, QPNP_PON_SOFT_RB_SPARE(pon), PON_MASK(7, 2), (reason << 2)); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%x, rc(%d)\n", QPNP_PON_SOFT_RB_SPARE(pon), rc); return rc; @@ -406,7 +396,7 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) QPNP_PON_DBC_DELAY_MASK(pon), delay_reg); if (rc) { - dev_err(&pon->spmi->dev, "Unable to set PON debounce\n"); + dev_err(&pon->pdev->dev, "Unable to set PON debounce\n"); goto unlock; } @@ -485,7 +475,7 @@ static int qpnp_pon_reset_config(struct qpnp_pon *pon, rc = qpnp_pon_masked_write(pon, rst_en_reg, QPNP_PON_RESET_EN, 0); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%hx, rc(%d)\n", rst_en_reg, rc); @@ -499,18 +489,18 @@ static int qpnp_pon_reset_config(struct qpnp_pon *pon, rc = qpnp_pon_masked_write(pon, QPNP_PON_PS_HOLD_RST_CTL(pon), QPNP_PON_POWER_OFF_MASK, type); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%x, rc(%d)\n", QPNP_PON_PS_HOLD_RST_CTL(pon), rc); rc = qpnp_pon_masked_write(pon, rst_en_reg, QPNP_PON_RESET_EN, QPNP_PON_RESET_EN); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%hx, rc(%d)\n", rst_en_reg, rc); - dev_dbg(&pon->spmi->dev, "power off type = 0x%02X\n", type); + dev_dbg(&pon->pdev->dev, "power off type = 0x%02X\n", type); return rc; } @@ -537,7 +527,8 @@ int qpnp_pon_system_pwr_off(enum pon_power_off_type type) rc = qpnp_pon_reset_config(pon, type); if (rc) { - dev_err(&pon->spmi->dev, "Error configuring main PON rc: %d\n", + dev_err(&pon->pdev->dev, + "Error configuring main PON rc: %d\n", rc); return rc; } @@ -552,12 +543,13 @@ int qpnp_pon_system_pwr_off(enum pon_power_off_type type) goto out; list_for_each_entry_safe(pon, tmp, &spon_dev_list, list) { - dev_emerg(&pon->spmi->dev, + dev_emerg(&pon->pdev->dev, "PMIC@SID%d: configuring PON for reset\n", - pon->spmi->sid); + to_spmi_device(pon->pdev->dev.parent)->usid); rc = qpnp_pon_reset_config(pon, type); if (rc) { - dev_err(&pon->spmi->dev, "Error configuring secondary PON rc: %d\n", + dev_err(&pon->pdev->dev, + "Error configuring secondary PON rc: %d\n", rc); goto out; } @@ -608,7 +600,7 @@ int qpnp_pon_wd_config(bool enable) rc = qpnp_pon_masked_write(pon, QPNP_PON_WD_RST_S2_CTL2(pon), QPNP_PON_WD_EN, enable ? QPNP_PON_WD_EN : 0); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%x, rc(%d)\n", QPNP_PON_WD_RST_S2_CTL2(pon), rc); @@ -622,7 +614,7 @@ static int qpnp_pon_get_trigger_config(enum pon_trigger_source pon_src, struct qpnp_pon *pon = sys_reset_dev; int rc; u16 addr; - u8 val; + int val; u8 mask; if (!pon) @@ -640,8 +632,8 @@ static int qpnp_pon_get_trigger_config(enum pon_trigger_source pon_src, mask = QPNP_PON_SMPL_EN; } - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - addr, &val, 1); + + rc = regmap_read(pon->regmap, addr, &val); if (rc) dev_err(&pon->spmi->dev, "Unable to read from addr=%hx, rc(%d)\n", @@ -671,7 +663,7 @@ int qpnp_pon_trigger_config(enum pon_trigger_source pon_src, bool enable) return -EPROBE_DEFER; if (pon_src < PON_SMPL || pon_src > PON_KPDPWR_N) { - dev_err(&pon->spmi->dev, "Invalid PON source\n"); + dev_err(&pon->pdev->dev, "Invalid PON source\n"); return -EINVAL; } @@ -679,13 +671,15 @@ int qpnp_pon_trigger_config(enum pon_trigger_source pon_src, bool enable) rc = qpnp_pon_masked_write(pon, QPNP_PON_SMPL_CTL(pon), QPNP_PON_SMPL_EN, enable ? QPNP_PON_SMPL_EN : 0); if (rc) - dev_err(&pon->spmi->dev, "Unable to write to addr=%x, rc(%d)\n", + dev_err(&pon->pdev->dev, + "Unable to write to addr=%x, rc(%d)\n", QPNP_PON_SMPL_CTL(pon), rc); } else { rc = qpnp_pon_masked_write(pon, QPNP_PON_TRIGGER_EN(pon), BIT(pon_src), enable ? BIT(pon_src) : 0); if (rc) - dev_err(&pon->spmi->dev, "Unable to write to addr=%x, rc(%d)\n", + dev_err(&pon->pdev->dev, + "Unable to write to addr=%x, rc(%d)\n", QPNP_PON_TRIGGER_EN(pon), rc); } @@ -702,34 +696,35 @@ static int qpnp_pon_store_and_clear_warm_reset(struct qpnp_pon *pon) { int rc; u8 reg = 0; + uint val; - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_WARM_RESET_REASON1(pon), - &pon->warm_reset_reason1, 1); + rc = regmap_read(pon->regmap, QPNP_PON_WARM_RESET_REASON1(pon), + &val); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read addr=%x, rc(%d)\n", + dev_err(&pon->pdev->dev, "Unable to read addr=%x, rc(%d)\n", QPNP_PON_WARM_RESET_REASON1(pon), rc); return rc; } + pon->warm_reset_reason1 = (u8)val; if (is_pon_gen1(pon) || pon->subtype == PON_1REG) { - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_WARM_RESET_REASON2(pon), - &pon->warm_reset_reason2, 1); + rc = regmap_read(pon->regmap, QPNP_PON_WARM_RESET_REASON2(pon), + &val); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read addr=%x, rc(%d)\n", QPNP_PON_WARM_RESET_REASON2(pon), rc); return rc; } + pon->warm_reset_reason2 = (u8)val; } - if (of_property_read_bool(pon->spmi->dev.of_node, + if (of_property_read_bool(pon->pdev->dev.of_node, "qcom,clear-warm-reset")) { - rc = spmi_ext_register_writel(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_WARM_RESET_REASON1(pon), ®, 1); + rc = regmap_write(pon->regmap, + QPNP_PON_WARM_RESET_REASON1(pon), reg); if (rc) - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%hx, rc(%d)\n", QPNP_PON_WARM_RESET_REASON1(pon), rc); } @@ -755,8 +750,9 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) { int rc; struct qpnp_pon_config *cfg = NULL; - u8 pon_rt_sts = 0, pon_rt_bit = 0; + u8 pon_rt_bit = 0; u32 key_status; + uint pon_rt_sts; cfg = qpnp_get_cfg(pon, pon_type); if (!cfg) @@ -767,10 +763,9 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) return 0; /* check the RT status to get the current status of the line */ - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_RT_STS(pon), &pon_rt_sts, 1); + rc = regmap_read(pon->regmap, QPNP_PON_RT_STS(pon), &pon_rt_sts); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read PON RT status\n"); + dev_err(&pon->pdev->dev, "Unable to read PON RT status\n"); return rc; } @@ -818,7 +813,7 @@ static irqreturn_t qpnp_kpdpwr_irq(int irq, void *_pon) rc = qpnp_pon_input_dispatch(pon, PON_KPDPWR); if (rc) - dev_err(&pon->spmi->dev, "Unable to send input event\n"); + dev_err(&pon->pdev->dev, "Unable to send input event\n"); return IRQ_HANDLED; } @@ -835,7 +830,7 @@ static irqreturn_t qpnp_resin_irq(int irq, void *_pon) rc = qpnp_pon_input_dispatch(pon, PON_RESIN); if (rc) - dev_err(&pon->spmi->dev, "Unable to send input event\n"); + dev_err(&pon->pdev->dev, "Unable to send input event\n"); return IRQ_HANDLED; } @@ -851,7 +846,7 @@ static irqreturn_t qpnp_cblpwr_irq(int irq, void *_pon) rc = qpnp_pon_input_dispatch(pon, PON_CBLPWR); if (rc) - dev_err(&pon->spmi->dev, "Unable to send input event\n"); + dev_err(&pon->pdev->dev, "Unable to send input event\n"); return IRQ_HANDLED; } @@ -860,16 +855,15 @@ static void print_pon_reg(struct qpnp_pon *pon, u16 offset) { int rc; u16 addr; - u8 reg; + uint reg; addr = pon->base + offset; - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - addr, ®, 1); + rc = regmap_read(pon->regmap, addr, ®); if (rc) - dev_emerg(&pon->spmi->dev, + dev_emerg(&pon->pdev->dev, "Unable to read reg at 0x%04hx\n", addr); else - dev_emerg(&pon->spmi->dev, "reg@0x%04hx: %02hhx\n", addr, reg); + dev_emerg(&pon->pdev->dev, "reg@0x%04hx: %02hhx\n", addr, reg); } #define PON_PBL_STATUS 0x7 @@ -913,14 +907,14 @@ static irqreturn_t qpnp_pmic_wd_bark_irq(int irq, void *_pon) static void bark_work_func(struct work_struct *work) { int rc; - u8 pon_rt_sts = 0; + uint pon_rt_sts = 0; struct qpnp_pon_config *cfg; struct qpnp_pon *pon = container_of(work, struct qpnp_pon, bark_work.work); cfg = qpnp_get_cfg(pon, PON_RESIN); if (!cfg) { - dev_err(&pon->spmi->dev, "Invalid config pointer\n"); + dev_err(&pon->pdev->dev, "Invalid config pointer\n"); goto err_return; } @@ -928,16 +922,15 @@ static void bark_work_func(struct work_struct *work) rc = qpnp_pon_masked_write(pon, cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, QPNP_PON_S2_CNTL_EN); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 enable\n"); + dev_err(&pon->pdev->dev, "Unable to configure S2 enable\n"); goto err_return; } /* bark RT status update delay */ msleep(100); /* read the bark RT status */ - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_RT_STS(pon), &pon_rt_sts, 1); + rc = regmap_read(pon->regmap, QPNP_PON_RT_STS(pon), &pon_rt_sts); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read PON RT status\n"); + dev_err(&pon->pdev->dev, "Unable to read PON RT status\n"); goto err_return; } @@ -951,7 +944,7 @@ static void bark_work_func(struct work_struct *work) rc = qpnp_pon_masked_write(pon, cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, 0); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to configure S2 enable\n"); goto err_return; } @@ -974,7 +967,7 @@ static irqreturn_t qpnp_resin_bark_irq(int irq, void *_pon) cfg = qpnp_get_cfg(pon, PON_RESIN); if (!cfg) { - dev_err(&pon->spmi->dev, "Invalid config pointer\n"); + dev_err(&pon->pdev->dev, "Invalid config pointer\n"); goto err_exit; } @@ -982,7 +975,7 @@ static irqreturn_t qpnp_resin_bark_irq(int irq, void *_pon) rc = qpnp_pon_masked_write(pon, cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, 0); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 enable\n"); + dev_err(&pon->pdev->dev, "Unable to configure S2 enable\n"); goto err_exit; } @@ -1021,7 +1014,7 @@ qpnp_config_pull(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) rc = qpnp_pon_masked_write(pon, QPNP_PON_PULL_CTL(pon), pull_bit, cfg->pull_up ? pull_bit : 0); if (rc) - dev_err(&pon->spmi->dev, "Unable to config pull-up\n"); + dev_err(&pon->pdev->dev, "Unable to config pull-up\n"); return rc; } @@ -1053,7 +1046,7 @@ qpnp_config_reset(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) rc = qpnp_pon_masked_write(pon, cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, 0); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 enable\n"); + dev_err(&pon->pdev->dev, "Unable to configure S2 enable\n"); return rc; } @@ -1067,7 +1060,7 @@ qpnp_config_reset(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) rc = qpnp_pon_masked_write(pon, s1_timer_addr, QPNP_PON_S1_TIMER_MASK, i); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S1 timer\n"); + dev_err(&pon->pdev->dev, "Unable to configure S1 timer\n"); return rc; } @@ -1080,14 +1073,15 @@ qpnp_config_reset(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) rc = qpnp_pon_masked_write(pon, s2_timer_addr, QPNP_PON_S2_TIMER_MASK, i); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 timer\n"); + dev_err(&pon->pdev->dev, "Unable to configure S2 timer\n"); return rc; } rc = qpnp_pon_masked_write(pon, cfg->s2_cntl_addr, QPNP_PON_S2_CNTL_TYPE_MASK, (u8)cfg->s2_type); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 reset type\n"); + dev_err(&pon->pdev->dev, + "Unable to configure S2 reset type\n"); return rc; } @@ -1095,7 +1089,7 @@ qpnp_config_reset(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) rc = qpnp_pon_masked_write(pon, cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, QPNP_PON_S2_CNTL_EN); if (rc) { - dev_err(&pon->spmi->dev, "Unable to configure S2 enable\n"); + dev_err(&pon->pdev->dev, "Unable to configure S2 enable\n"); return rc; } @@ -1109,22 +1103,22 @@ qpnp_pon_request_irqs(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) switch (cfg->pon_type) { case PON_KPDPWR: - rc = devm_request_irq(&pon->spmi->dev, cfg->state_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->state_irq, qpnp_kpdpwr_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "qpnp_kpdpwr_status", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, "Can't request %d IRQ\n", + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->state_irq); return rc; } if (cfg->use_bark) { - rc = devm_request_irq(&pon->spmi->dev, cfg->bark_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->bark_irq, qpnp_kpdpwr_bark_irq, IRQF_TRIGGER_RISING, "qpnp_kpdpwr_bark", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->bark_irq); return rc; @@ -1132,22 +1126,22 @@ qpnp_pon_request_irqs(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) } break; case PON_RESIN: - rc = devm_request_irq(&pon->spmi->dev, cfg->state_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->state_irq, qpnp_resin_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "qpnp_resin_status", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, "Can't request %d IRQ\n", + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->state_irq); return rc; } if (cfg->use_bark) { - rc = devm_request_irq(&pon->spmi->dev, cfg->bark_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->bark_irq, qpnp_resin_bark_irq, IRQF_TRIGGER_RISING, "qpnp_resin_bark", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->bark_irq); return rc; @@ -1155,24 +1149,24 @@ qpnp_pon_request_irqs(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) } break; case PON_CBLPWR: - rc = devm_request_irq(&pon->spmi->dev, cfg->state_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->state_irq, qpnp_cblpwr_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "qpnp_cblpwr_status", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, "Can't request %d IRQ\n", + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->state_irq); return rc; } break; case PON_KPDPWR_RESIN: if (cfg->use_bark) { - rc = devm_request_irq(&pon->spmi->dev, cfg->bark_irq, + rc = devm_request_irq(&pon->pdev->dev, cfg->bark_irq, qpnp_kpdpwr_resin_bark_irq, IRQF_TRIGGER_RISING, "qpnp_kpdpwr_resin_bark", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", cfg->bark_irq); return rc; @@ -1200,7 +1194,7 @@ qpnp_pon_config_input(struct qpnp_pon *pon, struct qpnp_pon_config *cfg) if (!pon->pon_input) { pon->pon_input = input_allocate_device(); if (!pon->pon_input) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't allocate pon input device\n"); return -ENOMEM; } @@ -1220,17 +1214,17 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) int rc = 0, i = 0, pmic_wd_bark_irq; struct device_node *pp = NULL; struct qpnp_pon_config *cfg; - u8 pmic_type; - u8 revid_rev4; + uint pmic_type; + uint revid_rev4; if (!pon->num_pon_config) { - dev_dbg(&pon->spmi->dev, "num_pon_config: %d\n", + dev_dbg(&pon->pdev->dev, "num_pon_config: %d\n", pon->num_pon_config); return 0; } /* iterate through the list of pon configs */ - for_each_available_child_of_node(pon->spmi->dev.of_node, pp) { + for_each_available_child_of_node(pon->pdev->dev.of_node, pp) { if (!of_find_property(pp, "qcom,pon-type", NULL)) continue; @@ -1238,16 +1232,16 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) rc = of_property_read_u32(pp, "qcom,pon-type", &cfg->pon_type); if (rc) { - dev_err(&pon->spmi->dev, "PON type not specified\n"); + dev_err(&pon->pdev->dev, "PON type not specified\n"); return rc; } switch (cfg->pon_type) { case PON_KPDPWR: - cfg->state_irq = spmi_get_irq_byname(pon->spmi, - NULL, "kpdpwr"); + cfg->state_irq = platform_get_irq_byname(pon->pdev, + "kpdpwr"); if (cfg->state_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get kpdpwr irq\n"); return cfg->state_irq; } @@ -1257,10 +1251,10 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) if (rc) { if (rc == -EINVAL) { - dev_dbg(&pon->spmi->dev, + dev_dbg(&pon->pdev->dev, "'qcom,support-reset' DT property doesn't exist\n"); } else { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read 'qcom,support-reset'\n"); return rc; } @@ -1271,10 +1265,11 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) cfg->use_bark = of_property_read_bool(pp, "qcom,use-bark"); if (cfg->use_bark) { - cfg->bark_irq = spmi_get_irq_byname(pon->spmi, - NULL, "kpdpwr-bark"); + cfg->bark_irq + = platform_get_irq_byname(pon->pdev, + "kpdpwr-bark"); if (cfg->bark_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get kpdpwr-bark irq\n"); return cfg->bark_irq; } @@ -1296,10 +1291,10 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) break; case PON_RESIN: - cfg->state_irq = spmi_get_irq_byname(pon->spmi, - NULL, "resin"); + cfg->state_irq = platform_get_irq_byname(pon->pdev, + "resin"); if (cfg->state_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get resin irq\n"); return cfg->bark_irq; } @@ -1309,10 +1304,10 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) if (rc) { if (rc == -EINVAL) { - dev_dbg(&pon->spmi->dev, + dev_dbg(&pon->pdev->dev, "'qcom,support-reset' DT property doesn't exist\n"); } else { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read 'qcom,support-reset'\n"); return rc; } @@ -1323,24 +1318,23 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) cfg->use_bark = of_property_read_bool(pp, "qcom,use-bark"); - rc = spmi_ext_register_readl(pon->spmi->ctrl, - pon->spmi->sid, PMIC_VERSION_REG, - &pmic_type, 1); + rc = regmap_read(pon->regmap, PMIC_VERSION_REG, + &pmic_type); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read PMIC type\n"); return rc; } if (pmic_type == PMIC_VER_8941) { - rc = spmi_ext_register_readl(pon->spmi->ctrl, - pon->spmi->sid, PMIC_VERSION_REV4_REG, - &revid_rev4, 1); + rc = regmap_read(pon->regmap, + PMIC_VERSION_REV4_REG, + &revid_rev4); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read PMIC revision ID\n"); return rc; } @@ -1355,10 +1349,11 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) } if (cfg->use_bark) { - cfg->bark_irq = spmi_get_irq_byname(pon->spmi, - NULL, "resin-bark"); + cfg->bark_irq + = platform_get_irq_byname(pon->pdev, + "resin-bark"); if (cfg->bark_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get resin-bark irq\n"); return cfg->bark_irq; } @@ -1376,10 +1371,10 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) break; case PON_CBLPWR: - cfg->state_irq = spmi_get_irq_byname(pon->spmi, - NULL, "cblpwr"); + cfg->state_irq = platform_get_irq_byname(pon->pdev, + "cblpwr"); if (cfg->state_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get cblpwr irq\n"); return rc; } @@ -1390,10 +1385,10 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) if (rc) { if (rc == -EINVAL) { - dev_dbg(&pon->spmi->dev, + dev_dbg(&pon->pdev->dev, "'qcom,support-reset' DT property doesn't exist\n"); } else { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read 'qcom,support-reset'\n"); return rc; } @@ -1404,10 +1399,11 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) cfg->use_bark = of_property_read_bool(pp, "qcom,use-bark"); if (cfg->use_bark) { - cfg->bark_irq = spmi_get_irq_byname(pon->spmi, - NULL, "kpdpwr-resin-bark"); + cfg->bark_irq + = platform_get_irq_byname(pon->pdev, + "kpdpwr-resin-bark"); if (cfg->bark_irq < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to get kpdpwr-resin-bark irq\n"); return cfg->bark_irq; } @@ -1425,7 +1421,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) break; default: - dev_err(&pon->spmi->dev, "PON RESET %d not supported", + dev_err(&pon->pdev->dev, "PON RESET %d not supported", cfg->pon_type); return -EINVAL; } @@ -1438,40 +1434,39 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) rc = of_property_read_u32(pp, "qcom,s1-timer", &cfg->s1_timer); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read s1-timer\n"); return rc; } if (cfg->s1_timer > QPNP_PON_S1_TIMER_MAX) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Incorrect S1 debounce time\n"); return -EINVAL; } rc = of_property_read_u32(pp, "qcom,s2-timer", &cfg->s2_timer); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read s2-timer\n"); return rc; } if (cfg->s2_timer > QPNP_PON_S2_TIMER_MAX) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Incorrect S2 debounce time\n"); return -EINVAL; } rc = of_property_read_u32(pp, "qcom,s2-type", &cfg->s2_type); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read s2-type\n"); return rc; } if (cfg->s2_type > QPNP_PON_RESET_TYPE_MAX) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Incorrect reset type specified\n"); return -EINVAL; } - } /* * Get the standard-key parameters. This might not be @@ -1479,8 +1474,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) */ rc = of_property_read_u32(pp, "linux,code", &cfg->key_code); if (rc && rc != -EINVAL) { - dev_err(&pon->spmi->dev, - "Unable to read key-code\n"); + dev_err(&pon->pdev->dev, "Unable to read key-code\n"); return rc; } /* Register key configuration */ @@ -1492,20 +1486,20 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) /* get the pull-up configuration */ rc = of_property_read_u32(pp, "qcom,pull-up", &cfg->pull_up); if (rc && rc != -EINVAL) { - dev_err(&pon->spmi->dev, "Unable to read pull-up\n"); + dev_err(&pon->pdev->dev, "Unable to read pull-up\n"); return rc; } } - pmic_wd_bark_irq = spmi_get_irq_byname(pon->spmi, NULL, "pmic-wd-bark"); + pmic_wd_bark_irq = platform_get_irq_byname(pon->pdev, "pmic-wd-bark"); /* request the pmic-wd-bark irq only if it is defined */ if (pmic_wd_bark_irq >= 0) { - rc = devm_request_irq(&pon->spmi->dev, pmic_wd_bark_irq, + rc = devm_request_irq(&pon->pdev->dev, pmic_wd_bark_irq, qpnp_pmic_wd_bark_irq, IRQF_TRIGGER_RISING, "qpnp_pmic_wd_bark", pon); if (rc < 0) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't request %d IRQ\n", pmic_wd_bark_irq); goto free_input_dev; @@ -1516,7 +1510,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) if (pon->pon_input) { rc = input_register_device(pon->pon_input); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Can't register pon key: %d\n", rc); goto free_input_dev; } @@ -1527,7 +1521,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) /* Configure the pull-up */ rc = qpnp_config_pull(pon, cfg); if (rc) { - dev_err(&pon->spmi->dev, "Unable to config pull-up\n"); + dev_err(&pon->pdev->dev, "Unable to config pull-up\n"); goto unreg_input_dev; } @@ -1536,7 +1530,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) if (cfg->support_reset) { rc = qpnp_config_reset(pon, cfg); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to config pon reset\n"); goto unreg_input_dev; } @@ -1547,7 +1541,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) cfg->s2_cntl2_addr, QPNP_PON_S2_CNTL_EN, 0); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to disable S2 reset\n"); goto unreg_input_dev; } @@ -1557,12 +1551,12 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) rc = qpnp_pon_request_irqs(pon, cfg); if (rc) { - dev_err(&pon->spmi->dev, "Unable to request-irq's\n"); + dev_err(&pon->pdev->dev, "Unable to request-irq's\n"); goto unreg_input_dev; } } - device_init_wakeup(&pon->spmi->dev, 1); + device_init_wakeup(&pon->pdev->dev, 1); return rc; @@ -1588,7 +1582,7 @@ static int pon_spare_regulator_enable(struct regulator_dev *rdev) rc = qpnp_pon_masked_write(pon_reg->pon, pon_reg->pon->base + pon_reg->addr, value, value); if (rc) - dev_err(&pon_reg->pon->spmi->dev, "Unable to write to %x\n", + dev_err(&pon_reg->pon->pdev->dev, "Unable to write to %x\n", pon_reg->pon->base + pon_reg->addr); else pon_reg->enabled = true; @@ -1608,7 +1602,7 @@ static int pon_spare_regulator_disable(struct regulator_dev *rdev) rc = qpnp_pon_masked_write(pon_reg->pon, pon_reg->pon->base + pon_reg->addr, mask, 0); if (rc) - dev_err(&pon_reg->pon->spmi->dev, "Unable to write to %x\n", + dev_err(&pon_reg->pon->pdev->dev, "Unable to write to %x\n", pon_reg->pon->base + pon_reg->addr); else pon_reg->enabled = false; @@ -1634,7 +1628,7 @@ static int pon_regulator_init(struct qpnp_pon *pon) struct regulator_init_data *init_data; struct regulator_config reg_cfg = {}; struct device_node *node = NULL; - struct device *dev = &pon->spmi->dev; + struct device *dev = &pon->pdev->dev; struct pon_regulator *pon_reg; if (!pon->num_pon_reg) @@ -1749,15 +1743,14 @@ static int qpnp_pon_debugfs_uvlo_dload_get(char *buf, { struct qpnp_pon *pon = sys_reset_dev; int rc = 0; - u8 reg; + uint reg; if (!pon) return -ENODEV; - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_XVDD_RB_SPARE(pon), ®, 1); + rc = regmap_read(pon->regmap, QPNP_PON_XVDD_RB_SPARE(pon), ®); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read addr=%x, rc(%d)\n", QPNP_PON_XVDD_RB_SPARE(pon), rc); return rc; @@ -1772,7 +1765,7 @@ static int qpnp_pon_debugfs_uvlo_dload_set(const char *val, { struct qpnp_pon *pon = sys_reset_dev; int rc = 0; - u8 reg; + uint reg; if (!pon) return -ENODEV; @@ -1783,10 +1776,9 @@ static int qpnp_pon_debugfs_uvlo_dload_set(const char *val, return rc; } - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_XVDD_RB_SPARE(pon), ®, 1); + rc = regmap_read(pon->regmap, QPNP_PON_XVDD_RB_SPARE(pon), ®); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read addr=%x, rc(%d)\n", QPNP_PON_XVDD_RB_SPARE(pon), rc); return rc; @@ -1796,10 +1788,9 @@ static int qpnp_pon_debugfs_uvlo_dload_set(const char *val, if (*(bool *)kp->arg) reg |= QPNP_PON_UVLO_DLOAD_EN; - rc = spmi_ext_register_writel(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_XVDD_RB_SPARE(pon), ®, 1); + rc = regmap_write(pon->regmap, QPNP_PON_XVDD_RB_SPARE(pon), reg); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to write to addr=%hx, rc(%d)\n", QPNP_PON_XVDD_RB_SPARE(pon), rc); return rc; @@ -1841,36 +1832,38 @@ static int qpnp_pon_debugfs_uvlo_set(void *data, u64 val) DEFINE_SIMPLE_ATTRIBUTE(qpnp_pon_debugfs_uvlo_fops, qpnp_pon_debugfs_uvlo_get, qpnp_pon_debugfs_uvlo_set, "0x%02llx\n"); -static void qpnp_pon_debugfs_init(struct spmi_device *spmi) +static void qpnp_pon_debugfs_init(struct platform_device *pdev) { - struct qpnp_pon *pon = dev_get_drvdata(&spmi->dev); + struct qpnp_pon *pon = dev_get_drvdata(&pdev->dev); struct dentry *ent; - pon->debugfs = debugfs_create_dir(dev_name(&spmi->dev), NULL); + pon->debugfs = debugfs_create_dir(dev_name(&pdev->dev), NULL); if (!pon->debugfs) { - dev_err(&pon->spmi->dev, "Unable to create debugfs directory\n"); + dev_err(&pon->pdev->dev, + "Unable to create debugfs directory\n"); } else { ent = debugfs_create_file("uvlo_panic", S_IFREG | S_IWUSR | S_IRUGO, pon->debugfs, pon, &qpnp_pon_debugfs_uvlo_fops); if (!ent) - dev_err(&pon->spmi->dev, "Unable to create uvlo_panic debugfs file.\n"); + dev_err(&pon->pdev->dev, + "Unable to create uvlo_panic debugfs file.\n"); } } -static void qpnp_pon_debugfs_remove(struct spmi_device *spmi) +static void qpnp_pon_debugfs_remove(struct platform_device *pdev) { - struct qpnp_pon *pon = dev_get_drvdata(&spmi->dev); + struct qpnp_pon *pon = dev_get_drvdata(&pdev->dev); debugfs_remove_recursive(pon->debugfs); } #else -static void qpnp_pon_debugfs_init(struct spmi_device *spmi) +static void qpnp_pon_debugfs_init(struct platform_device *pdev) {} -static void qpnp_pon_debugfs_remove(struct spmi_device *spmi) +static void qpnp_pon_debugfs_remove(struct platform_device *pdev) {} #endif @@ -1878,96 +1871,104 @@ static int read_gen2_pon_off_reason(struct qpnp_pon *pon, u16 *reason, int *reason_index_offset) { int rc; - u8 buf[2], reg; + int buf[2], reg; - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_OFF_REASON(pon), - ®, 1); + rc = regmap_read(pon->regmap, + QPNP_PON_OFF_REASON(pon), + ®); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read PON_OFF_REASON reg rc:%d\n", + dev_err(&pon->pdev->dev, "Unable to read PON_OFF_REASON reg rc:%d\n", rc); return rc; } if (reg & QPNP_GEN2_POFF_SEQ) { - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_POFF_REASON1(pon), - buf, 1); + rc = regmap_read(pon->regmap, + QPNP_POFF_REASON1(pon), + buf); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read POFF_REASON1 reg rc:%d\n", + dev_err(&pon->pdev->dev, "Unable to read POFF_REASON1 reg rc:%d\n", rc); return rc; } - *reason = buf[0]; + *reason = (u8)buf[0]; *reason_index_offset = 0; } else if (reg & QPNP_GEN2_FAULT_SEQ) { - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_FAULT_REASON1(pon), - buf, 2); + rc = regmap_bulk_read(pon->regmap, + QPNP_FAULT_REASON1(pon), + buf, 2); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read FAULT_REASON regs rc:%d\n", + dev_err(&pon->pdev->dev, "Unable to read FAULT_REASON regs rc:%d\n", rc); return rc; } - *reason = buf[0] | (buf[1] << 8); + *reason = (u8)buf[0] | (u16)(buf[1] << 8); *reason_index_offset = POFF_REASON_FAULT_OFFSET; } else if (reg & QPNP_GEN2_S3_RESET_SEQ) { - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_S3_RESET_REASON(pon), - buf, 1); + rc = regmap_read(pon->regmap, + QPNP_S3_RESET_REASON(pon), + buf); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read S3_RESET_REASON reg rc:%d\n", + dev_err(&pon->pdev->dev, "Unable to read S3_RESET_REASON reg rc:%d\n", rc); return rc; } - *reason = buf[0]; + *reason = (u8)buf[0]; *reason_index_offset = POFF_REASON_S3_RESET_OFFSET; } return 0; } -static int qpnp_pon_probe(struct spmi_device *spmi) +static int qpnp_pon_probe(struct platform_device *pdev) { struct qpnp_pon *pon; - struct resource *pon_resource; + unsigned int base; struct device_node *node = NULL; u32 delay = 0, s3_debounce = 0; int rc, sys_reset, index; int reason_index_offset = 0; - u8 pon_sts = 0, buf[2]; + u8 buf[2]; + uint pon_sts = 0; u16 poff_sts = 0; const char *s3_src; u8 s3_src_reg; unsigned long flags; + uint temp = 0; - pon = devm_kzalloc(&spmi->dev, sizeof(struct qpnp_pon), - GFP_KERNEL); - if (!pon) { - dev_err(&spmi->dev, "Can't allocate qpnp_pon\n"); + pon = devm_kzalloc(&pdev->dev, sizeof(struct qpnp_pon), GFP_KERNEL); + if (!pon) return -ENOMEM; + + pon->regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!pon->regmap) { + dev_err(&pdev->dev, "Couldn't get parent's regmap\n"); + return -EINVAL; } - sys_reset = of_property_read_bool(spmi->dev.of_node, + sys_reset = of_property_read_bool(pdev->dev.of_node, "qcom,system-reset"); if (sys_reset && sys_reset_dev) { - dev_err(&spmi->dev, "qcom,system-reset property can only be specified for one device on the system\n"); + dev_err(&pdev->dev, + "qcom,system-reset property can only be specified for one device on the system\n"); return -EINVAL; } else if (sys_reset) { sys_reset_dev = pon; } - pon->spmi = spmi; + pon->pdev = pdev; - pon_resource = spmi_get_resource(spmi, NULL, IORESOURCE_MEM, 0); - if (!pon_resource) { - dev_err(&spmi->dev, "Unable to get PON base address\n"); - return -ENXIO; + rc = of_property_read_u32(pdev->dev.of_node, "reg", &base); + if (rc < 0) { + dev_err(&pdev->dev, + "Couldn't find reg in node = %s rc = %d\n", + pdev->dev.of_node->full_name, rc); + return rc; } - pon->base = pon_resource->start; + pon->base = base; /* get the total number of pon configurations */ - for_each_available_child_of_node(spmi->dev.of_node, node) { + for_each_available_child_of_node(pdev->dev.of_node, node) { if (of_find_property(node, "regulator-name", NULL)) { pon->num_pon_reg++; } else if (of_find_property(node, "qcom,pon-type", NULL)) { @@ -1979,43 +1980,47 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } pr_debug("PON@SID %d: num_pon_config: %d num_pon_reg: %d\n", - pon->spmi->sid, pon->num_pon_config, pon->num_pon_reg); + to_spmi_device(pon->pdev->dev.parent)->usid, + pon->num_pon_config, pon->num_pon_reg); rc = pon_regulator_init(pon); if (rc) { - dev_err(&pon->spmi->dev, "Error in pon_regulator_init rc: %d\n", + dev_err(&pdev->dev, "Error in pon_regulator_init rc: %d\n", rc); return rc; } if (!pon->num_pon_config) /* No PON config., do not register the driver */ - dev_info(&spmi->dev, "No PON config. specified\n"); + dev_info(&pdev->dev, "No PON config. specified\n"); else - pon->pon_cfg = devm_kzalloc(&spmi->dev, + pon->pon_cfg = devm_kzalloc(&pdev->dev, sizeof(struct qpnp_pon_config) * pon->num_pon_config, GFP_KERNEL); /* Read PON_PERPH_SUBTYPE register to get PON type */ - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + rc = regmap_read(pon->regmap, QPNP_PON_PERPH_SUBTYPE(pon), - &pon->subtype, 1); + &temp); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read PON_PERPH_SUBTYPE register rc: %d\n", rc); return rc; } + pon->subtype = temp; /* Check if it is rev B */ - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_REVISION2(pon), &pon->pon_ver, 1); + rc = regmap_read(pon->regmap, + QPNP_PON_REVISION2(pon), &temp); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to read addr=%x, rc(%d)\n", QPNP_PON_REVISION2(pon), rc); return rc; } + + pon->pon_ver = temp; if (is_pon_gen1(pon)) { if (pon->pon_ver == 0) pon->pon_ver = QPNP_PON_GEN1_V1; @@ -2026,7 +2031,7 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } else if (pon->subtype == PON_1REG) { pon->pon_ver = QPNP_PON_GEN1_V2; } else { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Invalid PON_PERPH_SUBTYPE value %x\n", pon->subtype); return -EINVAL; @@ -2037,17 +2042,17 @@ static int qpnp_pon_probe(struct spmi_device *spmi) rc = qpnp_pon_store_and_clear_warm_reset(pon); if (rc) { - dev_err(&pon->spmi->dev, + dev_err(&pon->pdev->dev, "Unable to store/clear WARM_RESET_REASONx registers rc: %d\n", rc); return rc; } /* PON reason */ - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_PON_REASON1(pon), &pon_sts, 1); + rc = regmap_read(pon->regmap, QPNP_PON_REASON1(pon), &pon_sts); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read PON_REASON1 reg rc: %d\n", + dev_err(&pon->pdev->dev, + "Unable to read PON_RESASON1 reg rc: %d\n", rc); return rc; } @@ -2055,14 +2060,16 @@ static int qpnp_pon_probe(struct spmi_device *spmi) index = ffs(pon_sts) - 1; cold_boot = !qpnp_pon_is_warm_reset(); if (index >= ARRAY_SIZE(qpnp_pon_reason) || index < 0) { - dev_info(&pon->spmi->dev, + dev_info(&pon->pdev->dev, "PMIC@SID%d Power-on reason: Unknown and '%s' boot\n", - pon->spmi->sid, cold_boot ? "cold" : "warm"); + to_spmi_device(pon->pdev->dev.parent)->usid, + cold_boot ? "cold" : "warm"); } else { pon->pon_trigger_reason = index; - dev_info(&pon->spmi->dev, + dev_info(&pon->pdev->dev, "PMIC@SID%d Power-on reason: %s and '%s' boot\n", - pon->spmi->sid, qpnp_pon_reason[index], + to_spmi_device(pon->pdev->dev.parent)->usid, + qpnp_pon_reason[index], cold_boot ? "cold" : "warm"); } @@ -2073,11 +2080,10 @@ static int qpnp_pon_probe(struct spmi_device *spmi) if (rc) return rc; } else { - rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, - QPNP_POFF_REASON1(pon), - buf, 2); + rc = regmap_bulk_read(pon->regmap, QPNP_POFF_REASON1(pon), + buf, 2); if (rc) { - dev_err(&pon->spmi->dev, "Unable to read POFF_REASON regs rc:%d\n", + dev_err(&pon->pdev->dev, "Unable to read POFF_REASON regs rc:%d\n", rc); return rc; } @@ -2085,36 +2091,37 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } index = ffs(poff_sts) - 1 + reason_index_offset; if (index >= ARRAY_SIZE(qpnp_poff_reason) || index < 0) { - dev_info(&pon->spmi->dev, + dev_info(&pon->pdev->dev, "PMIC@SID%d: Unknown power-off reason\n", - pon->spmi->sid); + to_spmi_device(pon->pdev->dev.parent)->usid); } else { pon->pon_power_off_reason = index; - dev_info(&pon->spmi->dev, + dev_info(&pon->pdev->dev, "PMIC@SID%d: Power-off reason: %s\n", - pon->spmi->sid, + to_spmi_device(pon->pdev->dev.parent)->usid, qpnp_poff_reason[index]); } if (pon->pon_trigger_reason == PON_SMPL || pon->pon_power_off_reason == QPNP_POFF_REASON_UVLO) { - if (of_property_read_bool(spmi->dev.of_node, + if (of_property_read_bool(pdev->dev.of_node, "qcom,uvlo-panic")) panic("An UVLO was occurred."); } /* program s3 debounce */ - rc = of_property_read_u32(pon->spmi->dev.of_node, + rc = of_property_read_u32(pon->pdev->dev.of_node, "qcom,s3-debounce", &s3_debounce); if (rc) { if (rc != -EINVAL) { - dev_err(&pon->spmi->dev, "Unable to read s3 timer rc:%d\n", + dev_err(&pon->pdev->dev, + "Unable to read s3 timer rc:%d\n", rc); return rc; } } else { if (s3_debounce > QPNP_PON_S3_TIMER_SECS_MAX) { - dev_info(&pon->spmi->dev, + dev_info(&pon->pdev->dev, "Exceeded S3 max value, set it to max\n"); s3_debounce = QPNP_PON_S3_TIMER_SECS_MAX; } @@ -2127,7 +2134,7 @@ static int qpnp_pon_probe(struct spmi_device *spmi) rc = qpnp_pon_masked_write(pon, QPNP_PON_SEC_ACCESS(pon), 0xFF, QPNP_PON_SEC_UNLOCK); if (rc) { - dev_err(&spmi->dev, "Unable to do SEC_ACCESS rc:%d\n", + dev_err(&pdev->dev, "Unable to do SEC_ACCESS rc:%d\n", rc); return rc; } @@ -2135,7 +2142,8 @@ static int qpnp_pon_probe(struct spmi_device *spmi) rc = qpnp_pon_masked_write(pon, QPNP_PON_S3_DBC_CTL(pon), QPNP_PON_S3_DBC_DELAY_MASK, s3_debounce); if (rc) { - dev_err(&spmi->dev, "Unable to set S3 debounce rc:%d\n", + dev_err(&pdev->dev, + "Unable to set S3 debounce rc:%d\n", rc); return rc; } @@ -2143,10 +2151,10 @@ static int qpnp_pon_probe(struct spmi_device *spmi) /* program s3 source */ s3_src = "kpdpwr-and-resin"; - rc = of_property_read_string(pon->spmi->dev.of_node, + rc = of_property_read_string(pon->pdev->dev.of_node, "qcom,s3-src", &s3_src); if (rc && rc != -EINVAL) { - dev_err(&pon->spmi->dev, "Unable to read s3 timer rc: %d\n", + dev_err(&pon->pdev->dev, "Unable to read s3 timer rc: %d\n", rc); return rc; } @@ -2168,27 +2176,29 @@ static int qpnp_pon_probe(struct spmi_device *spmi) rc = qpnp_pon_masked_write(pon, QPNP_PON_S3_SRC(pon), QPNP_PON_S3_SRC_MASK, s3_src_reg); if (rc) { - dev_err(&spmi->dev, "Unable to program s3 source rc: %d\n", rc); + dev_err(&pdev->dev, "Unable to program s3 source rc: %d\n", + rc); return rc; } - dev_set_drvdata(&spmi->dev, pon); + dev_set_drvdata(&pdev->dev, pon); INIT_DELAYED_WORK(&pon->bark_work, bark_work_func); /* register the PON configurations */ rc = qpnp_pon_config_init(pon); if (rc) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Unable to initialize PON configurations rc: %d\n", rc); return rc; } - rc = of_property_read_u32(pon->spmi->dev.of_node, + rc = of_property_read_u32(pon->pdev->dev.of_node, "qcom,pon-dbc-delay", &delay); if (rc) { if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read debounce delay rc: %d\n", + dev_err(&pdev->dev, + "Unable to read debounce delay rc: %d\n", rc); return rc; } @@ -2196,65 +2206,65 @@ static int qpnp_pon_probe(struct spmi_device *spmi) rc = qpnp_pon_set_dbc(pon, delay); } - rc = of_property_read_u32(pon->spmi->dev.of_node, + rc = of_property_read_u32(pon->pdev->dev.of_node, "qcom,warm-reset-poweroff-type", &pon->warm_reset_poff_type); if (rc) { if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read warm reset poweroff type rc: %d\n", + dev_err(&pdev->dev, "Unable to read warm reset poweroff type rc: %d\n", rc); return rc; } pon->warm_reset_poff_type = -EINVAL; } else if (pon->warm_reset_poff_type <= PON_POWER_OFF_RESERVED || pon->warm_reset_poff_type >= PON_POWER_OFF_MAX_TYPE) { - dev_err(&spmi->dev, "Invalid warm-reset-poweroff-type\n"); + dev_err(&pdev->dev, "Invalid warm-reset-poweroff-type\n"); pon->warm_reset_poff_type = -EINVAL; } - rc = of_property_read_u32(pon->spmi->dev.of_node, + rc = of_property_read_u32(pon->pdev->dev.of_node, "qcom,hard-reset-poweroff-type", &pon->hard_reset_poff_type); if (rc) { if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read hard reset poweroff type rc: %d\n", + dev_err(&pdev->dev, "Unable to read hard reset poweroff type rc: %d\n", rc); return rc; } pon->hard_reset_poff_type = -EINVAL; } else if (pon->hard_reset_poff_type <= PON_POWER_OFF_RESERVED || pon->hard_reset_poff_type >= PON_POWER_OFF_MAX_TYPE) { - dev_err(&spmi->dev, "Invalid hard-reset-poweroff-type\n"); + dev_err(&pdev->dev, "Invalid hard-reset-poweroff-type\n"); pon->hard_reset_poff_type = -EINVAL; } - rc = of_property_read_u32(pon->spmi->dev.of_node, + rc = of_property_read_u32(pon->pdev->dev.of_node, "qcom,shutdown-poweroff-type", &pon->shutdown_poff_type); if (rc) { if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read shutdown poweroff type rc: %d\n", + dev_err(&pdev->dev, "Unable to read shutdown poweroff type rc: %d\n", rc); return rc; } pon->shutdown_poff_type = -EINVAL; } else if (pon->shutdown_poff_type <= PON_POWER_OFF_RESERVED || pon->shutdown_poff_type >= PON_POWER_OFF_MAX_TYPE) { - dev_err(&spmi->dev, "Invalid shutdown-poweroff-type\n"); + dev_err(&pdev->dev, "Invalid shutdown-poweroff-type\n"); pon->shutdown_poff_type = -EINVAL; } - rc = device_create_file(&spmi->dev, &dev_attr_debounce_us); + rc = device_create_file(&pdev->dev, &dev_attr_debounce_us); if (rc) { - dev_err(&spmi->dev, "sys file creation failed rc: %d\n", - rc); + dev_err(&pdev->dev, "sys file creation failed rc: %d\n", rc); return rc; } - if (of_property_read_bool(spmi->dev.of_node, + if (of_property_read_bool(pdev->dev.of_node, "qcom,secondary-pon-reset")) { if (sys_reset) { - dev_err(&spmi->dev, "qcom,system-reset property shouldn't be used along with qcom,secondary-pon-reset property\n"); + dev_err(&pdev->dev, + "qcom,system-reset property shouldn't be used along with qcom,secondary-pon-reset property\n"); return -EINVAL; } spin_lock_irqsave(&spon_list_slock, flags); @@ -2266,26 +2276,25 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } /* config whether store the hard reset reason */ - pon->store_hard_reset_reason = of_property_read_bool( - spmi->dev.of_node, + pon->store_hard_reset_reason = of_property_read_bool(pdev->dev.of_node, "qcom,store-hard-reset-reason"); - qpnp_pon_debugfs_init(spmi); + qpnp_pon_debugfs_init(pdev); return 0; } -static int qpnp_pon_remove(struct spmi_device *spmi) +static int qpnp_pon_remove(struct platform_device *pdev) { - struct qpnp_pon *pon = dev_get_drvdata(&spmi->dev); + struct qpnp_pon *pon = dev_get_drvdata(&pdev->dev); unsigned long flags; - device_remove_file(&spmi->dev, &dev_attr_debounce_us); + device_remove_file(&pdev->dev, &dev_attr_debounce_us); cancel_delayed_work_sync(&pon->bark_work); if (pon->pon_input) input_unregister_device(pon->pon_input); - qpnp_pon_debugfs_remove(spmi); + qpnp_pon_debugfs_remove(pdev); if (pon->is_spon) { spin_lock_irqsave(&spon_list_slock, flags); list_del(&pon->list); @@ -2299,10 +2308,10 @@ static struct of_device_id spmi_match_table[] = { {} }; -static struct spmi_driver qpnp_pon_driver = { +static struct platform_driver qpnp_pon_driver = { .driver = { - .name = "qcom,qpnp-power-on", - .of_match_table = spmi_match_table, + .name = "qcom,qpnp-power-on", + .of_match_table = spmi_match_table, }, .probe = qpnp_pon_probe, .remove = qpnp_pon_remove, @@ -2310,13 +2319,13 @@ static struct spmi_driver qpnp_pon_driver = { static int __init qpnp_pon_init(void) { - return spmi_driver_register(&qpnp_pon_driver); + return platform_driver_register(&qpnp_pon_driver); } subsys_initcall(qpnp_pon_init); static void __exit qpnp_pon_exit(void) { - return spmi_driver_unregister(&qpnp_pon_driver); + return platform_driver_unregister(&qpnp_pon_driver); } module_exit(qpnp_pon_exit); |
