blob: 6dfd5459aa2076dc4029c1c217b1760e569085a8 [file] [log] [blame]
David Rhodes6450ef52021-09-07 17:57:18 -05001// SPDX-License-Identifier: GPL-2.0
2//
3// cs35l41-spi.c -- CS35l41 SPI driver
4//
5// Copyright 2017-2021 Cirrus Logic, Inc.
6//
7// Author: David Rhodes <david.rhodes@cirrus.com>
8
9#include <linux/acpi.h>
10#include <linux/delay.h>
11#include <linux/init.h>
12#include <linux/kernel.h>
13#include <linux/module.h>
14#include <linux/moduleparam.h>
15#include <linux/platform_device.h>
16#include <linux/spi/spi.h>
17
David Rhodes6450ef52021-09-07 17:57:18 -050018#include "cs35l41.h"
19
David Rhodes6450ef52021-09-07 17:57:18 -050020static const struct spi_device_id cs35l41_id_spi[] = {
21 { "cs35l40", 0 },
22 { "cs35l41", 0 },
David Rhodesdcf82132022-01-05 11:30:19 +000023 { "cs35l51", 0 },
24 { "cs35l53", 0 },
David Rhodes6450ef52021-09-07 17:57:18 -050025 {}
26};
27
28MODULE_DEVICE_TABLE(spi, cs35l41_id_spi);
29
David Rhodes6450ef52021-09-07 17:57:18 -050030static int cs35l41_spi_probe(struct spi_device *spi)
31{
32 const struct regmap_config *regmap_config = &cs35l41_regmap_spi;
Charles Keepax4295c8c2021-09-14 15:13:49 +010033 struct cs35l41_platform_data *pdata = dev_get_platdata(&spi->dev);
David Rhodes6450ef52021-09-07 17:57:18 -050034 struct cs35l41_private *cs35l41;
35 int ret;
36
Charles Keepax4295c8c2021-09-14 15:13:49 +010037 cs35l41 = devm_kzalloc(&spi->dev, sizeof(struct cs35l41_private), GFP_KERNEL);
David Rhodes6450ef52021-09-07 17:57:18 -050038 if (!cs35l41)
39 return -ENOMEM;
40
Lucas Tanure872fc0b62021-11-23 16:31:39 +000041 spi->max_speed_hz = CS35L41_SPI_MAX_FREQ;
42 spi_setup(spi);
43
David Rhodes6450ef52021-09-07 17:57:18 -050044 spi_set_drvdata(spi, cs35l41);
45 cs35l41->regmap = devm_regmap_init_spi(spi, regmap_config);
46 if (IS_ERR(cs35l41->regmap)) {
47 ret = PTR_ERR(cs35l41->regmap);
Charles Keepax4295c8c2021-09-14 15:13:49 +010048 dev_err(&spi->dev, "Failed to allocate register map: %d\n", ret);
David Rhodes6450ef52021-09-07 17:57:18 -050049 return ret;
50 }
51
52 cs35l41->dev = &spi->dev;
53 cs35l41->irq = spi->irq;
David Rhodes6450ef52021-09-07 17:57:18 -050054
55 return cs35l41_probe(cs35l41, pdata);
56}
57
58static int cs35l41_spi_remove(struct spi_device *spi)
59{
60 struct cs35l41_private *cs35l41 = spi_get_drvdata(spi);
61
Uwe Kleine-Königca7270a2021-10-20 15:24:16 +020062 cs35l41_remove(cs35l41);
63
64 return 0;
David Rhodes6450ef52021-09-07 17:57:18 -050065}
66
67#ifdef CONFIG_OF
68static const struct of_device_id cs35l41_of_match[] = {
69 { .compatible = "cirrus,cs35l40" },
70 { .compatible = "cirrus,cs35l41" },
71 {},
72};
73MODULE_DEVICE_TABLE(of, cs35l41_of_match);
74#endif
75
76#ifdef CONFIG_ACPI
77static const struct acpi_device_id cs35l41_acpi_match[] = {
78 { "CSC3541", 0 }, /* Cirrus Logic PnP ID + part ID */
79 {},
80};
81MODULE_DEVICE_TABLE(acpi, cs35l41_acpi_match);
82#endif
83
84static struct spi_driver cs35l41_spi_driver = {
85 .driver = {
86 .name = "cs35l41",
Charles Keepaxf517ba42022-01-07 16:06:36 +000087 .pm = &cs35l41_pm_ops,
David Rhodes6450ef52021-09-07 17:57:18 -050088 .of_match_table = of_match_ptr(cs35l41_of_match),
89 .acpi_match_table = ACPI_PTR(cs35l41_acpi_match),
90 },
91 .id_table = cs35l41_id_spi,
92 .probe = cs35l41_spi_probe,
93 .remove = cs35l41_spi_remove,
94};
95
96module_spi_driver(cs35l41_spi_driver);
97
98MODULE_DESCRIPTION("SPI CS35L41 driver");
99MODULE_AUTHOR("David Rhodes, Cirrus Logic Inc, <david.rhodes@cirrus.com>");
100MODULE_LICENSE("GPL");