forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/staging/iio/frequency/ad9834.c
....@@ -1,11 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * AD9833/AD9834/AD9837/AD9838 SPI DDS driver
34 *
45 * Copyright 2010-2011 Analog Devices Inc.
5
- *
6
- * Licensed under the GPL-2.
76 */
87
8
+#include <linux/clk.h>
99 #include <linux/interrupt.h>
1010 #include <linux/workqueue.h>
1111 #include <linux/device.h>
....@@ -71,7 +71,7 @@
7171 struct ad9834_state {
7272 struct spi_device *spi;
7373 struct regulator *reg;
74
- unsigned int mclk;
74
+ struct clk *mclk;
7575 unsigned short control;
7676 unsigned short devid;
7777 struct spi_transfer xfer;
....@@ -110,12 +110,15 @@
110110 static int ad9834_write_frequency(struct ad9834_state *st,
111111 unsigned long addr, unsigned long fout)
112112 {
113
+ unsigned long clk_freq;
113114 unsigned long regval;
114115
115
- if (fout > (st->mclk / 2))
116
+ clk_freq = clk_get_rate(st->mclk);
117
+
118
+ if (fout > (clk_freq / 2))
116119 return -EINVAL;
117120
118
- regval = ad9834_calc_freqreg(st->mclk, fout);
121
+ regval = ad9834_calc_freqreg(clk_freq, fout);
119122
120123 st->freq_data[0] = cpu_to_be16(addr | (regval &
121124 RES_MASK(AD9834_FREQ_BITS / 2)));
....@@ -282,7 +285,7 @@
282285 struct ad9834_state *st = iio_priv(indio_dev);
283286 char *str;
284287
285
- if ((st->devid == ID_AD9833) || (st->devid == ID_AD9837))
288
+ if (st->devid == ID_AD9833 || st->devid == ID_AD9837)
286289 str = "sine triangle square";
287290 else if (st->control & AD9834_OPBITEN)
288291 str = "sine";
....@@ -389,16 +392,10 @@
389392
390393 static int ad9834_probe(struct spi_device *spi)
391394 {
392
- struct ad9834_platform_data *pdata = dev_get_platdata(&spi->dev);
393395 struct ad9834_state *st;
394396 struct iio_dev *indio_dev;
395397 struct regulator *reg;
396398 int ret;
397
-
398
- if (!pdata) {
399
- dev_dbg(&spi->dev, "no platform data?\n");
400
- return -ENODEV;
401
- }
402399
403400 reg = devm_regulator_get(&spi->dev, "avdd");
404401 if (IS_ERR(reg))
....@@ -418,11 +415,21 @@
418415 spi_set_drvdata(spi, indio_dev);
419416 st = iio_priv(indio_dev);
420417 mutex_init(&st->lock);
421
- st->mclk = pdata->mclk;
418
+ st->mclk = devm_clk_get(&spi->dev, NULL);
419
+ if (IS_ERR(st->mclk)) {
420
+ ret = PTR_ERR(st->mclk);
421
+ goto error_disable_reg;
422
+ }
423
+
424
+ ret = clk_prepare_enable(st->mclk);
425
+ if (ret) {
426
+ dev_err(&spi->dev, "Failed to enable master clock\n");
427
+ goto error_disable_reg;
428
+ }
429
+
422430 st->spi = spi;
423431 st->devid = spi_get_device_id(spi)->driver_data;
424432 st->reg = reg;
425
- indio_dev->dev.parent = &spi->dev;
426433 indio_dev->name = spi_get_device_id(spi)->name;
427434 switch (st->devid) {
428435 case ID_AD9833:
....@@ -454,42 +461,41 @@
454461 spi_message_add_tail(&st->freq_xfer[1], &st->freq_msg);
455462
456463 st->control = AD9834_B28 | AD9834_RESET;
464
+ st->control |= AD9834_DIV2;
457465
458
- if (!pdata->en_div2)
459
- st->control |= AD9834_DIV2;
460
-
461
- if (!pdata->en_signbit_msb_out && (st->devid == ID_AD9834))
466
+ if (st->devid == ID_AD9834)
462467 st->control |= AD9834_SIGN_PIB;
463468
464469 st->data = cpu_to_be16(AD9834_REG_CMD | st->control);
465470 ret = spi_sync(st->spi, &st->msg);
466471 if (ret) {
467472 dev_err(&spi->dev, "device init failed\n");
468
- goto error_disable_reg;
473
+ goto error_clock_unprepare;
469474 }
470475
471
- ret = ad9834_write_frequency(st, AD9834_REG_FREQ0, pdata->freq0);
476
+ ret = ad9834_write_frequency(st, AD9834_REG_FREQ0, 1000000);
472477 if (ret)
473
- goto error_disable_reg;
478
+ goto error_clock_unprepare;
474479
475
- ret = ad9834_write_frequency(st, AD9834_REG_FREQ1, pdata->freq1);
480
+ ret = ad9834_write_frequency(st, AD9834_REG_FREQ1, 5000000);
476481 if (ret)
477
- goto error_disable_reg;
482
+ goto error_clock_unprepare;
478483
479
- ret = ad9834_write_phase(st, AD9834_REG_PHASE0, pdata->phase0);
484
+ ret = ad9834_write_phase(st, AD9834_REG_PHASE0, 512);
480485 if (ret)
481
- goto error_disable_reg;
486
+ goto error_clock_unprepare;
482487
483
- ret = ad9834_write_phase(st, AD9834_REG_PHASE1, pdata->phase1);
488
+ ret = ad9834_write_phase(st, AD9834_REG_PHASE1, 1024);
484489 if (ret)
485
- goto error_disable_reg;
490
+ goto error_clock_unprepare;
486491
487492 ret = iio_device_register(indio_dev);
488493 if (ret)
489
- goto error_disable_reg;
494
+ goto error_clock_unprepare;
490495
491496 return 0;
492
-
497
+error_clock_unprepare:
498
+ clk_disable_unprepare(st->mclk);
493499 error_disable_reg:
494500 regulator_disable(reg);
495501
....@@ -502,6 +508,7 @@
502508 struct ad9834_state *st = iio_priv(indio_dev);
503509
504510 iio_device_unregister(indio_dev);
511
+ clk_disable_unprepare(st->mclk);
505512 regulator_disable(st->reg);
506513
507514 return 0;
....@@ -516,9 +523,20 @@
516523 };
517524 MODULE_DEVICE_TABLE(spi, ad9834_id);
518525
526
+static const struct of_device_id ad9834_of_match[] = {
527
+ {.compatible = "adi,ad9833"},
528
+ {.compatible = "adi,ad9834"},
529
+ {.compatible = "adi,ad9837"},
530
+ {.compatible = "adi,ad9838"},
531
+ {}
532
+};
533
+
534
+MODULE_DEVICE_TABLE(of, ad9834_of_match);
535
+
519536 static struct spi_driver ad9834_driver = {
520537 .driver = {
521538 .name = "ad9834",
539
+ .of_match_table = ad9834_of_match
522540 },
523541 .probe = ad9834_probe,
524542 .remove = ad9834_remove,
....@@ -526,6 +544,6 @@
526544 };
527545 module_spi_driver(ad9834_driver);
528546
529
-MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
547
+MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
530548 MODULE_DESCRIPTION("Analog Devices AD9833/AD9834/AD9837/AD9838 DDS");
531549 MODULE_LICENSE("GPL v2");