1162 lines
35 KiB
C
1162 lines
35 KiB
C
|
/* sound/soc/samsung/abox/abox.h
|
||
|
*
|
||
|
* ALSA SoC - Samsung Abox driver
|
||
|
*
|
||
|
* Copyright (c) 2016 Samsung Electronics Co. Ltd.
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*/
|
||
|
|
||
|
#ifndef __SND_SOC_ABOX_H
|
||
|
#define __SND_SOC_ABOX_H
|
||
|
|
||
|
#include <linux/pm_wakeup.h>
|
||
|
#include <linux/dma-buf.h>
|
||
|
#include <linux/dma-buf-container.h>
|
||
|
#include <sound/samsung/abox.h>
|
||
|
|
||
|
#define ABOX_MASK(name) (GENMASK(ABOX_##name##_H, ABOX_##name##_L))
|
||
|
#define ABOX_MASK_ARG(name, x) (GENMASK(ABOX_##name##_H(x), ABOX_##name##_L(x)))
|
||
|
#define ABOX_IDX_ARG(name, o, x) (ABOX_##name##_BASE + \
|
||
|
(x * ABOX_##name##_INTERVAL) + o)
|
||
|
#define ABOX_L_ARG(name, o, x) ABOX_IDX_ARG(name, o, x)
|
||
|
#define ABOX_H_ARG(name, o, x) ABOX_IDX_ARG(name, o, x)
|
||
|
|
||
|
/* System */
|
||
|
#define ABOX_IP_INDEX (0x0000)
|
||
|
#define ABOX_VERSION (0x0004)
|
||
|
#define ABOX_SYSPOWER_CTRL (0x0010)
|
||
|
#define ABOX_SYSPOWER_STATUS (0x0014)
|
||
|
#define ABOX_SYSTEM_CONFIG0 (0x0020)
|
||
|
#define ABOX_REMAP_MASK (0x0024)
|
||
|
#define ABOX_REMAP_ADDR (0x0028)
|
||
|
#define ABOX_DYN_CLOCK_OFF (0x0030)
|
||
|
#define ABOX_QCHANNEL_DISABLE (0x0038)
|
||
|
#define ABOX_ROUTE_CTRL0 (0x0040)
|
||
|
#define ABOX_ROUTE_CTRL1 (0x0044)
|
||
|
#define ABOX_ROUTE_CTRL2 (0x0048)
|
||
|
#define ABOX_TICK_DIV_RATIO (0x0050)
|
||
|
/* ABOX_SYSPOWER_CTRL */
|
||
|
#define ABOX_SYSPOWER_CTRL_L (0)
|
||
|
#define ABOX_SYSPOWER_CTRL_H (0)
|
||
|
#define ABOX_SYSPOWER_CTRL_MASK ABOX_MASK(SYSPOWER_CTRL)
|
||
|
/* ABOX_SYSPOWER_STATUS */
|
||
|
#define ABOX_SYSPOWER_STATUS_L (0)
|
||
|
#define ABOX_SYSPOWER_STATUS_H (0)
|
||
|
#define ABOX_SYSPOWER_STATUS_MASK ABOX_MASK(SYSPOWER_STATUS)
|
||
|
/* ABOX_DYN_CLOCK_OFF */
|
||
|
#define ABOX_DYN_CLOCK_OFF_L (0)
|
||
|
#define ABOX_DYN_CLOCK_OFF_H (30)
|
||
|
#define ABOX_DYN_CLOCK_OFF_MASK ABOX_MASK(DYN_CLOCK_OFF)
|
||
|
/* ABOX_QCHANNEL_DISABLE */
|
||
|
#define ABOX_QCHANNEL_DISABLE_BASE (0)
|
||
|
#define ABOX_QCHANNEL_DISABLE_INTERVAL (1)
|
||
|
#define ABOX_QCHANNEL_DISABLE_L(x) ABOX_L_ARG(QCHANNEL_DISABLE, 0, x)
|
||
|
#define ABOX_QCHANNEL_DISABLE_H(x) ABOX_H_ARG(QCHANNEL_DISABLE, 0, x)
|
||
|
#define ABOX_QCHANNEL_DISABLE_MASK(x) ABOX_MASK_ARG(QCHANNEL_DISABLE, x)
|
||
|
/* ABOX_ROUTE_CTRL0 */
|
||
|
#define ABOX_ROUTE_DSIF_L (20)
|
||
|
#define ABOX_ROUTE_DSIF_H (23)
|
||
|
#define ABOX_ROUTE_DSIF_MASK ABOX_MASK(ROUTE_DSIF)
|
||
|
#define ABOX_ROUTE_UAIF_SPK_BASE (0)
|
||
|
#define ABOX_ROUTE_UAIF_SPK_INTERVAL (4)
|
||
|
#define ABOX_ROUTE_UAIF_SPK_L(x) ABOX_L_ARG(ROUTE_UAIF_SPK, 0, x)
|
||
|
#define ABOX_ROUTE_UAIF_SPK_H(x) ABOX_H_ARG(ROUTE_UAIF_SPK, 3, x)
|
||
|
#define ABOX_ROUTE_UAIF_SPK_MASK(x) ABOX_MASK_ARG(ROUTE_UAIF_SPK, x)
|
||
|
/* ABOX_ROUTE_CTRL1 */
|
||
|
#define ABOX_ROUTE_SPUSM_L (16)
|
||
|
#define ABOX_ROUTE_SPUSM_H (19)
|
||
|
#define ABOX_ROUTE_SPUSM_MASK ABOX_MASK(ROUTE_SPUSM)
|
||
|
#define ABOX_ROUTE_NSRC_BASE (0)
|
||
|
#define ABOX_ROUTE_NSRC_INTERVAL (4)
|
||
|
#define ABOX_ROUTE_NSRC_L(x) ABOX_L_ARG(ROUTE_NSRC, 0, x)
|
||
|
#define ABOX_ROUTE_NSRC_H(x) ABOX_H_ARG(ROUTE_NSRC, 3, x)
|
||
|
#define ABOX_ROUTE_NSRC_MASK(x) ABOX_MASK_ARG(ROUTE_NSRC, x)
|
||
|
/* ABOX_ROUTE_CTRL2 */
|
||
|
#define ABOX_ROUTE_RSRC_BASE (0)
|
||
|
#define ABOX_ROUTE_RSRC_INTERVAL (4)
|
||
|
#define ABOX_ROUTE_RSRC_L(x) ABOX_L_ARG(ROUTE_RSRC, 0, x)
|
||
|
#define ABOX_ROUTE_RSRC_H(x) ABOX_H_ARG(ROUTE_RSRC, 3, x)
|
||
|
#define ABOX_ROUTE_RSRC_MASK(x) ABOX_MASK_ARG(ROUTE_RSRC, x)
|
||
|
|
||
|
/* SPUS */
|
||
|
#define ABOX_SPUS_CTRL0 (0x0200)
|
||
|
#define ABOX_SPUS_CTRL1 (0x0204)
|
||
|
#define ABOX_SPUS_CTRL2 (0x0208)
|
||
|
#define ABOX_SPUS_CTRL3 (0x020C)
|
||
|
#define ABOX_SPUS_CTRL_SIFS_CNT0 (0x0280)
|
||
|
#define ABOX_SPUS_CTRL_SIFS_CNT1 (0x0284)
|
||
|
/* ABOX_SPUS_CTRL0 */
|
||
|
#define ABOX_FUNC_CHAIN_SRC_BASE (0)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_INTERVAL (4)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_IN_L(x) ABOX_L_ARG(FUNC_CHAIN_SRC, 3, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_IN_H(x) ABOX_H_ARG(FUNC_CHAIN_SRC, 3, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_IN_MASK(x) ABOX_MASK_ARG(FUNC_CHAIN_SRC_IN, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_OUT_L(x) ABOX_L_ARG(FUNC_CHAIN_SRC, 1, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_OUT_H(x) ABOX_H_ARG(FUNC_CHAIN_SRC, 2, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_OUT_MASK(x) ABOX_MASK_ARG(FUNC_CHAIN_SRC_OUT, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_ASRC_L(x) ABOX_L_ARG(FUNC_CHAIN_SRC, 0, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_ASRC_H(x) ABOX_H_ARG(FUNC_CHAIN_SRC, 0, x)
|
||
|
#define ABOX_FUNC_CHAIN_SRC_ASRC_MASK(x) ABOX_MASK_ARG(\
|
||
|
FUNC_CHAIN_SRC_ASRC, x)
|
||
|
/* ABOX_SPUS_CTRL1 */
|
||
|
#define ABOX_SIFM_IN_SEL_L (22)
|
||
|
#define ABOX_SIFM_IN_SEL_H (24)
|
||
|
#define ABOX_SIFM_IN_SEL_MASK (ABOX_MASK(SIFM_IN_SEL))
|
||
|
#define ABOX_SIFS_OUT2_SEL_L (19)
|
||
|
#define ABOX_SIFS_OUT2_SEL_H (21)
|
||
|
#define ABOX_SIFS_OUT2_SEL_MASK (ABOX_MASK(SIFS_OUT2_SEL))
|
||
|
#define ABOX_SIFS_OUT1_SEL_L (16)
|
||
|
#define ABOX_SIFS_OUT1_SEL_H (18)
|
||
|
#define ABOX_SIFS_OUT1_SEL_MASK (ABOX_MASK(SIFS_OUT1_SEL))
|
||
|
#define ABOX_SPUS_MIXP_FORMAT_L (0)
|
||
|
#define ABOX_SPUS_MIXP_FORMAT_H (4)
|
||
|
#define ABOX_SPUS_MIXP_FORMAT_MASK (ABOX_MASK(SPUS_MIXP_FORMAT))
|
||
|
/* ABOX_SPUS_CTRL2 */
|
||
|
#define ABOX_SPUS_MIXP_FLUSH_L (0)
|
||
|
#define ABOX_SPUS_MIXP_FLUSH_H (0)
|
||
|
#define ABOX_SPUS_MIXP_FLUSH_MASK (ABOX_MASK(SPUS_MIXP_FLUSH))
|
||
|
/* ABOX_SPUS_CTRL3 */
|
||
|
#define ABOX_SPUS_SIFM_FLUSH_L (2)
|
||
|
#define ABOX_SPUS_SIFM_FLUSH_H (2)
|
||
|
#define ABOX_SPUS_SIFM_FLUSH_MASK (ABOX_MASK(SPUS_SIFM_FLUSH))
|
||
|
#define ABOX_SPUS_SIFS2_FLUSH_L (1)
|
||
|
#define ABOX_SPUS_SIFS2_FLUSH_H (1)
|
||
|
#define ABOX_SPUS_SIFS2_FLUSH_MASK (ABOX_MASK(SPUS_SIFS2_FLUSH))
|
||
|
#define ABOX_SPUS_SIFS1_FLUSH_L (0)
|
||
|
#define ABOX_SPUS_SIFS1_FLUSH_H (0)
|
||
|
#define ABOX_SPUS_SIFS1_FLUSH_MASK (ABOX_MASK(SPUS_SIFS1_FLUSH))
|
||
|
/* ABOX_SPUS_CTRL_SIFS_CNT0 */
|
||
|
#define ABOX_SIFS1_CNT_VAL_L (16)
|
||
|
#define ABOX_SIFS1_CNT_VAL_H (31)
|
||
|
#define ABOX_SIFS1_CNT_VAL_MASK (ABOX_MASK(SIFS1_CNT_VAL))
|
||
|
#define ABOX_SIFS0_CNT_VAL_L (0)
|
||
|
#define ABOX_SIFS0_CNT_VAL_H (15)
|
||
|
#define ABOX_SIFS0_CNT_VAL_MASK (ABOX_MASK(SIFS0_CNT_VAL))
|
||
|
/* ABOX_SPUS_CTRL_SIFS_CNT1 */
|
||
|
#define ABOX_SIFS2_CNT_VAL_L (0)
|
||
|
#define ABOX_SIFS2_CNT_VAL_H (15)
|
||
|
#define ABOX_SIFS2_CNT_VAL_MASK (ABOX_MASK(SIFS2_CNT_VAL))
|
||
|
|
||
|
/* SPUM */
|
||
|
#define ABOX_SPUM_CTRL0 (0x0300)
|
||
|
#define ABOX_SPUM_CTRL1 (0x0304)
|
||
|
#define ABOX_SPUM_CTRL2 (0x0308)
|
||
|
#define ABOX_SPUM_CTRL3 (0x030C)
|
||
|
|
||
|
/* ABOX_SPUM_CTRL0 */
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_BASE (4)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_INTERVAL (4)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_OUT_L(x) ABOX_L_ARG(FUNC_CHAIN_NSRC, 3, x)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_OUT_H(x) ABOX_H_ARG(FUNC_CHAIN_NSRC, 3, x)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_OUT_MASK(x) ABOX_MASK_ARG(\
|
||
|
FUNC_CHAIN_NSRC_OUT, x)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_ASRC_L(x) ABOX_L_ARG(FUNC_CHAIN_NSRC, 0, x)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_ASRC_H(x) ABOX_H_ARG(FUNC_CHAIN_NSRC, 0, x)
|
||
|
#define ABOX_FUNC_CHAIN_NSRC_ASRC_MASK(x) ABOX_MASK_ARG(\
|
||
|
FUNC_CHAIN_NSRC_ASRC, x)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_RECP_L (1)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_RECP_H (1)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_RECP_MASK ABOX_MASK(FUNC_CHAIN_RSRC_RECP)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_ASRC_L (0)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_ASRC_H (0)
|
||
|
#define ABOX_FUNC_CHAIN_RSRC_ASRC_MASK ABOX_MASK(FUNC_CHAIN_RSRC_ASRC)
|
||
|
/* ABOX_SPUM_CTRL1 */
|
||
|
#define ABOX_SIFS_OUT_SEL_L (16)
|
||
|
#define ABOX_SIFS_OUT_SEL_H (18)
|
||
|
#define ABOX_SIFS_OUT_SEL_MASK (ABOX_MASK(SIFS_OUT_SEL))
|
||
|
#define ABOX_RECP_SRC_FORMAT_L (8)
|
||
|
#define ABOX_RECP_SRC_FORMAT_H (12)
|
||
|
#define ABOX_RECP_SRC_FORMAT_MASK (ABOX_MASK(RECP_SRC_FORMAT))
|
||
|
#define ABOX_RECP_SRC_VALID_L (0)
|
||
|
#define ABOX_RECP_SRC_VALID_H (1)
|
||
|
#define ABOX_RECP_SRC_VALID_MASK (ABOX_MASK(RECP_SRC_VALID))
|
||
|
/* ABOX_SPUM_CTRL2 */
|
||
|
#define ABOX_SPUM_RECP_FLUSH_L (0)
|
||
|
#define ABOX_SPUM_RECP_FLUSH_H (0)
|
||
|
#define ABOX_SPUM_RECP_FLUSH_MASK (ABOX_MASK(SPUM_RECP_FLUSH))
|
||
|
/* ABOX_SPUM_CTRL3 */
|
||
|
#define ABOX_SPUM_SIFM3_FLUSH_L (3)
|
||
|
#define ABOX_SPUM_SIFM3_FLUSH_H (3)
|
||
|
#define ABOX_SPUM_SIFM3_FLUSH_MASK (ABOX_MASK(SPUM_SIFM3_FLUSH))
|
||
|
#define ABOX_SPUM_SIFM2_FLUSH_L (2)
|
||
|
#define ABOX_SPUM_SIFM2_FLUSH_H (2)
|
||
|
#define ABOX_SPUM_SIFM2_FLUSH_MASK (ABOX_MASK(SPUM_SIFM2_FLUSH))
|
||
|
#define ABOX_SPUM_SIFM1_FLUSH_L (1)
|
||
|
#define ABOX_SPUM_SIFM1_FLUSH_H (1)
|
||
|
#define ABOX_SPUM_SIFM1_FLUSH_MASK (ABOX_MASK(SPUM_SIFM1_FLUSH))
|
||
|
#define ABOX_SPUM_SIFM0_FLUSH_L (0)
|
||
|
#define ABOX_SPUM_SIFM0_FLUSH_H (0)
|
||
|
#define ABOX_SPUM_SIFM0_FLUSH_MASK (ABOX_MASK(SPUM_SIFM0_FLUSH))
|
||
|
|
||
|
|
||
|
/* UAIF */
|
||
|
#define ABOX_UAIF_BASE (0x0500)
|
||
|
#define ABOX_UAIF_INTERVAL (0x0010)
|
||
|
#define ABOX_UAIF_CTRL0(x) ABOX_IDX_ARG(UAIF, 0x0, x)
|
||
|
#define ABOX_UAIF_CTRL1(x) ABOX_IDX_ARG(UAIF, 0x4, x)
|
||
|
#define ABOX_UAIF_STATUS(x) ABOX_IDX_ARG(UAIF, 0xC, x)
|
||
|
/* ABOX_UAIF?_CTRL0 */
|
||
|
#define ABOX_START_FIFO_DIFF_MIC_L (28)
|
||
|
#define ABOX_START_FIFO_DIFF_MIC_H (31)
|
||
|
#define ABOX_START_FIFO_DIFF_MIC_MASK (ABOX_MASK(START_FIFO_DIFF_MIC))
|
||
|
#define ABOX_START_FIFO_DIFF_SPK_L (24)
|
||
|
#define ABOX_START_FIFO_DIFF_SPK_H (27)
|
||
|
#define ABOX_START_FIFO_DIFF_SPK_MASK (ABOX_MASK(START_FIFO_DIFF_SPK))
|
||
|
#define ABOX_DATA_MODE_L (4)
|
||
|
#define ABOX_DATA_MODE_H (4)
|
||
|
#define ABOX_DATA_MODE_MASK (ABOX_MASK(DATA_MODE))
|
||
|
#define ABOX_IRQ_MODE_L (3)
|
||
|
#define ABOX_IRQ_MODE_H (3)
|
||
|
#define ABOX_IRQ_MODE_MASK (ABOX_MASK(IRQ_MODE))
|
||
|
#define ABOX_MODE_L (2)
|
||
|
#define ABOX_MODE_H (2)
|
||
|
#define ABOX_MODE_MASK (ABOX_MASK(MODE))
|
||
|
#define ABOX_MIC_ENABLE_L (1)
|
||
|
#define ABOX_MIC_ENABLE_H (1)
|
||
|
#define ABOX_MIC_ENABLE_MASK (ABOX_MASK(MIC_ENABLE))
|
||
|
#define ABOX_SPK_ENABLE_L (0)
|
||
|
#define ABOX_SPK_ENABLE_H (0)
|
||
|
#define ABOX_SPK_ENABLE_MASK (ABOX_MASK(SPK_ENABLE))
|
||
|
/* ABOX_UAIF?_CTRL1 */
|
||
|
#define ABOX_FORMAT_L (24)
|
||
|
#define ABOX_FORMAT_H (28)
|
||
|
#define ABOX_FORMAT_MASK (ABOX_MASK(FORMAT))
|
||
|
#define ABOX_BCLK_POLARITY_L (23)
|
||
|
#define ABOX_BCLK_POLARITY_H (23)
|
||
|
#define ABOX_BCLK_POLARITY_MASK (ABOX_MASK(BCLK_POLARITY))
|
||
|
#define ABOX_WS_MODE_L (22)
|
||
|
#define ABOX_WS_MODE_H (22)
|
||
|
#define ABOX_WS_MODE_MASK (ABOX_MASK(WS_MODE))
|
||
|
#define ABOX_WS_POLAR_L (21)
|
||
|
#define ABOX_WS_POLAR_H (21)
|
||
|
#define ABOX_WS_POLAR_MASK (ABOX_MASK(WS_POLAR))
|
||
|
#define ABOX_SLOT_MAX_L (18)
|
||
|
#define ABOX_SLOT_MAX_H (20)
|
||
|
#define ABOX_SLOT_MAX_MASK (ABOX_MASK(SLOT_MAX))
|
||
|
#define ABOX_SBIT_MAX_L (12)
|
||
|
#define ABOX_SBIT_MAX_H (17)
|
||
|
#define ABOX_SBIT_MAX_MASK (ABOX_MASK(SBIT_MAX))
|
||
|
#define ABOX_VALID_STR_L (6)
|
||
|
#define ABOX_VALID_STR_H (11)
|
||
|
#define ABOX_VALID_STR_MASK (ABOX_MASK(VALID_STR))
|
||
|
#define ABOX_VALID_END_L (0)
|
||
|
#define ABOX_VALID_END_H (5)
|
||
|
#define ABOX_VALID_END_MASK (ABOX_MASK(VALID_END))
|
||
|
/* ABOX_UAIF?_STATUS */
|
||
|
#define ABOX_ERROR_OF_MIC_L (1)
|
||
|
#define ABOX_ERROR_OF_MIC_H (1)
|
||
|
#define ABOX_ERROR_OF_MIC_MASK (ABOX_MASK(ERROR_OF_MIC))
|
||
|
#define ABOX_ERROR_OF_SPK_L (0)
|
||
|
#define ABOX_ERROR_OF_SPK_H (0)
|
||
|
#define ABOX_ERROR_OF_SPK_MASK (ABOX_MASK(ERROR_OF_SPK))
|
||
|
|
||
|
/* DSIF */
|
||
|
#define ABOX_DSIF_CTRL (0x0550)
|
||
|
#define ABOX_DSIF_STATUS (0x0554)
|
||
|
/* ABOX_DSIF_CTRL */
|
||
|
#define ABOX_DSIF_BCLK_POLARITY_L (2)
|
||
|
#define ABOX_DSIF_BCLK_POLARITY_H (2)
|
||
|
#define ABOX_DSIF_BCLK_POLARITY_MASK (ABOX_MASK(DSIF_BCLK_POLARITY))
|
||
|
#define ABOX_ORDER_L (1)
|
||
|
#define ABOX_ORDER_H (1)
|
||
|
#define ABOX_ORDER_MASK (ABOX_MASK(ORDER))
|
||
|
#define ABOX_ENABLE_L (0)
|
||
|
#define ABOX_ENABLE_H (0)
|
||
|
#define ABOX_ENABLE_MASK (ABOX_MASK(ENABLE))
|
||
|
/* ABOX_DSIF_STATUS */
|
||
|
#define ABOX_ERROR_L (0)
|
||
|
#define ABOX_ERROR_H (0)
|
||
|
#define ABOX_ERROR_MASK (ABOX_MASK(ERROR))
|
||
|
|
||
|
/* SPDY */
|
||
|
#define ABOX_SPDYIF_CTRL (0x0560)
|
||
|
/* ABOX_SPDYIF_CTRL */
|
||
|
#define ABOX_START_FIFO_DIFF_L (1)
|
||
|
#define ABOX_START_FIFO_DIFF_H (4)
|
||
|
#define ABOX_START_FIFO_DIFF_MASK (ABOX_MASK(START_FIFO_DIFF))
|
||
|
/* same with DSIF
|
||
|
* #define ABOX_ENABLE_L (0)
|
||
|
* #define ABOX_ENABLE_H (0)
|
||
|
* #define ABOX_ENABLE_MASK (ABOX_MASK(ENABLE))
|
||
|
*/
|
||
|
|
||
|
/* TIMER */
|
||
|
#define ABOX_TIMER_BASE (0x0600)
|
||
|
#define ABOX_TIMER_INTERVAL (0x0020)
|
||
|
#define ABOX_TIMER_CTRL0(x) ABOX_IDX_ARG(TIMER, 0x0, x)
|
||
|
#define ABOX_TIMER_CTRL1(x) ABOX_IDX_ARG(TIMER, 0x4, x)
|
||
|
#define ABOX_TIMER_PRESET_LSB(x) ABOX_IDX_ARG(TIMER, 0x8, x)
|
||
|
#define ABOX_TIMER_PRESET_MSB(x) ABOX_IDX_ARG(TIMER, 0xC, x)
|
||
|
#define ABOX_TIMER_CURVALUD_LSB(x) ABOX_IDX_ARG(TIMER, 0x10, x)
|
||
|
#define ABOX_TIMER_CURVALUD_MSB(x) ABOX_IDX_ARG(TIMER, 0x14, x)
|
||
|
|
||
|
/* ABOX_TIMER?_CTRL0 */
|
||
|
#define ABOX_TIMER_FLUSH_L (1)
|
||
|
#define ABOX_TIMER_FLUSH_H (1)
|
||
|
#define ABOX_TIMER_FLUSH_MASK (ABOX_MASK(TIMER_FLUSH))
|
||
|
#define ABOX_TIMER_START_L (0)
|
||
|
#define ABOX_TIMER_START_H (0)
|
||
|
#define ABOX_TIMER_START_MASK (ABOX_MASK(TIMER_START))
|
||
|
/* ABOX_TIMER?_CTRL1 */
|
||
|
#define ABOX_TIMER_MODE_L (0)
|
||
|
#define ABOX_TIMER_MODE_H (0)
|
||
|
#define ABOX_TIMER_MODE_MASK (ABOX_MASK(TIMER_MODE))
|
||
|
|
||
|
/* RDMA */
|
||
|
#define ABOX_RDMA_BASE (0x1000)
|
||
|
#define ABOX_RDMA_INTERVAL (0x0100)
|
||
|
#define ABOX_RDMA_CTRL0 (0x00)
|
||
|
#define ABOX_RDMA_CTRL1 (0x04)
|
||
|
#define ABOX_RDMA_BUF_STR (0x08)
|
||
|
#define ABOX_RDMA_BUF_END (0x0C)
|
||
|
#define ABOX_RDMA_BUF_OFFSET (0x10)
|
||
|
#define ABOX_RDMA_STR_POINT (0x14)
|
||
|
#define ABOX_RDMA_VOL_FACTOR(x) ABOX_IDX_ARG(RDMA, 0x18, x)
|
||
|
#define ABOX_RDMA_VOL_CHANGE (0x1C)
|
||
|
#ifdef CONFIG_SOC_EXYNOS8895
|
||
|
#define ABOX_RDMA_STATUS (0x20)
|
||
|
#else
|
||
|
#define ABOX_RDMA_SBACK_LIMIT (0x20)
|
||
|
#define ABOX_RDMA_STATUS (0x30)
|
||
|
#endif
|
||
|
/* ABOX_RDMA_CTRL0 */
|
||
|
#define ABOX_RDMA_ENABLE_L (0)
|
||
|
#define ABOX_RDMA_ENABLE_H (0)
|
||
|
#define ABOX_RDMA_ENABLE_MASK (ABOX_MASK(RDMA_ENABLE))
|
||
|
/* ABOX_RDMA_STATUS */
|
||
|
#define ABOX_RDMA_PROGRESS_L (31)
|
||
|
#define ABOX_RDMA_PROGRESS_H (31)
|
||
|
#define ABOX_RDMA_PROGRESS_MASK (ABOX_MASK(RDMA_PROGRESS))
|
||
|
#define ABOX_RDMA_RBUF_OFFSET_L (16)
|
||
|
#define ABOX_RDMA_RBUF_OFFSET_H (28)
|
||
|
#define ABOX_RDMA_RBUF_OFFSET_MASK (ABOX_MASK(RDMA_RBUF_OFFSET))
|
||
|
#define ABOX_RDMA_RBUF_CNT_L (0)
|
||
|
#define ABOX_RDMA_RBUF_CNT_H (12)
|
||
|
#define ABOX_RDMA_RBUF_CNT_MASK (ABOX_MASK(RDMA_RBUF_CNT))
|
||
|
/* ABOX_RDMA_VOL_FACTOR */
|
||
|
#define ABOX_RDMA_VOL_FACTOR_H (23)
|
||
|
#define ABOX_RDMA_VOL_FACTOR_L (0)
|
||
|
#define ABOX_RDMA_VOL_FACTOR_MASK (ABOX_MASK(RDMA_VOL_FACTOR))
|
||
|
|
||
|
/* WDMA */
|
||
|
#define ABOX_WDMA_BASE (0x2000)
|
||
|
#define ABOX_WDMA_INTERVAL (0x0100)
|
||
|
#define ABOX_WDMA_CTRL (0x00)
|
||
|
#define ABOX_WDMA_BUF_STR (0x08)
|
||
|
#define ABOX_WDMA_BUF_END (0x0C)
|
||
|
#define ABOX_WDMA_BUF_OFFSET (0x10)
|
||
|
#define ABOX_WDMA_STR_POINT (0x14)
|
||
|
#define ABOX_WDMA_VOL_FACTOR (0x18)
|
||
|
#define ABOX_WDMA_VOL_CHANGE (0x1C)
|
||
|
#ifdef CONFIG_SOC_EXYNOS8895
|
||
|
#define ABOX_WDMA_STATUS (0x20)
|
||
|
#else
|
||
|
#define ABOX_WDMA_SBACK_LIMIT (0x20)
|
||
|
#define ABOX_WDMA_STATUS (0x30)
|
||
|
#endif
|
||
|
/* ABOX_WDMA_CTRL */
|
||
|
#define ABOX_WDMA_ENABLE_L (0)
|
||
|
#define ABOX_WDMA_ENABLE_H (0)
|
||
|
#define ABOX_WDMA_ENABLE_MASK (ABOX_MASK(WDMA_ENABLE))
|
||
|
/* ABOX_WDMA_STATUS */
|
||
|
#define ABOX_WDMA_PROGRESS_L (31)
|
||
|
#define ABOX_WDMA_PROGRESS_H (31)
|
||
|
#define ABOX_WDMA_PROGRESS_MASK (ABOX_MASK(WDMA_PROGRESS))
|
||
|
#define ABOX_WDMA_RBUF_OFFSET_L (16)
|
||
|
#define ABOX_WDMA_RBUF_OFFSET_H (28)
|
||
|
#define ABOX_WDMA_RBUF_OFFSET_MASK (ABOX_MASK(WDMA_RBUF_OFFSET))
|
||
|
#define ABOX_WDMA_RBUF_CNT_L (0)
|
||
|
#define ABOX_WDMA_RBUF_CNT_H (12)
|
||
|
#define ABOX_WDMA_RBUF_CNT_MASK (ABOX_MASK(WDMA_RBUF_CNT))
|
||
|
|
||
|
/* CA7 */
|
||
|
#define ABOX_CPU_R(x) (0x2C00 + (x * 0x4))
|
||
|
#define ABOX_CPU_PC (0x2C3C)
|
||
|
#define ABOX_CPU_L2C_STATUS (0x2C40)
|
||
|
|
||
|
#define ABOX_MAX_REGISTERS (0x2D0C)
|
||
|
|
||
|
/* SYSREG */
|
||
|
#define ABOX_SYSREG_L2_CACHE_CON (0x0328)
|
||
|
#define ABOX_SYSREG_MISC_CON (0x032C)
|
||
|
|
||
|
#define BUFFER_BYTES_MAX (SZ_128K)
|
||
|
#define PERIOD_BYTES_MIN (SZ_128)
|
||
|
#define PERIOD_BYTES_MAX (BUFFER_BYTES_MAX / 2)
|
||
|
|
||
|
#define DRAM_FIRMWARE_SIZE (SZ_16M + SZ_2M)
|
||
|
#define IOVA_DRAM_FIRMWARE (0x80000000)
|
||
|
#define IOVA_RDMA_BUFFER_BASE (0x91000000)
|
||
|
#define IOVA_RDMA_BUFFER(x) (IOVA_RDMA_BUFFER_BASE + (SZ_1M * x))
|
||
|
#define IOVA_WDMA_BUFFER_BASE (0x92000000)
|
||
|
#define IOVA_WDMA_BUFFER(x) (IOVA_WDMA_BUFFER_BASE + (SZ_1M * x))
|
||
|
#define IOVA_COMPR_BUFFER_BASE (0x93000000)
|
||
|
#define IOVA_COMPR_BUFFER(x) (IOVA_COMPR_BUFFER_BASE + (SZ_1M * x))
|
||
|
#define IOVA_VDMA_BUFFER_BASE (0x94000000)
|
||
|
#define IOVA_VDMA_BUFFER(x) (IOVA_VDMA_BUFFER_BASE + (SZ_1M * x))
|
||
|
#define IOVA_VSS_FIRMWARE (0xA0000000)
|
||
|
#define IOVA_VSS_PARAMETER (0xA1000000)
|
||
|
#define IOVA_BLUETOOTH (0xB0000000)
|
||
|
#define IOVA_DUMP_BUFFER (0xD0000000)
|
||
|
#define IOVA_PRIVATE (0xE0000000)
|
||
|
#define PRIVATE_SIZE (SZ_8M)
|
||
|
#define PHSY_VSS_FIRMWARE (0xFEE00000)
|
||
|
#define PHSY_VSS_SIZE (SZ_4M + SZ_2M)
|
||
|
|
||
|
#define AUD_PLL_RATE_HZ_FOR_48000 (1179648040)
|
||
|
#define AUD_PLL_RATE_HZ_FOR_44100 (1083801600)
|
||
|
|
||
|
#define LIMIT_IN_JIFFIES (msecs_to_jiffies(1000))
|
||
|
|
||
|
#define ABOX_CPU_GEAR_CALL_VSS (0xCA11)
|
||
|
#define ABOX_CPU_GEAR_CALL_KERNEL (0xCA12)
|
||
|
#define ABOX_CPU_GEAR_CALL ABOX_CPU_GEAR_CALL_VSS
|
||
|
#define ABOX_CPU_GEAR_BOOT (0xB00D)
|
||
|
#define ABOX_CPU_GEAR_MAX (1)
|
||
|
#define ABOX_CPU_GEAR_MIN (12)
|
||
|
#define ABOX_CPU_GEAR_DAI 0xDA100000
|
||
|
#define ABOX_CPU_GEAR_FM 0xF1000000
|
||
|
|
||
|
#define ABOX_DMA_TIMEOUT_NS (40000000)
|
||
|
|
||
|
#define ABOX_SAMPLING_RATES (SNDRV_PCM_RATE_KNOT)
|
||
|
#define ABOX_SAMPLE_FORMATS (SNDRV_PCM_FMTBIT_S16\
|
||
|
| SNDRV_PCM_FMTBIT_S24\
|
||
|
| SNDRV_PCM_FMTBIT_S32)
|
||
|
#define ABOX_WDMA_SAMPLE_FORMATS (SNDRV_PCM_FMTBIT_S16\
|
||
|
| SNDRV_PCM_FMTBIT_S24\
|
||
|
| SNDRV_PCM_FMTBIT_S32)
|
||
|
|
||
|
#define set_mask_value(id, mask, value) \
|
||
|
{id = (typeof(id))((id & ~mask) | (value & mask)); }
|
||
|
|
||
|
#define set_value_by_name(id, name, value) \
|
||
|
set_mask_value(id, name##_MASK, value << name##_L)
|
||
|
|
||
|
#define ABOX_SUPPLEMENT_SIZE (SZ_128)
|
||
|
#define ABOX_IPC_QUEUE_SIZE (SZ_64)
|
||
|
|
||
|
#define CALLIOPE_VERSION(class, year, month, minor) \
|
||
|
((class << 24) | \
|
||
|
((year - 1 + 'A') << 16) | \
|
||
|
((month - 1 + 'A') << 8) | \
|
||
|
((minor + '0') << 0))
|
||
|
|
||
|
enum abox_dai {
|
||
|
ABOX_RDMA0,
|
||
|
ABOX_RDMA1,
|
||
|
ABOX_RDMA2,
|
||
|
ABOX_RDMA3,
|
||
|
ABOX_RDMA4,
|
||
|
ABOX_RDMA5,
|
||
|
ABOX_RDMA6,
|
||
|
ABOX_RDMA7,
|
||
|
ABOX_WDMA0,
|
||
|
ABOX_WDMA1,
|
||
|
ABOX_WDMA2,
|
||
|
ABOX_WDMA3,
|
||
|
ABOX_WDMA4,
|
||
|
ABOX_UAIF0,
|
||
|
ABOX_UAIF1,
|
||
|
ABOX_UAIF2,
|
||
|
ABOX_UAIF3,
|
||
|
ABOX_UAIF4,
|
||
|
ABOX_DSIF,
|
||
|
ABOX_SPDY,
|
||
|
ABOX_SIFS0, /* Virtual DAI */
|
||
|
ABOX_SIFS1, /* Virtual DAI */
|
||
|
ABOX_SIFS2, /* Virtual DAI */
|
||
|
};
|
||
|
|
||
|
#define ABOX_DAI_COUNT (ABOX_DSIF - ABOX_UAIF0 + 1)
|
||
|
|
||
|
enum calliope_state {
|
||
|
CALLIOPE_DISABLED,
|
||
|
CALLIOPE_DISABLING,
|
||
|
CALLIOPE_ENABLING,
|
||
|
CALLIOPE_ENABLED,
|
||
|
CALLIOPE_STATE_COUNT,
|
||
|
};
|
||
|
|
||
|
enum audio_mode {
|
||
|
MODE_NORMAL,
|
||
|
MODE_RINGTONE,
|
||
|
MODE_IN_CALL,
|
||
|
MODE_IN_COMMUNICATION,
|
||
|
MODE_IN_VIDEOCALL,
|
||
|
};
|
||
|
|
||
|
enum sound_type {
|
||
|
SOUND_TYPE_VOICE,
|
||
|
SOUND_TYPE_SPEAKER,
|
||
|
SOUND_TYPE_HEADSET,
|
||
|
SOUND_TYPE_BTVOICE,
|
||
|
SOUND_TYPE_USB,
|
||
|
};
|
||
|
|
||
|
enum qchannel {
|
||
|
ABOX_CCLK_CA7,
|
||
|
ABOX_ACLK,
|
||
|
ABOX_BCLK_UAIF0,
|
||
|
ABOX_BCLK_UAIF1,
|
||
|
ABOX_BCLK_UAIF2,
|
||
|
ABOX_BCLK_UAIF3,
|
||
|
ABOX_BCLK_DSIF,
|
||
|
ABOX_CCLK_ATB,
|
||
|
ABOX_CCLK_ASB,
|
||
|
};
|
||
|
|
||
|
|
||
|
#define ABOX_QUIRK_TRY_TO_ASRC_OFF (1 << 0)
|
||
|
#define ABOX_QUIRK_SHARE_VTS_SRAM (1 << 1)
|
||
|
#define ABOX_QUIRK_OFF_ON_SUSPEND (1 << 2)
|
||
|
#define ABOX_QUIRK_SCSC_BT (1 << 3)
|
||
|
#define ABOX_QUIRK_SCSC_BT_HACK (1 << 4)
|
||
|
#define ABOX_QUIRK_STR_TRY_TO_ASRC_OFF "try to asrc off"
|
||
|
#define ABOX_QUIRK_STR_SHARE_VTS_SRAM "share vts sram"
|
||
|
#define ABOX_QUIRK_STR_OFF_ON_SUSPEND "off on suspend"
|
||
|
#define ABOX_QUIRK_STR_SCSC_BT "scsc bt"
|
||
|
#define ABOX_QUIRK_STR_SCSC_BT_HACK "scsc bt hack"
|
||
|
|
||
|
struct abox_ipc {
|
||
|
struct device *dev;
|
||
|
int hw_irq;
|
||
|
unsigned long long put_time;
|
||
|
unsigned long long get_time;
|
||
|
ABOX_IPC_MSG msg;
|
||
|
};
|
||
|
|
||
|
struct abox_irq_action {
|
||
|
struct list_head list;
|
||
|
int irq;
|
||
|
abox_irq_handler_t irq_handler;
|
||
|
void *dev_id;
|
||
|
};
|
||
|
|
||
|
struct abox_iommu_mapping {
|
||
|
struct list_head list;
|
||
|
unsigned long iova; /* IO virtual address */
|
||
|
unsigned char *area; /* virtual pointer */
|
||
|
dma_addr_t addr; /* physical address */
|
||
|
size_t bytes; /* buffer size in bytes */
|
||
|
};
|
||
|
|
||
|
struct abox_qos_request {
|
||
|
unsigned int id;
|
||
|
unsigned int value;
|
||
|
};
|
||
|
|
||
|
struct abox_dram_request {
|
||
|
void *id;
|
||
|
bool on;
|
||
|
};
|
||
|
|
||
|
struct abox_l2c_request {
|
||
|
void *id;
|
||
|
bool on;
|
||
|
};
|
||
|
|
||
|
struct abox_extra_firmware {
|
||
|
const struct firmware *firmware;
|
||
|
const char *name;
|
||
|
u32 area;
|
||
|
u32 offset;
|
||
|
};
|
||
|
|
||
|
struct abox_component {
|
||
|
struct ABOX_COMPONENT_DESCRIPTIOR *desc;
|
||
|
bool registered;
|
||
|
struct list_head value_list;
|
||
|
};
|
||
|
|
||
|
struct abox_component_kcontrol_value {
|
||
|
struct ABOX_COMPONENT_DESCRIPTIOR *desc;
|
||
|
struct ABOX_COMPONENT_CONTROL *control;
|
||
|
struct list_head list;
|
||
|
bool cache_only;
|
||
|
int cache[];
|
||
|
};
|
||
|
|
||
|
struct abox_data {
|
||
|
struct platform_device *pdev;
|
||
|
struct snd_soc_component *cmpnt;
|
||
|
struct regmap *regmap;
|
||
|
void __iomem *sfr_base;
|
||
|
void __iomem *sysreg_base;
|
||
|
void __iomem *sram_base;
|
||
|
phys_addr_t sram_base_phys;
|
||
|
size_t sram_size;
|
||
|
void *dram_base;
|
||
|
dma_addr_t dram_base_phys;
|
||
|
void *dump_base;
|
||
|
phys_addr_t dump_base_phys;
|
||
|
void *priv_base;
|
||
|
phys_addr_t priv_base_phys;
|
||
|
struct iommu_domain *iommu_domain;
|
||
|
unsigned int ipc_tx_offset;
|
||
|
unsigned int ipc_rx_offset;
|
||
|
unsigned int ipc_tx_ack_offset;
|
||
|
unsigned int ipc_rx_ack_offset;
|
||
|
unsigned int mailbox_offset;
|
||
|
unsigned int if_count;
|
||
|
unsigned int rdma_count;
|
||
|
unsigned int wdma_count;
|
||
|
unsigned int calliope_version;
|
||
|
const struct firmware *firmware_sram;
|
||
|
const struct firmware *firmware_dram;
|
||
|
struct abox_extra_firmware firmware_extra[SZ_16];
|
||
|
struct device *dev_gic;
|
||
|
struct device *dev_bt;
|
||
|
struct platform_device *pdev_if[8];
|
||
|
struct platform_device *pdev_rdma[8];
|
||
|
struct platform_device *pdev_wdma[5];
|
||
|
struct platform_device *pdev_vts;
|
||
|
struct workqueue_struct *gear_workqueue;
|
||
|
struct workqueue_struct *ipc_workqueue;
|
||
|
struct work_struct ipc_work;
|
||
|
struct abox_ipc ipc_queue[ABOX_IPC_QUEUE_SIZE];
|
||
|
int ipc_queue_start;
|
||
|
int ipc_queue_end;
|
||
|
spinlock_t ipc_queue_lock;
|
||
|
wait_queue_head_t ipc_wait_queue;
|
||
|
struct clk *clk_pll;
|
||
|
struct clk *clk_audif;
|
||
|
struct clk *clk_cpu;
|
||
|
struct clk *clk_bus;
|
||
|
unsigned int uaif_max_div;
|
||
|
struct pinctrl *pinctrl;
|
||
|
unsigned long quirks;
|
||
|
unsigned int cpu_gear;
|
||
|
unsigned int cpu_gear_min;
|
||
|
struct abox_qos_request cpu_gear_requests[64];
|
||
|
struct work_struct change_cpu_gear_work;
|
||
|
unsigned int int_freq;
|
||
|
struct abox_qos_request int_requests[16];
|
||
|
struct work_struct change_int_freq_work;
|
||
|
unsigned int mif_freq;
|
||
|
struct abox_qos_request mif_requests[16];
|
||
|
struct work_struct change_mif_freq_work;
|
||
|
unsigned int lit_freq;
|
||
|
struct abox_qos_request lit_requests[16];
|
||
|
struct work_struct change_lit_freq_work;
|
||
|
unsigned int big_freq;
|
||
|
struct abox_qos_request big_requests[16];
|
||
|
struct work_struct change_big_freq_work;
|
||
|
unsigned int hmp_boost;
|
||
|
struct abox_qos_request hmp_requests[16];
|
||
|
struct work_struct change_hmp_boost_work;
|
||
|
struct abox_dram_request dram_requests[16];
|
||
|
unsigned long audif_rates[ABOX_DAI_COUNT];
|
||
|
unsigned int sif_rate[SET_INMUX4_SAMPLE_RATE -
|
||
|
SET_MIXER_SAMPLE_RATE + 1];
|
||
|
snd_pcm_format_t sif_format[SET_INMUX4_FORMAT -
|
||
|
SET_MIXER_FORMAT + 1];
|
||
|
unsigned int sif_channels[SET_INMUX4_FORMAT -
|
||
|
SET_MIXER_FORMAT + 1];
|
||
|
unsigned int sif_rate_min[SET_INMUX4_SAMPLE_RATE -
|
||
|
SET_MIXER_SAMPLE_RATE + 1];
|
||
|
snd_pcm_format_t sif_format_min[SET_INMUX4_FORMAT -
|
||
|
SET_MIXER_FORMAT + 1];
|
||
|
unsigned int sif_channels_min[SET_INMUX4_FORMAT -
|
||
|
SET_MIXER_FORMAT + 1];
|
||
|
bool sif_auto_config[SET_INMUX4_SAMPLE_RATE -
|
||
|
SET_MIXER_SAMPLE_RATE + 1];
|
||
|
unsigned int erap_status[ERAP_TYPE_COUNT];
|
||
|
struct work_struct register_component_work;
|
||
|
struct abox_component components[16];
|
||
|
struct list_head irq_actions;
|
||
|
struct list_head iommu_maps;
|
||
|
struct mutex iommu_lock;
|
||
|
bool enabled;
|
||
|
enum calliope_state calliope_state;
|
||
|
bool l2c_controlled;
|
||
|
bool l2c_enabled;
|
||
|
struct abox_l2c_request l2c_requests[8];
|
||
|
struct work_struct l2c_work;
|
||
|
struct notifier_block qos_nb;
|
||
|
struct notifier_block pm_nb;
|
||
|
struct notifier_block modem_nb;
|
||
|
struct notifier_block itmon_nb;
|
||
|
int pm_qos_int[5];
|
||
|
int pm_qos_aud[5];
|
||
|
struct work_struct boot_done_work;
|
||
|
struct delayed_work tickle_work;
|
||
|
unsigned long long audio_mode_time;
|
||
|
enum audio_mode audio_mode;
|
||
|
enum sound_type sound_type;
|
||
|
struct ion_client *client;
|
||
|
atomic_t suspend_state;
|
||
|
struct wakeup_source ws;
|
||
|
struct wakeup_source ws_boot;
|
||
|
unsigned int bootargs_offset;
|
||
|
const char *bootargs;
|
||
|
};
|
||
|
|
||
|
struct abox_compr_data {
|
||
|
/* compress offload */
|
||
|
struct snd_compr_stream *cstream;
|
||
|
|
||
|
void *dma_area;
|
||
|
size_t dma_size;
|
||
|
dma_addr_t dma_addr;
|
||
|
|
||
|
unsigned int block_num;
|
||
|
unsigned int handle_id;
|
||
|
unsigned int codec_id;
|
||
|
unsigned int channels;
|
||
|
unsigned int sample_rate;
|
||
|
|
||
|
unsigned int byte_offset;
|
||
|
u64 copied_total;
|
||
|
u64 received_total;
|
||
|
|
||
|
bool start;
|
||
|
bool eos;
|
||
|
bool created;
|
||
|
|
||
|
bool effect_on;
|
||
|
|
||
|
wait_queue_head_t flush_wait;
|
||
|
wait_queue_head_t exit_wait;
|
||
|
wait_queue_head_t ipc_wait;
|
||
|
|
||
|
uint32_t stop_ack;
|
||
|
uint32_t exit_ack;
|
||
|
|
||
|
spinlock_t lock;
|
||
|
spinlock_t cmd_lock;
|
||
|
|
||
|
int (*isr_handler)(void *data);
|
||
|
|
||
|
struct snd_compr_params codec_param;
|
||
|
|
||
|
/* effect offload */
|
||
|
unsigned int out_sample_rate;
|
||
|
};
|
||
|
|
||
|
enum abox_platform_type {
|
||
|
PLATFORM_NORMAL,
|
||
|
PLATFORM_CALL,
|
||
|
PLATFORM_COMPRESS,
|
||
|
PLATFORM_REALTIME,
|
||
|
PLATFORM_VI_SENSING,
|
||
|
PLATFORM_SYNC,
|
||
|
};
|
||
|
|
||
|
enum abox_buffer_type {
|
||
|
BUFFER_TYPE_DMA,
|
||
|
BUFFER_TYPE_ION,
|
||
|
};
|
||
|
|
||
|
enum abox_rate {
|
||
|
RATE_SUHQA,
|
||
|
RATE_UHQA,
|
||
|
RATE_NORMAL,
|
||
|
RATE_COUNT,
|
||
|
};
|
||
|
|
||
|
static inline bool abox_test_quirk(struct abox_data *data, unsigned long quirk)
|
||
|
{
|
||
|
return !!(data->quirks & quirk);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get sampling rate type
|
||
|
* @param[in] rate sampling rate in Hz
|
||
|
* @return rate type in enum abox_rate
|
||
|
*/
|
||
|
static inline enum abox_rate abox_get_rate_type(unsigned int rate)
|
||
|
{
|
||
|
if (rate < 176400)
|
||
|
return RATE_NORMAL;
|
||
|
else if (rate >= 176400 && rate <= 192000)
|
||
|
return RATE_UHQA;
|
||
|
else
|
||
|
return RATE_SUHQA;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get SFR of sample format
|
||
|
* @param[in] bit_depth count of bit in sample
|
||
|
* @param[in] channels count of channel
|
||
|
* @return SFR of sample format
|
||
|
*/
|
||
|
static inline u32 abox_get_format(int bit_depth, int channels)
|
||
|
{
|
||
|
u32 ret = (channels - 1);
|
||
|
|
||
|
switch (bit_depth) {
|
||
|
case 16:
|
||
|
ret |= 1 << 3;
|
||
|
break;
|
||
|
case 24:
|
||
|
ret |= 2 << 3;
|
||
|
break;
|
||
|
case 32:
|
||
|
ret |= 3 << 3;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
pr_debug("%s(%d, %d): %u\n", __func__, bit_depth, channels, ret);
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get enum IPC_ID from SNDRV_PCM_STREAM_*
|
||
|
* @param[in] stream SNDRV_PCM_STREAM_*
|
||
|
* @return IPC_PCMPLAYBACK or IPC_PCMCAPTURE
|
||
|
*/
|
||
|
static inline enum IPC_ID abox_stream_to_ipcid(int stream)
|
||
|
{
|
||
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||
|
return IPC_PCMPLAYBACK;
|
||
|
else if (stream == SNDRV_PCM_STREAM_CAPTURE)
|
||
|
return IPC_PCMCAPTURE;
|
||
|
else
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get SNDRV_PCM_STREAM_* from enum IPC_ID
|
||
|
* @param[in] ipcid IPC_PCMPLAYBACK or IPC_PCMCAPTURE
|
||
|
* @return SNDRV_PCM_STREAM_*
|
||
|
*/
|
||
|
static inline int abox_ipcid_to_stream(enum IPC_ID ipcid)
|
||
|
{
|
||
|
if (ipcid == IPC_PCMPLAYBACK)
|
||
|
return SNDRV_PCM_STREAM_PLAYBACK;
|
||
|
else if (ipcid == IPC_PCMCAPTURE)
|
||
|
return SNDRV_PCM_STREAM_CAPTURE;
|
||
|
else
|
||
|
return -EINVAL;
|
||
|
}
|
||
|
|
||
|
struct abox_ion_buf {
|
||
|
size_t size;
|
||
|
size_t align;
|
||
|
void *ctx;
|
||
|
void *kvaddr;
|
||
|
void *kva;
|
||
|
dma_addr_t iova;
|
||
|
struct sg_table *sgt;
|
||
|
|
||
|
struct dma_buf *dma_buf;
|
||
|
struct dma_buf_attachment *attachment;
|
||
|
enum dma_data_direction direction;
|
||
|
int fd;
|
||
|
|
||
|
void *priv;
|
||
|
};
|
||
|
|
||
|
struct abox_platform_data {
|
||
|
struct platform_device *pdev;
|
||
|
void __iomem *sfr_base;
|
||
|
void __iomem *mailbox_base;
|
||
|
unsigned int id;
|
||
|
unsigned int pointer;
|
||
|
int pm_qos_lit[RATE_COUNT];
|
||
|
int pm_qos_big[RATE_COUNT];
|
||
|
int pm_qos_hmp[RATE_COUNT];
|
||
|
struct platform_device *pdev_abox;
|
||
|
struct abox_data *abox_data;
|
||
|
struct snd_pcm_substream *substream;
|
||
|
enum abox_platform_type type;
|
||
|
bool ack_enabled;
|
||
|
struct abox_compr_data compr_data;
|
||
|
struct regmap *mailbox;
|
||
|
bool scsc_bt;
|
||
|
struct snd_dma_buffer dmab;
|
||
|
struct abox_ion_buf ion_buf;
|
||
|
struct snd_hwdep *hwdep;
|
||
|
bool mmap_fd_state;
|
||
|
enum abox_buffer_type buf_type;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* get pointer to abox_data (internal use only)
|
||
|
* @return pointer to abox_data
|
||
|
*/
|
||
|
extern struct abox_data *abox_get_abox_data(void);
|
||
|
|
||
|
/**
|
||
|
* get physical address from abox virtual address
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] addr abox virtual address
|
||
|
* @return physical address
|
||
|
*/
|
||
|
extern phys_addr_t abox_addr_to_phys_addr(struct abox_data *data,
|
||
|
unsigned int addr);
|
||
|
|
||
|
/**
|
||
|
* get kernel address from abox virtual address
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] addr abox virtual address
|
||
|
* @return kernel address
|
||
|
*/
|
||
|
extern void *abox_addr_to_kernel_addr(struct abox_data *data,
|
||
|
unsigned int addr);
|
||
|
|
||
|
/**
|
||
|
* check specific cpu gear request is idle
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @return true if it is idle or not has been requested, false on otherwise
|
||
|
*/
|
||
|
extern bool abox_cpu_gear_idle(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id);
|
||
|
|
||
|
/**
|
||
|
* Request abox cpu clock level
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] gear gear level (cpu clock = aud pll rate / gear)
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_cpu_gear(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id, unsigned int gear);
|
||
|
|
||
|
/**
|
||
|
* Wait for pending cpu gear change
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
*/
|
||
|
extern void abox_cpu_gear_barrier(struct abox_data *data);
|
||
|
|
||
|
/**
|
||
|
* Request abox cpu clock level synchronously
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] gear gear level (cpu clock = aud pll rate / gear)
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_cpu_gear_sync(struct device *dev,
|
||
|
struct abox_data *data, unsigned int id, unsigned int gear);
|
||
|
|
||
|
/**
|
||
|
* Request abox cpu clock level with DAI
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] dai DAI which is used as unique handle
|
||
|
* @param[in] gear gear level (cpu clock = aud pll rate / gear)
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
static inline int abox_request_cpu_gear_dai(struct device *dev,
|
||
|
struct abox_data *data,
|
||
|
struct snd_soc_dai *dai, unsigned int gear)
|
||
|
{
|
||
|
return abox_request_cpu_gear(dev, data, ABOX_CPU_GEAR_DAI | dai->id,
|
||
|
gear);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clear abox cpu clock requests
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
*/
|
||
|
extern void abox_clear_cpu_gear_requests(struct device *dev,
|
||
|
struct abox_data *data);
|
||
|
|
||
|
/**
|
||
|
* Request LITTLE cluster clock level
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] freq frequency in kHz
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_lit_freq(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id, unsigned int freq);
|
||
|
|
||
|
/**
|
||
|
* Request LITTLE cluster clock level with DAI
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] dai DAI which is used as unique handle
|
||
|
* @param[in] freq frequency in kHz
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
static inline int abox_request_lit_freq_dai(struct device *dev,
|
||
|
struct abox_data *data,
|
||
|
struct snd_soc_dai *dai, unsigned int freq)
|
||
|
{
|
||
|
return abox_request_lit_freq(dev, data, ABOX_CPU_GEAR_DAI | dai->id,
|
||
|
freq);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Request big cluster clock level
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] freq frequency in kHz
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_big_freq(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id, unsigned int freq);
|
||
|
|
||
|
/**
|
||
|
* Request big cluster clock level with DAI
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] dai DAI which is used as unique handle
|
||
|
* @param[in] freq frequency in kHz
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
static inline int abox_request_big_freq_dai(struct device *dev,
|
||
|
struct abox_data *data,
|
||
|
struct snd_soc_dai *dai, unsigned int freq)
|
||
|
{
|
||
|
return abox_request_big_freq(dev, data, ABOX_CPU_GEAR_DAI | dai->id,
|
||
|
freq);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Request hmp boost
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] on 1 on boost, 0 on otherwise.
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_hmp_boost(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id, unsigned int on);
|
||
|
|
||
|
/**
|
||
|
* Request hmp boost with DAI
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] dai DAI which is used as unique handle
|
||
|
* @param[in] on 1 on boost, 0 on otherwise.
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
static inline int abox_request_hmp_boost_dai(struct device *dev,
|
||
|
struct abox_data *data,
|
||
|
struct snd_soc_dai *dai, unsigned int on)
|
||
|
{
|
||
|
return abox_request_hmp_boost(dev, data, ABOX_CPU_GEAR_DAI | dai->id,
|
||
|
on);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Request INT clock level
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] int_freq frequency in kHz
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_int_freq(struct device *dev, struct abox_data *data,
|
||
|
unsigned int id, unsigned int int_freq);
|
||
|
|
||
|
/**
|
||
|
* Register uaif or dsif to abox
|
||
|
* @param[in] pdev_abox pointer to abox platform device
|
||
|
* @param[in] pdev_xif pointer to abox uaif or dsif device
|
||
|
* @param[in] id number
|
||
|
* @param[in] dapm dapm context of the uaif or dsif
|
||
|
* @param[in] name dai name
|
||
|
* @param[in] playback true if dai has playback capability
|
||
|
* @param[in] capture true if dai has capture capability
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_register_if(struct platform_device *pdev_abox,
|
||
|
struct platform_device *pdev_if, unsigned int id,
|
||
|
struct snd_soc_dapm_context *dapm, const char *name,
|
||
|
bool playback, bool capture);
|
||
|
|
||
|
/**
|
||
|
* Try to turn off ASRC when sampling rate auto control is enabled
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] fe pointer to snd_soc_pcm_runtime
|
||
|
* @param[in] stream SNDRV_PCM_STREAM_PLAYBACK or CAPUTURE
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_try_to_asrc_off(struct device *dev, struct abox_data *data,
|
||
|
struct snd_soc_pcm_runtime *fe, int stream);
|
||
|
|
||
|
/**
|
||
|
* Register rdma to abox
|
||
|
* @param[in] pdev_abox pointer to abox platform device
|
||
|
* @param[in] pdev_rdma pointer to abox rdma platform device
|
||
|
* @param[in] id number
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_register_rdma(struct platform_device *pdev_abox,
|
||
|
struct platform_device *pdev_rdma, unsigned int id);
|
||
|
|
||
|
/**
|
||
|
* Register wdma to abox
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] ipcid id of ipc
|
||
|
* @param[in] irq_handler irq handler to register
|
||
|
* @param[in] dev_id cookie which would be summitted with irq_handler
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_register_wdma(struct platform_device *pdev_abox,
|
||
|
struct platform_device *pdev_wdma, unsigned int id);
|
||
|
|
||
|
/**
|
||
|
* Register uaif to abox
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id id of the uaif
|
||
|
* @param[in] rate sampling rate
|
||
|
* @param[in] channels number of channels
|
||
|
* @param[in] width number of bit in sample
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_register_bclk_usage(struct device *dev, struct abox_data *data,
|
||
|
enum abox_dai id, unsigned int rate, unsigned int channels,
|
||
|
unsigned int width);
|
||
|
|
||
|
/**
|
||
|
* Request or release l2 cache
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] on true for requesting, false on otherwise
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_l2c(struct device *dev, struct abox_data *data,
|
||
|
void *id, bool on);
|
||
|
|
||
|
/**
|
||
|
* Request or release l2 cache synchronously
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] on true for requesting, false on otherwise
|
||
|
* @return error code if any
|
||
|
*/
|
||
|
extern int abox_request_l2c_sync(struct device *dev, struct abox_data *data,
|
||
|
void *id, bool on);
|
||
|
|
||
|
/**
|
||
|
* Request or release dram during cpuidle (count based API)
|
||
|
* @param[in] pdev_abox pointer to abox platform device
|
||
|
* @param[in] id key which is used as unique handle
|
||
|
* @param[in] on true for requesting, false on otherwise
|
||
|
*/
|
||
|
extern void abox_request_dram_on(struct platform_device *pdev_abox, void *id,
|
||
|
bool on);
|
||
|
|
||
|
/**
|
||
|
* disable or enable qchannel of a clock
|
||
|
* @param[in] dev pointer to struct dev which invokes this API
|
||
|
* @param[in] data pointer to abox_data structure
|
||
|
* @param[in] clk clock id
|
||
|
* @param[in] disable disable or enable
|
||
|
*/
|
||
|
extern int abox_disable_qchannel(struct device *dev, struct abox_data *data,
|
||
|
enum qchannel clk, int disable);
|
||
|
#endif /* __SND_SOC_ABOX_H */
|