mirror of
https://github.com/torvalds/linux.git
synced 2026-10-16 12:50:02 +02:00
Currently, the SDCA code registers the HID device whilst parsing the DisCo information. This necessitates storing the HID device in the DisCo structs, which are intended to only store the parsed DisCo. Having the HID device registered so early in the process also causes some issues with cleaning up. Update the code to register the HID device as the IRQs are handled, this alleviates the previous concerns and brings the support inline with the other SDCA event handling. As part of this move the naming for the SDCA HID is also updated, it saves some complexity around the passing of the SoundWire device to include this in this patch. Update to using the dev_name for the phys, which is more consistent with other HID users, and use the actual function name/address for the HID name itself. Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev> Link: https://patch.msgid.link/20260805124205.4152543-4-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
141 lines
4.0 KiB
C
141 lines
4.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* rt766-sdca.h -- RT766 SDCA ALSA SoC audio driver header
|
|
*
|
|
* Copyright(c) 2026 Realtek Semiconductor Corp.
|
|
*/
|
|
|
|
#ifndef __RT766_H__
|
|
#define __RT766_H__
|
|
|
|
#include <linux/hid.h>
|
|
#include <linux/pm.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/soundwire/sdw.h>
|
|
#include <linux/soundwire/sdw_type.h>
|
|
#include <sound/soc.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
struct rt766_sdca_priv {
|
|
struct regmap *regmap;
|
|
struct snd_soc_component *component;
|
|
struct sdw_slave *slave;
|
|
bool hw_init;
|
|
bool first_hw_init;
|
|
struct snd_soc_jack *hs_jack;
|
|
struct mutex disable_irq_lock; /* SDCA irq lock protection */
|
|
bool disable_irq;
|
|
int jack_type;
|
|
bool fu41_dapm_mute;
|
|
bool fu41_mixer_l_mute;
|
|
bool fu41_mixer_r_mute;
|
|
bool fu113_dapm_mute;
|
|
bool fu113_mixer_mute[4];
|
|
bool fu21_dapm_mute;
|
|
bool fu21_mixer_l_mute;
|
|
bool fu21_mixer_r_mute;
|
|
bool fu36_dapm_mute;
|
|
bool fu36_mixer_l_mute;
|
|
bool fu36_mixer_r_mute;
|
|
struct sdca_function_data *uaj_func_data;
|
|
struct sdca_function_data *sm_func_data;
|
|
struct sdca_function_data *sa_func_data;
|
|
struct sdca_function_data *hid_func_data;
|
|
struct sdca_interrupt_info *irq_info;
|
|
struct hid_device *hid;
|
|
};
|
|
|
|
/* vendor registers */
|
|
#define RT766_VERSION_ID 0xc404
|
|
#define RT766_DEV_ID1 0xc405
|
|
#define RT766_DEV_ID0 0xc406
|
|
#define RT766_BOND_LATCH_ID 0xc407
|
|
|
|
#define RT766_HP_POWER_STATE 0x1000004
|
|
#define RT766_HP_FSM_CTL2_1 0x100000d
|
|
|
|
/* MCU Patch address */
|
|
#define RT766_MCU_PATCH_ADDR1_START 0x10010000
|
|
#define RT766_MCU_PATCH_ADDR1_END 0x10011fff
|
|
#define RT766_MCU_PATCH_ADDR2_START 0x10020000
|
|
#define RT766_MCU_PATCH_ADDR2_END 0x10023fff
|
|
|
|
/* Buffer address for HID */
|
|
#define RT766_BUF_ADDR_HID1 0x44030000
|
|
#define RT766_BUF_ADDR_HID2 0x44030020
|
|
|
|
/* SDCA (Channel) */
|
|
#define RT766_CH_1 0x01
|
|
#define RT766_CH_2 0x02
|
|
#define RT766_CH_3 0x03
|
|
#define RT766_CH_4 0x04
|
|
|
|
/* RT766 SDCA Control - function number */
|
|
#define RT766_FUNC_NUM_UAJ 0x01
|
|
#define RT766_FUNC_NUM_MIC 0x02
|
|
#define RT766_FUNC_NUM_HID 0x03
|
|
#define RT766_FUNC_NUM_AMP 0x04
|
|
|
|
/* RT766 SDCA entity */
|
|
#define RT766_SDCA_ENT_0 0x00
|
|
#define RT766_SDCA_ENT_HID101 0x01
|
|
#define RT766_SDCA_ENT_GE49 0x49
|
|
#define RT766_SDCA_ENT_USER_FU41 0x05
|
|
#define RT766_SDCA_ENT_USER_FU36 0x0f
|
|
#define RT766_SDCA_ENT_USER_FU21 0x03
|
|
#define RT766_SDCA_ENT_USER_FU113 0x30
|
|
#define RT766_SDCA_ENT_PDE23 0x33
|
|
#define RT766_SDCA_ENT_PDE47 0x28
|
|
#define RT766_SDCA_ENT_PDE11 0x2a
|
|
#define RT766_SDCA_ENT_PDE34 0x29
|
|
#define RT766_SDCA_ENT_CS41 0x01
|
|
#define RT766_SDCA_ENT_CS36 0x11
|
|
#define RT766_SDCA_ENT_CS113 0x12
|
|
#define RT766_SDCA_ENT_CS21 0x21
|
|
#define RT766_SDCA_ENT_PLATFORM_FU33 0x44
|
|
#define RT766_SDCA_ENT_PPU21 0x04
|
|
|
|
/* sample frequency index */
|
|
#define RT766_SDCA_RATE_44100HZ 0x08
|
|
#define RT766_SDCA_RATE_48000HZ 0x09
|
|
#define RT766_SDCA_RATE_96000HZ 0x0b
|
|
#define RT766_SDCA_RATE_192000HZ 0x0d
|
|
|
|
/* SDCA Register macros */
|
|
#define RT766_MUTE_REG(func, fu, ch) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##fu, SDCA_CTL_FU_MUTE, RT766_CH_##ch)
|
|
|
|
#define RT766_VOLUME_REG(func, fu, ch) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##fu, SDCA_CTL_FU_CHANNEL_VOLUME, RT766_CH_##ch)
|
|
|
|
#define RT766_GAIN_REG(func, fu, ch) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##fu, SDCA_CTL_FU_GAIN, RT766_CH_##ch)
|
|
|
|
#define RT766_PDE_REQ_REG(func, pde) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##pde, SDCA_CTL_PDE_REQUESTED_PS, 0)
|
|
|
|
#define RT766_PDE_ACTUAL_REG(func, pde) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##pde, SDCA_CTL_PDE_ACTUAL_PS, 0)
|
|
|
|
#define RT766_FUNC_STATUS_REG(func) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_0, SDCA_CTL_ENTITY_0_FUNCTION_STATUS, 0)
|
|
|
|
#define RT766_SDCA_CTL(func, ent, ctl) \
|
|
SDW_SDCA_CTL(RT766_FUNC_NUM_##func, RT766_SDCA_ENT_##ent, ctl, 0)
|
|
|
|
enum {
|
|
RT766_AIF1,
|
|
RT766_AIF2,
|
|
RT766_AIF3,
|
|
};
|
|
|
|
enum {
|
|
RT766_DAI_UAJ,
|
|
RT766_DAI_AMP,
|
|
RT766_DAI_MIC,
|
|
};
|
|
|
|
int rt766_sdca_io_init(struct device *dev, struct sdw_slave *slave);
|
|
int rt766_sdca_init(struct device *dev, struct regmap *regmap, struct sdw_slave *slave);
|
|
#endif /* __RT766_H__ */
|