2021-09-07 17:57:18 -05:00
// SPDX-License-Identifier: GPL-2.0
//
// cs35l41-spi.c -- CS35l41 SPI driver
//
// Copyright 2017-2021 Cirrus Logic, Inc.
//
// Author: David Rhodes <david.rhodes@cirrus.com>
# include <linux/acpi.h>
# include <linux/delay.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/moduleparam.h>
# include <linux/platform_device.h>
# include <linux/spi/spi.h>
# include "cs35l41.h"
static const struct spi_device_id cs35l41_id_spi [ ] = {
{ " cs35l40 " , 0 } ,
{ " cs35l41 " , 0 } ,
2022-01-05 11:30:19 +00:00
{ " cs35l51 " , 0 } ,
{ " cs35l53 " , 0 } ,
2021-09-07 17:57:18 -05:00
{ }
} ;
MODULE_DEVICE_TABLE ( spi , cs35l41_id_spi ) ;
static int cs35l41_spi_probe ( struct spi_device * spi )
{
const struct regmap_config * regmap_config = & cs35l41_regmap_spi ;
2022-04-13 09:37:13 +01:00
struct cs35l41_hw_cfg * hw_cfg = dev_get_platdata ( & spi - > dev ) ;
2021-09-07 17:57:18 -05:00
struct cs35l41_private * cs35l41 ;
2021-09-14 15:13:49 +01:00
cs35l41 = devm_kzalloc ( & spi - > dev , sizeof ( struct cs35l41_private ) , GFP_KERNEL ) ;
2021-09-07 17:57:18 -05:00
if ( ! cs35l41 )
return - ENOMEM ;
2021-11-23 16:31:39 +00:00
spi - > max_speed_hz = CS35L41_SPI_MAX_FREQ ;
spi_setup ( spi ) ;
2021-09-07 17:57:18 -05:00
spi_set_drvdata ( spi , cs35l41 ) ;
cs35l41 - > regmap = devm_regmap_init_spi ( spi , regmap_config ) ;
2023-09-07 20:10:06 +03:00
if ( IS_ERR ( cs35l41 - > regmap ) )
return dev_err_probe ( cs35l41 - > dev , PTR_ERR ( cs35l41 - > regmap ) ,
" Failed to allocate register map \n " ) ;
2021-09-07 17:57:18 -05:00
cs35l41 - > dev = & spi - > dev ;
cs35l41 - > irq = spi - > irq ;
2022-04-13 09:37:13 +01:00
return cs35l41_probe ( cs35l41 , hw_cfg ) ;
2021-09-07 17:57:18 -05:00
}
2022-01-23 18:52:01 +01:00
static void cs35l41_spi_remove ( struct spi_device * spi )
2021-09-07 17:57:18 -05:00
{
struct cs35l41_private * cs35l41 = spi_get_drvdata ( spi ) ;
2021-10-20 15:24:16 +02:00
cs35l41_remove ( cs35l41 ) ;
2021-09-07 17:57:18 -05:00
}
# ifdef CONFIG_OF
static const struct of_device_id cs35l41_of_match [ ] = {
{ . compatible = " cirrus,cs35l40 " } ,
{ . compatible = " cirrus,cs35l41 " } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , cs35l41_of_match ) ;
# endif
# ifdef CONFIG_ACPI
static const struct acpi_device_id cs35l41_acpi_match [ ] = {
{ " CSC3541 " , 0 } , /* Cirrus Logic PnP ID + part ID */
2022-06-22 00:38:19 +03:00
{ " CLSA3541 " , 0 } , /* Cirrus Logic PnP ID + part ID */
2021-09-07 17:57:18 -05:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( acpi , cs35l41_acpi_match ) ;
# endif
static struct spi_driver cs35l41_spi_driver = {
. driver = {
. name = " cs35l41 " ,
2023-09-07 20:10:07 +03:00
. pm = pm_ptr ( & cs35l41_pm_ops ) ,
2021-09-07 17:57:18 -05:00
. of_match_table = of_match_ptr ( cs35l41_of_match ) ,
. acpi_match_table = ACPI_PTR ( cs35l41_acpi_match ) ,
} ,
. id_table = cs35l41_id_spi ,
. probe = cs35l41_spi_probe ,
. remove = cs35l41_spi_remove ,
} ;
module_spi_driver ( cs35l41_spi_driver ) ;
MODULE_DESCRIPTION ( " SPI CS35L41 driver " ) ;
MODULE_AUTHOR ( " David Rhodes, Cirrus Logic Inc, <david.rhodes@cirrus.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;