Skip to content

Commit 91336d9

Browse files
mhennerichcommodo
authored andcommitted
iio: frequency: cf_axi_dds: generically handle more than 16 DDS channels
This patch also fixes the IQ Correction initialization, which needs to be set by the number of real buffer channels. Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
1 parent a16a077 commit 91336d9

File tree

1 file changed

+21
-34
lines changed

1 file changed

+21
-34
lines changed

drivers/iio/frequency/cf_axi_dds.c

Lines changed: 21 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,8 @@ static void cf_axi_dds_set_sed_pattern(struct iio_dev *indio_dev, unsigned chan,
390390
}
391391

392392
static int cf_axi_dds_default_setup(struct cf_axi_dds_state *st, u32 chan,
393-
u32 phase, u32 freq, u32 scale) {
393+
u32 phase, u32 freq, u32 scale)
394+
{
394395

395396
unsigned long long val64;
396397
u32 val;
@@ -408,15 +409,6 @@ static int cf_axi_dds_default_setup(struct cf_axi_dds_state *st, u32 chan,
408409
dds_write(st, ADI_REG_CHAN_CNTRL_1_IIOCHAN(chan), ADI_DDS_SCALE(scale));
409410
dds_write(st, ADI_REG_CHAN_CNTRL_2_IIOCHAN(chan), val);
410411

411-
if (chan % 2)
412-
dds_write(st, ADI_REG_CHAN_CNTRL_8(chan),
413-
ADI_IQCOR_COEFF_2(0x4000) |
414-
ADI_IQCOR_COEFF_1(0));
415-
else
416-
dds_write(st, ADI_REG_CHAN_CNTRL_8(chan),
417-
ADI_IQCOR_COEFF_2(0) |
418-
ADI_IQCOR_COEFF_1(0x4000));
419-
420412
return 0;
421413
}
422414

@@ -1789,40 +1781,35 @@ static int cf_axi_dds_probe(struct platform_device *pdev)
17891781
cf_axi_dds_datasel(st, -1, DATA_SEL_DDS);
17901782

17911783
if (!st->dp_disable) {
1792-
unsigned scale, frequency;
1784+
u32 scale, frequency, phase, i;
17931785
scale = 0x1000; /* 0.250 */
17941786
frequency = 40000000;
17951787

17961788
of_property_read_u32(np, "adi,axi-dds-default-scale", &scale);
17971789
of_property_read_u32(np, "adi,axi-dds-default-frequency",
17981790
&frequency);
17991791

1800-
cf_axi_dds_default_setup(st, 0, 90000, frequency, scale);
1801-
cf_axi_dds_default_setup(st, 1, 90000, frequency, scale);
1802-
1803-
1804-
if (st->chip_info->num_dds_channels >= 4) {
1805-
cf_axi_dds_default_setup(st, 2, 0, frequency, scale);
1806-
cf_axi_dds_default_setup(st, 3, 0, frequency, scale);
1807-
}
1792+
for (i = 0; i < st->chip_info->num_dds_channels; i += 2) {
1793+
if ((i / 2) % 2)
1794+
phase = 0;
1795+
else
1796+
phase = 90000;
18081797

1809-
if (st->chip_info->num_dds_channels >= 8) {
1810-
cf_axi_dds_default_setup(st, 4, 90000, frequency, scale);
1811-
cf_axi_dds_default_setup(st, 5, 90000, frequency, scale);
1812-
cf_axi_dds_default_setup(st, 6, 0, frequency, scale);
1813-
cf_axi_dds_default_setup(st, 7, 0, frequency, scale);
1798+
cf_axi_dds_default_setup(st, i, phase,
1799+
frequency, scale);
1800+
cf_axi_dds_default_setup(st, i + 1, phase,
1801+
frequency, scale);
18141802
}
18151803

1816-
if (st->chip_info->num_dds_channels >= 16) {
1817-
cf_axi_dds_default_setup(st, 8, 90000, frequency, scale);
1818-
cf_axi_dds_default_setup(st, 9, 90000, frequency, scale);
1819-
cf_axi_dds_default_setup(st, 10, 0, frequency, scale);
1820-
cf_axi_dds_default_setup(st, 11, 0, frequency, scale);
1821-
cf_axi_dds_default_setup(st, 12, 90000, frequency, scale);
1822-
cf_axi_dds_default_setup(st, 13, 90000, frequency, scale);
1823-
cf_axi_dds_default_setup(st, 14, 0, frequency, scale);
1824-
cf_axi_dds_default_setup(st, 15, 0, frequency, scale);
1825-
}
1804+
for (i = 0; i < st->chip_info->num_buf_channels; i++)
1805+
if (i % 2)
1806+
dds_write(st, ADI_REG_CHAN_CNTRL_8(i),
1807+
ADI_IQCOR_COEFF_2(0x4000) |
1808+
ADI_IQCOR_COEFF_1(0));
1809+
else
1810+
dds_write(st, ADI_REG_CHAN_CNTRL_8(i),
1811+
ADI_IQCOR_COEFF_2(0) |
1812+
ADI_IQCOR_COEFF_1(0x4000));
18261813

18271814
cf_axi_dds_update_chan_spec(st, st->chip_info->channel,
18281815
st->chip_info->num_channels);

0 commit comments

Comments
 (0)