1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * ADAU1977/ADAU1978/ADAU1979 driver |
4 | * |
5 | * Copyright 2014 Analog Devices Inc. |
6 | * Author: Lars-Peter Clausen <lars@metafoo.de> |
7 | */ |
8 | |
9 | #include <linux/mod_devicetable.h> |
10 | #include <linux/module.h> |
11 | #include <linux/regmap.h> |
12 | #include <linux/of.h> |
13 | #include <linux/spi/spi.h> |
14 | #include <sound/soc.h> |
15 | |
16 | #include "adau1977.h" |
17 | |
18 | static void adau1977_spi_switch_mode(struct device *dev) |
19 | { |
20 | struct spi_device *spi = to_spi_device(dev); |
21 | |
22 | /* |
23 | * To get the device into SPI mode CLATCH has to be pulled low three |
24 | * times. Do this by issuing three dummy reads. |
25 | */ |
26 | spi_w8r8(spi, cmd: 0x00); |
27 | spi_w8r8(spi, cmd: 0x00); |
28 | spi_w8r8(spi, cmd: 0x00); |
29 | } |
30 | |
31 | static int adau1977_spi_probe(struct spi_device *spi) |
32 | { |
33 | const struct spi_device_id *id = spi_get_device_id(sdev: spi); |
34 | struct regmap_config config; |
35 | |
36 | if (!id) |
37 | return -EINVAL; |
38 | |
39 | config = adau1977_regmap_config; |
40 | config.val_bits = 8; |
41 | config.reg_bits = 16; |
42 | config.read_flag_mask = 0x1; |
43 | |
44 | return adau1977_probe(dev: &spi->dev, |
45 | devm_regmap_init_spi(spi, &config), |
46 | type: id->driver_data, switch_mode: adau1977_spi_switch_mode); |
47 | } |
48 | |
49 | static const struct spi_device_id adau1977_spi_ids[] = { |
50 | { "adau1977" , ADAU1977 }, |
51 | { "adau1978" , ADAU1978 }, |
52 | { "adau1979" , ADAU1978 }, |
53 | { } |
54 | }; |
55 | MODULE_DEVICE_TABLE(spi, adau1977_spi_ids); |
56 | |
57 | static const struct of_device_id adau1977_spi_of_match[] __maybe_unused = { |
58 | { .compatible = "adi,adau1977" }, |
59 | { .compatible = "adi,adau1978" }, |
60 | { .compatible = "adi,adau1979" }, |
61 | { }, |
62 | }; |
63 | MODULE_DEVICE_TABLE(of, adau1977_spi_of_match); |
64 | |
65 | static struct spi_driver adau1977_spi_driver = { |
66 | .driver = { |
67 | .name = "adau1977" , |
68 | .of_match_table = of_match_ptr(adau1977_spi_of_match), |
69 | }, |
70 | .probe = adau1977_spi_probe, |
71 | .id_table = adau1977_spi_ids, |
72 | }; |
73 | module_spi_driver(adau1977_spi_driver); |
74 | |
75 | MODULE_DESCRIPTION("ASoC ADAU1977/ADAU1978/ADAU1979 driver" ); |
76 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>" ); |
77 | MODULE_LICENSE("GPL" ); |
78 | |