211 lines
6.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (c) 2024 Rockchip Electronics Co., Ltd.
* Author: Jason Zhang <jason.zhang@rock-chips.com>
*/
#ifndef _IT6621_H
#define _IT6621_H
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/miscdevice.h>
#include <linux/of_gpio.h>
#include <linux/regmap.h>
#include <sound/asoundef.h>
#define IT6621_VENDOR_ID 0x4954
#define IT6621_DEVICE_ID 0x6621
#define IT6621_REVISION_VARIANT_B0 0xb0
#define IT6621_REVISION_VARIANT_C0 0xc0
#define IT6621_REVISION_VARIANT_D0 0xd0
#define IT6621_ARC_START 0
#define IT6621_EARC_CAP_CHG 1
#define IT6621_EARC_EDID_OK 2
#define IT6621_EARC_BCLK_OK 3
#define IT6621_AUDIO_START 0
#define IT6621_AUDIO_TO_EN_DMAC 7
#define IT6621_CMD_WAIT_TIME_MS 1
#define IT6621_CMD_WAIT_COUNT 10
#define IT6621_RXCAP_BULK_LEN 16
#define IT6621_RX_CAP_MAX_LEN 256
#define IT6621_ADB_MAX_LEN 32
/**
* struct it6621_priv - IT6621 device
* @client: the i2c client used by the driver.
* @dev: i2c device.
* @mclk: master clock.
* @hpdio: Input Hot Plus Detection.
* @hpdio_lock: hpdio lock to protect hpdio access.
* @rxcap_lock: rxcap lock to protect rxcap access.
* @state: the state of IT6621 device.
* @vid: vendor ID.
* @devid: device ID.
* @revid: revision ID.
* @audio_enc: LPCM 2-ch do not support encryption.
* @audio_src: I2S, SPDIF, TDM, DSD (DSD: EnAudGen must be TRUE for
* Internal AudGen).
* @audio_ch: channel number.
* @audio_fs: sample frequency.
* @audio_type: LPCM, NLPCM.
* @audio_hbr: HBR.
* @audio_input_hbr: input audio HBR.
* @i2s_wl: 0 for 16-bit, 1 for 18-bit, 2 for 20-bit, 3 for 24-bit.
* @i2s_hbr: I2S HBR.
* @i2s_fmt: I2S format.
* @i2s_nlpcm_enabled: auto by input setting.
* @i2s_hbr_enabled: enable eARC TX I2S hbr.
* @hbr_layb_enabled: QD980 HFR5-1-40.
* @mch_lpcm_enabled: SL-870 5-1-30 [Multi-channel 2-ch layout] has audio output
* @layout_2ch_enabled: use for SL-870 5-1-29 [Multi-channel 2-ch layout] =>
* fixed by SL-870 @ FW Ver1.11 => (always FALSE)
* @vcm_sel: tx VCM selection.
* @force_ca: force channel allocation.
* @force_16ch: force to 16 channels.
* @toggle_by_edid: indicate whether HPD is toggled by EDID.
* @rclk: RCLK frequency.
* @aclk: ACLK frequency.
* @bclk: BCLK frequency.
* @rclk_sel: RCLK frequency selection.
* @update_avg_enabled: enable update average clock detection value.
* @cmo_opt: eARC TX common mode output enable option.
* @force_cmo_enabled: force eARC TX common mode enable.
* @resync_opt: eARC TX common mode resync option.
* @ubit_opt: U-bit option.
* @c_ch_opt: eARC TX U-bit C-Ch option.
* @ecc_opt: eARC TX ECC option.
* @enc_seed: eARC TX encryption seed.
* @enc_opt: eARC TX encryption option.
* @fixed_lcf: fixed LC frequency.
* @bclk_inv_enabled: enable eARC BCLK inversion.
* @sck_inv_enabled: enable I2S serial clock inversion.
* @tck_inv_enabled: enable TDM clock inversion.
* @mclk_inv_enabled: enable SPDIF master clock inversion.
* @dclk_inv_enabled: enable DSD clock inversion.
* @nxt_pkt_to_sel: eARC TX next packet timeout selection.
* @turn_over_sel: eARC TX turn-over time selection before
* transmitting packet, set 24 us for QD980 HFR5-1-21.
* @hb_retry_sel: eARC TX HeartBeat retry time selection.
* @hb_retry_enabled: enable eARC TX auto HeartBeat retry.
* @cmd_to_enabled: indicate whether command timeout is enabled.
* @force_arc: force TX ARC mode.
* @enter_arc_now: enter ARC mode when initiate IT6621 device,
* enable for standalone ARC mode.
* @arc_enabled: enable ARC mode.
* @earc_enabled: enable eARC mode, disable for standalone ARC mode.
* @pkt1_enabled: enable eARC TX packet 1 using U-bit.
* @pkt2_enabled: enable eARC TX packet 2 using U-bit.
* @pkt3_enabled: enable eARC TX packet 3 using U-bit.
* @events: eARC events.
* @audio_flag: upstream's audio state, if upstream is audio on, set to 1 at
* upstream, extern to upstream's function.
* @hpdio_work: work to toggle hpdio.
* @config_audio: indicate whether audio is need to be configured.
* @force_mute: force mute.
* @uapi_registered: indicate whether uapi is registered.
* @rxcap: capabilities from the ARC device.
* @adb: audio data block.
*/
struct it6621_priv {
struct i2c_client *client;
struct device *dev;
struct regmap *regmap;
struct miscdevice mdev;
struct clk *mclk;
struct gpio_desc *hpdio;
struct list_head fhs;
struct mutex fhs_lock;
struct mutex hpdio_lock;
struct mutex rxcap_lock;
unsigned int state;
unsigned int vid;
unsigned int devid;
unsigned int revid;
/* Tx Audio Option */
unsigned int audio_enc;
unsigned int audio_src;
unsigned int audio_ch;
unsigned int audio_fs;
unsigned int audio_type;
unsigned int audio_hbr;
unsigned int audio_input_hbr;
unsigned int i2s_wl;
unsigned int i2s_hbr;
unsigned int i2s_fmt;
unsigned int i2s_nlpcm_enabled;
unsigned int i2s_hbr_enabled;
unsigned int hbr_layb_enabled;
unsigned int mch_lpcm_enabled;
unsigned int layout_2ch_enabled;
unsigned int vcm_sel;
unsigned int force_ca;
unsigned int force_16ch;
/* FIXME: Need to toggle by edid? */
unsigned int toggle_by_edid;
unsigned int rclk;
unsigned int aclk;
unsigned int bclk;
/* Clock configurations */
unsigned int rclk_sel;
unsigned int update_avg_enabled;
unsigned int cmo_opt;
unsigned int force_cmo_enabled;
unsigned int resync_opt;
unsigned int ubit_opt;
unsigned int c_ch_opt;
unsigned int ecc_opt;
unsigned int enc_seed;
unsigned int enc_opt;
unsigned int fixed_lcf;
/* Clock inversion option */
unsigned int bclk_inv_enabled;
unsigned int sck_inv_enabled;
unsigned int tck_inv_enabled;
unsigned int mclk_inv_enabled;
unsigned int dclk_inv_enabled;
/* DMCD option */
unsigned int nxt_pkt_to_sel;
unsigned int turn_over_sel;
/* TX CMDC option */
unsigned int hb_retry_sel;
unsigned int hb_retry_enabled;
unsigned int cmd_to_enabled;
/* Discovery option */
unsigned int force_arc;
unsigned int force_earc;
unsigned int enter_arc_now;
unsigned int arc_enabled;
unsigned int earc_enabled;
/* Loop Test option */
unsigned int pkt1_enabled;
unsigned int pkt2_enabled;
unsigned int pkt3_enabled;
unsigned long events;
unsigned long audio_flag;
struct work_struct hpdio_work;
struct class class;
bool config_audio;
bool force_mute;
bool uapi_registered;
u8 rxcap[IT6621_RX_CAP_MAX_LEN];
u8 adb[IT6621_ADB_MAX_LEN];
};
#endif /* _IT6621_H */