ad9832.c 9.3 KB
Newer Older
1
/*
2
 * AD9832 SPI DDS driver
3
 *
4
 * Copyright 2011 Analog Devices Inc.
5
 *
6
 * Licensed under the GPL-2.
7
 */
8

9
#include <linux/device.h>
10
#include <linux/kernel.h>
11 12
#include <linux/slab.h>
#include <linux/sysfs.h>
13 14 15
#include <linux/spi/spi.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
16
#include <linux/module.h>
17
#include <asm/div64.h>
18

19 20
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
21
#include "dds.h"
22

23
#include "ad9832.h"
24

25
static unsigned long ad9832_calc_freqreg(unsigned long mclk, unsigned long fout)
26
{
27 28
	unsigned long long freqreg = (u64)fout *
				     (u64)((u64)1L << AD9832_FREQ_BITS);
29 30 31
	do_div(freqreg, mclk);
	return freqreg;
}
32

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
static int ad9832_write_frequency(struct ad9832_state *st,
				  unsigned addr, unsigned long fout)
{
	unsigned long regval;

	if (fout > (st->mclk / 2))
		return -EINVAL;

	regval = ad9832_calc_freqreg(st->mclk, fout);

	st->freq_data[0] = cpu_to_be16((AD9832_CMD_FRE8BITSW << CMD_SHIFT) |
					(addr << ADD_SHIFT) |
					((regval >> 24) & 0xFF));
	st->freq_data[1] = cpu_to_be16((AD9832_CMD_FRE16BITSW << CMD_SHIFT) |
					((addr - 1) << ADD_SHIFT) |
					((regval >> 16) & 0xFF));
	st->freq_data[2] = cpu_to_be16((AD9832_CMD_FRE8BITSW << CMD_SHIFT) |
					((addr - 2) << ADD_SHIFT) |
					((regval >> 8) & 0xFF));
	st->freq_data[3] = cpu_to_be16((AD9832_CMD_FRE16BITSW << CMD_SHIFT) |
					((addr - 3) << ADD_SHIFT) |
					((regval >> 0) & 0xFF));

56
	return spi_sync(st->spi, &st->freq_msg);
57 58
}

59
static int ad9832_write_phase(struct ad9832_state *st,
60
			      unsigned long addr, unsigned long phase)
61
{
62
	if (phase > BIT(AD9832_PHASE_BITS))
63
		return -EINVAL;
64

65 66 67 68 69 70
	st->phase_data[0] = cpu_to_be16((AD9832_CMD_PHA8BITSW << CMD_SHIFT) |
					(addr << ADD_SHIFT) |
					((phase >> 8) & 0xFF));
	st->phase_data[1] = cpu_to_be16((AD9832_CMD_PHA16BITSW << CMD_SHIFT) |
					((addr - 1) << ADD_SHIFT) |
					(phase & 0xFF));
71

72 73
	return spi_sync(st->spi, &st->phase_msg);
}
74

75 76
static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr,
			    const char *buf, size_t len)
77
{
78
	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
79
	struct ad9832_state *st = iio_priv(indio_dev);
80
	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
81
	int ret;
82
	unsigned long val;
83

84
	ret = kstrtoul(buf, 10, &val);
85 86 87
	if (ret)
		goto error_ret;

88
	mutex_lock(&indio_dev->mlock);
89
	switch ((u32)this_attr->address) {
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
	case AD9832_FREQ0HM:
	case AD9832_FREQ1HM:
		ret = ad9832_write_frequency(st, this_attr->address, val);
		break;
	case AD9832_PHASE0H:
	case AD9832_PHASE1H:
	case AD9832_PHASE2H:
	case AD9832_PHASE3H:
		ret = ad9832_write_phase(st, this_attr->address, val);
		break;
	case AD9832_PINCTRL_EN:
		if (val)
			st->ctrl_ss &= ~AD9832_SELSRC;
		else
			st->ctrl_ss |= AD9832_SELSRC;
		st->data = cpu_to_be16((AD9832_CMD_SYNCSELSRC << CMD_SHIFT) |
					st->ctrl_ss);
		ret = spi_sync(st->spi, &st->msg);
		break;
	case AD9832_FREQ_SYM:
110
		if (val == 1) {
111
			st->ctrl_fp |= AD9832_FREQ;
112
		} else if (val == 0) {
113
			st->ctrl_fp &= ~AD9832_FREQ;
114
		} else {
115 116 117 118 119 120 121 122
			ret = -EINVAL;
			break;
		}
		st->data = cpu_to_be16((AD9832_CMD_FPSELECT << CMD_SHIFT) |
					st->ctrl_fp);
		ret = spi_sync(st->spi, &st->msg);
		break;
	case AD9832_PHASE_SYM:
123
		if (val > 3) {
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
			ret = -EINVAL;
			break;
		}

		st->ctrl_fp &= ~AD9832_PHASE(3);
		st->ctrl_fp |= AD9832_PHASE(val);

		st->data = cpu_to_be16((AD9832_CMD_FPSELECT << CMD_SHIFT) |
					st->ctrl_fp);
		ret = spi_sync(st->spi, &st->msg);
		break;
	case AD9832_OUTPUT_EN:
		if (val)
			st->ctrl_src &= ~(AD9832_RESET | AD9832_SLEEP |
					AD9832_CLR);
		else
			st->ctrl_src |= AD9832_RESET;

		st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) |
					st->ctrl_src);
		ret = spi_sync(st->spi, &st->msg);
		break;
	default:
		ret = -ENODEV;
	}
