Lines Matching refs:gts

18 #include <linux/iio/iio-gts-helper.h>
115 * @gts: Gain time scale descriptor
126 int iio_gts_total_gain_to_scale(struct iio_gts *gts, int total_gain,
131 tmp = gts->max_scale;
141 * @gts: Gain time scale descriptor
145 static void iio_gts_purge_avail_scale_table(struct iio_gts *gts)
149 if (gts->per_time_avail_scale_tables) {
150 for (i = 0; i < gts->num_itime; i++)
151 kfree(gts->per_time_avail_scale_tables[i]);
153 kfree(gts->per_time_avail_scale_tables);
154 gts->per_time_avail_scale_tables = NULL;
157 kfree(gts->avail_all_scales_table);
158 gts->avail_all_scales_table = NULL;
160 gts->num_avail_all_scales = 0;
168 static int gain_to_scaletables(struct iio_gts *gts, int **gains, int **scales)
174 for (i = 0; i < gts->num_itime; i++) {
179 sort(gains[i], gts->num_hwgain, sizeof(int), iio_gts_gain_cmp,
183 for (j = 0; j < gts->num_hwgain; j++) {
184 ret = iio_gts_total_gain_to_scale(gts, gains[i][j],
192 gain_bytes = array_size(gts->num_hwgain, sizeof(int));
193 all_gains = kcalloc(gts->num_itime, gain_bytes, GFP_KERNEL);
204 time_idx = gts->num_itime - 1;
206 new_idx = gts->num_hwgain;
209 for (j = 0; j < gts->num_hwgain; j++) {
233 gts->avail_all_scales_table = kcalloc(new_idx, 2 * sizeof(int),
235 if (!gts->avail_all_scales_table) {
239 gts->num_avail_all_scales = new_idx;
241 for (i = 0; i < gts->num_avail_all_scales; i++) {
242 ret = iio_gts_total_gain_to_scale(gts, all_gains[i],
243 &gts->avail_all_scales_table[i * 2],
244 &gts->avail_all_scales_table[i * 2 + 1]);
247 kfree(gts->avail_all_scales_table);
248 gts->num_avail_all_scales = 0;
261 * @gts: Gain time scale descriptor
276 static int iio_gts_build_avail_scale_table(struct iio_gts *gts)
280 per_time_gains = kcalloc(gts->num_itime, sizeof(*per_time_gains), GFP_KERNEL);
284 per_time_scales = kcalloc(gts->num_itime, sizeof(*per_time_scales), GFP_KERNEL);
288 for (i = 0; i < gts->num_itime; i++) {
289 per_time_scales[i] = kcalloc(gts->num_hwgain, 2 * sizeof(int),
294 per_time_gains[i] = kcalloc(gts->num_hwgain, sizeof(int),
301 for (j = 0; j < gts->num_hwgain; j++)
302 per_time_gains[i][j] = gts->hwgain_table[j].gain *
303 gts->itime_table[i].mul;
306 ret = gain_to_scaletables(gts, per_time_gains, per_time_scales);
311 gts->per_time_avail_scale_tables = per_time_scales;
340 * @gts: Gain time scale descriptor
350 static int iio_gts_build_avail_time_table(struct iio_gts *gts)
354 if (!gts->num_itime)
357 times = kcalloc(gts->num_itime, sizeof(int), GFP_KERNEL);
362 for (i = gts->num_itime - 1; i >= 0; i--) {
363 int new = gts->itime_table[i].time_us;
386 * trust the gts->num_itime.
388 gts->num_avail_time_tables = idx;
392 gts->avail_time_tables = int_micro_times;
403 * @gts: Gain time scale descriptor
407 static void iio_gts_purge_avail_time_table(struct iio_gts *gts)
409 if (gts->num_avail_time_tables) {
410 kfree(gts->avail_time_tables);
411 gts->avail_time_tables = NULL;
412 gts->num_avail_time_tables = 0;
418 * @gts: Gain time scale descriptor
441 static int iio_gts_build_avail_tables(struct iio_gts *gts)
445 ret = iio_gts_build_avail_scale_table(gts);
449 ret = iio_gts_build_avail_time_table(gts);
451 iio_gts_purge_avail_scale_table(gts);
458 * @gts: Gain time scale descriptor
463 static void iio_gts_purge_avail_tables(struct iio_gts *gts)
465 iio_gts_purge_avail_time_table(gts);
466 iio_gts_purge_avail_scale_table(gts);
477 * @gts: Gain time scale descriptor
499 struct iio_gts *gts)
503 ret = iio_gts_build_avail_tables(gts);
507 return devm_add_action_or_reset(dev, devm_iio_gts_avail_all_drop, gts);
526 static int iio_gts_sanity_check(struct iio_gts *gts)
530 if (!gts->num_hwgain && !gts->num_itime)
533 for (t = 0; t < gts->num_itime; t++) {
534 ret = sanity_check_time(&gts->itime_table[t]);
539 for (g = 0; g < gts->num_hwgain; g++) {
540 ret = sanity_check_gain(&gts->hwgain_table[g]);
545 for (g = 0; g < gts->num_hwgain; g++) {
546 for (t = 0; t < gts->num_itime; t++) {
549 gain = gts->hwgain_table[g].gain;
550 mul = gts->itime_table[t].mul;
563 struct iio_gts *gts)
567 memset(gts, 0, sizeof(*gts));
570 &gts->max_scale);
574 gts->hwgain_table = gain_tbl;
575 gts->num_hwgain = num_gain;
576 gts->itime_table = tim_tbl;
577 gts->num_itime = num_times;
579 return iio_gts_sanity_check(gts);
584 * @dev: Pointer to the device whose lifetime gts resources are
597 * @gts: pointer to the helper struct
609 struct iio_gts *gts)
614 num_gain, tim_tbl, num_times, gts);
618 return devm_iio_gts_build_avail_tables(dev, gts);
624 * @gts: Gain time scale descriptor
631 int iio_gts_all_avail_scales(struct iio_gts *gts, const int **vals, int *type,
634 if (!gts->num_avail_all_scales)
637 *vals = gts->avail_all_scales_table;
639 *length = gts->num_avail_all_scales * 2;
647 * @gts: Gain time scale descriptor
659 int iio_gts_avail_scales_for_time(struct iio_gts *gts, int time,
664 for (i = 0; i < gts->num_itime; i++)
665 if (gts->itime_table[i].time_us == time)
668 if (i == gts->num_itime)
671 *vals = gts->per_time_avail_scale_tables[i];
673 *length = gts->num_hwgain * 2;
681 * @gts: Gain time scale descriptor
688 int iio_gts_avail_times(struct iio_gts *gts, const int **vals, int *type,
691 if (!gts->num_avail_time_tables)
694 *vals = gts->avail_time_tables;
696 *length = gts->num_avail_time_tables * 2;
704 * @gts: Gain time scale descriptor
710 int iio_gts_find_sel_by_gain(struct iio_gts *gts, int gain)
714 for (i = 0; i < gts->num_hwgain; i++)
715 if (gts->hwgain_table[i].gain == gain)
716 return gts->hwgain_table[i].sel;
724 * @gts: Gain time scale descriptor
730 int iio_gts_find_gain_by_sel(struct iio_gts *gts, int sel)
734 for (i = 0; i < gts->num_hwgain; i++)
735 if (gts->hwgain_table[i].sel == sel)
736 return gts->hwgain_table[i].gain;
744 * @gts: Gain time scale descriptor
748 int iio_gts_get_min_gain(struct iio_gts *gts)
752 for (i = 0; i < gts->num_hwgain; i++) {
753 int gain = gts->hwgain_table[i].gain;
767 * @gts: Gain time scale descriptor
781 int iio_find_closest_gain_low(struct iio_gts *gts, int gain, bool *in_range)
788 for (i = 0; i < gts->num_hwgain; i++) {
789 if (gain == gts->hwgain_table[i].gain) {
794 if (gain > gts->hwgain_table[i].gain) {
796 diff = gain - gts->hwgain_table[i].gain;
799 int tmp = gain - gts->hwgain_table[i].gain;
822 return gts->hwgain_table[best].gain;
826 static int iio_gts_get_int_time_gain_multiplier_by_sel(struct iio_gts *gts,
831 time = iio_gts_find_itime_by_sel(gts, sel);
840 * @gts: Gain time scale descriptor
854 static int iio_gts_find_gain_for_scale_using_time(struct iio_gts *gts, int time_sel,
865 ret = iio_gts_get_int_time_gain_multiplier_by_sel(gts, time_sel);
871 ret = gain_get_scale_fraction(gts->max_scale, scale_linear, mul, gain);
875 if (!iio_gts_valid_gain(gts, *gain))
883 * @gts: Gain time scale descriptor
892 int iio_gts_find_gain_sel_for_scale_using_time(struct iio_gts *gts, int time_sel,
898 ret = iio_gts_find_gain_for_scale_using_time(gts, time_sel, scale_int,
903 ret = iio_gts_find_sel_by_gain(gts, gain);
913 static int iio_gts_get_total_gain(struct iio_gts *gts, int gain, int time)
917 if (!iio_gts_valid_gain(gts, gain))
920 if (!gts->num_itime)
923 itime = iio_gts_find_itime_by_time(gts, time);
930 static int iio_gts_get_scale_linear(struct iio_gts *gts, int gain, int time,
936 total_gain = iio_gts_get_total_gain(gts, gain, time);
940 tmp = gts->max_scale;
951 * @gts: Gain time scale descriptor
961 int iio_gts_get_scale(struct iio_gts *gts, int gain, int time, int *scale_int,
967 ret = iio_gts_get_scale_linear(gts, gain, time, &lin_scale);
977 * @gts: Gain time scale descriptor
997 int iio_gts_find_new_gain_sel_by_old_gain_time(struct iio_gts *gts,
1007 itime_old = iio_gts_find_itime_by_sel(gts, old_time_sel);
1011 itime_new = iio_gts_find_itime_by_sel(gts, new_time_sel);
1015 ret = iio_gts_get_scale_linear(gts, old_gain, itime_old->time_us,
1020 ret = gain_get_scale_fraction(gts->max_scale, scale, itime_new->mul,
1025 if (!iio_gts_valid_gain(gts, *new_gain))
1034 * @gts: Gain time scale descriptor
1054 int iio_gts_find_new_gain_by_old_gain_time(struct iio_gts *gts, int old_gain,
1064 itime_new = iio_gts_find_itime_by_time(gts, new_time);
1068 ret = iio_gts_get_scale_linear(gts, old_gain, old_time, &scale);
1072 ret = gain_get_scale_fraction(gts->max_scale, scale, itime_new->mul,
1077 if (!iio_gts_valid_gain(gts, *new_gain))