lineage_kernel_xcoverpro/sound/soc/codecs/tfa9872/tfa_hal.c

119 lines
3.1 KiB
C
Raw Permalink Normal View History

2023-06-18 22:53:49 +00:00
/*
* Copyright 2015 NXP Semiconductors
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 or later
* as published by the Free Software Foundation.
*/
#include <stdlib.h>
#include <string.h>
#include "tfa_dsp_fw.h"
#include "dbgprint.h"
#include "NXP_I2C.h"
#include "tfa_internal.h"
#include "lxScribo.h"
/* translate a I2C driver error into an error */
static enum tfa98xx_error
tfa98xx_classify_i2c_error(enum NXP_I2C_Error i2c_error)
{
switch (i2c_error) {
case NXP_I2C_Ok:
return TFA98XX_ERROR_OK;
case NXP_I2C_NoAck:
case NXP_I2C_ArbLost:
case NXP_I2C_TimeOut:
return TFA98XX_ERROR_I2C_NON_FATAL;
default:
return TFA98XX_ERROR_I2C_FATAL;
}
}
/*
* write a 16 bit subaddress
*/
enum tfa98xx_error
tfa98xx_write_register16(tfa98xx_handle_t handle,
unsigned char subaddress, unsigned short value)
{
enum NXP_I2C_Error i2c_error;
unsigned char write_data[3]; /* subaddress and 2 bytes of the value */
if (!tfa98xx_handle_is_open(handle))
return TFA98XX_ERROR_NOT_OPEN;
write_data[0] = subaddress;
write_data[1] = (value >> 8) & 0xFF;
write_data[2] = value & 0xFF;
i2c_error = NXP_I2C_WriteRead
(handles_local[handle].slave_address, sizeof(write_data),
write_data, 0, NULL);
return tfa98xx_classify_i2c_error(i2c_error);
}
enum tfa98xx_error
tfa98xx_read_register16(tfa98xx_handle_t handle,
unsigned char subaddress, unsigned short *p_value)
{
enum NXP_I2C_Error i2c_error;
unsigned char write_data[1]; /* subaddress */
unsigned char read_buffer[2]; /* 2 data bytes */
_ASSERT(p_value != NULL);
if (!tfa98xx_handle_is_open(handle))
return TFA98XX_ERROR_NOT_OPEN;
write_data[0] = subaddress;
read_buffer[0] = read_buffer[1] = 0;
i2c_error = NXP_I2C_WriteRead
(handles_local[handle].slave_address, sizeof(write_data),
write_data, sizeof(read_buffer), read_buffer);
if (tfa98xx_classify_i2c_error(i2c_error) != TFA98XX_ERROR_OK)
return tfa98xx_classify_i2c_error(i2c_error);
*p_value = (read_buffer[0] << 8) + read_buffer[1];
return TFA98XX_ERROR_OK;
}
enum tfa98xx_error
tfa98xx_read_data(tfa98xx_handle_t handle,
unsigned char subaddress, int num_bytes, unsigned char data[])
{
enum NXP_I2C_Error i2c_error;
unsigned char write_data[1]; /* subaddress */
if (!tfa98xx_handle_is_open(handle))
return TFA98XX_ERROR_NOT_OPEN;
if (num_bytes > handles_local[handle].buffer_size)
return TFA98XX_ERROR_BAD_PARAMETER;
write_data[0] = subaddress;
i2c_error = NXP_I2C_WriteRead
(handles_local[handle].slave_address, sizeof(write_data),
write_data, num_bytes, data);
return tfa98xx_classify_i2c_error(i2c_error);
}
/*
* Write raw I2C data with no sub address
*/
enum tfa98xx_error
tfa98xx_write_raw(tfa98xx_handle_t handle,
int num_bytes,
const unsigned char data[])
{
enum NXP_I2C_Error i2c_error;
if (!tfa98xx_handle_is_open(handle))
return TFA98XX_ERROR_NOT_OPEN;
if (num_bytes > handles_local[handle].buffer_size)
return TFA98XX_ERROR_BAD_PARAMETER;
i2c_error = NXP_I2C_WriteRead
(handles_local[handle].slave_address, num_bytes,
data, 0, NULL);
return tfa98xx_classify_i2c_error(i2c_error);
}