// SPDX-License-Identifier: GPL-2.0 /* * CS42L43 I2C driver * * Copyright (C) 2022-2023 Cirrus Logic, Inc. and * Cirrus Logic International Semiconductor Ltd. */ #include #include #include #include #include #include #include #include #include #include "cs42l43.h" static const struct regmap_config cs42l43_i2c_regmap = { .reg_bits = 32, .reg_stride = 4, .val_bits = 32, .reg_format_endian = REGMAP_ENDIAN_BIG, .val_format_endian = REGMAP_ENDIAN_BIG, .max_register = CS42L43_MCU_RAM_MAX, .readable_reg = cs42l43_readable_register, .volatile_reg = cs42l43_volatile_register, .precious_reg = cs42l43_precious_register, .cache_type = REGCACHE_MAPLE, .reg_defaults = cs42l43_reg_default, .num_reg_defaults = ARRAY_SIZE(cs42l43_reg_default), }; static int cs42l43_i2c_probe(struct i2c_client *i2c) { struct cs42l43 *cs42l43; cs42l43 = devm_kzalloc(&i2c->dev, sizeof(*cs42l43), GFP_KERNEL); if (!cs42l43) return -ENOMEM; cs42l43->dev = &i2c->dev; cs42l43->irq = i2c->irq; /* A device on an I2C is always attached by definition. */ cs42l43->attached = true; cs42l43->regmap = devm_regmap_init_i2c(i2c, &cs42l43_i2c_regmap); if (IS_ERR(cs42l43->regmap)) return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->regmap), "Failed to allocate regmap\n"); return cs42l43_dev_probe(cs42l43); } static void cs42l43_i2c_remove(struct i2c_client *i2c) { struct cs42l43 *cs42l43 = dev_get_drvdata(&i2c->dev); cs42l43_dev_remove(cs42l43); } #if IS_ENABLED(CONFIG_OF) static const struct of_device_id cs42l43_of_match[] = { { .compatible = "cirrus,cs42l43", }, {} }; MODULE_DEVICE_TABLE(of, cs42l43_of_match); #endif #if IS_ENABLED(CONFIG_ACPI) static const struct acpi_device_id cs42l43_acpi_match[] = { { "CSC4243", 0 }, {} }; MODULE_DEVICE_TABLE(acpi, cs42l43_acpi_match); #endif static struct i2c_driver cs42l43_i2c_driver = { .driver = { .name = "cs42l43", .pm = pm_ptr(&cs42l43_pm_ops), .of_match_table = of_match_ptr(cs42l43_of_match), .acpi_match_table = ACPI_PTR(cs42l43_acpi_match), }, .probe = cs42l43_i2c_probe, .remove = cs42l43_i2c_remove, }; module_i2c_driver(cs42l43_i2c_driver); MODULE_IMPORT_NS("MFD_CS42L43"); MODULE_DESCRIPTION("CS42L43 I2C Driver"); MODULE_AUTHOR("Charles Keepax "); MODULE_LICENSE("GPL");