Exemple #1
0
/***************************************************************************//**
 * @brief axiadc_set_pnsel
*******************************************************************************/
int axiadc_set_pnsel(struct axiadc_state *st, int channel, enum adc_pn_sel sel)
{
	unsigned reg;

	uint32_t version = axiadc_read(st, 0x4000);

	if (PCORE_VERSION_MAJOR(version) > 7) {
		reg = axiadc_read(st, ADI_REG_CHAN_CNTRL_3(channel));
		reg &= ~ADI_ADC_PN_SEL(~0);
		reg |= ADI_ADC_PN_SEL(sel);
		axiadc_write(st, ADI_REG_CHAN_CNTRL_3(channel), reg);
	} else {
		reg = axiadc_read(st, ADI_REG_CHAN_CNTRL(channel));

		if (sel == ADC_PN_CUSTOM) {
			reg |= ADI_PN_SEL;
		} else if (sel == ADC_PN9) {
			reg &= ~ADI_PN23_TYPE;
			reg &= ~ADI_PN_SEL;
		} else {
			reg |= ADI_PN23_TYPE;
			reg &= ~ADI_PN_SEL;
		}

		axiadc_write(st, ADI_REG_CHAN_CNTRL(channel), reg);
	}

	return 0;
}
enum adc_pn_sel axiadc_get_pnsel(struct axiadc_state *st,
			       int channel, const char **name)
{
	unsigned val;

	if (PCORE_VERSION_MAJOR(st->pcore_version) > 7) {
		const char *ident[] = {"PN9", "PN23A", "UNDEF", "UNDEF",
				"PN7", "PN15", "PN23", "PN31", "UNDEF", "PN_CUSTOM"};

		val = ADI_TO_ADC_PN_SEL(axiadc_read(st, ADI_REG_CHAN_CNTRL_3(channel)));

		if (name)
			*name = ident[val];

		return val;
	} else {
		val = axiadc_read(st, ADI_REG_CHAN_CNTRL(channel));;

		if (name) {
			if (val & ADI_PN_SEL)
				*name = "PN_CUSTOM";
			else if (val & ADI_PN23_TYPE)
				*name = "PN23";
			else
				*name = "PN9";
		}
		return val & (ADI_PN23_TYPE | ADI_PN_SEL);
	}
}