2018-01-08 15:50:59 +05:30
// SPDX-License-Identifier: GPL-2.0
// Copyright(c) 2015-17 Intel Corporation.
# include <linux/device.h>
2020-11-25 21:01:28 +08:00
# include <linux/errno.h>
2018-01-08 15:50:59 +05:30
# include <linux/module.h>
2020-11-25 21:01:28 +08:00
# include <linux/regmap.h>
2018-01-08 15:50:59 +05:30
# include <linux/soundwire/sdw.h>
# include "internal.h"
static int regmap_sdw_write ( void * context , unsigned int reg , unsigned int val )
{
struct device * dev = context ;
struct sdw_slave * slave = dev_to_sdw_dev ( dev ) ;
2021-01-22 15:06:30 +08:00
return sdw_write_no_pm ( slave , reg , val ) ;
2018-01-08 15:50:59 +05:30
}
static int regmap_sdw_read ( void * context , unsigned int reg , unsigned int * val )
{
struct device * dev = context ;
struct sdw_slave * slave = dev_to_sdw_dev ( dev ) ;
int read ;
2021-01-22 15:06:30 +08:00
read = sdw_read_no_pm ( slave , reg ) ;
2018-01-08 15:50:59 +05:30
if ( read < 0 )
return read ;
* val = read ;
return 0 ;
}
2022-03-30 23:41:10 +02:00
static const struct regmap_bus regmap_sdw = {
2018-01-08 15:50:59 +05:30
. reg_read = regmap_sdw_read ,
. reg_write = regmap_sdw_write ,
. reg_format_endian_default = REGMAP_ENDIAN_LITTLE ,
. val_format_endian_default = REGMAP_ENDIAN_LITTLE ,
} ;
static int regmap_sdw_config_check ( const struct regmap_config * config )
{
/* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */
if ( config - > val_bits ! = 8 )
return - ENOTSUPP ;
/* Registers are 32 bits wide */
if ( config - > reg_bits ! = 32 )
return - ENOTSUPP ;
if ( config - > pad_bits ! = 0 )
return - ENOTSUPP ;
return 0 ;
}
struct regmap * __regmap_init_sdw ( struct sdw_slave * sdw ,
const struct regmap_config * config ,
struct lock_class_key * lock_key ,
const char * lock_name )
{
int ret ;
ret = regmap_sdw_config_check ( config ) ;
if ( ret )
return ERR_PTR ( ret ) ;
return __regmap_init ( & sdw - > dev , & regmap_sdw ,
& sdw - > dev , config , lock_key , lock_name ) ;
}
EXPORT_SYMBOL_GPL ( __regmap_init_sdw ) ;
struct regmap * __devm_regmap_init_sdw ( struct sdw_slave * sdw ,
const struct regmap_config * config ,
struct lock_class_key * lock_key ,
const char * lock_name )
{
int ret ;
ret = regmap_sdw_config_check ( config ) ;
if ( ret )
return ERR_PTR ( ret ) ;
return __devm_regmap_init ( & sdw - > dev , & regmap_sdw ,
& sdw - > dev , config , lock_key , lock_name ) ;
}
EXPORT_SYMBOL_GPL ( __devm_regmap_init_sdw ) ;
MODULE_DESCRIPTION ( " Regmap SoundWire Module " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;