drivers/iio/industrialio-gts-helper.c

Source file repositories/reference/linux-study-clean/drivers/iio/industrialio-gts-helper.c

File Facts

System
Linux kernel
Corpus path
drivers/iio/industrialio-gts-helper.c
Extension
.c
Size
34869 bytes
Lines
1254
Domain
Driver Families
Bucket
drivers/iio
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (scale_smaller(candidate, &all_scales[new_idx - 2])) {
				all_scales[new_idx] = candidate[0];
				all_scales[new_idx + 1] = candidate[1];
				new_idx += 2;

				continue;
			}
			for (chk = 0; chk < new_idx; chk += 2)
				if (!scale_smaller(candidate, &all_scales[chk]))
					break;

			if (scale_eq(candidate, &all_scales[chk]))
				continue;

			memmove(&all_scales[chk + 2], &all_scales[chk],
				(new_idx - chk) * sizeof(int));
			all_scales[chk] = candidate[0];
			all_scales[chk + 1] = candidate[1];
			new_idx += 2;
		}
	}

	gts->num_avail_all_scales = new_idx / 2;
	gts->avail_all_scales_table = all_scales;

	return 0;
}

static void iio_gts_free_int_table_array(int **arr, int num_tables)
{
	int i;

	for (i = 0; i < num_tables; i++)
		kfree(arr[i]);

	kfree(arr);
}

static int iio_gts_alloc_int_table_array(int ***arr, int num_tables, int num_table_items)
{
	int i, **tmp;

	tmp = kzalloc_objs(**arr, num_tables);
	if (!tmp)
		return -ENOMEM;

	for (i = 0; i < num_tables; i++) {
		tmp[i] = kzalloc_objs(int, num_table_items);
		if (!tmp[i])
			goto err_free;
	}

	*arr = tmp;

	return 0;
err_free:
	iio_gts_free_int_table_array(tmp, i);

	return -ENOMEM;
}

static int iio_gts_gain_cmp(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
}

static int fill_and_sort_scaletables(struct iio_gts *gts, int **gains, int **scales)
{
	int i, j, ret;

	for (i = 0; i < gts->num_itime; i++) {
		/*
		 * Sort the tables for nice output and for easier finding of
		 * unique values.
		 */
		sort(gains[i], gts->num_hwgain, sizeof(int), iio_gts_gain_cmp,
		     NULL);

		/* Convert gains to scales */
		for (j = 0; j < gts->num_hwgain; j++) {
			ret = iio_gts_total_gain_to_scale(gts, gains[i][j],
							  &scales[i][2 * j],
							  &scales[i][2 * j + 1]);
			if (ret)
				return ret;
		}
	}

	return 0;
}

Annotation

Implementation Notes