Commit 6489b8749d33ad35b8d2e24674708508f4bedabc
1 parent
01d6714696
Exists in
master
driver prenant le mot en bits et non la frequence
Showing 2 changed files with 1123 additions and 0 deletions Side-by-side Diff
220124_AD9832driver/ad9832.c
1 | +// SPDX-License-Identifier: GPL-2.0 | |
2 | +/* | |
3 | + * AD9832 SPI DDS driver | |
4 | + * | |
5 | + * Copyright 2011 Analog Devices Inc. | |
6 | + */ | |
7 | + | |
8 | +#include <asm/div64.h> | |
9 | + | |
10 | +#include <linux/clk.h> | |
11 | +#include <linux/device.h> | |
12 | +#include <linux/err.h> | |
13 | +#include <linux/kernel.h> | |
14 | +#include <linux/module.h> | |
15 | +#include <linux/regulator/consumer.h> | |
16 | +#include <linux/slab.h> | |
17 | +#include <linux/spi/spi.h> | |
18 | +#include <linux/sysfs.h> | |
19 | + | |
20 | +#include <linux/iio/iio.h> | |
21 | +#include <linux/iio/sysfs.h> | |
22 | + | |
23 | +#include "ad9832.h" | |
24 | + | |
25 | +#include "dds.h" | |
26 | + | |
27 | +/* Registers */ | |
28 | + | |
29 | +#define AD9832_FREQ0LL 0x0 | |
30 | +#define AD9832_FREQ0HL 0x1 | |
31 | +#define AD9832_FREQ0LM 0x2 | |
32 | +#define AD9832_FREQ0HM 0x3 | |
33 | +#define AD9832_FREQ1LL 0x4 | |
34 | +#define AD9832_FREQ1HL 0x5 | |
35 | +#define AD9832_FREQ1LM 0x6 | |
36 | +#define AD9832_FREQ1HM 0x7 | |
37 | +#define AD9832_PHASE0L 0x8 | |
38 | +#define AD9832_PHASE0H 0x9 | |
39 | +#define AD9832_PHASE1L 0xA | |
40 | +#define AD9832_PHASE1H 0xB | |
41 | +#define AD9832_PHASE2L 0xC | |
42 | +#define AD9832_PHASE2H 0xD | |
43 | +#define AD9832_PHASE3L 0xE | |
44 | +#define AD9832_PHASE3H 0xF | |
45 | + | |
46 | +#define AD9832_PHASE_SYM 0x10 | |
47 | +#define AD9832_FREQ_SYM 0x11 | |
48 | +#define AD9832_PINCTRL_EN 0x12 | |
49 | +#define AD9832_OUTPUT_EN 0x13 | |
50 | + | |
51 | +/* Command Control Bits */ | |
52 | + | |
53 | +#define AD9832_CMD_PHA8BITSW 0x1 | |
54 | +#define AD9832_CMD_PHA16BITSW 0x0 | |
55 | +#define AD9832_CMD_FRE8BITSW 0x3 | |
56 | +#define AD9832_CMD_FRE16BITSW 0x2 | |
57 | +#define AD9832_CMD_FPSELECT 0x6 | |
58 | +#define AD9832_CMD_SYNCSELSRC 0x8 | |
59 | +#define AD9832_CMD_SLEEPRESCLR 0xC | |
60 | + | |
61 | +#define AD9832_FREQ BIT(11) | |
62 | +#define AD9832_PHASE(x) (((x) & 3) << 9) | |
63 | +#define AD9832_SYNC BIT(13) | |
64 | +#define AD9832_SELSRC BIT(12) | |
65 | +#define AD9832_SLEEP BIT(13) | |
66 | +#define AD9832_RESET BIT(12) | |
67 | +#define AD9832_CLR BIT(11) | |
68 | +#define CMD_SHIFT 12 | |
69 | +#define ADD_SHIFT 8 | |
70 | +#define AD9832_FREQ_BITS 32 | |
71 | +#define AD9832_PHASE_BITS 12 | |
72 | +#define RES_MASK(bits) ((1 << (bits)) - 1) | |
73 | + | |
74 | +/** | |
75 | + * struct ad9832_state - driver instance specific data | |
76 | + * @spi: spi_device | |
77 | + * @avdd: supply regulator for the analog section | |
78 | + * @dvdd: supply regulator for the digital section | |
79 | + * @mclk: external master clock | |
80 | + * @ctrl_fp: cached frequency/phase control word | |
81 | + * @ctrl_ss: cached sync/selsrc control word | |
82 | + * @ctrl_src: cached sleep/reset/clr word | |
83 | + * @xfer: default spi transfer | |
84 | + * @msg: default spi message | |
85 | + * @freq_xfer: tuning word spi transfer | |
86 | + * @freq_msg: tuning word spi message | |
87 | + * @phase_xfer: tuning word spi transfer | |
88 | + * @phase_msg: tuning word spi message | |
89 | + * @lock protect sensor state | |
90 | + * @data: spi transmit buffer | |
91 | + * @phase_data: tuning word spi transmit buffer | |
92 | + * @freq_data: tuning word spi transmit buffer | |
93 | + */ | |
94 | + | |
95 | +struct ad9832_state { | |
96 | + struct spi_device *spi; | |
97 | + struct regulator *avdd; | |
98 | + struct regulator *dvdd; | |
99 | + struct clk *mclk; | |
100 | + unsigned short ctrl_fp; | |
101 | + unsigned short ctrl_ss; | |
102 | + unsigned short ctrl_src; | |
103 | + struct spi_transfer xfer; | |
104 | + struct spi_message msg; | |
105 | + struct spi_transfer freq_xfer[4]; | |
106 | + struct spi_message freq_msg; | |
107 | + struct spi_transfer phase_xfer[2]; | |
108 | + struct spi_message phase_msg; | |
109 | + struct mutex lock; /* protect sensor state */ | |
110 | + /* | |
111 | + * DMA (thus cache coherency maintenance) requires the | |
112 | + * transfer buffers to live in their own cache lines. | |
113 | + */ | |
114 | + union { | |
115 | + __be16 freq_data[4]____cacheline_aligned; | |
116 | + __be16 phase_data[2]; | |
117 | + __be16 data; | |
118 | + }; | |
119 | +}; | |
120 | + | |
121 | +static unsigned long ad9832_calc_freqreg(unsigned long mclk, unsigned long fout) | |
122 | +{ | |
123 | +// unsigned long long freqreg = (u64)fout * | |
124 | +// (u64)((u64)1L << AD9832_FREQ_BITS); | |
125 | +// do_div(freqreg, mclk); | |
126 | + return fout; // freqreg; | |
127 | +} | |
128 | + | |
129 | +static int ad9832_write_frequency(struct ad9832_state *st, | |
130 | + unsigned int addr, unsigned long fout) | |
131 | +{ | |
132 | + unsigned long regval; | |
133 | + | |
134 | +// if (fout > (clk_get_rate(st->mclk) / 2)) | |
135 | +// return -EINVAL; | |
136 | + | |
137 | + regval = ad9832_calc_freqreg(clk_get_rate(st->mclk), fout); | |
138 | + | |
139 | + st->freq_data[0] = cpu_to_be16((AD9832_CMD_FRE8BITSW << CMD_SHIFT) | | |
140 | + (addr << ADD_SHIFT) | | |
141 | + ((regval >> 24) & 0xFF)); | |
142 | + st->freq_data[1] = cpu_to_be16((AD9832_CMD_FRE16BITSW << CMD_SHIFT) | | |
143 | + ((addr - 1) << ADD_SHIFT) | | |
144 | + ((regval >> 16) & 0xFF)); | |
145 | + st->freq_data[2] = cpu_to_be16((AD9832_CMD_FRE8BITSW << CMD_SHIFT) | | |
146 | + ((addr - 2) << ADD_SHIFT) | | |
147 | + ((regval >> 8) & 0xFF)); | |
148 | + st->freq_data[3] = cpu_to_be16((AD9832_CMD_FRE16BITSW << CMD_SHIFT) | | |
149 | + ((addr - 3) << ADD_SHIFT) | | |
150 | + ((regval >> 0) & 0xFF)); | |
151 | + | |
152 | + return spi_sync(st->spi, &st->freq_msg); | |
153 | +} | |
154 | + | |
155 | +static int ad9832_write_phase(struct ad9832_state *st, | |
156 | + unsigned long addr, unsigned long phase) | |
157 | +{ | |
158 | + if (phase > BIT(AD9832_PHASE_BITS)) | |
159 | + return -EINVAL; | |
160 | + | |
161 | + st->phase_data[0] = cpu_to_be16((AD9832_CMD_PHA8BITSW << CMD_SHIFT) | | |
162 | + (addr << ADD_SHIFT) | | |
163 | + ((phase >> 8) & 0xFF)); | |
164 | + st->phase_data[1] = cpu_to_be16((AD9832_CMD_PHA16BITSW << CMD_SHIFT) | | |
165 | + ((addr - 1) << ADD_SHIFT) | | |
166 | + (phase & 0xFF)); | |
167 | + | |
168 | + return spi_sync(st->spi, &st->phase_msg); | |
169 | +} | |
170 | + | |
171 | +static ssize_t ad9832_write(struct device *dev, struct device_attribute *attr, | |
172 | + const char *buf, size_t len) | |
173 | +{ | |
174 | + struct iio_dev *indio_dev = dev_to_iio_dev(dev); | |
175 | + struct ad9832_state *st = iio_priv(indio_dev); | |
176 | + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); | |
177 | + int ret; | |
178 | + unsigned long val; | |
179 | + | |
180 | + ret = kstrtoul(buf, 10, &val); | |
181 | + if (ret) | |
182 | + goto error_ret; | |
183 | + | |
184 | + mutex_lock(&st->lock); | |
185 | + switch ((u32)this_attr->address) { | |
186 | + case AD9832_FREQ0HM: | |
187 | + case AD9832_FREQ1HM: | |
188 | + ret = ad9832_write_frequency(st, this_attr->address, val); | |
189 | + break; | |
190 | + case AD9832_PHASE0H: | |
191 | + case AD9832_PHASE1H: | |
192 | + case AD9832_PHASE2H: | |
193 | + case AD9832_PHASE3H: | |
194 | + ret = ad9832_write_phase(st, this_attr->address, val); | |
195 | + break; | |
196 | + case AD9832_PINCTRL_EN: | |
197 | + if (val) | |
198 | + st->ctrl_ss &= ~AD9832_SELSRC; | |
199 | + else | |
200 | + st->ctrl_ss |= AD9832_SELSRC; | |
201 | + st->data = cpu_to_be16((AD9832_CMD_SYNCSELSRC << CMD_SHIFT) | | |
202 | + st->ctrl_ss); | |
203 | + ret = spi_sync(st->spi, &st->msg); | |
204 | + break; | |
205 | + case AD9832_FREQ_SYM: | |
206 | + if (val == 1) { | |
207 | + st->ctrl_fp |= AD9832_FREQ; | |
208 | + } else if (val == 0) { | |
209 | + st->ctrl_fp &= ~AD9832_FREQ; | |
210 | + } else { | |
211 | + ret = -EINVAL; | |
212 | + break; | |
213 | + } | |
214 | + st->data = cpu_to_be16((AD9832_CMD_FPSELECT << CMD_SHIFT) | | |
215 | + st->ctrl_fp); | |
216 | + ret = spi_sync(st->spi, &st->msg); | |
217 | + break; | |
218 | + case AD9832_PHASE_SYM: | |
219 | + if (val > 3) { | |
220 | + ret = -EINVAL; | |
221 | + break; | |
222 | + } | |
223 | + | |
224 | + st->ctrl_fp &= ~AD9832_PHASE(3); | |
225 | + st->ctrl_fp |= AD9832_PHASE(val); | |
226 | + | |
227 | + st->data = cpu_to_be16((AD9832_CMD_FPSELECT << CMD_SHIFT) | | |
228 | + st->ctrl_fp); | |
229 | + ret = spi_sync(st->spi, &st->msg); | |
230 | + break; | |
231 | + case AD9832_OUTPUT_EN: | |
232 | + if (val) | |
233 | + st->ctrl_src &= ~(AD9832_RESET | AD9832_SLEEP | | |
234 | + AD9832_CLR); | |
235 | + else | |
236 | + st->ctrl_src |= AD9832_RESET; | |
237 | + | |
238 | + st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | | |
239 | + st->ctrl_src); | |
240 | + ret = spi_sync(st->spi, &st->msg); | |
241 | + break; | |
242 | + default: | |
243 | + ret = -ENODEV; | |
244 | + } | |
245 | + mutex_unlock(&st->lock); | |
246 | + | |
247 | +error_ret: | |
248 | + return ret ? ret : len; | |
249 | +} | |
250 | + | |
251 | +/** | |
252 | + * see dds.h for further information | |
253 | + */ | |
254 | + | |
255 | +static IIO_DEV_ATTR_FREQ(0, 0, 0200, NULL, ad9832_write, AD9832_FREQ0HM); | |
256 | +static IIO_DEV_ATTR_FREQ(0, 1, 0200, NULL, ad9832_write, AD9832_FREQ1HM); | |
257 | +static IIO_DEV_ATTR_FREQSYMBOL(0, 0200, NULL, ad9832_write, AD9832_FREQ_SYM); | |
258 | +static IIO_CONST_ATTR_FREQ_SCALE(0, "1"); /* 1Hz */ | |
259 | + | |
260 | +static IIO_DEV_ATTR_PHASE(0, 0, 0200, NULL, ad9832_write, AD9832_PHASE0H); | |
261 | +static IIO_DEV_ATTR_PHASE(0, 1, 0200, NULL, ad9832_write, AD9832_PHASE1H); | |
262 | +static IIO_DEV_ATTR_PHASE(0, 2, 0200, NULL, ad9832_write, AD9832_PHASE2H); | |
263 | +static IIO_DEV_ATTR_PHASE(0, 3, 0200, NULL, ad9832_write, AD9832_PHASE3H); | |
264 | +static IIO_DEV_ATTR_PHASESYMBOL(0, 0200, NULL, | |
265 | + ad9832_write, AD9832_PHASE_SYM); | |
266 | +static IIO_CONST_ATTR_PHASE_SCALE(0, "0.0015339808"); /* 2PI/2^12 rad*/ | |
267 | + | |
268 | +static IIO_DEV_ATTR_PINCONTROL_EN(0, 0200, NULL, | |
269 | + ad9832_write, AD9832_PINCTRL_EN); | |
270 | +static IIO_DEV_ATTR_OUT_ENABLE(0, 0200, NULL, | |
271 | + ad9832_write, AD9832_OUTPUT_EN); | |
272 | + | |
273 | +static struct attribute *ad9832_attributes[] = { | |
274 | + &iio_dev_attr_out_altvoltage0_frequency0.dev_attr.attr, | |
275 | + &iio_dev_attr_out_altvoltage0_frequency1.dev_attr.attr, | |
276 | + &iio_const_attr_out_altvoltage0_frequency_scale.dev_attr.attr, | |
277 | + &iio_dev_attr_out_altvoltage0_phase0.dev_attr.attr, | |
278 | + &iio_dev_attr_out_altvoltage0_phase1.dev_attr.attr, | |
279 | + &iio_dev_attr_out_altvoltage0_phase2.dev_attr.attr, | |
280 | + &iio_dev_attr_out_altvoltage0_phase3.dev_attr.attr, | |
281 | + &iio_const_attr_out_altvoltage0_phase_scale.dev_attr.attr, | |
282 | + &iio_dev_attr_out_altvoltage0_pincontrol_en.dev_attr.attr, | |
283 | + &iio_dev_attr_out_altvoltage0_frequencysymbol.dev_attr.attr, | |
284 | + &iio_dev_attr_out_altvoltage0_phasesymbol.dev_attr.attr, | |
285 | + &iio_dev_attr_out_altvoltage0_out_enable.dev_attr.attr, | |
286 | + NULL, | |
287 | +}; | |
288 | + | |
289 | +static const struct attribute_group ad9832_attribute_group = { | |
290 | + .attrs = ad9832_attributes, | |
291 | +}; | |
292 | + | |
293 | +static const struct iio_info ad9832_info = { | |
294 | + .attrs = &ad9832_attribute_group, | |
295 | +}; | |
296 | + | |
297 | +#if defined(CONFIG_OF) | |
298 | +static struct ad9832_platform_data *ad9832_parse_dt(struct spi_device *spi) | |
299 | +{ | |
300 | + struct ad9832_platform_data *pdata; | |
301 | + struct device_node *np = spi->dev.of_node; | |
302 | + unsigned int tmp; | |
303 | + | |
304 | + pdata = devm_kzalloc(&spi->dev, sizeof(*pdata), GFP_KERNEL); | |
305 | + if (!pdata) | |
306 | + return ERR_PTR(-ENOMEM); | |
307 | + | |
308 | + pdata->freq0 = 134000; | |
309 | + of_property_read_u32(np, "freq0", &tmp); | |
310 | + pdata->freq0=(unsigned int)tmp; | |
311 | + | |
312 | + pdata->freq1 = 134000; | |
313 | + of_property_read_u32(np, "freq1", &tmp); | |
314 | + pdata->freq1=(unsigned int)tmp; | |
315 | + | |
316 | + pdata->phase0 = 0; | |
317 | + of_property_read_u16(np, "phase0", &pdata->phase0); | |
318 | + | |
319 | + pdata->phase1 = 0; | |
320 | + of_property_read_u16(np, "phase1", &pdata->phase1); | |
321 | + | |
322 | + pdata->phase2 = 0; | |
323 | + of_property_read_u16(np, "phase1", &pdata->phase2); | |
324 | + | |
325 | + pdata->phase3 = 0; | |
326 | + of_property_read_u16(np, "phase1", &pdata->phase3); | |
327 | + | |
328 | + return pdata; | |
329 | +} | |
330 | +#else | |
331 | +static struct ad9832_platform_data *ad9832_parse_dt(struct spi_device *spi) | |
332 | +{ | |
333 | + return NULL; | |
334 | +} | |
335 | +#endif | |
336 | + | |
337 | +static int ad9832_probe(struct spi_device *spi) | |
338 | +{ | |
339 | + struct ad9832_platform_data *pdata = dev_get_platdata(&spi->dev); | |
340 | + struct iio_dev *indio_dev; | |
341 | + struct ad9832_state *st; | |
342 | + int ret; | |
343 | + | |
344 | + if (!pdata && spi->dev.of_node) { | |
345 | + pdata = ad9832_parse_dt(spi); | |
346 | + if (IS_ERR(pdata)) | |
347 | + return PTR_ERR(pdata); | |
348 | + } | |
349 | + | |
350 | + if (!pdata) { | |
351 | + dev_dbg(&spi->dev, "no platform data?\n"); | |
352 | + return -ENODEV; | |
353 | + } | |
354 | + | |
355 | + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); | |
356 | + if (!indio_dev) | |
357 | + return -ENOMEM; | |
358 | + | |
359 | + spi_set_drvdata(spi, indio_dev); | |
360 | + st = iio_priv(indio_dev); | |
361 | + | |
362 | + st->avdd = devm_regulator_get(&spi->dev, "avdd"); | |
363 | + if (IS_ERR(st->avdd)) | |
364 | + return PTR_ERR(st->avdd); | |
365 | + | |
366 | + ret = regulator_enable(st->avdd); | |
367 | + if (ret) { | |
368 | + dev_err(&spi->dev, "Failed to enable specified AVDD supply\n"); | |
369 | + return ret; | |
370 | + } | |
371 | + | |
372 | + st->dvdd = devm_regulator_get(&spi->dev, "dvdd"); | |
373 | + if (IS_ERR(st->dvdd)) { | |
374 | + ret = PTR_ERR(st->dvdd); | |
375 | + goto error_disable_avdd; | |
376 | + } | |
377 | + | |
378 | + ret = regulator_enable(st->dvdd); | |
379 | + if (ret) { | |
380 | + dev_err(&spi->dev, "Failed to enable specified DVDD supply\n"); | |
381 | + goto error_disable_avdd; | |
382 | + } | |
383 | + | |
384 | + st->mclk = devm_clk_get(&spi->dev, "mclk"); | |
385 | + if (IS_ERR(st->mclk)) { | |
386 | + ret = PTR_ERR(st->mclk); | |
387 | + goto error_disable_dvdd; | |
388 | + } | |
389 | + | |
390 | + ret = clk_prepare_enable(st->mclk); | |
391 | + if (ret < 0) | |
392 | + goto error_disable_dvdd; | |
393 | + | |
394 | + st->spi = spi; | |
395 | + mutex_init(&st->lock); | |
396 | + | |
397 | + indio_dev->name = spi_get_device_id(spi)->name; | |
398 | + indio_dev->info = &ad9832_info; | |
399 | + indio_dev->modes = INDIO_DIRECT_MODE; | |
400 | + | |
401 | + /* Setup default messages */ | |
402 | + | |
403 | + st->xfer.tx_buf = &st->data; | |
404 | + st->xfer.len = 2; | |
405 | + | |
406 | + spi_message_init(&st->msg); | |
407 | + spi_message_add_tail(&st->xfer, &st->msg); | |
408 | + | |
409 | + st->freq_xfer[0].tx_buf = &st->freq_data[0]; | |
410 | + st->freq_xfer[0].len = 2; | |
411 | + st->freq_xfer[0].cs_change = 1; | |
412 | + st->freq_xfer[1].tx_buf = &st->freq_data[1]; | |
413 | + st->freq_xfer[1].len = 2; | |
414 | + st->freq_xfer[1].cs_change = 1; | |
415 | + st->freq_xfer[2].tx_buf = &st->freq_data[2]; | |
416 | + st->freq_xfer[2].len = 2; | |
417 | + st->freq_xfer[2].cs_change = 1; | |
418 | + st->freq_xfer[3].tx_buf = &st->freq_data[3]; | |
419 | + st->freq_xfer[3].len = 2; | |
420 | + | |
421 | + spi_message_init(&st->freq_msg); | |
422 | + spi_message_add_tail(&st->freq_xfer[0], &st->freq_msg); | |
423 | + spi_message_add_tail(&st->freq_xfer[1], &st->freq_msg); | |
424 | + spi_message_add_tail(&st->freq_xfer[2], &st->freq_msg); | |
425 | + spi_message_add_tail(&st->freq_xfer[3], &st->freq_msg); | |
426 | + | |
427 | + st->phase_xfer[0].tx_buf = &st->phase_data[0]; | |
428 | + st->phase_xfer[0].len = 2; | |
429 | + st->phase_xfer[0].cs_change = 1; | |
430 | + st->phase_xfer[1].tx_buf = &st->phase_data[1]; | |
431 | + st->phase_xfer[1].len = 2; | |
432 | + | |
433 | + spi_message_init(&st->phase_msg); | |
434 | + spi_message_add_tail(&st->phase_xfer[0], &st->phase_msg); | |
435 | + spi_message_add_tail(&st->phase_xfer[1], &st->phase_msg); | |
436 | + | |
437 | + st->ctrl_src = AD9832_SLEEP | AD9832_RESET | AD9832_CLR; | |
438 | + st->data = cpu_to_be16((AD9832_CMD_SLEEPRESCLR << CMD_SHIFT) | | |
439 | + st->ctrl_src); | |
440 | + ret = spi_sync(st->spi, &st->msg); | |
441 | + if (ret) { | |
442 | + dev_err(&spi->dev, "device init failed\n"); | |
443 | + goto error_unprepare_mclk; | |
444 | + } | |
445 | + | |
446 | + ret = ad9832_write_frequency(st, AD9832_FREQ0HM, pdata->freq0); | |
447 | + if (ret) | |
448 | + goto error_unprepare_mclk; | |
449 | + | |
450 | + ret = ad9832_write_frequency(st, AD9832_FREQ1HM, pdata->freq1); | |
451 | + if (ret) | |
452 | + goto error_unprepare_mclk; | |
453 | + | |
454 | + ret = ad9832_write_phase(st, AD9832_PHASE0H, pdata->phase0); | |
455 | + if (ret) | |
456 | + goto error_unprepare_mclk; | |
457 | + | |
458 | + ret = ad9832_write_phase(st, AD9832_PHASE1H, pdata->phase1); | |
459 | + if (ret) | |
460 | + goto error_unprepare_mclk; | |
461 | + | |
462 | + ret = ad9832_write_phase(st, AD9832_PHASE2H, pdata->phase2); | |
463 | + if (ret) | |
464 | + goto error_unprepare_mclk; | |
465 | + | |
466 | + ret = ad9832_write_phase(st, AD9832_PHASE3H, pdata->phase3); | |
467 | + if (ret) | |
468 | + goto error_unprepare_mclk; | |
469 | + | |
470 | + ret = iio_device_register(indio_dev); | |
471 | + if (ret) | |
472 | + goto error_unprepare_mclk; | |
473 | + | |
474 | + return 0; | |
475 | + | |
476 | +error_unprepare_mclk: | |
477 | + clk_disable_unprepare(st->mclk); | |
478 | +error_disable_dvdd: | |
479 | + regulator_disable(st->dvdd); | |
480 | +error_disable_avdd: | |
481 | + regulator_disable(st->avdd); | |
482 | + | |
483 | + return ret; | |
484 | +} | |
485 | + | |
486 | +static int ad9832_remove(struct spi_device *spi) | |
487 | +{ | |
488 | + struct iio_dev *indio_dev = spi_get_drvdata(spi); | |
489 | + struct ad9832_state *st = iio_priv(indio_dev); | |
490 | + | |
491 | + iio_device_unregister(indio_dev); | |
492 | + clk_disable_unprepare(st->mclk); | |
493 | + regulator_disable(st->dvdd); | |
494 | + regulator_disable(st->avdd); | |
495 | + | |
496 | + return 0; | |
497 | +} | |
498 | + | |
499 | +static const struct spi_device_id ad9832_id[] = { | |
500 | + {"ad9832", 0}, | |
501 | + {"ad9835", 0}, | |
502 | + {} | |
503 | +}; | |
504 | +MODULE_DEVICE_TABLE(spi, ad9832_id); | |
505 | + | |
506 | +static struct spi_driver ad9832_driver = { | |
507 | + .driver = { | |
508 | + .name = "ad9832", | |
509 | + }, | |
510 | + .probe = ad9832_probe, | |
511 | + .remove = ad9832_remove, | |
512 | + .id_table = ad9832_id, | |
513 | +}; | |
514 | +module_spi_driver(ad9832_driver); | |
515 | + | |
516 | +MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); | |
517 | +MODULE_DESCRIPTION("Analog Devices AD9832/AD9835 DDS"); | |
518 | +MODULE_LICENSE("GPL v2"); |
220124_AD9832driver/bcm2711-rpi-4-b.dts
1 | +// SPDX-License-Identifier: GPL-2.0 | |
2 | +/dts-v1/; | |
3 | +#include "bcm2711.dtsi" | |
4 | +#include "bcm2835-rpi.dtsi" | |
5 | + | |
6 | +/ { | |
7 | + compatible = "raspberrypi,4-model-b", "brcm,bcm2711"; | |
8 | + model = "Raspberry Pi 4 Model B"; | |
9 | + | |
10 | + chosen { | |
11 | + /* 8250 auxiliary UART instead of pl011 */ | |
12 | + stdout-path = "serial1:115200n8"; | |
13 | + }; | |
14 | + | |
15 | + /* Will be filled by the bootloader */ | |
16 | + memory@0 { | |
17 | + device_type = "memory"; | |
18 | + reg = <0 0 0>; | |
19 | + }; | |
20 | + | |
21 | + aliases { | |
22 | + emmc2bus = &emmc2bus; | |
23 | + ethernet0 = &genet; | |
24 | + pcie0 = &pcie0; | |
25 | + }; | |
26 | + | |
27 | + leds { | |
28 | + act { | |
29 | + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; | |
30 | + }; | |
31 | + | |
32 | + pwr { | |
33 | + label = "PWR"; | |
34 | + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; | |
35 | + default-state = "keep"; | |
36 | + linux,default-trigger = "default-on"; | |
37 | + }; | |
38 | + }; | |
39 | + | |
40 | + wifi_pwrseq: wifi-pwrseq { | |
41 | + compatible = "mmc-pwrseq-simple"; | |
42 | + reset-gpios = <&expgpio 1 GPIO_ACTIVE_LOW>; | |
43 | + }; | |
44 | + | |
45 | + sd_io_1v8_reg: sd_io_1v8_reg { | |
46 | + compatible = "regulator-gpio"; | |
47 | + regulator-name = "vdd-sd-io"; | |
48 | + regulator-min-microvolt = <1800000>; | |
49 | + regulator-max-microvolt = <3300000>; | |
50 | + regulator-boot-on; | |
51 | + regulator-always-on; | |
52 | + regulator-settling-time-us = <5000>; | |
53 | + gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>; | |
54 | + states = <1800000 0x1 | |
55 | + 3300000 0x0>; | |
56 | + status = "okay"; | |
57 | + }; | |
58 | +}; | |
59 | + | |
60 | +&firmware { | |
61 | + expgpio: gpio { | |
62 | + compatible = "raspberrypi,firmware-gpio"; | |
63 | + gpio-controller; | |
64 | + #gpio-cells = <2>; | |
65 | + gpio-line-names = "BT_ON", | |
66 | + "WL_ON", | |
67 | + "PWR_LED_OFF", | |
68 | + "GLOBAL_RESET", | |
69 | + "VDD_SD_IO_SEL", | |
70 | + "CAM_GPIO", | |
71 | + "SD_PWR_ON", | |
72 | + "SD_OC_N"; | |
73 | + status = "okay"; | |
74 | + }; | |
75 | +}; | |
76 | + | |
77 | +&gpio { | |
78 | + /* | |
79 | + * Parts taken from rpi_SCH_4b_4p0_reduced.pdf and | |
80 | + * the official GPU firmware DT blob. | |
81 | + * | |
82 | + * Legend: | |
83 | + * "FOO" = GPIO line named "FOO" on the schematic | |
84 | + * "FOO_N" = GPIO line named "FOO" on schematic, active low | |
85 | + */ | |
86 | + gpio-line-names = "ID_SDA", | |
87 | + "ID_SCL", | |
88 | + "SDA1", | |
89 | + "SCL1", | |
90 | + "GPIO_GCLK", | |
91 | + "GPIO5", | |
92 | + "GPIO6", | |
93 | + "SPI_CE1_N", | |
94 | + "SPI_CE0_N", | |
95 | + "SPI_MISO", | |
96 | + "SPI_MOSI", | |
97 | + "SPI_SCLK", | |
98 | + "GPIO12", | |
99 | + "GPIO13", | |
100 | + /* Serial port */ | |
101 | + "TXD1", | |
102 | + "RXD1", | |
103 | + "GPIO16", | |
104 | + "GPIO17", | |
105 | + "GPIO18", | |
106 | + "GPIO19", | |
107 | + "GPIO20", | |
108 | + "GPIO21", | |
109 | + "GPIO22", | |
110 | + "GPIO23", | |
111 | + "GPIO24", | |
112 | + "GPIO25", | |
113 | + "GPIO26", | |
114 | + "GPIO27", | |
115 | + "RGMII_MDIO", | |
116 | + "RGMIO_MDC", | |
117 | + /* Used by BT module */ | |
118 | + "CTS0", | |
119 | + "RTS0", | |
120 | + "TXD0", | |
121 | + "RXD0", | |
122 | + /* Used by Wifi */ | |
123 | + "SD1_CLK", | |
124 | + "SD1_CMD", | |
125 | + "SD1_DATA0", | |
126 | + "SD1_DATA1", | |
127 | + "SD1_DATA2", | |
128 | + "SD1_DATA3", | |
129 | + /* Shared with SPI flash */ | |
130 | + "PWM0_MISO", | |
131 | + "PWM1_MOSI", | |
132 | + "STATUS_LED_G_CLK", | |
133 | + "SPIFLASH_CE_N", | |
134 | + "SDA0", | |
135 | + "SCL0", | |
136 | + "RGMII_RXCLK", | |
137 | + "RGMII_RXCTL", | |
138 | + "RGMII_RXD0", | |
139 | + "RGMII_RXD1", | |
140 | + "RGMII_RXD2", | |
141 | + "RGMII_RXD3", | |
142 | + "RGMII_TXCLK", | |
143 | + "RGMII_TXCTL", | |
144 | + "RGMII_TXD0", | |
145 | + "RGMII_TXD1", | |
146 | + "RGMII_TXD2", | |
147 | + "RGMII_TXD3"; | |
148 | +}; | |
149 | + | |
150 | +&pwm1 { | |
151 | + pinctrl-names = "default"; | |
152 | + pinctrl-0 = <&pwm1_0_gpio40 &pwm1_1_gpio41>; | |
153 | + status = "okay"; | |
154 | +}; | |
155 | + | |
156 | +/* SDHCI is used to control the SDIO for wireless */ | |
157 | +&sdhci { | |
158 | + #address-cells = <1>; | |
159 | + #size-cells = <0>; | |
160 | + pinctrl-names = "default"; | |
161 | + pinctrl-0 = <&emmc_gpio34>; | |
162 | + bus-width = <4>; | |
163 | + non-removable; | |
164 | + mmc-pwrseq = <&wifi_pwrseq>; | |
165 | + status = "okay"; | |
166 | + | |
167 | + brcmf: wifi@1 { | |
168 | + reg = <1>; | |
169 | + compatible = "brcm,bcm4329-fmac"; | |
170 | + }; | |
171 | +}; | |
172 | + | |
173 | +/* EMMC2 is used to drive the SD card */ | |
174 | +&emmc2 { | |
175 | + vqmmc-supply = <&sd_io_1v8_reg>; | |
176 | + broken-cd; | |
177 | + status = "okay"; | |
178 | +}; | |
179 | + | |
180 | +&genet { | |
181 | + phy-handle = <&phy1>; | |
182 | + phy-mode = "rgmii-rxid"; | |
183 | + status = "okay"; | |
184 | +}; | |
185 | + | |
186 | +&genet_mdio { | |
187 | + phy1: ethernet-phy@1 { | |
188 | + /* No PHY interrupt */ | |
189 | + reg = <0x1>; | |
190 | + }; | |
191 | +}; | |
192 | + | |
193 | +/* uart0 communicates with the BT module */ | |
194 | +&uart0 { | |
195 | + pinctrl-names = "default"; | |
196 | + pinctrl-0 = <&uart0_ctsrts_gpio30 &uart0_gpio32>; | |
197 | + uart-has-rtscts; | |
198 | + status = "okay"; | |
199 | + | |
200 | + bluetooth { | |
201 | + compatible = "brcm,bcm43438-bt"; | |
202 | + max-speed = <2000000>; | |
203 | + shutdown-gpios = <&expgpio 0 GPIO_ACTIVE_HIGH>; | |
204 | + }; | |
205 | +}; | |
206 | + | |
207 | +/* uart1 is mapped to the pin header */ | |
208 | +&uart1 { | |
209 | + pinctrl-names = "default"; | |
210 | + pinctrl-0 = <&uart1_gpio14>; | |
211 | + status = "okay"; | |
212 | +}; | |
213 | + | |
214 | +&vchiq { | |
215 | + interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>; | |
216 | +}; | |
217 | + | |
218 | +// ============================================= | |
219 | +// Downstream rpi- changes | |
220 | + | |
221 | +#include "bcm270x.dtsi" | |
222 | +#include "bcm271x-rpi-bt.dtsi" | |
223 | + | |
224 | +/ { | |
225 | + soc { | |
226 | + /delete-node/ pixelvalve@7e807000; | |
227 | + /delete-node/ hdmi@7e902000; | |
228 | + }; | |
229 | +}; | |
230 | + | |
231 | +#include "bcm2711-rpi.dtsi" | |
232 | +#include "bcm283x-rpi-csi1-2lane.dtsi" | |
233 | +#include "bcm283x-rpi-i2c0mux_0_44.dtsi" | |
234 | + | |
235 | +/ { | |
236 | + chosen { | |
237 | + bootargs = "coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 snd_bcm2835.enable_headphones=1"; | |
238 | + }; | |
239 | + | |
240 | + aliases { | |
241 | + serial0 = &uart1; | |
242 | + serial1 = &uart0; | |
243 | + mmc0 = &emmc2; | |
244 | + mmc1 = &mmcnr; | |
245 | + mmc2 = &sdhost; | |
246 | + /delete-property/ i2c2; | |
247 | + i2c3 = &i2c3; | |
248 | + i2c4 = &i2c4; | |
249 | + i2c5 = &i2c5; | |
250 | + i2c6 = &i2c6; | |
251 | + /delete-property/ intc; | |
252 | + }; | |
253 | + | |
254 | + vcc: fixedregulator@0 { | |
255 | + compatible = "regulator-fixed"; | |
256 | + regulator-name = "fixed-supply"; | |
257 | + regulator-min-microvolt = <2500000>; | |
258 | + regulator-max-microvolt = <2500000>; | |
259 | + regulator-boot-on; | |
260 | + }; | |
261 | + | |
262 | + osc: oscillator { | |
263 | + #clock-cells = <0>; | |
264 | + compatible = "fixed-clock"; | |
265 | + clock-frequency = <25000000>; | |
266 | + clock-output-names = "mclk"; | |
267 | + }; | |
268 | + | |
269 | + /delete-node/ wifi-pwrseq; | |
270 | +}; | |
271 | + | |
272 | +&mmcnr { | |
273 | + pinctrl-names = "default"; | |
274 | + pinctrl-0 = <&sdio_pins>; | |
275 | + bus-width = <4>; | |
276 | + status = "okay"; | |
277 | +}; | |
278 | + | |
279 | +&uart0 { | |
280 | + pinctrl-0 = <&uart0_pins &bt_pins>; | |
281 | + status = "okay"; | |
282 | +}; | |
283 | + | |
284 | +&uart1 { | |
285 | + pinctrl-0 = <&uart1_pins>; | |
286 | +}; | |
287 | + | |
288 | +&spi0 { | |
289 | + pinctrl-names = "default"; | |
290 | + pinctrl-0 = <&spi0_pins &spi0_cs_pins>; | |
291 | + cs-gpios = <&gpio 8 1>, <&gpio 7 1>; | |
292 | + status = "okay"; | |
293 | + | |
294 | + ad9832@0{ | |
295 | + #clock-cells = <0>; | |
296 | + compatible = "ad9832"; | |
297 | + reg = <0>; | |
298 | + spi-max-frequency = <1000000>; | |
299 | + spi-cpol; | |
300 | + //spi-cpha; // mode 2 => CPHA = CPOL = 1 | |
301 | + clocks = <&osc>; | |
302 | + clock-names="mclk"; | |
303 | + vcc-supply = <&vcc>; | |
304 | + }; | |
305 | + | |
306 | + //spidev0: spidev@0{ | |
307 | + // compatible = "spidev"; | |
308 | + // reg = <0>; /* CE0 */ | |
309 | + // #address-cells = <1>; | |
310 | + // #size-cells = <0>; | |
311 | + // spi-max-frequency = <125000000>; | |
312 | + //}; | |
313 | + | |
314 | + //spidev1: spidev@1{ | |
315 | + // compatible = "spidev"; | |
316 | + // reg = <1>; /* CE1 */ | |
317 | + // #address-cells = <1>; | |
318 | + // #size-cells = <0>; | |
319 | + // spi-max-frequency = <125000000>; | |
320 | + //}; | |
321 | +}; | |
322 | + | |
323 | +&gpio { | |
324 | + spi0_pins: spi0_pins { | |
325 | + brcm,pins = <9 10 11>; | |
326 | + brcm,function = <BCM2835_FSEL_ALT0>; | |
327 | + }; | |
328 | + | |
329 | + spi0_cs_pins: spi0_cs_pins { | |
330 | + brcm,pins = <8 7>; | |
331 | + brcm,function = <BCM2835_FSEL_GPIO_OUT>; | |
332 | + }; | |
333 | + | |
334 | + spi3_pins: spi3_pins { | |
335 | + brcm,pins = <1 2 3>; | |
336 | + brcm,function = <BCM2835_FSEL_ALT3>; | |
337 | + }; | |
338 | + | |
339 | + spi3_cs_pins: spi3_cs_pins { | |
340 | + brcm,pins = <0 24>; | |
341 | + brcm,function = <BCM2835_FSEL_GPIO_OUT>; | |
342 | + }; | |
343 | + | |
344 | + spi4_pins: spi4_pins { | |
345 | + brcm,pins = <5 6 7>; | |
346 | + brcm,function = <BCM2835_FSEL_ALT3>; | |
347 | + }; | |
348 | + | |
349 | + spi4_cs_pins: spi4_cs_pins { | |
350 | + brcm,pins = <4 25>; | |
351 | + brcm,function = <BCM2835_FSEL_GPIO_OUT>; | |
352 | + }; | |
353 | + | |
354 | + spi5_pins: spi5_pins { | |
355 | + brcm,pins = <13 14 15>; | |
356 | + brcm,function = <BCM2835_FSEL_ALT3>; | |
357 | + }; | |
358 | + | |
359 | + spi5_cs_pins: spi5_cs_pins { | |
360 | + brcm,pins = <12 26>; | |
361 | + brcm,function = <BCM2835_FSEL_GPIO_OUT>; | |
362 | + }; | |
363 | + | |
364 | + spi6_pins: spi6_pins { | |
365 | + brcm,pins = <19 20 21>; | |
366 | + brcm,function = <BCM2835_FSEL_ALT3>; | |
367 | + }; | |
368 | + | |
369 | + spi6_cs_pins: spi6_cs_pins { | |
370 | + brcm,pins = <18 27>; | |
371 | + brcm,function = <BCM2835_FSEL_GPIO_OUT>; | |
372 | + }; | |
373 | + | |
374 | + i2c0_pins: i2c0 { | |
375 | + brcm,pins = <0 1>; | |
376 | + brcm,function = <BCM2835_FSEL_ALT0>; | |
377 | + brcm,pull = <BCM2835_PUD_UP>; | |
378 | + }; | |
379 | + | |
380 | + i2c1_pins: i2c1 { | |
381 | + brcm,pins = <2 3>; | |
382 | + brcm,function = <BCM2835_FSEL_ALT0>; | |
383 | + brcm,pull = <BCM2835_PUD_UP>; | |
384 | + }; | |
385 | + | |
386 | + i2c3_pins: i2c3 { | |
387 | + brcm,pins = <4 5>; | |
388 | + brcm,function = <BCM2835_FSEL_ALT5>; | |
389 | + brcm,pull = <BCM2835_PUD_UP>; | |
390 | + }; | |
391 | + | |
392 | + i2c4_pins: i2c4 { | |
393 | + brcm,pins = <8 9>; | |
394 | + brcm,function = <BCM2835_FSEL_ALT5>; | |
395 | + brcm,pull = <BCM2835_PUD_UP>; | |
396 | + }; | |
397 | + | |
398 | + i2c5_pins: i2c5 { | |
399 | + brcm,pins = <12 13>; | |
400 | + brcm,function = <BCM2835_FSEL_ALT5>; | |
401 | + brcm,pull = <BCM2835_PUD_UP>; | |
402 | + }; | |
403 | + | |
404 | + i2c6_pins: i2c6 { | |
405 | + brcm,pins = <22 23>; | |
406 | + brcm,function = <BCM2835_FSEL_ALT5>; | |
407 | + brcm,pull = <BCM2835_PUD_UP>; | |
408 | + }; | |
409 | + | |
410 | + i2s_pins: i2s { | |
411 | + brcm,pins = <18 19 20 21>; | |
412 | + brcm,function = <BCM2835_FSEL_ALT0>; | |
413 | + }; | |
414 | + | |
415 | + sdio_pins: sdio_pins { | |
416 | + brcm,pins = <34 35 36 37 38 39>; | |
417 | + brcm,function = <BCM2835_FSEL_ALT3>; // alt3 = SD1 | |
418 | + brcm,pull = <0 2 2 2 2 2>; | |
419 | + }; | |
420 | + | |
421 | + bt_pins: bt_pins { | |
422 | + brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0 | |
423 | + // to fool pinctrl | |
424 | + brcm,function = <0>; | |
425 | + brcm,pull = <2>; | |
426 | + }; | |
427 | + | |
428 | + uart0_pins: uart0_pins { | |
429 | + brcm,pins = <32 33>; | |
430 | + brcm,function = <BCM2835_FSEL_ALT3>; | |
431 | + brcm,pull = <0 2>; | |
432 | + }; | |
433 | + | |
434 | + uart1_pins: uart1_pins { | |
435 | + brcm,pins; | |
436 | + brcm,function; | |
437 | + brcm,pull; | |
438 | + }; | |
439 | + | |
440 | + uart2_pins: uart2_pins { | |
441 | + brcm,pins = <0 1>; | |
442 | + brcm,function = <BCM2835_FSEL_ALT4>; | |
443 | + brcm,pull = <0 2>; | |
444 | + }; | |
445 | + | |
446 | + uart3_pins: uart3_pins { | |
447 | + brcm,pins = <4 5>; | |
448 | + brcm,function = <BCM2835_FSEL_ALT4>; | |
449 | + brcm,pull = <0 2>; | |
450 | + }; | |
451 | + | |
452 | + uart4_pins: uart4_pins { | |
453 | + brcm,pins = <8 9>; | |
454 | + brcm,function = <BCM2835_FSEL_ALT4>; | |
455 | + brcm,pull = <0 2>; | |
456 | + }; | |
457 | + | |
458 | + uart5_pins: uart5_pins { | |
459 | + brcm,pins = <12 13>; | |
460 | + brcm,function = <BCM2835_FSEL_ALT4>; | |
461 | + brcm,pull = <0 2>; | |
462 | + }; | |
463 | +}; | |
464 | + | |
465 | +&i2c0if { | |
466 | + clock-frequency = <100000>; | |
467 | +}; | |
468 | + | |
469 | +&i2c1 { | |
470 | + pinctrl-names = "default"; | |
471 | + pinctrl-0 = <&i2c1_pins>; | |
472 | + clock-frequency = <100000>; | |
473 | +}; | |
474 | + | |
475 | +&i2s { | |
476 | + pinctrl-names = "default"; | |
477 | + pinctrl-0 = <&i2s_pins>; | |
478 | +}; | |
479 | + | |
480 | +/ { | |
481 | + __overrides__ { | |
482 | + /delete-property/ i2c2_baudrate; | |
483 | + /delete-property/ i2c2_iknowwhatimdoing; | |
484 | + }; | |
485 | +}; | |
486 | + | |
487 | +&firmwarekms { | |
488 | + compatible = "raspberrypi,rpi-firmware-kms-2711"; | |
489 | +}; | |
490 | + | |
491 | +// ============================================= | |
492 | +// Board specific stuff here | |
493 | + | |
494 | +/ { | |
495 | + sd_vcc_reg: sd_vcc_reg { | |
496 | + compatible = "regulator-fixed"; | |
497 | + regulator-name = "vcc-sd"; | |
498 | + regulator-min-microvolt = <3300000>; | |
499 | + regulator-max-microvolt = <3300000>; | |
500 | + regulator-boot-on; | |
501 | + enable-active-high; | |
502 | + gpio = <&expgpio 6 GPIO_ACTIVE_HIGH>; | |
503 | + }; | |
504 | +}; | |
505 | + | |
506 | +&sdhost { | |
507 | + status = "disabled"; | |
508 | +}; | |
509 | + | |
510 | +&emmc2 { | |
511 | + vmmc-supply = <&sd_vcc_reg>; | |
512 | +}; | |
513 | + | |
514 | +&phy1 { | |
515 | + led-modes = <0x00 0x08>; /* link/activity link */ | |
516 | +}; | |
517 | + | |
518 | +&gpio { | |
519 | + audio_pins: audio_pins { | |
520 | + brcm,pins = <40 41>; | |
521 | + brcm,function = <4>; | |
522 | + }; | |
523 | +}; | |
524 | + | |
525 | +&leds { | |
526 | + act_led: act { | |
527 | + label = "led0"; | |
528 | + linux,default-trigger = "mmc0"; | |
529 | + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; | |
530 | + }; | |
531 | + | |
532 | + pwr_led: pwr { | |
533 | + label = "led1"; | |
534 | + linux,default-trigger = "default-on"; | |
535 | + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; | |
536 | + }; | |
537 | +}; | |
538 | + | |
539 | +&pwm1 { | |
540 | + status = "disabled"; | |
541 | +}; | |
542 | + | |
543 | +&audio { | |
544 | + pinctrl-names = "default"; | |
545 | + pinctrl-0 = <&audio_pins>; | |
546 | +}; | |
547 | + | |
548 | +&vc4 { | |
549 | + status = "disabled"; | |
550 | +}; | |
551 | + | |
552 | +&pixelvalve0 { | |
553 | + status = "disabled"; | |
554 | +}; | |
555 | + | |
556 | +&pixelvalve1 { | |
557 | + status = "disabled"; | |
558 | +}; | |
559 | + | |
560 | +&pixelvalve2 { | |
561 | + status = "disabled"; | |
562 | +}; | |
563 | + | |
564 | +&pixelvalve3 { | |
565 | + status = "disabled"; | |
566 | +}; | |
567 | + | |
568 | +&pixelvalve4 { | |
569 | + status = "disabled"; | |
570 | +}; | |
571 | + | |
572 | +&hdmi0 { | |
573 | + status = "disabled"; | |
574 | +}; | |
575 | + | |
576 | +&ddc0 { | |
577 | + status = "disabled"; | |
578 | +}; | |
579 | + | |
580 | +&hdmi1 { | |
581 | + status = "disabled"; | |
582 | +}; | |
583 | + | |
584 | +&ddc1 { | |
585 | + status = "disabled"; | |
586 | +}; | |
587 | + | |
588 | +/ { | |
589 | + __overrides__ { | |
590 | + act_led_gpio = <&act_led>,"gpios:4"; | |
591 | + act_led_activelow = <&act_led>,"gpios:8"; | |
592 | + act_led_trigger = <&act_led>,"linux,default-trigger"; | |
593 | + | |
594 | + pwr_led_gpio = <&pwr_led>,"gpios:4"; | |
595 | + pwr_led_activelow = <&pwr_led>,"gpios:8"; | |
596 | + pwr_led_trigger = <&pwr_led>,"linux,default-trigger"; | |
597 | + | |
598 | + eth_led0 = <&phy1>,"led-modes:0"; | |
599 | + eth_led1 = <&phy1>,"led-modes:4"; | |
600 | + | |
601 | + sd_poll_once = <&emmc2>, "non-removable?"; | |
602 | + spi_dma4 = <&spi0>, "dmas:0=", <&dma40>, | |
603 | + <&spi0>, "dmas:8=", <&dma40>; | |
604 | + }; | |
605 | +}; |