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); }
static int da9052_set_led_brightness(struct da9052_led *led) { u8 val; int error; val = (led->brightness & 0x7f) | DA9052_LED_CONT_DIM; error = da9052_reg_write(led->da9052, led_reg[led->led_index], val); if (error < 0) dev_err(led->da9052->dev, "Failed to set led brightness, %d\n", error); return error; }
static int da9052_adjust_wled_brightness(struct da9052_bl *wleds) { unsigned char boost_en; unsigned char i_sink; int ret; boost_en = 0x3F; i_sink = 0xFF; if (wleds->state == DA9052_WLEDS_OFF) { boost_en = 0x00; i_sink = 0x00; } ret = da9052_reg_write(wleds->da9052, DA9052_BOOST_REG, boost_en); if (ret < 0) return ret; ret = da9052_reg_write(wleds->da9052, DA9052_LED_CONT_REG, i_sink); if (ret < 0) return ret; ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], 0x0); if (ret < 0) return ret; usleep_range(10000, 11000); if (wleds->brightness) { ret = da9052_reg_write(wleds->da9052, wled_bank[wleds->led_reg], wleds->brightness); if (ret < 0) return ret; } return 0; }
int da9052_adc_manual_read(struct da9052 *da9052, unsigned char channel) { int ret; unsigned short calc_data; unsigned short data; unsigned char mux_sel; if (channel > DA9052_ADC_VBBAT) return -EINVAL; mutex_lock(&da9052->auxadc_lock); /* Channel gets activated on enabling the Conversion bit */ mux_sel = chan_mux[channel] | DA9052_ADC_MAN_MAN_CONV; ret = da9052_reg_write(da9052, DA9052_ADC_MAN_REG, mux_sel); if (ret < 0) goto err; /* Wait for an interrupt */ if (!wait_for_completion_timeout(&da9052->done, msecs_to_jiffies(500))) { dev_err(da9052->dev, "timeout waiting for ADC conversion interrupt\n"); ret = -ETIMEDOUT; goto err; } ret = da9052_reg_read(da9052, DA9052_ADC_RES_H_REG); if (ret < 0) goto err; calc_data = (unsigned short)ret; data = calc_data << 2; ret = da9052_reg_read(da9052, DA9052_ADC_RES_L_REG); if (ret < 0) goto err; calc_data = (unsigned short)(ret & DA9052_ADC_RES_LSB); data |= calc_data; ret = data; err: mutex_unlock(&da9052->auxadc_lock); return ret; }