149
	mutex_unlock(&indio_dev->mlock);
150

151 152 153
error_ret:
	return ret ? ret : len;
}
154

155 156 157
/**
 * see dds.h for further information
 */
158

159 160 161 162
static IIO_DEV_ATTR_FREQ(0, 0, S_IWUSR, NULL, ad9832_write, AD9832_FREQ0HM);
static IIO_DEV_ATTR_FREQ(0, 1, S_IWUSR, NULL, ad9832_write, AD9832_FREQ1HM);
static IIO_DEV_ATTR_FREQSYMBOL(0, S_IWUSR, NULL, ad9832_write, AD9832_FREQ_SYM);
static IIO_CONST_ATTR_FREQ_SCALE(0, "1"); /* 1Hz */
163

164 165 166 167 168 169 170
static IIO_DEV_ATTR_PHASE(0, 0, S_IWUSR, NULL, ad9832_write, AD9832_PHASE0H);
static IIO_DEV_ATTR_PHASE(0, 1, S_IWUSR, NULL, ad9832_write, AD9832_PHASE1H);
static IIO_DEV_ATTR_PHASE(0, 2, S_IWUSR, NULL, ad9832_write, AD9832_PHASE2H);
static IIO_DEV_ATTR_PHASE(0, 3, S_IWUSR, NULL, ad9832_write, AD9832_PHASE3H);
static IIO_DEV_ATTR_PHASESYMBOL(0, S_IWUSR, NULL,
				ad9832_write, AD9832_PHASE_SYM);
static IIO_CONST_ATTR_PHASE_SCALE(0, "0.0015339808"); /* 2PI/2^12 rad*/
171

172 173 174 175
static IIO_DEV_ATTR_PINCONTROL_EN(0, S_IWUSR, NULL,
				ad9832_write, AD9832_PINCTRL_EN);
static IIO_DEV_ATTR_OUT_ENABLE(0, S_IWUSR, NULL,
				ad9832_write, AD9832_OUTPUT_EN);
176

177
static struct attribute *ad9832_attributes[] = {
178 179 180 181 182 183 184 185 186 187 188 189
	&iio_dev_attr_out_altvoltage0_frequency0.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_frequency1.dev_attr.attr,
	&iio_const_attr_out_altvoltage0_frequency_scale.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_phase0.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_phase1.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_phase2.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_phase3.dev_attr.attr,
	&iio_const_attr_out_altvoltage0_phase_scale.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_pincontrol_en.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_frequencysymbol.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_phasesymbol.dev_attr.attr,
	&iio_dev_attr_out_altvoltage0_out_enable.dev_attr.attr,
190 191
	NULL,
};
192

193 194 195
static const struct attribute_group ad9832_attribute_group = {
	.attrs = ad9832_attributes,
};
196

197 198 199 200 201
static const struct iio_info ad9832_info = {
	.attrs = &ad9832_attribute_group,
	.driver_module = THIS_MODULE,
};

