diff options
Diffstat (limited to 'drivers/power/qpnp-smbcharger.c')
-rw-r--r-- | drivers/power/qpnp-smbcharger.c | 437 |
1 files changed, 228 insertions, 209 deletions
diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index d9d90ae66eae..5a32b1c7c098 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -11,7 +11,7 @@ */ #define pr_fmt(fmt) "SMBCHG: %s: " fmt, __func__ -#include <linux/spmi.h> +#include <linux/regmap.h> #include <linux/spinlock.h> #include <linux/gpio.h> #include <linux/errno.h> @@ -23,11 +23,13 @@ #include <linux/power_supply.h> #include <linux/of.h> #include <linux/of_gpio.h> +#include <linux/of_irq.h> #include <linux/bitops.h> #include <linux/regulator/driver.h> #include <linux/regulator/of_regulator.h> #include <linux/regulator/machine.h> #include <linux/spmi.h> +#include <linux/platform_device.h> #include <linux/printk.h> #include <linux/ratelimit.h> #include <linux/debugfs.h> @@ -94,7 +96,8 @@ struct smbchg_version_tables { struct smbchg_chip { struct device *dev; - struct spmi_device *spmi; + struct platform_device *pdev; + struct regmap *regmap; int schg_version; /* peripheral register address bases */ @@ -493,52 +496,21 @@ static int smbchg_read(struct smbchg_chip *chip, u8 *val, u16 addr, int count) { int rc = 0; - struct spmi_device *spmi = chip->spmi; + struct platform_device *pdev = chip->pdev; if (addr == 0) { dev_err(chip->dev, "addr cannot be zero addr=0x%02x sid=0x%02x rc=%d\n", - addr, spmi->sid, rc); + addr, to_spmi_device(pdev->dev.parent)->usid, rc); return -EINVAL; } - rc = spmi_ext_register_readl(spmi->ctrl, spmi->sid, addr, val, count); + rc = regmap_bulk_read(chip->regmap, addr, val, count); if (rc) { dev_err(chip->dev, "spmi read failed addr=0x%02x sid=0x%02x rc=%d\n", - addr, spmi->sid, rc); - return rc; - } - return 0; -} - -/* - * Writes an arbitrary number of bytes to a specified register - * - * Do not use this function for register writes if possible. Instead use the - * smbchg_masked_write function. - * - * The sec_access_lock must be held for all register writes and this function - * does not do that. If this function is used, please hold the spinlock or - * random secure access writes may fail. - */ -static int smbchg_write(struct smbchg_chip *chip, u8 *val, - u16 addr, int count) -{ - int rc = 0; - struct spmi_device *spmi = chip->spmi; - - if (addr == 0) { - dev_err(chip->dev, "addr cannot be zero addr=0x%02x sid=0x%02x rc=%d\n", - addr, spmi->sid, rc); - return -EINVAL; - } - - rc = spmi_ext_register_writel(spmi->ctrl, spmi->sid, addr, val, count); - if (rc) { - dev_err(chip->dev, "write failed addr=0x%02x sid=0x%02x rc=%d\n", - addr, spmi->sid, rc); + addr, to_spmi_device(pdev->dev.parent)->usid, + rc); return rc; } - return 0; } @@ -556,21 +528,8 @@ static int smbchg_masked_write_raw(struct smbchg_chip *chip, u16 base, u8 mask, u8 val) { int rc; - u8 reg; - rc = smbchg_read(chip, ®, base, 1); - if (rc) { - dev_err(chip->dev, "spmi read failed: addr=%03X, rc=%d\n", - base, rc); - return rc; - } - - reg &= ~mask; - reg |= val & mask; - - pr_smb(PR_REGISTER, "addr = 0x%x writing 0x%x\n", base, reg); - - rc = smbchg_write(chip, ®, base, 1); + rc = regmap_update_bits(chip->regmap, base, mask, val); if (rc) { dev_err(chip->dev, "spmi write failed: addr=%03X, rc=%d\n", base, rc); @@ -3428,7 +3387,7 @@ static int smbchg_config_chg_battery_type(struct smbchg_chip *chip) { int rc = 0, max_voltage_uv = 0, fastchg_ma = 0, ret = 0, iterm_ua = 0; struct device_node *batt_node, *profile_node; - struct device_node *node = chip->spmi->dev.of_node; + struct device_node *node = chip->pdev->dev.of_node; union power_supply_propval prop = {0,}; rc = chip->bms_psy->get_property(chip->bms_psy, @@ -3508,7 +3467,7 @@ static int smbchg_config_chg_battery_type(struct smbchg_chip *chip) * Only configure from profile if fastchg-ma is not defined in the * charger device node. */ - if (!of_find_property(chip->spmi->dev.of_node, + if (!of_find_property(chip->pdev->dev.of_node, "qcom,fastchg-current-ma", NULL)) { rc = of_property_read_u32(profile_node, "qcom,fastchg-current-ma", &fastchg_ma); @@ -7044,7 +7003,7 @@ do { \ if (optional) \ prop = -EINVAL; \ \ - retval = of_property_read_u32(chip->spmi->dev.of_node, \ + retval = of_property_read_u32(chip->pdev->dev.of_node, \ "qcom," dt_property , \ &prop); \ \ @@ -7213,11 +7172,9 @@ static int smb_parse_dt(struct smbchg_chip *chip) /* * use the dt values if they exist, otherwise do not touch the params */ - of_property_read_u32(chip->spmi->dev.of_node, - "qcom,parallel-main-chg-fcc-percent", + of_property_read_u32(node, "qcom,parallel-main-chg-fcc-percent", &smbchg_main_chg_fcc_percent); - of_property_read_u32(chip->spmi->dev.of_node, - "qcom,parallel-main-chg-icl-percent", + of_property_read_u32(node, "qcom,parallel-main-chg-icl-percent", &smbchg_main_chg_icl_percent); pr_smb(PR_STATUS, "parallel usb thr: %d, 9v thr: %d\n", chip->parallel.min_current_thr_ma, @@ -7254,7 +7211,7 @@ static int smb_parse_dt(struct smbchg_chip *chip) "qcom,skip-usb-suspend-for-fake-battery"); /* parse the battery missing detection pin source */ - rc = of_property_read_string(chip->spmi->dev.of_node, + rc = of_property_read_string(chip->pdev->dev.of_node, "qcom,bmd-pin-src", &bpd); if (rc) { /* Select BAT_THM as default BPD scheme */ @@ -7360,50 +7317,52 @@ static int smb_parse_dt(struct smbchg_chip *chip) #define SMBCHG_LITE_USB_CHGPTH_SUBTYPE 0x54 #define SMBCHG_LITE_DC_CHGPTH_SUBTYPE 0x55 #define SMBCHG_LITE_MISC_SUBTYPE 0x57 -#define REQUEST_IRQ(chip, resource, irq_num, irq_name, irq_handler, flags, rc)\ -do { \ - irq_num = spmi_get_irq_byname(chip->spmi, \ - resource, irq_name); \ - if (irq_num < 0) { \ - dev_err(chip->dev, "Unable to get " irq_name " irq\n"); \ - return -ENXIO; \ - } \ - rc = devm_request_threaded_irq(chip->dev, \ - irq_num, NULL, irq_handler, flags, irq_name, \ - chip); \ - if (rc < 0) { \ - dev_err(chip->dev, "Unable to request " irq_name " irq: %d\n",\ - rc); \ - return -ENXIO; \ - } \ -} while (0) +static int smbchg_request_irq(struct smbchg_chip *chip, + struct device_node *child, + int irq_num, char *irq_name, + irqreturn_t (irq_handler)(int irq, void *_chip), + int flags) +{ + int rc; + + irq_num = of_irq_get_byname(child, irq_name); + if (irq_num < 0) { + dev_err(chip->dev, "Unable to get %s irqn", irq_name); + rc = -ENXIO; + } + rc = devm_request_threaded_irq(chip->dev, + irq_num, NULL, irq_handler, flags, irq_name, + chip); + if (rc < 0) { + dev_err(chip->dev, "Unable to request %s irq: %dn", + irq_name, rc); + rc = -ENXIO; + } + return 0; +} static int smbchg_request_irqs(struct smbchg_chip *chip) { int rc = 0; - struct resource *resource; - struct spmi_resource *spmi_resource; + unsigned int base; + struct device_node *child; u8 subtype; - struct spmi_device *spmi = chip->spmi; unsigned long flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT; - spmi_for_each_container_dev(spmi_resource, chip->spmi) { - if (!spmi_resource) { - dev_err(chip->dev, "spmi resource absent\n"); - return rc; - } + if (of_get_available_child_count(chip->pdev->dev.of_node) == 0) { + pr_err("no child nodes\n"); + return -ENXIO; + } - resource = spmi_get_resource(spmi, spmi_resource, - IORESOURCE_MEM, 0); - if (!(resource && resource->start)) { - dev_err(chip->dev, "node %s IO resource absent!\n", - spmi->dev.of_node->full_name); - return rc; + for_each_available_child_of_node(chip->pdev->dev.of_node, child) { + rc = of_property_read_u32(child, "reg", &base); + if (rc < 0) { + rc = 0; + continue; } - rc = smbchg_read(chip, &subtype, - resource->start + SUBTYPE_REG, 1); + rc = smbchg_read(chip, &subtype, base + SUBTYPE_REG, 1); if (rc) { dev_err(chip->dev, "Peripheral subtype read failed rc=%d\n", rc); @@ -7413,37 +7372,66 @@ static int smbchg_request_irqs(struct smbchg_chip *chip) switch (subtype) { case SMBCHG_CHGR_SUBTYPE: case SMBCHG_LITE_CHGR_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, chip->chg_error_irq, - "chg-error", chg_error_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->taper_irq, + rc = smbchg_request_irq(chip, child, + chip->chg_error_irq, "chg-error", + chg_error_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->taper_irq, "chg-taper-thr", taper_handler, - (IRQF_TRIGGER_RISING | IRQF_ONESHOT), rc); + (IRQF_TRIGGER_RISING | IRQF_ONESHOT)); + if (rc < 0) + return rc; disable_irq_nosync(chip->taper_irq); - REQUEST_IRQ(chip, spmi_resource, chip->chg_term_irq, + rc = smbchg_request_irq(chip, child, chip->chg_term_irq, "chg-tcc-thr", chg_term_handler, - (IRQF_TRIGGER_RISING | IRQF_ONESHOT), rc); - REQUEST_IRQ(chip, spmi_resource, chip->recharge_irq, - "chg-rechg-thr", recharge_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->fastchg_irq, - "chg-p2f-thr", fastchg_handler, flags, rc); + (IRQF_TRIGGER_RISING | IRQF_ONESHOT)); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->recharge_irq, + "chg-rechg-thr", recharge_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->fastchg_irq, + "chg-p2f-thr", fastchg_handler, flags); + if (rc < 0) + return rc; enable_irq_wake(chip->chg_term_irq); enable_irq_wake(chip->chg_error_irq); enable_irq_wake(chip->fastchg_irq); break; case SMBCHG_BAT_IF_SUBTYPE: case SMBCHG_LITE_BAT_IF_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, chip->batt_hot_irq, - "batt-hot", batt_hot_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->batt_warm_irq, - "batt-warm", batt_warm_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->batt_cool_irq, - "batt-cool", batt_cool_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->batt_cold_irq, - "batt-cold", batt_cold_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->batt_missing_irq, - "batt-missing", batt_pres_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->vbat_low_irq, - "batt-low", vbat_low_handler, flags, rc); + rc = smbchg_request_irq(chip, child, chip->batt_hot_irq, + "batt-hot", batt_hot_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->batt_warm_irq, + "batt-warm", batt_warm_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->batt_cool_irq, + "batt-cool", batt_cool_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->batt_cold_irq, + "batt-cold", batt_cold_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->batt_missing_irq, + "batt-missing", batt_pres_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->vbat_low_irq, + "batt-low", vbat_low_handler, flags); + if (rc < 0) + return rc; + enable_irq_wake(chip->batt_hot_irq); enable_irq_wake(chip->batt_warm_irq); enable_irq_wake(chip->batt_cool_irq); @@ -7453,33 +7441,49 @@ static int smbchg_request_irqs(struct smbchg_chip *chip) break; case SMBCHG_USB_CHGPTH_SUBTYPE: case SMBCHG_LITE_USB_CHGPTH_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, chip->usbin_uv_irq, + rc = smbchg_request_irq(chip, child, + chip->usbin_uv_irq, "usbin-uv", usbin_uv_handler, - flags | IRQF_EARLY_RESUME, rc); - REQUEST_IRQ(chip, spmi_resource, chip->usbin_ov_irq, - "usbin-ov", usbin_ov_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->src_detect_irq, + flags | IRQF_EARLY_RESUME); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->usbin_ov_irq, + "usbin-ov", usbin_ov_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->src_detect_irq, "usbin-src-det", - src_detect_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->aicl_done_irq, + src_detect_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, + chip->aicl_done_irq, "aicl-done", aicl_done_handler, - (IRQF_TRIGGER_RISING | IRQF_ONESHOT), - rc); + (IRQF_TRIGGER_RISING | IRQF_ONESHOT)); + if (rc < 0) + return rc; + if (chip->schg_version != QPNP_SCHG_LITE) { - REQUEST_IRQ(chip, spmi_resource, + rc = smbchg_request_irq(chip, child, chip->otg_fail_irq, "otg-fail", - otg_fail_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, + otg_fail_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->otg_oc_irq, "otg-oc", otg_oc_handler, - (IRQF_TRIGGER_RISING | IRQF_ONESHOT), - rc); - REQUEST_IRQ(chip, spmi_resource, + (IRQF_TRIGGER_RISING | IRQF_ONESHOT)); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->usbid_change_irq, "usbid-change", usbid_change_handler, - (IRQF_TRIGGER_FALLING | IRQF_ONESHOT), - rc); + (IRQF_TRIGGER_FALLING | IRQF_ONESHOT)); + if (rc < 0) + return rc; enable_irq_wake(chip->otg_oc_irq); enable_irq_wake(chip->usbid_change_irq); enable_irq_wake(chip->otg_fail_irq); @@ -7494,38 +7498,50 @@ static int smbchg_request_irqs(struct smbchg_chip *chip) break; case SMBCHG_DC_CHGPTH_SUBTYPE: case SMBCHG_LITE_DC_CHGPTH_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, chip->dcin_uv_irq, - "dcin-uv", dcin_uv_handler, flags, rc); + rc = smbchg_request_irq(chip, child, chip->dcin_uv_irq, + "dcin-uv", dcin_uv_handler, flags); + if (rc < 0) + return rc; enable_irq_wake(chip->dcin_uv_irq); break; case SMBCHG_MISC_SUBTYPE: case SMBCHG_LITE_MISC_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, chip->power_ok_irq, - "power-ok", power_ok_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, chip->chg_hot_irq, - "temp-shutdown", chg_hot_handler, flags, rc); - REQUEST_IRQ(chip, spmi_resource, - chip->wdog_timeout_irq, + rc = smbchg_request_irq(chip, child, chip->power_ok_irq, + "power-ok", power_ok_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->chg_hot_irq, + "temp-shutdown", chg_hot_handler, flags); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->wdog_timeout_irq, "wdog-timeout", - wdog_timeout_handler, flags, rc); + wdog_timeout_handler, flags); + if (rc < 0) + return rc; enable_irq_wake(chip->chg_hot_irq); enable_irq_wake(chip->wdog_timeout_irq); break; case SMBCHG_OTG_SUBTYPE: break; case SMBCHG_LITE_OTG_SUBTYPE: - REQUEST_IRQ(chip, spmi_resource, + rc = smbchg_request_irq(chip, child, chip->usbid_change_irq, "usbid-change", usbid_change_handler, - (IRQF_TRIGGER_FALLING | IRQF_ONESHOT), - rc); - REQUEST_IRQ(chip, spmi_resource, + (IRQF_TRIGGER_FALLING | IRQF_ONESHOT)); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->otg_oc_irq, "otg-oc", otg_oc_handler, - (IRQF_TRIGGER_RISING | IRQF_ONESHOT), rc); - REQUEST_IRQ(chip, spmi_resource, + (IRQF_TRIGGER_RISING | IRQF_ONESHOT)); + if (rc < 0) + return rc; + rc = smbchg_request_irq(chip, child, chip->otg_fail_irq, "otg-fail", - otg_fail_handler, flags, rc); + otg_fail_handler, flags); + if (rc < 0) + return rc; enable_irq_wake(chip->usbid_change_irq); enable_irq_wake(chip->otg_oc_irq); enable_irq_wake(chip->otg_fail_irq); @@ -7547,27 +7563,23 @@ do { \ static int smbchg_parse_peripherals(struct smbchg_chip *chip) { int rc = 0; - struct resource *resource; - struct spmi_resource *spmi_resource; + unsigned int base; + struct device_node *child; u8 subtype; - struct spmi_device *spmi = chip->spmi; - spmi_for_each_container_dev(spmi_resource, chip->spmi) { - if (!spmi_resource) { - dev_err(chip->dev, "spmi resource absent\n"); - return rc; - } + if (of_get_available_child_count(chip->pdev->dev.of_node) == 0) { + pr_err("no child nodes\n"); + return -ENXIO; + } - resource = spmi_get_resource(spmi, spmi_resource, - IORESOURCE_MEM, 0); - if (!(resource && resource->start)) { - dev_err(chip->dev, "node %s IO resource absent!\n", - spmi->dev.of_node->full_name); - return rc; + for_each_available_child_of_node(chip->pdev->dev.of_node, child) { + rc = of_property_read_u32(child, "reg", &base); + if (rc < 0) { + rc = 0; + continue; } - rc = smbchg_read(chip, &subtype, - resource->start + SUBTYPE_REG, 1); + rc = smbchg_read(chip, &subtype, base + SUBTYPE_REG, 1); if (rc) { dev_err(chip->dev, "Peripheral subtype read failed rc=%d\n", rc); @@ -7577,27 +7589,27 @@ static int smbchg_parse_peripherals(struct smbchg_chip *chip) switch (subtype) { case SMBCHG_CHGR_SUBTYPE: case SMBCHG_LITE_CHGR_SUBTYPE: - chip->chgr_base = resource->start; + chip->chgr_base = base; break; case SMBCHG_BAT_IF_SUBTYPE: case SMBCHG_LITE_BAT_IF_SUBTYPE: - chip->bat_if_base = resource->start; + chip->bat_if_base = base; break; case SMBCHG_USB_CHGPTH_SUBTYPE: case SMBCHG_LITE_USB_CHGPTH_SUBTYPE: - chip->usb_chgpth_base = resource->start; + chip->usb_chgpth_base = base; break; case SMBCHG_DC_CHGPTH_SUBTYPE: case SMBCHG_LITE_DC_CHGPTH_SUBTYPE: - chip->dc_chgpth_base = resource->start; + chip->dc_chgpth_base = base; break; case SMBCHG_MISC_SUBTYPE: case SMBCHG_LITE_MISC_SUBTYPE: - chip->misc_base = resource->start; + chip->misc_base = base; break; case SMBCHG_OTG_SUBTYPE: case SMBCHG_LITE_OTG_SUBTYPE: - chip->otg_base = resource->start; + chip->otg_base = base; break; } } @@ -7680,7 +7692,7 @@ static int smbchg_check_chg_version(struct smbchg_chip *chip) struct device_node *revid_dev_node; int rc; - revid_dev_node = of_parse_phandle(chip->spmi->dev.of_node, + revid_dev_node = of_parse_phandle(chip->pdev->dev.of_node, "qcom,pmic-revid", 0); if (!revid_dev_node) { pr_err("Missing qcom,pmic-revid property - driver failed\n"); @@ -7786,7 +7798,7 @@ static void rerun_hvdcp_det_if_necessary(struct smbchg_chip *chip) } } -static int smbchg_probe(struct spmi_device *spmi) +static int smbchg_probe(struct platform_device *pdev) { int rc; struct smbchg_chip *chip; @@ -7800,9 +7812,9 @@ static int smbchg_probe(struct spmi_device *spmi) return -EPROBE_DEFER; } - if (of_property_read_bool(spmi->dev.of_node, "qcom,external-typec")) { + if (of_property_read_bool(pdev->dev.of_node, "qcom,external-typec")) { /* read the type power supply name */ - rc = of_property_read_string(spmi->dev.of_node, + rc = of_property_read_string(pdev->dev.of_node, "qcom,typec-psy-name", &typec_psy_name); if (rc) { pr_err("failed to get prop typec-psy-name rc=%d\n", @@ -7818,91 +7830,97 @@ static int smbchg_probe(struct spmi_device *spmi) } } - if (of_find_property(spmi->dev.of_node, "qcom,dcin-vadc", NULL)) { - vadc_dev = qpnp_get_vadc(&spmi->dev, "dcin"); + if (of_find_property(pdev->dev.of_node, "qcom,dcin-vadc", NULL)) { + vadc_dev = qpnp_get_vadc(&pdev->dev, "dcin"); if (IS_ERR(vadc_dev)) { rc = PTR_ERR(vadc_dev); if (rc != -EPROBE_DEFER) - dev_err(&spmi->dev, "Couldn't get vadc rc=%d\n", + dev_err(&pdev->dev, + "Couldn't get vadc rc=%d\n", rc); return rc; } } - if (of_find_property(spmi->dev.of_node, "qcom,vchg_sns-vadc", NULL)) { - vchg_vadc_dev = qpnp_get_vadc(&spmi->dev, "vchg_sns"); + if (of_find_property(pdev->dev.of_node, "qcom,vchg_sns-vadc", NULL)) { + vchg_vadc_dev = qpnp_get_vadc(&pdev->dev, "vchg_sns"); if (IS_ERR(vchg_vadc_dev)) { rc = PTR_ERR(vchg_vadc_dev); if (rc != -EPROBE_DEFER) - dev_err(&spmi->dev, "Couldn't get vadc 'vchg' rc=%d\n", + dev_err(&pdev->dev, "Couldn't get vadc 'vchg' rc=%d\n", rc); return rc; } } - chip = devm_kzalloc(&spmi->dev, sizeof(*chip), GFP_KERNEL); - if (!chip) { - dev_err(&spmi->dev, "Unable to allocate memory\n"); + + chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL); + if (!chip) return -ENOMEM; + + chip->regmap = dev_get_regmap(pdev->dev.parent, NULL); + if (!chip->regmap) { + dev_err(&pdev->dev, "Couldn't get parent's regmap\n"); + return -EINVAL; } - chip->fcc_votable = create_votable(&spmi->dev, + chip->fcc_votable = create_votable(&pdev->dev, "SMBCHG: fcc", VOTE_MIN, NUM_FCC_VOTER, 2000, set_fastchg_current_vote_cb); if (IS_ERR(chip->fcc_votable)) return PTR_ERR(chip->fcc_votable); - chip->usb_icl_votable = create_votable(&spmi->dev, + chip->usb_icl_votable = create_votable(&pdev->dev, "SMBCHG: usb_icl", VOTE_MIN, NUM_ICL_VOTER, 3000, set_usb_current_limit_vote_cb); if (IS_ERR(chip->usb_icl_votable)) return PTR_ERR(chip->usb_icl_votable); - chip->dc_icl_votable = create_votable(&spmi->dev, + chip->dc_icl_votable = create_votable(&pdev->dev, "SMBCHG: dcl_icl", VOTE_MIN, NUM_ICL_VOTER, 3000, set_dc_current_limit_vote_cb); if (IS_ERR(chip->dc_icl_votable)) return PTR_ERR(chip->dc_icl_votable); - chip->usb_suspend_votable = create_votable(&spmi->dev, + chip->usb_suspend_votable = create_votable(&pdev->dev, "SMBCHG: usb_suspend", VOTE_SET_ANY, NUM_EN_VOTERS, 0, usb_suspend_vote_cb); if (IS_ERR(chip->usb_suspend_votable)) return PTR_ERR(chip->usb_suspend_votable); - chip->dc_suspend_votable = create_votable(&spmi->dev, + chip->dc_suspend_votable = create_votable(&pdev->dev, "SMBCHG: dc_suspend", VOTE_SET_ANY, NUM_EN_VOTERS, 0, dc_suspend_vote_cb); if (IS_ERR(chip->dc_suspend_votable)) return PTR_ERR(chip->dc_suspend_votable); - chip->battchg_suspend_votable = create_votable(&spmi->dev, + chip->battchg_suspend_votable = create_votable(&pdev->dev, "SMBCHG: battchg_suspend", VOTE_SET_ANY, NUM_BATTCHG_EN_VOTERS, 0, charging_suspend_vote_cb); if (IS_ERR(chip->battchg_suspend_votable)) return PTR_ERR(chip->battchg_suspend_votable); - chip->hw_aicl_rerun_disable_votable = create_votable(&spmi->dev, + chip->hw_aicl_rerun_disable_votable = create_votable(&pdev->dev, "SMBCHG: hwaicl_disable", VOTE_SET_ANY, NUM_HW_AICL_DISABLE_VOTERS, 0, smbchg_hw_aicl_rerun_disable_cb); if (IS_ERR(chip->hw_aicl_rerun_disable_votable)) return PTR_ERR(chip->hw_aicl_rerun_disable_votable); - chip->hw_aicl_rerun_enable_indirect_votable = create_votable(&spmi->dev, + chip->hw_aicl_rerun_enable_indirect_votable = create_votable(&pdev->dev, "SMBCHG: hwaicl_enable_indirect", VOTE_SET_ANY, NUM_HW_AICL_RERUN_ENABLE_INDIRECT_VOTERS, 0, smbchg_hw_aicl_rerun_enable_indirect_cb); if (IS_ERR(chip->hw_aicl_rerun_enable_indirect_votable)) return PTR_ERR(chip->hw_aicl_rerun_enable_indirect_votable); - chip->aicl_deglitch_short_votable = create_votable(&spmi->dev, + chip->aicl_deglitch_short_votable = create_votable(&pdev->dev, "SMBCHG: hwaicl_short_deglitch", VOTE_SET_ANY, NUM_HW_SHORT_DEGLITCH_VOTERS, 0, smbchg_aicl_deglitch_config_cb); @@ -7920,13 +7938,14 @@ static int smbchg_probe(struct spmi_device *spmi) init_completion(&chip->usbin_uv_raised); chip->vadc_dev = vadc_dev; chip->vchg_vadc_dev = vchg_vadc_dev; - chip->spmi = spmi; - chip->dev = &spmi->dev; + chip->pdev = pdev; + chip->dev = &pdev->dev; + chip->usb_psy = usb_psy; chip->typec_psy = typec_psy; chip->fake_battery_soc = -EINVAL; chip->usb_online = -EINVAL; - dev_set_drvdata(&spmi->dev, chip); + dev_set_drvdata(&pdev->dev, chip); spin_lock_init(&chip->sec_access_lock); mutex_init(&chip->therm_lvl_lock); @@ -7952,27 +7971,27 @@ static int smbchg_probe(struct spmi_device *spmi) rc = smb_parse_dt(chip); if (rc < 0) { - dev_err(&spmi->dev, "Unable to parse DT nodes: %d\n", rc); + dev_err(&pdev->dev, "Unable to parse DT nodes: %d\n", rc); return rc; } rc = smbchg_regulator_init(chip); if (rc) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Couldn't initialize regulator rc=%d\n", rc); return rc; } rc = smbchg_hw_init(chip); if (rc < 0) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Unable to intialize hardware rc = %d\n", rc); goto out; } rc = determine_initial_status(chip); if (rc < 0) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Unable to determine init status rc = %d\n", rc); goto out; } @@ -7989,7 +8008,7 @@ static int smbchg_probe(struct spmi_device *spmi) rc = power_supply_register(chip->dev, &chip->batt_psy); if (rc < 0) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Unable to register batt_psy rc = %d\n", rc); goto out; } @@ -8006,7 +8025,7 @@ static int smbchg_probe(struct spmi_device *spmi) = ARRAY_SIZE(smbchg_dc_supplicants); rc = power_supply_register(chip->dev, &chip->dc_psy); if (rc < 0) { - dev_err(&spmi->dev, + dev_err(&pdev->dev, "Unable to register dc_psy rc = %d\n", rc); goto unregister_batt_psy; } @@ -8034,7 +8053,7 @@ static int smbchg_probe(struct spmi_device *spmi) rc = smbchg_request_irqs(chip); if (rc < 0) { - dev_err(&spmi->dev, "Unable to request irqs rc = %d\n", rc); + dev_err(&pdev->dev, "Unable to request irqs rc = %d\n", rc); goto unregister_led_class; } @@ -8069,9 +8088,9 @@ out: return rc; } -static int smbchg_remove(struct spmi_device *spmi) +static int smbchg_remove(struct platform_device *pdev) { - struct smbchg_chip *chip = dev_get_drvdata(&spmi->dev); + struct smbchg_chip *chip = dev_get_drvdata(&pdev->dev); debugfs_remove_recursive(chip->debug_root); @@ -8083,9 +8102,9 @@ static int smbchg_remove(struct spmi_device *spmi) return 0; } -static void smbchg_shutdown(struct spmi_device *spmi) +static void smbchg_shutdown(struct platform_device *pdev) { - struct smbchg_chip *chip = dev_get_drvdata(&spmi->dev); + struct smbchg_chip *chip = dev_get_drvdata(&pdev->dev); int i, rc; if (!(chip->wa_flags & SMBCHG_RESTART_WA)) @@ -8191,7 +8210,7 @@ static const struct dev_pm_ops smbchg_pm_ops = { MODULE_DEVICE_TABLE(spmi, smbchg_id); -static struct spmi_driver smbchg_driver = { +static struct platform_driver smbchg_driver = { .driver = { .name = "qpnp-smbcharger", .owner = THIS_MODULE, @@ -8205,12 +8224,12 @@ static struct spmi_driver smbchg_driver = { static int __init smbchg_init(void) { - return spmi_driver_register(&smbchg_driver); + return platform_driver_register(&smbchg_driver); } static void __exit smbchg_exit(void) { - return spmi_driver_unregister(&smbchg_driver); + return platform_driver_unregister(&smbchg_driver); } module_init(smbchg_init); |