char *qfprom_read(struct device *dev, const char *cname) { struct nvmem_cell *cell; ssize_t data; char *ret; cell = nvmem_cell_get(dev, cname); if (IS_ERR(cell)) return ERR_CAST(cell); ret = nvmem_cell_read(cell, &data); nvmem_cell_put(cell); return ret; }
static int sc27xx_adc_scale_calibration(struct sc27xx_adc_data *data, bool big_scale) { const struct sc27xx_adc_linear_graph *calib_graph; struct sc27xx_adc_linear_graph *graph; struct nvmem_cell *cell; const char *cell_name; u32 calib_data = 0; void *buf; size_t len; if (big_scale) { calib_graph = &big_scale_graph_calib; graph = &big_scale_graph; cell_name = "big_scale_calib"; } else { calib_graph = &small_scale_graph_calib; graph = &small_scale_graph; cell_name = "small_scale_calib"; } cell = nvmem_cell_get(data->dev, cell_name); if (IS_ERR(cell)) return PTR_ERR(cell); buf = nvmem_cell_read(cell, &len); nvmem_cell_put(cell); if (IS_ERR(buf)) return PTR_ERR(buf); memcpy(&calib_data, buf, min(len, sizeof(u32))); /* Only need to calibrate the adc values in the linear graph. */ graph->adc0 = sc27xx_adc_get_calib_data(calib_data, calib_graph->adc0); graph->adc1 = sc27xx_adc_get_calib_data(calib_data >> 8, calib_graph->adc1); kfree(buf); return 0; }