202
static int ad9832_probe(struct spi_device *spi)
203
{
204
	struct ad9832_platform_data *pdata = dev_get_platdata(&spi->dev);
205
	struct iio_dev *indio_dev;
206
	struct ad9832_state *st;
207
	struct regulator *reg;
208 209 210 211 212 213
	int ret;

	if (!pdata) {
		dev_dbg(&spi->dev, "no platform data?\n");
		return -ENODEV;
	}
214

215
	reg = devm_regulator_get(&spi->dev, "vcc");
216 217
	if (!IS_ERR(reg)) {
		ret = regulator_enable(reg);
218
		if (ret)
219
			return ret;
220 221
	}

222
	indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
223
	if (!indio_dev) {
224
		ret = -ENOMEM;
225
		goto error_disable_reg;
226
	}
227 228 229 230 231
	spi_set_drvdata(spi, indio_dev);
	st = iio_priv(indio_dev);
	st->reg = reg;
	st->mclk = pdata->mclk;
	st->spi = spi;
232

233 234 235 236
	indio_dev->dev.parent = &spi->dev;
	indio_dev->name = spi_get_device_id(spi)->name;
	indio_dev->info = &ad9832_info;
	indio_dev->modes = INDIO_DIRECT_MODE;
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279

	/* Setup default messages */

	st->xfer.tx_buf = &st->data;
	st->xfer.len = 2;

	spi_message_init(&st->msg);
	spi_message_add_tail(&st->xfer, &st->msg);

	st->freq_xfer[0].tx_buf = &st->freq_data[0];
	st->freq_xfer[0].len = 2;
	st->freq_xfer[0].cs_change = 1;
	st->freq_xfer[1].tx_buf = &st->freq_data[1];
	st->freq_xfer[1].len = 2;
	st->freq_xfer[1].cs_change = 1;
	st->freq_xfer[2].tx_buf = &st->freq_data[2];
	st->freq_xfer[2].len = 2;
	st->freq_xfer[2].cs_change = 1;
	st->freq_xfer[3].tx_buf = &st->freq_data[3];
	st->freq_xfer[3].len = 2;

	spi_message_init(&st->freq_msg);
	spi_message_add_tail(&st->freq_xfer[0], &st->freq_msg);
	spi_message_add_tail(&st->freq_xfer[1], &st->freq_msg);
	spi_message_add_tail(&st->freq_xfer[2], &st->freq_msg);
	spi_message_add_tail(&st->freq_xfer[3], &st->freq_msg);

	st->phase_xfer[0].tx_buf = &st->phase_data[0];
	st->phase_xfer[0].len = 2;
	st->phase_xfer[0].cs_change = 1;
	st->phase_xfer[1].tx_buf = &st->phase_data[1];
	st->phase_xfer[1].len = 2;

	spi_message_init(&st->phase_msg);
	spi_message_add_tail(&st->phase_xfer[0], &st->phase_msg);
	spi_message_add_tail(&st->phase_xfer[1], &st->phase_msg);

	st->ctrl_src = AD9832_SLEEP | AD9832_RESET | AD9832_CLR;
	st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) |
					st->ctrl_src);
	ret = spi_sync(st->spi, &st->msg);
	if (ret) {
		dev_err(&spi->dev, "device init failed\n");
280
		goto error_disable_reg;
281 282 283 284
	}

	ret = ad9832_write_frequency(st, AD9832_FREQ0HM, pdata->freq0);
	if (ret)
285
		goto error_disable_reg;
286 287 288

	ret = ad9832_write_frequency(st, AD9832_FREQ1HM, pdata->freq1);
	if (ret)
289
		goto error_disable_reg;
290 291 292

	ret = ad9832_write_phase(st, AD9832_PHASE0H, pdata->phase0);
	if (ret)
293
		goto error_disable_reg;
294 295 296

	ret = ad9832_write_phase(st, AD9832_PHASE1H, pdata->phase1);
	if (ret)
297
		goto error_disable_reg;
298

299
	ret = ad9832_write_phase(st, AD9832_PHASE2H, pdata->phase2);
300
	if (ret)
301
		goto error_disable_reg;
302 303 304

	ret = ad9832_write_phase(st, AD9832_PHASE3H, pdata->phase3);
	if (ret)
305
		goto error_disable_reg;
306

307
	ret = iio_device_register(indio_dev);
308
	if (ret)
309
		goto error_disable_reg;
310

311 312
	return 0;

313
error_disable_reg:
314 315 316
	if (!IS_ERR(reg))
		regulator_disable(reg);

317 318 319
	return ret;
}

320
static int ad9832_remove(struct spi_device *spi)
321
{
322 323 324 325
	struct iio_dev *indio_dev = spi_get_drvdata(spi);
	struct ad9832_state *st = iio_priv(indio_dev);

	iio_device_unregister(indio_dev);
326
	if (!IS_ERR(st->reg))
327 328
		regulator_disable(st->reg);

329 330 331
	return 0;
}

332 333 334 335 336
static const struct spi_device_id ad9832_id[] = {
	{"ad9832", 0},
	{"ad9835", 0},
	{}
};
337
MODULE_DEVICE_TABLE(spi, ad9832_id);
338

339 340
static struct spi_driver ad9832_driver = {
	.driver = {
341
		.name	= "ad9832",
342
	},
343
	.probe		= ad9832_probe,
344
	.remove		= ad9832_remove,
345
	.id_table	= ad9832_id,
346
};
347
module_spi_driver(ad9832_driver);
348

349 350
MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
MODULE_DESCRIPTION("Analog Devices AD9832/AD9835 DDS");
351
MODULE_LICENSE("GPL v2");