1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2022-2023 Cirrus Logic, Inc. and
6 * Cirrus Logic International Semiconductor Ltd.
9 #include <linux/array_size.h>
10 #include <linux/err.h>
11 #include <linux/i2c.h>
12 #include <linux/mfd/cs42l43.h>
13 #include <linux/mfd/cs42l43-regs.h>
14 #include <linux/mod_devicetable.h>
15 #include <linux/module.h>
17 #include <linux/regmap.h>
21 static const struct regmap_config cs42l43_i2c_regmap
= {
25 .reg_format_endian
= REGMAP_ENDIAN_BIG
,
26 .val_format_endian
= REGMAP_ENDIAN_BIG
,
28 .max_register
= CS42L43_MCU_RAM_MAX
,
29 .readable_reg
= cs42l43_readable_register
,
30 .volatile_reg
= cs42l43_volatile_register
,
31 .precious_reg
= cs42l43_precious_register
,
33 .cache_type
= REGCACHE_MAPLE
,
34 .reg_defaults
= cs42l43_reg_default
,
35 .num_reg_defaults
= ARRAY_SIZE(cs42l43_reg_default
),
38 static int cs42l43_i2c_probe(struct i2c_client
*i2c
)
40 struct cs42l43
*cs42l43
;
42 cs42l43
= devm_kzalloc(&i2c
->dev
, sizeof(*cs42l43
), GFP_KERNEL
);
46 cs42l43
->dev
= &i2c
->dev
;
47 cs42l43
->irq
= i2c
->irq
;
48 /* A device on an I2C is always attached by definition. */
49 cs42l43
->attached
= true;
51 cs42l43
->regmap
= devm_regmap_init_i2c(i2c
, &cs42l43_i2c_regmap
);
52 if (IS_ERR(cs42l43
->regmap
))
53 return dev_err_probe(cs42l43
->dev
, PTR_ERR(cs42l43
->regmap
),
54 "Failed to allocate regmap\n");
56 return cs42l43_dev_probe(cs42l43
);
59 static void cs42l43_i2c_remove(struct i2c_client
*i2c
)
61 struct cs42l43
*cs42l43
= dev_get_drvdata(&i2c
->dev
);
63 cs42l43_dev_remove(cs42l43
);
66 #if IS_ENABLED(CONFIG_OF)
67 static const struct of_device_id cs42l43_of_match
[] = {
68 { .compatible
= "cirrus,cs42l43", },
71 MODULE_DEVICE_TABLE(of
, cs42l43_of_match
);
74 #if IS_ENABLED(CONFIG_ACPI)
75 static const struct acpi_device_id cs42l43_acpi_match
[] = {
79 MODULE_DEVICE_TABLE(acpi
, cs42l43_acpi_match
);
82 static struct i2c_driver cs42l43_i2c_driver
= {
85 .pm
= pm_ptr(&cs42l43_pm_ops
),
86 .of_match_table
= of_match_ptr(cs42l43_of_match
),
87 .acpi_match_table
= ACPI_PTR(cs42l43_acpi_match
),
90 .probe
= cs42l43_i2c_probe
,
91 .remove
= cs42l43_i2c_remove
,
93 module_i2c_driver(cs42l43_i2c_driver
);
95 MODULE_IMPORT_NS("MFD_CS42L43");
97 MODULE_DESCRIPTION("CS42L43 I2C Driver");
98 MODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>");
99 MODULE_LICENSE("GPL");