static void sec_bat_adc_ap_init(struct platform_device *pdev, struct sec_battery_info *battery) { if (!battery->dev) { pr_err("%s : can't get battery dev \n", __func__); } else { adc_client = qpnp_get_vadc(battery->dev, "battery"); if (IS_ERR(adc_client)) { int rc; rc = PTR_ERR(adc_client); if (rc != -EPROBE_DEFER) pr_err("%s: Fail to get vadc %d\n", __func__, rc); } } temp_channel = LR_MUX8_PU1_AMUX_THM4; if (battery->pdata->chg_temp_check) chg_temp_channel = LR_MUX9_PU1_AMUX_THM5; #if defined(CONFIG_FUELGAUGE_MAX17050) /* battery id checking*/ sec_bat_check_batt_id(battery); #endif }
static void sec_bat_adc_ap_init(struct platform_device *pdev, struct sec_battery_info *battery) { adc_client = qpnp_get_vadc(battery->dev, "sec-battery"); if (IS_ERR(adc_client)) { int rc; rc = PTR_ERR(adc_client); if (rc != -EPROBE_DEFER) pr_err("%s: Fail to get vadc %d\n", __func__, rc); } }
static void max1462x_parse_dt(struct device *dev, struct max1462x_platform_data *pdata) { struct device_node *np = dev->of_node; pdata->gpio_detect = of_get_named_gpio_flags(np, "max1462x,gpio_detect", 0, NULL); pdata->gpio_key = of_get_named_gpio_flags(np, "max1462x,gpio_key", 0, NULL); pdata->gpio_mic_en = of_get_named_gpio_flags(np, "max1462x,gpio_mic_en", 0, NULL); pdata->key_code = 0; pdata->switch_name = "h2w"; pdata->keypad_name = "hs_detect"; pdata->gpio_get_value_func = gpio_get_value; switch_vadc = qpnp_get_vadc(dev, "switch"); }
static __devinit int sec_therm_probe(struct platform_device *pdev) { int ret = 0; struct sec_therm_platform_data *pdata = fill_therm_pdata(pdev); struct sec_therm_info *info; dev_info(&pdev->dev, "%s: SEC Thermistor Driver Loading\n", __func__); info = kzalloc(sizeof(*info), GFP_KERNEL); if (!info) return -ENOMEM; info->dev = &pdev->dev; info->pdata = pdata; info->vadc_dev = qpnp_get_vadc(info->dev, "therm"); therm_vadc_dev = info->vadc_dev; if (IS_ERR(info->vadc_dev)) { ret = PTR_ERR(info->vadc_dev); pr_err("%s:ret=%d\n",__func__,ret); if (ret != -EPROBE_DEFER) pr_err("vadc property missing\n"); else goto err_therm; } dev_set_drvdata(&pdev->dev, info); ret = sysfs_create_group(&info->dev->kobj, &sec_therm_group); if (ret) { dev_err(info->dev, "failed to create sysfs attribute group\n"); } if (!(pdata->no_polling)) { INIT_DELAYED_WORK_DEFERRABLE(&info->polling_work, sec_therm_polling_work); schedule_delayed_work(&info->polling_work, msecs_to_jiffies(info->pdata->polling_interval)); } return ret; err_therm: kfree(info); return ret; }
static void max14688_parse_dt(struct device *dev, struct max14688_platform_data *pdata) { struct device_node *np = dev->of_node; pdata->gpio_detect = of_get_named_gpio_flags(np, "max14688,gpio_detect", 0, NULL); pdata->gpio_int = of_get_named_gpio_flags(np, "max14688,gpio_int", 0, NULL); pdata->switch_name = SWITCH_NAME; pdata->switch_name_advanced = SWITCH_NAME_ADVANCED; pdata->switch_name_aux = SWITCH_NAME_AUX; pdata->jack_matches = max14688_jack_matches; pdata->num_of_jack_matches = ARRAY_SIZE(max14688_jack_matches); pdata->button_matches = max14688_button_matches; pdata->num_of_button_matches = ARRAY_SIZE(max14688_button_matches); pdata->detect_jack = max14688_detect_jack; pdata->read_mic_impedence = max14688_read_mic_impedence; pdata->read_left_impedence = max14688_read_left_impedence; pdata->report_jack = max14688_report_jack; pdata->report_button = max14688_report_button; input_vadc = qpnp_get_vadc(dev, "switch"); }
static void sec_bat_adc_ap_init(struct platform_device *pdev, struct sec_battery_info *battery) { #if 0 struct power_supply *psy_fuelgauge; struct sec_fuelgauge_info *fuelgauge; psy_fuelgauge = get_power_supply_by_name(battery->pdata->fuelgauge_name); if (!psy_fuelgauge) { pr_err("%s : can't get sec-fuelgauge\n", __func__); } else { fuelgauge = container_of(psy_fuelgauge, struct sec_fuelgauge_info, psy_fg); adc_client = qpnp_get_vadc(&fuelgauge->client->dev, "sec-fuelgauge"); if (IS_ERR(adc_client)) { int rc; rc = PTR_ERR(adc_client); if (rc != -EPROBE_DEFER) pr_err("%s: Fail to get vadc %d\n", __func__, rc); } } #endif #if defined(CONFIG_ARCH_MSM8974PRO) temp_channel = LR_MUX5_PU1_AMUX_THM2; #elif defined(CONFIG_SEC_H_PROJECT) || defined(CONFIG_SEC_KS01_PROJECT) || defined(CONFIG_SEC_FRESCO_PROJECT) temp_channel = LR_MUX5_PU2_AMUX_THM2; #else temp_channel = LR_MUX4_PU2_AMUX_THM1; #endif #if defined(CONFIG_FUELGAUGE_MAX17050) /* battery id checking*/ sec_bat_check_batt_id(battery); #endif }
static void sec_bat_adc_ap_init(struct platform_device *pdev, struct sec_battery_info *battery) { struct power_supply *psy_fuelgauge; struct sec_fuelgauge_info *fuelgauge; psy_fuelgauge = get_power_supply_by_name(battery->pdata->fuelgauge_name); if (!psy_fuelgauge) { pr_err("%s : can't get sec-fuelgauge\n", __func__); } else { fuelgauge = container_of(psy_fuelgauge, struct sec_fuelgauge_info, psy_fg); adc_client = qpnp_get_vadc(&fuelgauge->client->dev, "sec-fuelgauge"); if (IS_ERR(adc_client)) { int rc; rc = PTR_ERR(adc_client); if (rc != -EPROBE_DEFER) pr_err("%s: Fail to get vadc %d\n", __func__, rc); } } temp_channel = LR_MUX1_BATT_THERM; }
void initialize_temphumidity_factorytest(struct ssp_data *data) { int ret; sensors_register(data->temphumidity_device, data, temphumidity_attrs, "temphumidity_sensor"); data->shtc1_device.minor = MISC_DYNAMIC_MINOR; data->shtc1_device.name = "shtc1_sensor"; data->shtc1_device.fops = &ssp_temphumidity_fops; ret = misc_register(&data->shtc1_device); if (ret < 0) { pr_err("register temphumidity misc device err(%d)", ret); } ssp_vadc = qpnp_get_vadc(&data->spi->dev, "temphumidity_sensor"); if (IS_ERR(ssp_vadc)) { ret = PTR_ERR(ssp_vadc); if (ret != -EPROBE_DEFER) pr_err("%s: Fail to get vadc %d\n", __func__, ret); } }
static int __devinit qpnp_tm_probe(struct spmi_device *spmi) { struct device_node *node; struct resource *res; struct qpnp_tm_chip *chip; struct thermal_zone_device_ops *tz_ops; char *tm_name; u32 default_temperature; int rc = 0; u8 raw_type[2], type, subtype; if (!spmi || !(&spmi->dev) || !spmi->dev.of_node) { dev_err(&spmi->dev, "%s: device tree node not found\n", __func__); return -EINVAL; } node = spmi->dev.of_node; chip = kzalloc(sizeof(struct qpnp_tm_chip), GFP_KERNEL); if (!chip) { dev_err(&spmi->dev, "%s: Can't allocate qpnp_tm_chip\n", __func__); return -ENOMEM; } dev_set_drvdata(&spmi->dev, chip); res = spmi_get_resource(spmi, NULL, IORESOURCE_MEM, 0); if (!res) { dev_err(&spmi->dev, "%s: node is missing base address\n", __func__); rc = -EINVAL; goto free_chip; } chip->base_addr = res->start; chip->spmi_dev = spmi; chip->irq = spmi_get_irq(spmi, NULL, 0); if (chip->irq < 0) { rc = chip->irq; dev_err(&spmi->dev, "%s: node is missing irq, rc=%d\n", __func__, rc); goto free_chip; } chip->tm_name = of_get_property(node, "label", NULL); if (chip->tm_name == NULL) { dev_err(&spmi->dev, "%s: node is missing label\n", __func__); rc = -EINVAL; goto free_chip; } tm_name = kstrdup(chip->tm_name, GFP_KERNEL); if (tm_name == NULL) { dev_err(&spmi->dev, "%s: could not allocate memory for label\n", __func__); rc = -ENOMEM; goto free_chip; } chip->tm_name = tm_name; INIT_DELAYED_WORK(&chip->irq_work, qpnp_tm_work); /* These bindings are optional, so it is okay if they are not found. */ chip->thresh = THRESH_MAX + 1; rc = of_property_read_u32(node, "qcom,threshold-set", &chip->thresh); if (!rc && (chip->thresh < THRESH_MIN || chip->thresh > THRESH_MAX)) dev_err(&spmi->dev, "%s: invalid qcom,threshold-set=%u specified\n", __func__, chip->thresh); chip->adc_type = QPNP_TM_ADC_NONE; rc = of_property_read_u32(node, "qcom,channel-num", &chip->adc_channel); if (!rc) { if (chip->adc_channel < 0 || chip->adc_channel >= ADC_MAX_NUM) { dev_err(&spmi->dev, "%s: invalid qcom,channel-num=%d specified\n", __func__, chip->adc_channel); } else { chip->adc_type = QPNP_TM_ADC_QPNP_ADC; chip->vadc_dev = qpnp_get_vadc(&spmi->dev, "temp_alarm"); if (IS_ERR(chip->vadc_dev)) { rc = PTR_ERR(chip->vadc_dev); if (rc != -EPROBE_DEFER) pr_err("vadc property missing\n"); goto err_cancel_work; } } } if (chip->adc_type == QPNP_TM_ADC_QPNP_ADC) tz_ops = &qpnp_thermal_zone_ops_qpnp_adc; else tz_ops = &qpnp_thermal_zone_ops_no_adc; chip->allow_software_override = of_property_read_bool(node, "qcom,allow-override"); default_temperature = DEFAULT_NO_ADC_TEMP; rc = of_property_read_u32(node, "qcom,default-temp", &default_temperature); chip->temperature = default_temperature; rc = qpnp_tm_read(chip, QPNP_TM_REG_TYPE, raw_type, 2); if (rc) { dev_err(&spmi->dev, "%s: could not read type register, rc=%d\n", __func__, rc); goto err_cancel_work; } type = raw_type[0]; subtype = raw_type[1]; if (type != QPNP_TM_TYPE || subtype != QPNP_TM_SUBTYPE) { dev_err(&spmi->dev, "%s: invalid type=%02X or subtype=%02X register value\n", __func__, type, subtype); rc = -ENODEV; goto err_cancel_work; } rc = qpnp_tm_init_reg(chip); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_init_reg() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } if (chip->adc_type == QPNP_TM_ADC_NONE) { rc = qpnp_tm_init_temp_no_adc(chip); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_init_temp_no_adc() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } } /* Start in HW control; switch to SW control when user changes mode. */ chip->mode = THERMAL_DEVICE_DISABLED; rc = qpnp_tm_shutdown_override(chip, SOFTWARE_OVERRIDE_DISABLED); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_shutdown_override() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } chip->tz_dev = thermal_zone_device_register(tm_name, TRIP_NUM, chip, tz_ops, 0, 0, 0, 0); if (chip->tz_dev == NULL) { dev_err(&spmi->dev, "%s: thermal_zone_device_register() failed.\n", __func__); rc = -ENODEV; goto err_cancel_work; } rc = request_irq(chip->irq, qpnp_tm_isr, IRQF_TRIGGER_RISING, tm_name, chip); if (rc < 0) { dev_err(&spmi->dev, "%s: request_irq(%d) failed: %d\n", __func__, chip->irq, rc); goto err_free_tz; } return 0; err_free_tz: thermal_zone_device_unregister(chip->tz_dev); err_cancel_work: cancel_delayed_work_sync(&chip->irq_work); kfree(chip->tm_name); free_chip: dev_set_drvdata(&spmi->dev, NULL); kfree(chip); return rc; }
static int probe_btm_properties(struct bcl_context *bcl) { int ret = 0, curr_ua = 0; int adc_interval_us; struct device_node *ibat_node = NULL, *dev_node = bcl->dev->of_node; char *key = NULL; key = "qcom,ibat-monitor"; ibat_node = of_find_node_by_name(dev_node, key); if (!ibat_node) { ret = -ENODEV; goto btm_probe_exit; } key = "qcom,uv-to-ua-numerator"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_uv_to_ua_numerator); if (ret < 0) goto btm_probe_exit; key = "qcom,uv-to-ua-denominator"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_uv_to_ua_denominator); if (ret < 0) goto btm_probe_exit; key = "qcom,low-threshold-uamp"; ret = of_property_read_u32(ibat_node, key, &curr_ua); if (ret < 0) goto btm_probe_exit; bcl->btm_low_threshold_uv = current_to_voltage(bcl, curr_ua); key = "qcom,high-threshold-uamp"; ret = of_property_read_u32(ibat_node, key, &curr_ua); if (ret < 0) goto btm_probe_exit; bcl->btm_high_threshold_uv = current_to_voltage(bcl, curr_ua); key = "qcom,mitigation-freq-khz"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_freq_max); if (ret < 0) goto btm_probe_exit; key = "qcom,ibat-channel"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_ibat_chan); if (ret < 0) goto btm_probe_exit; key = "qcom,adc-interval-usec"; ret = of_property_read_u32(ibat_node, key, &adc_interval_us); if (ret < 0) goto btm_probe_exit; bcl->btm_adc_interval = uSec_to_adc_time(bcl, adc_interval_us); key = "qcom,vph-channel"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_vph_chan); if (ret < 0) goto btm_probe_exit; key = "qcom,vph-high-threshold-uv"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_vph_high_thresh); if (ret < 0) goto btm_probe_exit; key = "qcom,vph-low-threshold-uv"; ret = of_property_read_u32(ibat_node, key, &bcl->btm_vph_low_thresh); if (ret < 0) goto btm_probe_exit; key = "ibat-threshold"; bcl->btm_adc_tm_dev = qpnp_get_adc_tm(bcl->dev, key); if (IS_ERR(bcl->btm_adc_tm_dev)) { ret = PTR_ERR(bcl->btm_adc_tm_dev); goto btm_probe_exit; } key = "ibat"; bcl->btm_vadc_dev = qpnp_get_vadc(bcl->dev, key); if (IS_ERR(bcl->btm_vadc_dev)) { ret = PTR_ERR(bcl->btm_vadc_dev); goto btm_probe_exit; } get_vdd_rstr_freq(bcl, ibat_node); bcl->btm_freq_max = max(bcl->btm_freq_max, bcl->thermal_freq_limit); bcl->btm_mode = BCL_MONITOR_DISABLED; bcl->bcl_monitor_type = BCL_IBAT_MONITOR_TYPE; snprintf(bcl->bcl_type, BCL_NAME_LENGTH, "%s", bcl_type[BCL_IBAT_MONITOR_TYPE]); ret = cpufreq_register_notifier(&bcl_cpufreq_notifier, CPUFREQ_POLICY_NOTIFIER); if (ret) pr_err("Error with cpufreq register. err:%d\n", ret); btm_probe_exit: if (ret && ret != -EPROBE_DEFER) dev_info(bcl->dev, "%s:%s Error reading key:%s. ret = %d\n", KBUILD_MODNAME, __func__, key, ret); return ret; }
static int msm_thermal_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; int ret; t_pol = kzalloc(sizeof(struct throttle_policy), GFP_KERNEL); if (!t_pol) { pr_err("Failed to allocate thermal_policy struct\n"); ret = -ENOMEM; goto err; } t_conf = kzalloc(sizeof(struct thermal_config), GFP_KERNEL); if (!t_conf) { pr_err("Failed to allocate thermal_config struct\n"); ret = -ENOMEM; goto err; } t_conf->vadc_dev = qpnp_get_vadc(&pdev->dev, "thermal"); if (IS_ERR(t_conf->vadc_dev)) { ret = PTR_ERR(t_conf->vadc_dev); if (ret != -EPROBE_DEFER) pr_err("VADC property missing\n"); goto err; } ret = of_property_read_u32(np, "qcom,adc-channel", &t_conf->adc_chan); if (ret) { pr_err("ADC-channel property missing\n"); goto err; } thermal_wq = alloc_workqueue("msm_thermal_wq", WQ_HIGHPRI | WQ_NON_REENTRANT, 0); if (!thermal_wq) { pr_err("Failed to allocate workqueue\n"); ret = -EFAULT; goto err; } cpufreq_register_notifier(&cpu_throttle_nb, CPUFREQ_POLICY_NOTIFIER); t_conf->sampling_ms = DEFAULT_SAMPLING_MS; INIT_DELAYED_WORK(&thermal_work, msm_thermal_main); msm_thermal_kobject = kobject_create_and_add("msm_thermal", kernel_kobj); if (!msm_thermal_kobject) { pr_err("Failed to create kobject\n"); ret = -ENOMEM; goto err; } ret = sysfs_create_group(msm_thermal_kobject, &msm_thermal_attr_group); if (ret) { pr_err("Failed to create sysfs interface\n"); kobject_put(msm_thermal_kobject); } err: return ret; }
static int __devinit qpnp_tm_probe(struct spmi_device *spmi) { struct device_node *node; struct resource *res; struct qpnp_tm_chip *chip; struct thermal_zone_device_ops *tz_ops; char *tm_name; u32 default_temperature; int rc = 0; u8 raw_type[2], type, subtype; #ifdef CONFIG_LGE_PM struct spmi_resource *spmi_resource; u8 batt_pres_rt_sts; #endif if (!spmi || !(&spmi->dev) || !spmi->dev.of_node) { dev_err(&spmi->dev, "%s: device tree node not found\n", __func__); return -EINVAL; } node = spmi->dev.of_node; chip = kzalloc(sizeof(struct qpnp_tm_chip), GFP_KERNEL); if (!chip) { dev_err(&spmi->dev, "%s: Can't allocate qpnp_tm_chip\n", __func__); return -ENOMEM; } dev_set_drvdata(&spmi->dev, chip); res = spmi_get_resource(spmi, NULL, IORESOURCE_MEM, 0); if (!res) { dev_err(&spmi->dev, "%s: node is missing base address\n", __func__); rc = -EINVAL; goto free_chip; } chip->base_addr = res->start; chip->spmi_dev = spmi; chip->irq = spmi_get_irq(spmi, NULL, 0); if (chip->irq < 0) { rc = chip->irq; dev_err(&spmi->dev, "%s: node is missing irq, rc=%d\n", __func__, rc); goto free_chip; } chip->tm_name = of_get_property(node, "label", NULL); if (chip->tm_name == NULL) { dev_err(&spmi->dev, "%s: node is missing label\n", __func__); rc = -EINVAL; goto free_chip; } tm_name = kstrdup(chip->tm_name, GFP_KERNEL); if (tm_name == NULL) { dev_err(&spmi->dev, "%s: could not allocate memory for label\n", __func__); rc = -ENOMEM; goto free_chip; } chip->tm_name = tm_name; INIT_DELAYED_WORK(&chip->irq_work, qpnp_tm_work); /* These bindings are optional, so it is okay if they are not found. */ chip->thresh = THRESH_MAX + 1; rc = of_property_read_u32(node, "qcom,threshold-set", &chip->thresh); if (!rc && (chip->thresh < THRESH_MIN || chip->thresh > THRESH_MAX)) dev_err(&spmi->dev, "%s: invalid qcom,threshold-set=%u specified\n", __func__, chip->thresh); chip->adc_type = QPNP_TM_ADC_NONE; rc = of_property_read_u32(node, "qcom,channel-num", &chip->adc_channel); if (!rc) { if (chip->adc_channel < 0 || chip->adc_channel >= ADC_MAX_NUM) { dev_err(&spmi->dev, "%s: invalid qcom,channel-num=%d specified\n", __func__, chip->adc_channel); } else { chip->adc_type = QPNP_TM_ADC_QPNP_ADC; chip->vadc_dev = qpnp_get_vadc(&spmi->dev, "temp_alarm"); if (IS_ERR(chip->vadc_dev)) { rc = PTR_ERR(chip->vadc_dev); if (rc != -EPROBE_DEFER) pr_err("vadc property missing\n"); goto err_cancel_work; } } } if (chip->adc_type == QPNP_TM_ADC_QPNP_ADC) tz_ops = &qpnp_thermal_zone_ops_qpnp_adc; else tz_ops = &qpnp_thermal_zone_ops_no_adc; chip->allow_software_override = of_property_read_bool(node, "qcom,allow-override"); default_temperature = DEFAULT_NO_ADC_TEMP; rc = of_property_read_u32(node, "qcom,default-temp", &default_temperature); chip->temperature = default_temperature; rc = qpnp_tm_read(chip, QPNP_TM_REG_TYPE, raw_type, 2); if (rc) { dev_err(&spmi->dev, "%s: could not read type register, rc=%d\n", __func__, rc); goto err_cancel_work; } type = raw_type[0]; subtype = raw_type[1]; if (type != QPNP_TM_TYPE || subtype != QPNP_TM_SUBTYPE) { dev_err(&spmi->dev, "%s: invalid type=%02X or subtype=%02X register value\n", __func__, type, subtype); rc = -ENODEV; goto err_cancel_work; } rc = qpnp_tm_init_reg(chip); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_init_reg() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } if (chip->adc_type == QPNP_TM_ADC_NONE) { rc = qpnp_tm_init_temp_no_adc(chip); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_init_temp_no_adc() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } } /* Start in HW control; switch to SW control when user changes mode. */ chip->mode = THERMAL_DEVICE_DISABLED; rc = qpnp_tm_shutdown_override(chip, SOFTWARE_OVERRIDE_DISABLED); if (rc) { dev_err(&spmi->dev, "%s: qpnp_tm_shutdown_override() failed, rc=%d\n", __func__, rc); goto err_cancel_work; } chip->tz_dev = thermal_zone_device_register(tm_name, TRIP_NUM, chip, tz_ops, 0, 0, 0, 0); if (chip->tz_dev == NULL) { dev_err(&spmi->dev, "%s: thermal_zone_device_register() failed.\n", __func__); rc = -ENODEV; goto err_cancel_work; } rc = request_irq(chip->irq, qpnp_tm_isr, IRQF_TRIGGER_RISING, tm_name, chip); if (rc < 0) { dev_err(&spmi->dev, "%s: request_irq(%d) failed: %d\n", __func__, chip->irq, rc); goto err_free_tz; } #ifdef CONFIG_LGE_PM spmi_for_each_container_dev(spmi_resource, spmi) { if (!spmi_resource) { pr_err("qpnp temp alarm : spmi resource absent\n"); goto fail_bat_if; } res = spmi_get_resource(spmi, spmi_resource, IORESOURCE_MEM, 0); if (!(res && res->start)) { pr_err("node %s IO resource absent!\n", spmi->dev.of_node->full_name); goto fail_bat_if; } rc = qpnp_register_read(chip, &subtype, res->start + REG_OFFSET_PERP_SUBTYPE, 1); if (rc) { pr_err("Peripheral subtype read failed rc=%d\n", rc); goto fail_bat_if; } switch (subtype) { case SMBB_BAT_IF_SUBTYPE: pr_err("qpnp bat_if block enable for batt insert remove irq.\n"); chip->bat_if_base = res->start; chip->batt_present_irq = spmi_get_irq_byname(chip->spmi_dev, spmi_resource, "batt-pres"); if (chip->batt_present_irq < 0) { pr_err("Unable to get batt_present_irq\n"); goto fail_bat_if; } rc = devm_request_irq(&(chip->spmi_dev->dev), chip->batt_present_irq, qpnp_batif_batt_inserted_removed_irq_handler, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "batt_remove_insert", chip); if (rc < 0) { pr_err("Can't request %d batt irq for insert, remove : %d\n", chip->batt_present_irq, rc); goto fail_bat_if; } rc = qpnp_register_masked_write(chip, INT_EN_SET(chip->bat_if_base), BATT_PRES_EN_BIT, BATT_PRES_EN_BIT, 1); if (rc) { pr_err("failed to enable BAT_IF_INT_EN_SET rc=%d\n", rc); goto fail_bat_if; } /* smb349 charger battery present W/A */ rc = qpnp_register_read(chip, &batt_pres_rt_sts, INT_RT_STS(chip->bat_if_base), 1); if (rc) { pr_err("spmi read failed: addr=%03X, rc=%d\n", INT_RT_STS(chip->bat_if_base), rc); pr_err("assume that battery is present\n"); /* battery present */ pm_batt_rt_sts = 1; } else { pm_batt_rt_sts = (int)(batt_pres_rt_sts & BATT_IF_PRES_RT_STATUS); pr_err("%s : init PMIC battery RTS = %d\n", __func__, pm_batt_rt_sts); } enable_irq_wake(chip->batt_present_irq); break; default: break; } } INIT_WORK(&chip->batt_insert_remove_worker, batt_insert_remove_work); INIT_DELAYED_WORK(&chip->batt_insert_remove_worker_second, batt_insert_remove_work_second); wake_lock_init(&chip->battgone_wake_lock, WAKE_LOCK_SUSPEND, "batt removed"); #endif return 0; err_free_tz: thermal_zone_device_unregister(chip->tz_dev); err_cancel_work: cancel_delayed_work_sync(&chip->irq_work); kfree(chip->tm_name); free_chip: dev_set_drvdata(&spmi->dev, NULL); kfree(chip); return rc; #ifdef CONFIG_LGE_PM fail_bat_if: pr_err("Cannot enable qpnp bat_if block.\n"); return 0; #endif }