Commit | Line | Data |
---|---|---|
73cfbfa9 ST |
1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | // | |
3 | // CS35L56 HDA audio driver I2C binding | |
4 | // | |
5 | // Copyright (C) 2023 Cirrus Logic, Inc. and | |
6 | // Cirrus Logic International Semiconductor Ltd. | |
7 | ||
8 | #include <linux/i2c.h> | |
9 | #include <linux/module.h> | |
10 | #include <linux/regmap.h> | |
11 | ||
12 | #include "cs35l56_hda.h" | |
13 | ||
14 | static int cs35l56_hda_i2c_probe(struct i2c_client *clt) | |
15 | { | |
769dca23 | 16 | const struct i2c_device_id *id = i2c_client_get_device_id(clt); |
73cfbfa9 ST |
17 | struct cs35l56_hda *cs35l56; |
18 | int ret; | |
19 | ||
20 | cs35l56 = devm_kzalloc(&clt->dev, sizeof(*cs35l56), GFP_KERNEL); | |
21 | if (!cs35l56) | |
22 | return -ENOMEM; | |
23 | ||
24 | cs35l56->base.dev = &clt->dev; | |
d02ef87d ST |
25 | |
26 | #ifdef CS35L56_WAKE_HOLD_TIME_US | |
27 | cs35l56->base.can_hibernate = true; | |
28 | #endif | |
73cfbfa9 ST |
29 | cs35l56->base.regmap = devm_regmap_init_i2c(clt, &cs35l56_regmap_i2c); |
30 | if (IS_ERR(cs35l56->base.regmap)) { | |
31 | ret = PTR_ERR(cs35l56->base.regmap); | |
32 | dev_err(cs35l56->base.dev, "Failed to allocate register map: %d\n", | |
33 | ret); | |
34 | return ret; | |
35 | } | |
36 | ||
769dca23 | 37 | ret = cs35l56_hda_common_probe(cs35l56, id->driver_data, clt->addr); |
73cfbfa9 ST |
38 | if (ret) |
39 | return ret; | |
40 | ret = cs35l56_irq_request(&cs35l56->base, clt->irq); | |
41 | if (ret < 0) | |
42 | cs35l56_hda_remove(cs35l56->base.dev); | |
43 | ||
44 | return ret; | |
45 | } | |
46 | ||
47 | static void cs35l56_hda_i2c_remove(struct i2c_client *clt) | |
48 | { | |
49 | cs35l56_hda_remove(&clt->dev); | |
50 | } | |
51 | ||
52 | static const struct i2c_device_id cs35l56_hda_i2c_id[] = { | |
769dca23 ST |
53 | { "cs35l54-hda", 0x3554 }, |
54 | { "cs35l56-hda", 0x3556 }, | |
55 | { "cs35l57-hda", 0x3557 }, | |
73cfbfa9 ST |
56 | {} |
57 | }; | |
58 | ||
2d0401ee ST |
59 | static const struct acpi_device_id cs35l56_acpi_hda_match[] = { |
60 | { "CSC3554", 0 }, | |
61 | { "CSC3556", 0 }, | |
62 | { "CSC3557", 0 }, | |
63 | {} | |
64 | }; | |
65 | MODULE_DEVICE_TABLE(acpi, cs35l56_acpi_hda_match); | |
66 | ||
73cfbfa9 ST |
67 | static struct i2c_driver cs35l56_hda_i2c_driver = { |
68 | .driver = { | |
2d0401ee ST |
69 | .name = "cs35l56-hda", |
70 | .acpi_match_table = cs35l56_acpi_hda_match, | |
71 | .pm = &cs35l56_hda_pm_ops, | |
73cfbfa9 ST |
72 | }, |
73 | .id_table = cs35l56_hda_i2c_id, | |
74 | .probe = cs35l56_hda_i2c_probe, | |
75 | .remove = cs35l56_hda_i2c_remove, | |
76 | }; | |
77 | module_i2c_driver(cs35l56_hda_i2c_driver); | |
78 | ||
79 | MODULE_DESCRIPTION("HDA CS35L56 I2C driver"); | |
80 | MODULE_IMPORT_NS(SND_HDA_SCODEC_CS35L56); | |
81 | MODULE_IMPORT_NS(SND_SOC_CS35L56_SHARED); | |
82 | MODULE_AUTHOR("Richard Fitzgerald <rf@opensource.cirrus.com>"); | |
83 | MODULE_AUTHOR("Simon Trimmer <simont@opensource.cirrus.com>"); | |
84 | MODULE_LICENSE("GPL"); |