clk: lmk04832: Support using PLL1_LD as SPI readback pin

The PLL1_PD pin (a.k.a. STATUS_LD1) can be used as SPI readback pin. Make
this possible.

Signed-off-by: Mike Looijmans <mike.looijmans@topic.nl>
Link: https://lore.kernel.org/r/20230802064100.15793-3-mike.looijmans@topic.nl
Reviewed-by: Liam Beguin <liambeguin@gmail.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
Mike Looijmans 2023-08-02 08:41:00 +02:00 committed by Stephen Boyd
parent e63227c83c
commit 6aa8dc690d
1 changed files with 18 additions and 5 deletions

View File

@ -134,6 +134,11 @@
/* 0x14b - 0x152 Holdover */ /* 0x14b - 0x152 Holdover */
/* 0x153 - 0x15f PLL1 Configuration */ /* 0x153 - 0x15f PLL1 Configuration */
#define LMK04832_REG_PLL1_LD 0x15f
#define LMK04832_BIT_PLL1_LD_MUX GENMASK(7, 3)
#define LMK04832_VAL_PLL1_LD_MUX_SPI_RDBK 0x07
#define LMK04832_BIT_PLL1_LD_TYPE GENMASK(2, 0)
#define LMK04832_VAL_PLL1_LD_TYPE_OUT_PP 0x03
/* 0x160 - 0x16e PLL2 Configuration */ /* 0x160 - 0x16e PLL2 Configuration */
#define LMK04832_REG_PLL2_R_MSB 0x160 #define LMK04832_REG_PLL2_R_MSB 0x160
@ -206,6 +211,7 @@ enum lmk04832_rdbk_type {
RDBK_CLKIN_SEL0, RDBK_CLKIN_SEL0,
RDBK_CLKIN_SEL1, RDBK_CLKIN_SEL1,
RDBK_RESET, RDBK_RESET,
RDBK_PLL1_LD,
}; };
struct lmk_dclk { struct lmk_dclk {
@ -1346,6 +1352,10 @@ static int lmk04832_set_spi_rdbk(const struct lmk04832 *lmk, const int rdbk_pin)
{ {
int reg; int reg;
int ret; int ret;
int val = FIELD_PREP(LMK04832_BIT_CLKIN_SEL_MUX,
LMK04832_VAL_CLKIN_SEL_MUX_SPI_RDBK) |
FIELD_PREP(LMK04832_BIT_CLKIN_SEL_TYPE,
LMK04832_VAL_CLKIN_SEL_TYPE_OUT);
dev_info(lmk->dev, "setting up 4-wire mode\n"); dev_info(lmk->dev, "setting up 4-wire mode\n");
ret = regmap_write(lmk->regmap, LMK04832_REG_RST3W, ret = regmap_write(lmk->regmap, LMK04832_REG_RST3W,
@ -1363,15 +1373,18 @@ static int lmk04832_set_spi_rdbk(const struct lmk04832 *lmk, const int rdbk_pin)
case RDBK_RESET: case RDBK_RESET:
reg = LMK04832_REG_CLKIN_RST; reg = LMK04832_REG_CLKIN_RST;
break; break;
case RDBK_PLL1_LD:
reg = LMK04832_REG_PLL1_LD;
val = FIELD_PREP(LMK04832_BIT_PLL1_LD_MUX,
LMK04832_VAL_PLL1_LD_MUX_SPI_RDBK) |
FIELD_PREP(LMK04832_BIT_PLL1_LD_TYPE,
LMK04832_VAL_PLL1_LD_TYPE_OUT_PP);
break;
default: default:
return -EINVAL; return -EINVAL;
} }
return regmap_write(lmk->regmap, reg, return regmap_write(lmk->regmap, reg, val);
FIELD_PREP(LMK04832_BIT_CLKIN_SEL_MUX,
LMK04832_VAL_CLKIN_SEL_MUX_SPI_RDBK) |
FIELD_PREP(LMK04832_BIT_CLKIN_SEL_TYPE,
LMK04832_VAL_CLKIN_SEL_TYPE_OUT));
} }
static int lmk04832_probe(struct spi_device *spi) static int lmk04832_probe(struct spi_device *spi)