static int da9052_rtc_probe(struct platform_device *pdev) { struct da9052_rtc *rtc; int ret; rtc = devm_kzalloc(&pdev->dev, sizeof(struct da9052_rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; rtc->da9052 = dev_get_drvdata(pdev->dev.parent); platform_set_drvdata(pdev, rtc); ret = da9052_reg_write(rtc->da9052, DA9052_BBAT_CONT_REG, 0xFE); if (ret < 0) { rtc_err(rtc, "Failed to setup RTC battery charging: %d\n", ret); return ret; } ret = da9052_reg_update(rtc->da9052, DA9052_ALARM_Y_REG, DA9052_ALARM_Y_TICK_ON, 0); if (ret != 0) rtc_err(rtc, "Failed to disable TICKS: %d\n", ret); ret = da9052_request_irq(rtc->da9052, DA9052_IRQ_ALARM, "ALM", da9052_rtc_irq, rtc); if (ret != 0) { rtc_err(rtc, "irq registration failed: %d\n", ret); return ret; } rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &da9052_rtc_ops, THIS_MODULE); return PTR_ERR_OR_ZERO(rtc->rtc); }
int da9052_irq_init(struct da9052 *da9052) { int ret; ret = regmap_add_irq_chip(da9052->regmap, da9052->chip_irq, IRQF_TRIGGER_LOW | IRQF_ONESHOT, -1, &da9052_regmap_irq_chip, &da9052->irq_data); if (ret < 0) { dev_err(da9052->dev, "regmap_add_irq_chip failed: %d\n", ret); goto regmap_err; } enable_irq_wake(da9052->chip_irq); ret = da9052_request_irq(da9052, DA9052_IRQ_ADC_EOM, "adc-irq", da9052_auxadc_irq, da9052); if (ret != 0) { dev_err(da9052->dev, "DA9052_IRQ_ADC_EOM failed: %d\n", ret); goto request_irq_err; } return 0; request_irq_err: regmap_del_irq_chip(da9052->chip_irq, da9052->irq_data); regmap_err: return ret; }
static s32 da9052_bat_probe(struct platform_device *pdev) { struct da9052_pdata *pdata; struct da9052_battery *bat; int ret; int i; bat = kzalloc(sizeof(struct da9052_battery), GFP_KERNEL); if (!bat) return -ENOMEM; bat->da9052 = dev_get_drvdata(pdev->dev.parent); bat->psy = template_battery; bat->charger_type = DA9052_NOCHARGER; bat->status = POWER_SUPPLY_STATUS_UNKNOWN; bat->health = POWER_SUPPLY_HEALTH_UNKNOWN; bat->nb.notifier_call = da9052_USB_current_notifier; pdata = bat->da9052->dev->platform_data; if (pdata != NULL && pdata->use_for_apm) bat->psy.use_for_apm = pdata->use_for_apm; else bat->psy.use_for_apm = 1; for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) { ret = da9052_request_irq(bat->da9052, da9052_bat_irq_bits[i], da9052_bat_irqs[i], da9052_bat_irq, bat); if (ret != 0) { dev_err(bat->da9052->dev, "DA9052 failed to request %s IRQ: %d\n", da9052_bat_irqs[i], ret); goto err; } } ret = power_supply_register(&pdev->dev, &bat->psy); if (ret) goto err; platform_set_drvdata(pdev, bat); return 0; err: while (--i >= 0) da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat); kfree(bat); return ret; }
static int da9052_rtc_probe(struct platform_device *pdev) { struct da9052_rtc *rtc; int ret; rtc = devm_kzalloc(&pdev->dev, sizeof(struct da9052_rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; rtc->da9052 = dev_get_drvdata(pdev->dev.parent); platform_set_drvdata(pdev, rtc); rtc->irq = DA9052_IRQ_ALARM; ret = da9052_request_irq(rtc->da9052, rtc->irq, "ALM", da9052_rtc_irq, rtc); if (ret != 0) { rtc_err(rtc->da9052, "irq registration failed: %d\n", ret); return ret; } rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &da9052_rtc_ops, THIS_MODULE); return PTR_RET(rtc->rtc); }