2011-06-13 17:49:55 +01:00
/*
* soc - io . c - - ASoC register I / O helpers
*
* Copyright 2009 - 2011 Wolfson Microelectronics PLC .
*
* Author : Mark Brown < broonie @ opensource . wolfsonmicro . com >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*/
# include <linux/i2c.h>
# include <linux/spi/spi.h>
2011-06-13 19:35:29 +01:00
# include <linux/regmap.h>
2011-09-22 09:34:58 -04:00
# include <linux/export.h>
2011-06-13 17:49:55 +01:00
# include <sound/soc.h>
# include <trace/events/asoc.h>
2011-08-13 11:50:48 +09:00
# ifdef CONFIG_REGMAP
2011-06-13 19:35:29 +01:00
static int hw_write ( struct snd_soc_codec * codec , unsigned int reg ,
unsigned int value )
2011-06-13 17:49:55 +01:00
{
2011-06-13 19:35:29 +01:00
return regmap_write ( codec - > control_data , reg , value ) ;
2011-06-13 17:49:55 +01:00
}
static unsigned int hw_read ( struct snd_soc_codec * codec , unsigned int reg )
{
int ret ;
unsigned int val ;
2014-02-20 09:08:43 +09:00
ret = regmap_read ( codec - > control_data , reg , & val ) ;
if ( ret = = 0 )
return val ;
else
2011-06-13 17:49:55 +01:00
return - 1 ;
}
/**
* snd_soc_codec_set_cache_io : Set up standard I / O functions .
*
* @ codec : CODEC to configure .
2014-03-11 12:43:21 +08:00
* @ map : Register map to write to
2011-06-13 17:49:55 +01:00
*
* Register formats are frequently shared between many I2C and SPI
* devices . In order to promote code reuse the ASoC core provides
* some standard implementations of CODEC read and write operations
* which can be set up using this function .
*
* The caller is responsible for allocating and initialising the
* actual cache .
*
* Note that at present this code cannot be used by CODECs with
* volatile registers .
*/
int snd_soc_codec_set_cache_io ( struct snd_soc_codec * codec ,
2014-03-11 12:43:21 +08:00
struct regmap * regmap )
2011-06-13 17:49:55 +01:00
{
2012-02-17 14:33:29 -08:00
int ret ;
2011-06-13 17:49:55 +01:00
2014-03-11 12:43:21 +08:00
/* Device has made its own regmap arrangements */
if ( ! regmap )
codec - > control_data = dev_get_regmap ( codec - > dev , NULL ) ;
else
codec - > control_data = regmap ;
if ( IS_ERR ( codec - > control_data ) )
return PTR_ERR ( codec - > control_data ) ;
2011-06-13 19:35:29 +01:00
codec - > write = hw_write ;
2011-06-13 17:49:55 +01:00
codec - > read = hw_read ;
2014-03-11 12:43:21 +08:00
ret = regmap_get_val_bytes ( codec - > control_data ) ;
/* Errors are legitimate for non-integer byte
* multiples */
if ( ret > 0 )
codec - > val_bytes = ret ;
codec - > using_regmap = true ;
2011-06-13 17:49:55 +01:00
2014-03-11 12:43:21 +08:00
return 0 ;
2011-06-13 17:49:55 +01:00
}
EXPORT_SYMBOL_GPL ( snd_soc_codec_set_cache_io ) ;
2011-08-13 11:50:48 +09:00
# else
int snd_soc_codec_set_cache_io ( struct snd_soc_codec * codec ,
2014-03-11 12:43:21 +08:00
struct regmap * regmap )
2011-08-13 11:50:48 +09:00
{
return - ENOTSUPP ;
}
EXPORT_SYMBOL_GPL ( snd_soc_codec_set_cache_io ) ;
# endif