Skip to content

Commit

Permalink
ASoC: cs35l41: Set the max SPI speed for the whole device
Browse files Browse the repository at this point in the history
Higher speeds are only supported when PLL is enabled, but
the current driver doesn't enable PLL outside of stream
use cases, so better to set the lowest SPI speed accepted
by the entire device.

Move the current frequency set to the spi sub-driver so
the whole device can benefit from that speed.

spi-max-frequency property could be used, but ACPI systems don't
support it, so by setting it in the spi sub-driver probe
both Device Trees and ACPI systems are supported.

Signed-off-by: Lucas Tanure <[email protected]>
Reviewed-by: Charles Keepax <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
Lucas Tanure authored and broonie committed Nov 24, 2021
1 parent 8a6cc0d commit 872fc0b
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 39 deletions.
32 changes: 3 additions & 29 deletions sound/soc/codecs/cs35l41-spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,34 +42,6 @@ static const struct spi_device_id cs35l41_id_spi[] = {

MODULE_DEVICE_TABLE(spi, cs35l41_id_spi);

static void cs35l41_spi_otp_setup(struct cs35l41_private *cs35l41,
bool is_pre_setup, unsigned int *freq)
{
struct spi_device *spi;
u32 orig_spi_freq;

spi = to_spi_device(cs35l41->dev);

if (!spi) {
dev_err(cs35l41->dev, "%s: No SPI device\n", __func__);
return;
}

if (is_pre_setup) {
orig_spi_freq = spi->max_speed_hz;
if (orig_spi_freq > CS35L41_SPI_MAX_FREQ_OTP) {
spi->max_speed_hz = CS35L41_SPI_MAX_FREQ_OTP;
spi_setup(spi);
}
*freq = orig_spi_freq;
} else {
if (spi->max_speed_hz != *freq) {
spi->max_speed_hz = *freq;
spi_setup(spi);
}
}
}

static int cs35l41_spi_probe(struct spi_device *spi)
{
const struct regmap_config *regmap_config = &cs35l41_regmap_spi;
Expand All @@ -81,6 +53,9 @@ static int cs35l41_spi_probe(struct spi_device *spi)
if (!cs35l41)
return -ENOMEM;

spi->max_speed_hz = CS35L41_SPI_MAX_FREQ;
spi_setup(spi);

spi_set_drvdata(spi, cs35l41);
cs35l41->regmap = devm_regmap_init_spi(spi, regmap_config);
if (IS_ERR(cs35l41->regmap)) {
Expand All @@ -91,7 +66,6 @@ static int cs35l41_spi_probe(struct spi_device *spi)

cs35l41->dev = &spi->dev;
cs35l41->irq = spi->irq;
cs35l41->otp_setup = cs35l41_spi_otp_setup;

return cs35l41_probe(cs35l41, pdata);
}
Expand Down
7 changes: 0 additions & 7 deletions sound/soc/codecs/cs35l41.c
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,6 @@ static int cs35l41_otp_unpack(void *data)
const struct cs35l41_otp_packed_element_t *otp_map;
struct cs35l41_private *cs35l41 = data;
int bit_offset, word_offset, ret, i;
unsigned int orig_spi_freq;
unsigned int bit_sum = 8;
u32 otp_val, otp_id_reg;
u32 *otp_mem;
Expand All @@ -326,19 +325,13 @@ static int cs35l41_otp_unpack(void *data)
goto err_otp_unpack;
}

if (cs35l41->otp_setup)
cs35l41->otp_setup(cs35l41, true, &orig_spi_freq);

ret = regmap_bulk_read(cs35l41->regmap, CS35L41_OTP_MEM0, otp_mem,
CS35L41_OTP_SIZE_WORDS);
if (ret < 0) {
dev_err(cs35l41->dev, "Read OTP Mem failed: %d\n", ret);
goto err_otp_unpack;
}

if (cs35l41->otp_setup)
cs35l41->otp_setup(cs35l41, false, &orig_spi_freq);

otp_map = otp_map_match->map;

bit_offset = otp_map_match->bit_offset;
Expand Down
4 changes: 1 addition & 3 deletions sound/soc/codecs/cs35l41.h
Original file line number Diff line number Diff line change
Expand Up @@ -726,7 +726,7 @@
#define CS35L41_FS2_WINDOW_MASK 0x00FFF800
#define CS35L41_FS2_WINDOW_SHIFT 12

#define CS35L41_SPI_MAX_FREQ_OTP 4000000
#define CS35L41_SPI_MAX_FREQ 4000000

#define CS35L41_RX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
#define CS35L41_TX_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
Expand Down Expand Up @@ -764,8 +764,6 @@ struct cs35l41_private {
int irq;
/* GPIO for /RST */
struct gpio_desc *reset_gpio;
void (*otp_setup)(struct cs35l41_private *cs35l41, bool is_pre_setup,
unsigned int *freq);
};

int cs35l41_probe(struct cs35l41_private *cs35l41,
Expand Down

0 comments on commit 872fc0b

Please sign in to comment.