aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/tdmb/tcc3170/src/tcbd_api_common.c')
-rw-r--r--drivers/media/tdmb/tcc3170/src/tcbd_api_common.c192
1 files changed, 116 insertions, 76 deletions
diff --git a/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c b/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c
index 5b42026..986f3d9 100644
--- a/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c
+++ b/drivers/media/tdmb/tcc3170/src/tcbd_api_common.c
@@ -31,12 +31,25 @@
#include "tcc317x_boot_tdmb.h"
-s32 tcbd_device_start(
- struct tcbd_device *_device, enum tcbd_clock_type _clock_type)
+s32 tcbd_device_start(struct tcbd_device *_device,
+ enum tcbd_clock_type _clock_type)
{
s32 ret = 0, ver;
u8 *dsp_rom = TCC317X_BOOT_DATA_TDMB;
s32 size = TCC317X_BOOT_SIZE_TDMB;
+#if defined(__DEBUG_DSP_ROM__)
+ static u8 dsp_rom_buff[MAX_SIZE_DSP_ROM];
+ if (tcbd_debug_rom_from_fs() == 1) {
+ ret = tcbd_read_file(_device, tcbd_debug_rom_path(),
+ dsp_rom_buff, MAX_SIZE_DSP_ROM);
+ if (ret > 0) {
+ dsp_rom = dsp_rom_buff;
+ size = ret;
+ tcbd_debug(DEBUG_ERROR, "rom:%s, size:%d\n",
+ tcbd_debug_rom_path(), size);
+ }
+ }
+#endif /*__DEBUG_DSP_ROM__*/
/* Initialize PLL */
tcbd_init_pll(_device, _clock_type);
@@ -46,13 +59,13 @@ s32 tcbd_device_start(
tcbd_enable_peri(_device);
ret = tcbd_init_dsp(_device, dsp_rom, size);
if (ret < 0) {
- tcbd_debug(DEBUG_ERROR,
- "failed to initialize dsp!! error:%d\n", ret);
+ tcbd_debug(DEBUG_ERROR, "failed to initialize dsp!! "
+ "error:%d\n", ret);
return -TCERR_FATAL_ERROR;
} else {
tcbd_get_rom_version(_device, &ver);
- tcbd_debug(DEBUG_API_COMMON,
- "device start success!! version:0x%X\n", ver);
+ tcbd_debug(DEBUG_API_COMMON, "device start success!! "
+ "version:0x%X\n", ver);
}
return 0;
}
@@ -164,9 +177,9 @@ s32 tcbd_init_stream_data_config(
return ret;
}
+#if defined(__CSPI_ONLY__)
#if defined(__READ_FIXED_LENGTH__)
-s32 tcbd_read_stream(
- struct tcbd_device *_device, u8 *_buff, s32 *_size)
+s32 tcbd_read_stream(struct tcbd_device *_device, u8 *_buff, s32 *_size)
{
u32 bytes_read = _device->intr_threshold;
@@ -186,9 +199,8 @@ s32 tcbd_read_stream(
return tcbd_reg_read_burst_fix(
_device, TCBD_STREAM_CFG4, _buff, bytes_read);
}
-#else /* __READ_VARIABLE_LENGTH__ */
-s32 tcbd_read_stream(
- struct tcbd_device *_device, u8 *_buff, s32 *_size)
+#elif defined(__READ_VARIABLE_LENGTH__)
+s32 tcbd_read_stream(struct tcbd_device *_device, u8 *_buff, s32 *_size)
{
u32 bytes_remain = 0;
u32 bytes_read = _device->intr_threshold;
@@ -217,7 +229,10 @@ s32 tcbd_read_stream(
return tcbd_reg_read_burst_fix(
_device, TCBD_STREAM_CFG4, _buff, bytes_read);
}
-#endif
+#else
+#error "you must define __READ_VARIABLE_LENGTH__ or __READ_FIXED_LENGTH__"
+#endif /*!__READ_FIXED_LENGTH__ && !__READ_VARIABLE_LENGTH__*/
+#endif /*__CSPI_ONLY__*/
s32 tcbd_tune_frequency(
struct tcbd_device *_device, u32 _freq_khz, s32 _bw_khz)
@@ -233,32 +248,35 @@ s32 tcbd_tune_frequency(
_device->curr_band = BAND_TYPE_BAND3;
else
_device->curr_band = BAND_TYPE_LBAND;
- ret |= tcbd_reset_ip(
- _device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_ALL);
+ ret |= tcbd_reset_ip(_device, TCBD_SYS_COMP_ALL, TCBD_SYS_COMP_ALL);
ret |= tcbd_rf_tune_frequency(_device, _freq_khz, _bw_khz);
if (ret < 0) {
- tcbd_debug(DEBUG_ERROR,
- "failed to tune frequency to RF!! ret:%d\n", ret);
+ tcbd_debug(DEBUG_ERROR, "failed to tune frequency to RF!! "
+ "ret:%d\n", ret);
return ret;
}
- if (_device->peri_type == PERI_TYPE_SPI_ONLY) {
- /* enable fic buffer only*/
- ret |= tcbd_init_stream_data_config(
- _device,
- ENABLE_CMD_FIFO,
- STREAM_DATA_ENABLE |
- STREAM_HEADER_ON |
- STREAM_MASK_BUFFERA,
- TCBD_THRESHOLD_FIC);
+ switch (_device->peri_type) {
+ case PERI_TYPE_SPI_ONLY:
+ ret |= tcbd_init_stream_data_config(_device, ENABLE_CMD_FIFO,
+ STREAM_DATA_ENABLE | STREAM_HEADER_ON |
+ STREAM_MASK_BUFFERA, TCBD_THRESHOLD_FIC);
+ break;
+ case PERI_TYPE_STS:
+ ret |= tcbd_init_stream_data_config(_device, DISABLE_CMD_FIFO,
+ 0, 0);
+ break;
+ default:
+ tcbd_debug(DEBUG_ERROR, "%d not implemented!!\n",
+ _device->peri_type);
+ return -TCERR_FATAL_ERROR;
}
tcbd_init_status_manager();
ret |= tcbd_demod_tune_frequency(_device, _freq_khz, _bw_khz);
if (ret < 0) {
- tcbd_debug(DEBUG_ERROR,
- "failed to tune frequency "
+ tcbd_debug(DEBUG_ERROR, "failed to tune frequency "
"to demodulator!! ret:%d\n", ret);
return ret;
}
@@ -268,8 +286,8 @@ s32 tcbd_tune_frequency(
#if defined(__READ_VARIABLE_LENGTH__)
_device->size_more_read = 0;
#endif /*__READ_VARIABLE_LENGTH__*/
- tcbd_debug(DEBUG_API_COMMON,
- " # Frequency set time :%lld\n", tcpal_diff_time(tick));
+ tcbd_debug(DEBUG_API_COMMON, " # Frequency set time :%lld\n",
+ tcpal_diff_time(tick));
return ret;
}
@@ -318,8 +336,8 @@ s32 tcbd_wait_tune(struct tcbd_device *_device, u8 *_status)
} while (tcpal_diff_time(time_tick) < time_tune_wait);
if (cto && cfo)
- tcbd_debug(DEBUG_API_COMMON,
- "lock status : 0x%02X\n", *_status);
+ tcbd_debug(DEBUG_API_COMMON, "lock status : 0x%02X\n",
+ *_status);
else
ret = -TCERR_TUNE_FAILED;
@@ -345,12 +363,11 @@ static inline s32 tcbd_calc_threshold(struct tcbd_service *_service)
if (TCBD_MAX_THRESHOLD < threshold)
threshold = TCBD_MAX_THRESHOLD;
- tcbd_debug(DEBUG_API_COMMON,
- "ptype:%s, bitrate :%d, interrupt threshold:%d\n",
- (_service->ptype) ? "EEP" : "UEP",
+ tcbd_debug(DEBUG_API_COMMON, "ptype:%s, bitrate :%d, interrupt "
+ "threshold:%d\n", (_service->ptype) ? "EEP" : "UEP",
_service->bitrate, threshold);
- return threshold;
+ return threshold>>1;
}
static inline s32 tcbd_find_empty_slot(
@@ -381,37 +398,37 @@ static inline s32 tcbd_find_used_slot(
return -1;
}
-static inline s32 tcbd_set_service(
- struct tcbd_device *_device, struct tcbd_service *_service)
+#define FLAG_SHORT_PARAM 0
+#define FLAG_LONG_PARAM 1
+static inline s32 tcbd_set_service(struct tcbd_device *_device,
+ struct tcbd_service *_service, s32 _flag)
{
s32 ret = 0;
- u32 threshold, sel_buff = 0, sel_stream = 0;
+ u32 threshold = 0, sel_buff = 0, sel_stream = 0;
u8 en_cmd_fifo = 0;
+ sel_buff = STREAM_DATA_ENABLE | STREAM_HEADER_ON |
+ STREAM_MASK_BUFFERA;
switch (_device->peri_type) {
case PERI_TYPE_SPI_ONLY:
-#if defined(__CALC_INTRRUPT_THRESHOLD__)
- threshold = tcbd_calc_threshold(_service);
- sel_stream = STREAM_SET_GARBAGE(threshold) |
+ if (_flag == FLAG_LONG_PARAM) {
+ threshold = tcbd_calc_threshold(_service);
+ sel_stream = STREAM_SET_GARBAGE(threshold) |
STREAM_TYPE_ALL;
-#else /* __CALC_INTRRUPT_THRESHOLD__ */
+ } else {
threshold = TCBD_MAX_THRESHOLD;
sel_stream = STREAM_SET_GARBAGE(TCBD_MAX_THRESHOLD) |
STREAM_TYPE_ALL;
-#endif /* __CALC_INTRRUPT_THRESHOLD__ */
+ }
tcbd_debug(DEBUG_API_COMMON, "threshold : %d\n", threshold);
en_cmd_fifo = ENABLE_CMD_FIFO;
- sel_buff = STREAM_DATA_ENABLE |
- STREAM_HEADER_ON |
- STREAM_MASK_BUFFERA |
- STREAM_MASK_BUFFERB;
break;
case PERI_TYPE_STS:
en_cmd_fifo = DISABLE_CMD_FIFO;
sel_stream = STREAM_TYPE_ALL;
- sel_buff = STREAM_DATA_ENABLE |
- STREAM_MASK_BUFFERA |
- STREAM_MASK_BUFFERB;
+#if !defined(__ALWAYS_FIC_ON__)
+ sel_buff &= ~(STREAM_HEADER_ON);
+#endif /*__ALWAYS_FIC_ON__*/
break;
default:
tcbd_debug(DEBUG_ERROR, "not implemented!\n");
@@ -429,18 +446,20 @@ static inline s32 tcbd_set_service(
#if defined(__READ_VARIABLE_LENGTH__)
_device->size_more_read = 0;
#endif /*__READ_VARIABLE_LENGTH__*/
+ ret |= tcbd_disable_irq(_device, 0);
ret |= tcbd_change_stream_type(_device, sel_stream);
ret |= tcbd_init_stream_data_config(
_device, en_cmd_fifo, sel_buff, threshold);
ret |= tcbd_send_service_info(_device);
- ret |= tcbd_enable_irq(_device, _device->enabled_irq);
+ if (_device->peri_type == PERI_TYPE_SPI_ONLY)
+ ret |= tcbd_enable_irq(_device, _device->enabled_irq);
return ret;
}
-s32 tcbd_register_service(
- struct tcbd_device *_device, u8 _subch_id, u8 _data_mode)
+s32 tcbd_register_service(struct tcbd_device *_device, u8 _subch_id,
+ u8 _data_mode)
{
s32 empty_slot, empty_slot2x;
struct tcbd_service service = {0, };
@@ -448,8 +467,7 @@ s32 tcbd_register_service(
u32 *service_info = mult_service->service_info;
if (tcbd_find_used_slot(mult_service, _subch_id) >= 0) {
- tcbd_debug(DEBUG_ERROR,
- "aready registerd service! "
+ tcbd_debug(DEBUG_ERROR, "aready registerd service! "
"subch_id:%d\n", _subch_id);
return -TCERR_AREADY_REGISTERED;
}
@@ -473,11 +491,11 @@ s32 tcbd_register_service(
(empty_slot << 20) |
(_data_mode << 16);
- return tcbd_set_service(_device, &service);
+ return tcbd_set_service(_device, &service, FLAG_SHORT_PARAM);
}
-s32 tcbd_register_service_long(
- struct tcbd_device *_device, struct tcbd_service *_service)
+s32 tcbd_register_service_long(struct tcbd_device *_device,
+ struct tcbd_service *_service)
{
s32 empty_slot, empty_slot2x;
u32 data_mode = 0;
@@ -485,8 +503,7 @@ s32 tcbd_register_service_long(
u32 *service_info = mult_service->service_info;
if (tcbd_find_used_slot(mult_service, _service->subch_id) >= 0) {
- tcbd_debug(DEBUG_ERROR,
- "aready registerd service! "
+ tcbd_debug(DEBUG_ERROR, "aready registerd service! "
"subch_id:%d\n", _service->subch_id);
return -TCERR_AREADY_REGISTERED;
}
@@ -525,11 +542,10 @@ s32 tcbd_register_service_long(
(_service->plevel << 8) |
_service->bitrate;
- return tcbd_set_service(_device, _service);
+ return tcbd_set_service(_device, _service, FLAG_LONG_PARAM);
}
-s32 tcbd_unregister_service(
- struct tcbd_device *_device, u8 _subch_id)
+s32 tcbd_unregister_service(struct tcbd_device *_device, u8 _subch_id)
{
s32 ret = 0;
s32 service_idx;
@@ -553,36 +569,57 @@ s32 tcbd_unregister_service(
return ret;
}
-s32 tcbd_read_fic_data(
- struct tcbd_device *_device, u8 *_buff, s32 _size)
+s32 tcbd_read_fic_data(struct tcbd_device *_device, u8 *_buff, s32 _size)
{
s32 ret = 0;
u32 addr_fic_buff;
u8 status, err_status;
- u64 tick;
+ tcbd_read_irq_status(_device, &status, &err_status);
if (_size != TCBD_FIC_SIZE) {
tcbd_debug(DEBUG_ERROR, "wrong fic size! %d\n", _size);
- return -TCERR_INVALID_ARG;
+ ret = -TCERR_INVALID_ARG;
+ goto exit_read_fic;
}
-
- ret = tcbd_read_irq_status(_device, &status, &err_status);
if (status & TCBD_IRQ_STAT_FIFOAINIT) {
addr_fic_buff = PHY_MEM_ADDR_A_START;
- tick = tcpal_get_time();
- tcbd_debug(0, "status:0x%02X, err:0x%02X, %lld elapsed\n",
- status, err_status, tcpal_diff_time(tick));
+ tcbd_debug(DEBUG_INTRRUPT, "status:0x%02X, err:0x%02X\n",
+ status, err_status);
ret = tcbd_mem_read(_device, addr_fic_buff, _buff, _size);
- ret |= tcbd_clear_irq(_device, status);
- } else {
- ret |= -TCERR_NO_FIC_DATA;
+ } else
+ ret = -TCERR_NO_FIC_DATA;
+exit_read_fic:
+ tcbd_clear_irq(_device, status);
+ return ret;
}
- ret |= tcbd_clear_irq(_device, status);
+static s32 tcbd_disp_dsp_debug(struct tcbd_device *_device)
+{
+ s32 pos_buf = 0, ret, i;
+ u32 len = 0, *data = NULL;
+ u16 cmd;
+ s8 debug_buff[256];
+
+ tcbd_debug_mbox_rx(&cmd, &len, &data);
+ if (data == NULL)
+ return 0;
+
+ ret = tcbd_read_mail_box(_device, cmd, len, data);
+ if (ret < 0) {
+ tcbd_debug(DEBUG_ERROR, "failed to read mail box, "
+ "err:%d\n", ret);
return ret;
}
+ for (i = 0; i < 6; i++)
+ pos_buf += sprintf(debug_buff + pos_buf, "[%d:%08X]",
+ i, data[i]);
+ tcbd_debug(DEBUG_INFO, "%s\n", debug_buff);
+
+ return 0;
+}
+
s32 tcbd_read_signal_info(
struct tcbd_device *_device,
struct tcbd_status_data *_status_data)
@@ -595,6 +632,9 @@ s32 tcbd_read_signal_info(
if (!_status_data)
return -TCERR_INVALID_ARG;
+ if (tcbd_debug_spur_dbg() == 1)
+ tcbd_disp_dsp_debug(_device);
+
#if defined(__STATUS_IN_REGISTER__)
ret = tcbd_reg_write(_device, TCBD_OP_STATUS0, 0x1);
ret |= tcbd_reg_read_burst_fix(_device,