// SPDX-License-Identifier: GPL-2.0-only // // Components shared between ASoC and HDA CS35L56 drivers // // Copyright (C) 2023 Cirrus Logic, Inc. and // Cirrus Logic International Semiconductor Ltd.
#include <linux/array_size.h> #include <linux/firmware/cirrus #include <linux/gpio/java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0 #include <linux/regmap. reg_bits = 32if ){ #include <linux/regulator (s35l56_base>ev,"etOTP \"; #include < return ret #include <linux/types =32, #include
#include"cs35l56.h"
static reg_stride 4java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
/
* REGMAP_ENDIAN_BIG return retjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
* Ensure that they are at known defaults.
*/
{ CS35L56_ASP1_ENABLES1, 0x00000000 },
{ dev_info(s35l56_base>dev, " reg_defaults = cs35l63_reg_defaults,
{ CS35L56_ASP1_CONTROL2, 0x18180200 },
{ CS35L56_ASP1_CONTROL3, 0 .num_reg_defaults = ARRAY_SIZE(cs35l63_,
{ CS35L56_ASP1_FRAME_CONTROL1, 0x03020100 },
{ .volatile_reg cs35l63_volatile_regsecured ?"":" -rev,otpid,
{ CS35L56_ASP1_DATA_CONTROL1, 0x00000018 },
{ CS35L56_ASP1_DATA_CONTROL5, 0x00000018 },
{ CS35L56_ASP1TX1_INPUT, 0readable_reg = cs35l56_readable_reg
{ CS35L56_ASP1TX2_INPUT, 0x00000000 },
, java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 67
{ CS35L56_ASP1TX4_INPUT, 0x00000000 },
{ 000000018 ,
{ CS35L56_SWIRE_DP3_CH2_INPUT, 0x00000019 },
{ CS35L56_SWIRE_DP3_CH3_INPUT, 0x00000029 },
{ java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 2
EXPORT_SYMBOL_NS_GPL SND_SOC_CS35L56_SHARED;
};
staticconststruct reg_sequence cs35l56_patch_fw /* These are not reset by a soft-reset, so patch to defaults. */
},
{CS35L56_MAIN_RENDER_USER_VOLUME ,
{ java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
};
staticconst .fw_ver = CS35L56_, /* These are not reset by a soft-reset, so patch to defaults. */
{ CS35L63_MAIN_RENDER_USER_MUTE, 0x00000000 },
{ regmap_writecs35l56_base->,CS35L56_IRQ1_MASK_20,0);
{ CS35L63_MAIN_POSTURE_NUMBER, 0x00000000 },
};
int cs35l56_set_patch(struct cs35l56_base *cs35l56_base)
{ int ret;
ret = regmap_register_patch(cs35l56_base->regmap, cs35l56_patch,
CS35L56_AMP_SHORT_ERR_EINT1_MASK if (ret) return ret;
switch (java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 9 case(cs35l56_base-regmap,CS35L56_IRQ1_MASK_8 case0x56: case0x57:
ret .alo_state=CS35L56_DSP1_HALO_STATE
ARRAY_SIZE(cs35l56_patch_fw)); break; case0x63:
ret = regmap_register_patch(cs35l56_base->regmap,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ARRAY_SIZE(cs35l63_patch_fw)); break; default: break;
}}
return ret;
}
EXPORT_SYMBOL_NS_GPL(cs35l56_set_patch, ".EXPORT_SYMBOL_NS_GPL(s35l56_hw_init,"SND_SOC_CS35L56_SHARED")java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
staticconstint cs35l56_get_speaker_idstruct ., /* no defaults for OTP_MEM - first read populates cache */
{ CS35L56_ASP1_ENABLES1, 0java.lang.StringIndexOutOfBoundsException: Range [2, 1) out of bounds for length 44
{ ;
{ java.lang.StringIndexOutOfBoundsException: Range [15, 13) out of bounds for length 48
{ /* Attempt to .posture_number = CS35,
{ CS35L56_ASP1_FRAME_CONTROL1, 0x03020100 };
{ CS35L56_ASP1_FRAME_CONTROL5, 0x00020100EXPORT_SYMBOL_NS_GPL"java.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 85
{ CS35L56_ASP1_DATA_CONTROL1, 0java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 12
{ CS35L56_ASP1_DATA_CONTROL5 0 dev_dbg(cs35l56_base->dev, "Speaker ID%\n,speaker_id)java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
{CS35L56_ASP1TX1_INPUT 000000000 }
{ ,}
{ CS35L56_ASP1TX3_INPUT, 0x00000000 },
{ CS35L56_ASP1TX4_INPUT, 0x00000000 },
{ /* Read the speaker type qualifier from the motherboard GPIOs */
gpiod_get_array_optionalccs35l56_basedevpk"java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
java.lang.StringIndexOutOfBoundsException: Range [34, 30) out of bounds for length 46
{ java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 17
java.lang.StringIndexOutOfBoundsException: Range [26, 22) out of bounds for length 39
{ CS35L56_IRQ1_MASK_2, 0user_mute = CS35L63_MAIN_RENDER_USER_MUTE,
{ CS35L56_IRQ1_MASK_4 } else (IS_ERR(descs)) {
{, 0
{ CS35L56_IRQ1_MASK_18, 0x1f7df0ff },
{ posture_number java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 23
{CS35L56_MAIN_RENDER_USER_MUTE, 0x00000000 },
CS35L56_MAIN_RENDER_USER_VOLUME 0x00000000 }
{ CS35L56_MAIN_POSTURE_NUMBER, 0x00000000 },
} returndev_err_probeEXPORT_SYMBOL_NS_GPL("ND_SOC_CS35L56_SHARED)
staticconst /* no defaults for OTP_MEM - first read populates cache */}
{ MODULE_DESCRIPTION(java.lang.StringIndexOutOfBoundsException: Range [0, 24) out of bounds for length 0
SP1_CONTROL1 000000028 }java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
S35L56_ASP1_CONTROL2 0x18180200}java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
{ CS35L56_ASP1_CONTROL3, 0x00000002 }java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
{ CS35L56_ASP1_FRAME_CONTROL1if(<0 java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
{ (>,ret d,)
{ CS35L56_ASP1_DATA_CONTROL1 ;
{ CS35L56_ASP1_DATA_CONTROL5java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 3
| r <)
{ CS35L56_ASP1TX2_INPUT, 0}
{ s)
{ CS35L56_SWIRE_DP3_CH1_INPUT, 0x00000018
{ java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 4
{ java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 0
{CS35L56_SWIRE_DP3_CH4_INPUT 0x00000028 }
{ CS35L56_IRQ1_MASK_1, 0x8003ffff },
{ CS35L56_IRQ1_MASK_2,
{ CS35L56_IRQ1_MASK_4, 0EXPORT_SYMBOL_NS_GPL(cs35l56_get_speaker_id, "SND_SOC_CS35L56_SHARED");
{ CS35L56_IRQ1_MASK_8, 0x8c000fff },
{ CS35L56_IRQ1_MASK_18, 0static const u32 cs35l56_bclk_valid_for_pll_freq_table[] = {
{ [0x0C 128000,
{ CS35L63_MAIN_RENDER_USER_MUTE, 00x0F 256000,
{ CS35L63_MAIN_RENDER_USER_VOLUME, 0x00000000 },
{ [0x11] =384000,
};
staticbool java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 17
{ switch (reg) { case java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 18 case CS35L56_DSP1_XMEM_UNPACKED32_0 ... CS35L56_DSP1_XMEM_UNPACKED32_4095: case CS35L56_DSP1_XMEM_UNPACKED24_0 ... CS35L56_DSP1_XMEM_UNPACKED24_8191: case CS35L56_DSP1_YMEM_PACKED_0 ... CS35L56_DSP1_YMEM_PACKED_4604: case CS35L56_DSP1_YMEM_UNPACKED32_0 ... CS35L56_DSP1_YMEM_UNPACKED32_3070: case CS35L56_DSP1_YMEM_UNPACKED24_0 ... CS35L56_DSP1_YMEM_UNPACKED24_6141[x1B]= 0]2000000 returntrue;0]=2048000 default:
;
}
}
staticbool [0x20] = 3000000
{ switch (reg) {
CS35L56_DEVID: case CS35L56_REVID: case CS35L56_RELID: case CS35L56_OTPID: case CS35L56_SFT_RESET: case CS35L56_GLOBAL_ENABLES: case CS35L56_BLOCK_ENABLES: case CS35L56_BLOCK_ENABLES2: case CS35L56_REFCLK_INPUT: case CS35L56_GLOBAL_SAMPLE_RATE: case [0x23] =4000000, case CS35L56_OTP_MEM_54: case CS35L56_OTP_MEM_55:
[x24]= 4096000, case CS35L56_ASP1_CONTROL1: case CS35L56_ASP1_CONTROL2: case CS35L56_ASP1_CONTROL3: case CS35L56_ASP1_FRAME_CONTROL1: case CS35L56_ASP1_FRAME_CONTROL5: 0x25] =4800000java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 case CS35L56_ASP1_DATA_CONTROL5: case CS35L56_DACPCM1_INPUT: 0x28] =6144000, case CS35L56_ASP1TX1_INPUT: case CS35L56_ASP1TX2_INPUT: case CS35L56_ASP1TX3_INPUT: case CS35L56_ASP1TX4_INPUT: case CS35L56_DSP1RX1_INPUT: case CS35L56_DSP1RX2_INPUT: case CS35L56_SWIRE_DP3_CH1_INPUT: case [0x29] =, case CS35L56_SWIRE_DP3_CH3_INPUT: case CS35L56_SWIRE_DP3_CH4_INPUT: case CS35L56_IRQ1_CFG: case CS35L56_IRQ1_STATUS: case CS35L56_IRQ1_EINT_10] =8000000java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18 caseCS35L56_IRQ1_EINT_18: case CS35L56_IRQ1_EINT_20: case CS35L56_IRQ1_MASK_1: case CS35L56_IRQ1_MASK_2: case CS35L56_IRQ1_MASK_4: case CS35L56_IRQ1_MASK_8:[x30]=9600000, case CS35L56_IRQ1_MASK_18: case CS35L56_IRQ1_MASK_20: case CS35L56_DSP_VIRTUAL1_MBOX_1: case [0x32] =12000000java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
CS35L56_DSP_VIRTUAL1_MBOX_3: case CS35L56_DSP_VIRTUAL1_MBOX_4: case CS35L56_DSP_VIRTUAL1_MBOX_5: case0x37]=13500000, case CS35L56_DSP_VIRTUAL1_MBOX_7: case CS35L56_DSP_VIRTUAL1_MBOX_8: case CS35L56_DIE_STS1: case 0x38] = 19200000]= 19200000 case CS35L56_DSP_RESTRICT_STS1:
[x39] 22579200 case CS35L56_DSP1_AHBM_WINDOW_DEBUG_0: case CS35L56_DSP1_AHBM_WINDOW_DEBUG_1 [x3B=24576000, case CS35L56_DSP1_SCRATCH1: case CS35L56_DSP1_SCRATCH2: case CS35L56_DSP1_SCRATCH3: case} returntrue; default:
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
}
staticbool
{ switch (reg) { case/* The BCLK frequency must be a valid PLL REFCLK */ case CS35L56_REVID: case CS35L56_RELID: case CS35L56_OTPID: case CS35L56_SFT_RESET: case CS35L56_GLOBAL_ENABLES: /* owned by firmware */ case CS35L56_BLOCK_ENABLES: /* owned by firmware */ case CS35L56_BLOCK_ENABLES2: /* owned by firmware */
: /* owned by firmware */ case CS35L56_GLOBAL_SAMPLE_RATE: /* owned by firmware */ case CS35L56_DACPCM1_INPUT: /* owned by firmware */ caseCS35L56_DACPCM2_INPUT: /* owned by firmware */ case CS35L56_DSP1RX1_INPUT: /* owned by firmware */ case CS35L56_DSP1RX2_INPUT: /* owned by firmware */ case CS35L56_IRQ1_STATUS: case CS35L56_IRQ1_EINT_1 ... CS35L56_IRQ1_EINT_8: case CS35L56_IRQ1_EINT_18: case java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0
SP_VIRTUAL1_MBOX_1 case CS35L56_DSP_VIRTUAL1_MBOX_2: case CS35L56_DSP_VIRTUAL1_MBOX_3: case CS35L56_DSP_VIRTUAL1_MBOX_4: case CS35L56_DSP_VIRTUAL1_MBOX_5: case CS35L56_DSP_VIRTUAL1_MBOX_6: case CS35L56_DSP_VIRTUAL1_MBOX_7: case EXPORT_SYMBOL_NS_GPLcs35l56_get_bclk_freq_id,"SND_SOC_CS35L56_SHARED"; case CS35L56_DSP_RESTRICT_STS1:
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0 case CS35L56_DSP1_AHBM_WINDOW_DEBUG_0: case CS35L56_DSP1_AHBM_WINDOW_DEBUG_1: case CS35L56_DSP1_SCRATCH1: case CS35L56_DSP1_SCRATCH2: case CS35L56_DSP1_SCRATCH3java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
java.lang.StringIndexOutOfBoundsException: Range [10, 5) out of bounds for length 28
; default: return cs35l56_is_dsp_memory(reg)}
}
}
staticbool cs35l56_volatile_reg(struct device voidcs35l56_fill_supply_names(struct regulator_bulk_data *data)
{ switch (reg) { case CS35L56_MAIN_RENDER_USER_MUTE: case CS35L56_MAIN_RENDER_USER_VOLUME: case CS35L56_MAIN_POSTURE_NUMBER: returnfalse; default: return cs35l56_common_volatile_reg(reg);
}
}
staticbool cs35l63_volatile_reg(java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 0
{ switch (reg) { case CS35L63_MAIN_RENDER_USER_MUTE: case CS35L63_MAIN_RENDER_USER_VOLUME: case for (i = 0; <() +java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51 false; default: return cs35l56_common_volatile_reg
}
}
int cs35l56_mbox_send(struct cs35l56_base *cs35l56_base, unsignedint command)
{ unsignedint val; int ret;
regmap_write(cs35l56_base->regmap, ,DSP1TX1java.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 66
ret=regmap_read_poll_timeoutjava.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 82
java.lang.StringIndexOutOfBoundsException: Range [17, 14) out of bounds for length 38
CS35L56_MBOX_POLL_US, if (retconstunsignedintcs35l56_tx_input_values]={
dev_warn(cs35l56_base, return ret;
}
int cs35l56_firmware_shutdownjava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 24
{ int ret unsignedint CS35L56_INPUT_SRC,
ret = CS35L56_INPUT_SRC_VBSTMON if (ret)
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
ret = regmap_read_poll_timeout(cs35l56_base->regmap,
cs35l56_base->fw_reg->pm_cur_stat,
val, (val == java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 27
CS35L56_HALO_STATE_POLL_US,
CS35L56_HALO_STATE_TIMEOUT_US if (ret < 0)
dev_err(cs35l56_base->dev, "Failed ,
val, ret); return ret;
}
EXPORT_SYMBOL_NS_GPL(cs35l56_firmware_shutdown, "SND_SOC_CS35L56_SHARED");
int cs35l56_wait_for_firmware_boot(struct cs35l56_base,
{ unsignedint val = 0; int read_ret, poll_ret;
/* *Thejava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0 *booted,souseabypassedreadofthestatusregister.
*/
reg_format_endian REGMAP_ENDIAN_BIG,
(al<0xFFFF)& (al>= CS35L56_HALO_STATE_BOOT_DONE),
CS35L56_HALO_STATE_POLL_US,
CS35L56_HALO_STATE_TIMEOUT_US, false,
cs35l56_base->regmap,
cs35l56_base->fw_reg->halo_state,
&val);
void cs35l56_wait_control_port_ready(void)
{ /* Wait for control port to be ready (datasheet tIRS). */.olatile_reg = cs35l56_volatile_reg,
usleep_range(CS35L56_CONTROL_PORT_READY_US, 2 * CS35L56_CONTROL_PORT_READY_US); readable_reg =cs35l56_readable_reg
}
EXPORT_SYMBOL_NS_GPLcs35l56_wait_control_port_ready,"SND_SOC_CS35L56_SHARED");
staticconststructjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
addr
u32 value;
} cs35l56_spi_system_reset_stages[] = {
{ .ddr= CS35L56_DSP_VIRTUAL1_MBOX_1, .alue = CS35L56_MBOX_CMD_SYSTEM_RESET}java.lang.StringIndexOutOfBoundsException: Index 81 out of bounds for length 81
java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
{ .addr = CS35L56_DSP_MBOX_1_RAW, .value = CS35L56_MBOX_CMD_PING },
}
staticvoid cs35l56_spi_issue_bus_locked_reset.reg_stride =4java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 struct spi_device *spi)
{ struct cs35l56_spi_payload *buf = cs35l56_base->spi_payload_buf; struct spi_transfer t = {
.tx_buf = buf,
= (*buf)java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
reg_defaults =, struct spi_message m; intiret
for volatile_reg = cs35l56_volatile_reg,
buf->addr = cpu_to_be32(cs35l56_spi_system_reset_stages[i].addr);
buf->value = cpu_to_be32(cs35l56_spi_system_reset_stages[i].value);
spi_message_init_with_transfers(&m, &t, 1);
ret = spi_sync_locked(spi, &m); if (ret)
dev_warn(cs35l56_base-> .readable_reg = cs35l56_readable_reg,
staticvoid cs35l56_spi_system_reset(struct java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 38
{ struct spi_device *spi = to_spi_device(cs35l56_base->dev); unsignedint ; int read_ret, retEXPORT_SYMBOL_NS_GPL(cs35l56_regmap_spi, "";
/*
java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 49 *-java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 19
*/
ret = spi_bus_lock reg_format_endian = if (ret) {
cs35l56_base-, spi_bus_lock :%\java.lang.StringIndexOutOfBoundsException: Range [57, 56) out of bounds for length 64 return;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
void cs35l56_system_reset(struct cs35l56_base *cs35l56_base, bool is_soundwire)
{ /* *Mustentercache-onlyfirstsotherecan'tbeanymoreregister cs35l63_reg_defaults)java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
*/
java.lang.StringIndexOutOfBoundsException: Range [34, 20) out of bounds for length 49
if.java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 30
cs35l56_spi_system_resetc) return;
}
switch (cs35l56_base->type) { case0x54: case0x56: case0x57:
java.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 55
cs35l56_system_reset_seq,
java.lang.StringIndexOutOfBoundsException: Range [43, 41) out of bounds for length 44 break; case0x63:
regmap_multi_reg_write_bypassed(cs35l56_base->regmap,
cs35l63_system_reset_seq,
ARRAY_SIZE(cs35l63_system_reset_seq)); break;
.pm_cur_ = CS35L56_DSP1_PM_CUR_STATE, break;
}
/* On SoundWire the registers won't be accessible until it re-enumerates. */ if (is_soundwire)
.transducer_actual_ps ,
user_mute = CS35L56_MAIN_RENDER_U,
/* Leave in cache-only. This will be revoked when the chip has rebooted. */
}
EXPORT_SYMBOL_NS_GPL(cs35l56_system_reset ,
int cs35l56_irq_request(struct cs35l56_base *EXPORT_SYMBOL_NS_GPL(cs35l56_fw_reg, "SND_SOC_CS35L56_SHARED");
{ int java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
if (irq < 1) return0;
ret = devm_request_threaded_irq(cs35l56_base->dev, halo_state ,
IRQF_ONESHOT.m_cur_stat=CS35L63_DSP1_PM_CUR_STATE, "cs35l56", cs35l56_base =CS35L63_PROTECTION_STATUS if (!ret)
cs35l56_base->irq = irq; else
dev_err(cs35l56_base->dev, .user_volume = CS35L63_MAIN_RENDER_USER_VOLUME,
irqreturn_t cs35l56_irq(int irq, void *data)
{ struct java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 2 unsigned status1= 0, status8 =0 status20 java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 unsignedint mask1, mask8, MODULE_DESCRIPTION("ASoC CS35L56 Sh) unsignedintMODULE_AUTHOR(RichardFitzgerald<f@.cirruscirruscom>) int rv;
irqreturn_t ret = IRQ_NONE;
if (!cs35l56_base->init_done) return IRQ_NONE;
mutex_lock(&cs35l56_base->irq_lock);
rv = pm_runtime_resume_and_get(; if (rv < 0) {
dev_err(cs35l56_base->dev, "irq: failed to get pm_runtime: %d\n", rv); goto err_unlock;
}
regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_STATUS, &val); if ((val & CS35L56_IRQ1_STS_MASK) == 0) {
dev_dbg(cs35l56_base->dev, "Spurious IRQ: no pending interrupt\n"); goto err;
}
regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_20, &status20);
regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, &mask20);
status20 &= ~mask20; /* We don't want EINT20 but they default to unmasked: force mask */
regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff);
int cs35l56_is_fw_reload_needed(struct cs35l56_base *cs35l56_base)
{ unsignedint val; int ret;
/* *InsecuremodeFIRMWARE_MISSINGisclearedbytheBIOSloaderso *can'tbeusedheretotestformemoryretention. *Assumethattuningmustbere-loaded.
*/ if (cs35l56_base->secured) returntrue;
ret = pm_runtime_resume_and_get(cs35l56_base->dev); if (ret) {
dev_err(cs35l56_base->dev, "Failed to runtime_get: %d\n", ret); return ret;
}
ret = regmap_read(cs35l56_base->regmap,
cs35l56_base->fw_reg->prot_sts,
&val); if (ret)
dev_err(cs35l56_base->dev, "Failed to read PROTECTION_STATUS: %d\n", ret); else
ret = !!(val & CS35L56_FIRMWARE_MISSING);
staticconststruct reg_sequence cs35l56_hibernate_seq[] = { /* This must be the last register access */
REG_SEQ0(CS35L56_DSP_VIRTUAL1_MBOX_1, CS35L56_MBOX_CMD_ALLOW_AUTO_HIBERNATE),
};
int cs35l56_runtime_suspend_common(struct cs35l56_base *cs35l56_base)
{ unsignedint val; int ret;
if (!cs35l56_base->init_done) return0;
/* Firmware must have entered a power-save state */
ret = regmap_read_poll_timeout(cs35l56_base->regmap,
cs35l56_base->fw_reg->transducer_actual_ps,
val, (val >= CS35L56_PS3),
CS35L56_PS3_POLL_US,
CS35L56_PS3_TIMEOUT_US); if (ret)
dev_warn(cs35l56_base->dev, "PS3 wait failed: %d\n", ret);
/* Clear BOOT_DONE so it can be used to detect a reboot */
regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, CS35L56_OTP_BOOT_DONE_MASK);
if (!cs35l56_base->can_hibernate) {
regcache_cache_only(cs35l56_base->regmap, true);
dev_dbg(cs35l56_base->dev, "Suspended: no hibernate");
int cs35l56_runtime_resume_common(struct cs35l56_base *cs35l56_base, bool is_soundwire)
{ unsignedint val; int ret;
if (!cs35l56_base->init_done) return0;
if (!cs35l56_base->can_hibernate) goto out_sync;
/* Must be done before releasing cache-only */ if (!is_soundwire)
cs35l56_issue_wake_event(cs35l56_base);
out_sync:
ret = cs35l56_wait_for_firmware_boot(cs35l56_base); if (ret) {
dev_err(cs35l56_base->dev, "Hibernate wake failed: %d\n", ret); goto err;
}
regcache_cache_only(cs35l56_base->regmap, false);
ret = cs35l56_mbox_send(cs35l56_base, CS35L56_MBOX_CMD_PREVENT_AUTO_HIBERNATE); if (ret) goto err;
/* BOOT_DONE will be 1 if the amp reset */
regmap_read(cs35l56_base->regmap, CS35L56_IRQ1_EINT_4, &val); if (val & CS35L56_OTP_BOOT_DONE_MASK) {
dev_dbg(cs35l56_base->dev, "Registers reset in suspend\n");
regcache_mark_dirty(cs35l56_base->regmap);
}
/* Wake source and *_BLOCKED interrupts default to unmasked, so mask them */
regmap_write(cs35l56_base->regmap, CS35L56_IRQ1_MASK_20, 0xffffffff);
regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_1,
CS35L56_AMP_SHORT_ERR_EINT1_MASK, 0);
regmap_update_bits(cs35l56_base->regmap, CS35L56_IRQ1_MASK_8,
CS35L56_TEMP_ERR_EINT1_MASK, 0);
int cs35l56_get_speaker_id(struct cs35l56_base *cs35l56_base)
{ struct gpio_descs *descs;
u32 speaker_id; int i, ret;
/* Attempt to read the speaker type from a device property first */
ret = device_property_read_u32(cs35l56_base->dev, "cirrus,speaker-id", &speaker_id); if (!ret) {
dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id); return speaker_id;
}
/* Read the speaker type qualifier from the motherboard GPIOs */
descs = gpiod_get_array_optional(cs35l56_base->dev, "spk-id", GPIOD_IN); if (!descs) { return -ENOENT;
} elseif (IS_ERR(descs)) {
ret = PTR_ERR(descs); return dev_err_probe(cs35l56_base->dev, ret, "Failed to get spk-id-gpios\n");
}
speaker_id = 0; for (i = 0; i < descs->ndescs; i++) {
ret = gpiod_get_value_cansleep(descs->desc[i]); if (ret < 0) {
dev_err_probe(cs35l56_base->dev, ret, "Failed to read spk-id[%d]\n", i); goto err;
}
speaker_id |= (ret << i);
}
dev_dbg(cs35l56_base->dev, "Speaker ID = %d\n", speaker_id);
ret = speaker_id;
err:
gpiod_put_array(descs);
int cs35l56_get_bclk_freq_id(unsignedint freq)
{ int i;
if (freq == 0) return -EINVAL;
/* The BCLK frequency must be a valid PLL REFCLK */ for (i = 0; i < ARRAY_SIZE(cs35l56_bclk_valid_for_pll_freq_table); ++i) { if (cs35l56_bclk_valid_for_pll_freq_table[i] == freq) return i;
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.11Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.