0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/bitfield.h>
0013 #include <linux/clk.h>
0014 #include <linux/clk-provider.h>
0015 #include <linux/debugfs.h>
0016 #include <linux/device.h>
0017 #include <linux/gcd.h>
0018 #include <linux/gpio/consumer.h>
0019 #include <linux/module.h>
0020 #include <linux/uaccess.h>
0021 #include <linux/regmap.h>
0022 #include <linux/spi/spi.h>
0023
0024
0025 #define LMK04832_REG_RST3W 0x000
0026 #define LMK04832_BIT_RESET BIT(7)
0027 #define LMK04832_BIT_SPI_3WIRE_DIS BIT(4)
0028 #define LMK04832_REG_POWERDOWN 0x002
0029 #define LMK04832_REG_ID_DEV_TYPE 0x003
0030 #define LMK04832_REG_ID_PROD_MSB 0x004
0031 #define LMK04832_REG_ID_PROD_LSB 0x005
0032 #define LMK04832_REG_ID_MASKREV 0x006
0033 #define LMK04832_REG_ID_VNDR_MSB 0x00c
0034 #define LMK04832_REG_ID_VNDR_LSB 0x00d
0035
0036
0037 #define LMK04832_REG_CLKOUT_CTRL0(ch) (0x100 + (ch >> 1) * 8)
0038 #define LMK04832_BIT_DCLK_DIV_LSB GENMASK(7, 0)
0039 #define LMK04832_REG_CLKOUT_CTRL1(ch) (0x101 + (ch >> 1) * 8)
0040 #define LMK04832_BIT_DCLKX_Y_DDLY_LSB GENMASK(7, 0)
0041 #define LMK04832_REG_CLKOUT_CTRL2(ch) (0x102 + (ch >> 1) * 8)
0042 #define LMK04832_BIT_CLKOUTX_Y_PD BIT(7)
0043 #define LMK04832_BIT_DCLKX_Y_DDLY_PD BIT(4)
0044 #define LMK04832_BIT_DCLKX_Y_DDLY_MSB GENMASK(3, 2)
0045 #define LMK04832_BIT_DCLK_DIV_MSB GENMASK(1, 0)
0046 #define LMK04832_REG_CLKOUT_SRC_MUX(ch) (0x103 + (ch % 2) + (ch >> 1) * 8)
0047 #define LMK04832_BIT_CLKOUT_SRC_MUX BIT(5)
0048 #define LMK04832_REG_CLKOUT_CTRL3(ch) (0x103 + (ch >> 1) * 8)
0049 #define LMK04832_BIT_DCLKX_Y_PD BIT(4)
0050 #define LMK04832_BIT_DCLKX_Y_DCC BIT(2)
0051 #define LMK04832_BIT_DCLKX_Y_HS BIT(0)
0052 #define LMK04832_REG_CLKOUT_CTRL4(ch) (0x104 + (ch >> 1) * 8)
0053 #define LMK04832_BIT_SCLK_PD BIT(4)
0054 #define LMK04832_BIT_SCLKX_Y_DIS_MODE GENMASK(3, 2)
0055 #define LMK04832_REG_SCLKX_Y_ADLY(ch) (0x105 + (ch >> 1) * 8)
0056 #define LMK04832_REG_SCLKX_Y_DDLY(ch) (0x106 + (ch >> 1) * 8)
0057 #define LMK04832_BIT_SCLKX_Y_DDLY GENMASK(3, 0)
0058 #define LMK04832_REG_CLKOUT_FMT(ch) (0x107 + (ch >> 1) * 8)
0059 #define LMK04832_BIT_CLKOUT_FMT(ch) (ch % 2 ? 0xf0 : 0x0f)
0060 #define LMK04832_VAL_CLKOUT_FMT_POWERDOWN 0x00
0061 #define LMK04832_VAL_CLKOUT_FMT_LVDS 0x01
0062 #define LMK04832_VAL_CLKOUT_FMT_HSDS6 0x02
0063 #define LMK04832_VAL_CLKOUT_FMT_HSDS8 0x03
0064 #define LMK04832_VAL_CLKOUT_FMT_LVPECL1600 0x04
0065 #define LMK04832_VAL_CLKOUT_FMT_LVPECL2000 0x05
0066 #define LMK04832_VAL_CLKOUT_FMT_LCPECL 0x06
0067 #define LMK04832_VAL_CLKOUT_FMT_CML16 0x07
0068 #define LMK04832_VAL_CLKOUT_FMT_CML24 0x08
0069 #define LMK04832_VAL_CLKOUT_FMT_CML32 0x09
0070 #define LMK04832_VAL_CLKOUT_FMT_CMOS_OFF_INV 0x0a
0071 #define LMK04832_VAL_CLKOUT_FMT_CMOS_NOR_OFF 0x0b
0072 #define LMK04832_VAL_CLKOUT_FMT_CMOS_INV_INV 0x0c
0073 #define LMK04832_VAL_CLKOUT_FMT_CMOS_INV_NOR 0x0d
0074 #define LMK04832_VAL_CLKOUT_FMT_CMOS_NOR_INV 0x0e
0075 #define LMK04832_VAL_CLKOUT_FMT_CMOS_NOR_NOR 0x0f
0076
0077
0078 #define LMK04832_REG_VCO_OSCOUT 0x138
0079 #define LMK04832_BIT_VCO_MUX GENMASK(6, 5)
0080 #define LMK04832_VAL_VCO_MUX_VCO0 0x00
0081 #define LMK04832_VAL_VCO_MUX_VCO1 0x01
0082 #define LMK04832_VAL_VCO_MUX_EXT 0x02
0083 #define LMK04832_REG_SYSREF_OUT 0x139
0084 #define LMK04832_BIT_SYSREF_REQ_EN BIT(6)
0085 #define LMK04832_BIT_SYSREF_MUX GENMASK(1, 0)
0086 #define LMK04832_VAL_SYSREF_MUX_NORMAL_SYNC 0x00
0087 #define LMK04832_VAL_SYSREF_MUX_RECLK 0x01
0088 #define LMK04832_VAL_SYSREF_MUX_PULSER 0x02
0089 #define LMK04832_VAL_SYSREF_MUX_CONTINUOUS 0x03
0090 #define LMK04832_REG_SYSREF_DIV_MSB 0x13a
0091 #define LMK04832_BIT_SYSREF_DIV_MSB GENMASK(4, 0)
0092 #define LMK04832_REG_SYSREF_DIV_LSB 0x13b
0093 #define LMK04832_REG_SYSREF_DDLY_MSB 0x13c
0094 #define LMK04832_BIT_SYSREF_DDLY_MSB GENMASK(4, 0)
0095 #define LMK04832_REG_SYSREF_DDLY_LSB 0x13d
0096 #define LMK04832_REG_SYSREF_PULSE_CNT 0x13e
0097 #define LMK04832_REG_FB_CTRL 0x13f
0098 #define LMK04832_BIT_PLL2_RCLK_MUX BIT(7)
0099 #define LMK04832_VAL_PLL2_RCLK_MUX_OSCIN 0x00
0100 #define LMK04832_VAL_PLL2_RCLK_MUX_CLKIN 0x01
0101 #define LMK04832_BIT_PLL2_NCLK_MUX BIT(5)
0102 #define LMK04832_VAL_PLL2_NCLK_MUX_PLL2_P 0x00
0103 #define LMK04832_VAL_PLL2_NCLK_MUX_FB_MUX 0x01
0104 #define LMK04832_BIT_FB_MUX_EN BIT(0)
0105 #define LMK04832_REG_MAIN_PD 0x140
0106 #define LMK04832_BIT_PLL1_PD BIT(7)
0107 #define LMK04832_BIT_VCO_LDO_PD BIT(6)
0108 #define LMK04832_BIT_VCO_PD BIT(5)
0109 #define LMK04832_BIT_OSCIN_PD BIT(4)
0110 #define LMK04832_BIT_SYSREF_GBL_PD BIT(3)
0111 #define LMK04832_BIT_SYSREF_PD BIT(2)
0112 #define LMK04832_BIT_SYSREF_DDLY_PD BIT(1)
0113 #define LMK04832_BIT_SYSREF_PLSR_PD BIT(0)
0114 #define LMK04832_REG_SYNC 0x143
0115 #define LMK04832_BIT_SYNC_CLR BIT(7)
0116 #define LMK04832_BIT_SYNC_1SHOT_EN BIT(6)
0117 #define LMK04832_BIT_SYNC_POL BIT(5)
0118 #define LMK04832_BIT_SYNC_EN BIT(4)
0119 #define LMK04832_BIT_SYNC_MODE GENMASK(1, 0)
0120 #define LMK04832_VAL_SYNC_MODE_OFF 0x00
0121 #define LMK04832_VAL_SYNC_MODE_ON 0x01
0122 #define LMK04832_VAL_SYNC_MODE_PULSER_PIN 0x02
0123 #define LMK04832_VAL_SYNC_MODE_PULSER_SPI 0x03
0124 #define LMK04832_REG_SYNC_DIS 0x144
0125
0126
0127 #define LMK04832_REG_CLKIN_SEL0 0x148
0128 #define LMK04832_REG_CLKIN_SEL1 0x149
0129 #define LMK04832_REG_CLKIN_RST 0x14a
0130 #define LMK04832_BIT_SDIO_RDBK_TYPE BIT(6)
0131 #define LMK04832_BIT_CLKIN_SEL_MUX GENMASK(5, 3)
0132 #define LMK04832_VAL_CLKIN_SEL_MUX_SPI_RDBK 0x06
0133 #define LMK04832_BIT_CLKIN_SEL_TYPE GENMASK(2, 0)
0134 #define LMK04832_VAL_CLKIN_SEL_TYPE_OUT 0x03
0135
0136
0137
0138
0139
0140
0141 #define LMK04832_REG_PLL2_R_MSB 0x160
0142 #define LMK04832_BIT_PLL2_R_MSB GENMASK(3, 0)
0143 #define LMK04832_REG_PLL2_R_LSB 0x161
0144 #define LMK04832_REG_PLL2_MISC 0x162
0145 #define LMK04832_BIT_PLL2_MISC_P GENMASK(7, 5)
0146 #define LMK04832_BIT_PLL2_MISC_REF_2X_EN BIT(0)
0147 #define LMK04832_REG_PLL2_N_CAL_0 0x163
0148 #define LMK04832_BIT_PLL2_N_CAL_0 GENMASK(1, 0)
0149 #define LMK04832_REG_PLL2_N_CAL_1 0x164
0150 #define LMK04832_REG_PLL2_N_CAL_2 0x165
0151 #define LMK04832_REG_PLL2_N_0 0x166
0152 #define LMK04832_BIT_PLL2_N_0 GENMASK(1, 0)
0153 #define LMK04832_REG_PLL2_N_1 0x167
0154 #define LMK04832_REG_PLL2_N_2 0x168
0155 #define LMK04832_REG_PLL2_DLD_CNT_MSB 0x16a
0156 #define LMK04832_REG_PLL2_DLD_CNT_LSB 0x16b
0157 #define LMK04832_REG_PLL2_LD 0x16e
0158 #define LMK04832_BIT_PLL2_LD_MUX GENMASK(7, 3)
0159 #define LMK04832_VAL_PLL2_LD_MUX_PLL2_DLD 0x02
0160 #define LMK04832_BIT_PLL2_LD_TYPE GENMASK(2, 0)
0161 #define LMK04832_VAL_PLL2_LD_TYPE_OUT_PP 0x03
0162
0163
0164 #define LMK04832_REG_PLL2_PD 0x173
0165 #define LMK04832_BIT_PLL2_PRE_PD BIT(6)
0166 #define LMK04832_BIT_PLL2_PD BIT(5)
0167 #define LMK04832_REG_PLL1R_RST 0x177
0168 #define LMK04832_REG_CLR_PLL_LOST 0x182
0169 #define LMK04832_REG_RB_PLL_LD 0x183
0170 #define LMK04832_REG_RB_CLK_DAC_VAL_MSB 0x184
0171 #define LMK04832_REG_RB_DAC_VAL_LSB 0x185
0172 #define LMK04832_REG_RB_HOLDOVER 0x188
0173 #define LMK04832_REG_SPI_LOCK 0x555
0174
0175 enum lmk04832_device_types {
0176 LMK04832,
0177 };
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189 struct lmk04832_device_info {
0190 u16 pid;
0191 u8 maskrev;
0192 size_t num_channels;
0193 unsigned int vco0_range[2];
0194 unsigned int vco1_range[2];
0195 };
0196
0197 static const struct lmk04832_device_info lmk04832_device_info[] = {
0198 [LMK04832] = {
0199 .pid = 0x63d1,
0200 .maskrev = 0x70,
0201 .num_channels = 14,
0202 .vco0_range = { 2440, 2580 },
0203 .vco1_range = { 2945, 3255 },
0204 },
0205 };
0206
0207 enum lmk04832_rdbk_type {
0208 RDBK_CLKIN_SEL0,
0209 RDBK_CLKIN_SEL1,
0210 RDBK_RESET,
0211 };
0212
0213 struct lmk_dclk {
0214 struct lmk04832 *lmk;
0215 struct clk_hw hw;
0216 u8 id;
0217 };
0218
0219 struct lmk_clkout {
0220 struct lmk04832 *lmk;
0221 struct clk_hw hw;
0222 bool sysref;
0223 u32 format;
0224 u8 id;
0225 };
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247 struct lmk04832 {
0248 struct device *dev;
0249 struct regmap *regmap;
0250
0251 unsigned int sync_mode;
0252 unsigned int sysref_mux;
0253 unsigned int sysref_pulse_cnt;
0254 unsigned int sysref_ddly;
0255
0256 struct clk *oscin;
0257 struct clk_hw vco;
0258 struct clk_hw sclk;
0259 unsigned int vco_rate;
0260
0261 struct gpio_desc *reset_gpio;
0262
0263 struct lmk_dclk *dclk;
0264 struct lmk_clkout *clkout;
0265 struct clk_hw_onecell_data *clk_data;
0266 };
0267
0268 static bool lmk04832_regmap_rd_regs(struct device *dev, unsigned int reg)
0269 {
0270 switch (reg) {
0271 case LMK04832_REG_RST3W ... LMK04832_REG_ID_MASKREV:
0272 case LMK04832_REG_ID_VNDR_MSB:
0273 case LMK04832_REG_ID_VNDR_LSB:
0274 case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
0275 case LMK04832_REG_PLL2_LD:
0276 case LMK04832_REG_PLL2_PD:
0277 case LMK04832_REG_PLL1R_RST:
0278 case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
0279 case LMK04832_REG_RB_HOLDOVER:
0280 case LMK04832_REG_SPI_LOCK:
0281 return true;
0282 default:
0283 return false;
0284 };
0285 };
0286
0287 static bool lmk04832_regmap_wr_regs(struct device *dev, unsigned int reg)
0288 {
0289 switch (reg) {
0290 case LMK04832_REG_RST3W:
0291 case LMK04832_REG_POWERDOWN:
0292 return true;
0293 case LMK04832_REG_ID_DEV_TYPE ... LMK04832_REG_ID_MASKREV:
0294 case LMK04832_REG_ID_VNDR_MSB:
0295 case LMK04832_REG_ID_VNDR_LSB:
0296 return false;
0297 case LMK04832_REG_CLKOUT_CTRL0(0) ... LMK04832_REG_PLL2_DLD_CNT_LSB:
0298 case LMK04832_REG_PLL2_LD:
0299 case LMK04832_REG_PLL2_PD:
0300 case LMK04832_REG_PLL1R_RST:
0301 case LMK04832_REG_CLR_PLL_LOST ... LMK04832_REG_RB_DAC_VAL_LSB:
0302 case LMK04832_REG_RB_HOLDOVER:
0303 case LMK04832_REG_SPI_LOCK:
0304 return true;
0305 default:
0306 return false;
0307 };
0308 };
0309
0310 static const struct regmap_config regmap_config = {
0311 .name = "lmk04832",
0312 .reg_bits = 16,
0313 .val_bits = 8,
0314 .use_single_read = 1,
0315 .use_single_write = 1,
0316 .read_flag_mask = 0x80,
0317 .write_flag_mask = 0x00,
0318 .readable_reg = lmk04832_regmap_rd_regs,
0319 .writeable_reg = lmk04832_regmap_wr_regs,
0320 .cache_type = REGCACHE_NONE,
0321 .max_register = LMK04832_REG_SPI_LOCK,
0322 };
0323
0324 static int lmk04832_vco_is_enabled(struct clk_hw *hw)
0325 {
0326 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0327 unsigned int tmp;
0328 int ret;
0329
0330 ret = regmap_read(lmk->regmap, LMK04832_REG_MAIN_PD, &tmp);
0331 if (ret)
0332 return ret;
0333
0334 return !(FIELD_GET(LMK04832_BIT_OSCIN_PD, tmp) |
0335 FIELD_GET(LMK04832_BIT_VCO_PD, tmp) |
0336 FIELD_GET(LMK04832_BIT_VCO_LDO_PD, tmp));
0337 }
0338
0339 static int lmk04832_vco_prepare(struct clk_hw *hw)
0340 {
0341 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0342 int ret;
0343
0344 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_PLL2_PD,
0345 LMK04832_BIT_PLL2_PRE_PD |
0346 LMK04832_BIT_PLL2_PD,
0347 0x00);
0348 if (ret)
0349 return ret;
0350
0351 return regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0352 LMK04832_BIT_VCO_LDO_PD |
0353 LMK04832_BIT_VCO_PD |
0354 LMK04832_BIT_OSCIN_PD, 0x00);
0355 }
0356
0357 static void lmk04832_vco_unprepare(struct clk_hw *hw)
0358 {
0359 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0360
0361 regmap_update_bits(lmk->regmap, LMK04832_REG_PLL2_PD,
0362 LMK04832_BIT_PLL2_PRE_PD | LMK04832_BIT_PLL2_PD,
0363 0xff);
0364
0365
0366 regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0367 LMK04832_BIT_VCO_LDO_PD | LMK04832_BIT_VCO_PD, 0xff);
0368 }
0369
0370 static unsigned long lmk04832_vco_recalc_rate(struct clk_hw *hw,
0371 unsigned long prate)
0372 {
0373 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0374 unsigned int pll2_p[] = {8, 2, 2, 3, 4, 5, 6, 7};
0375 unsigned int pll2_n, p, pll2_r;
0376 unsigned int pll2_misc;
0377 unsigned long vco_rate;
0378 u8 tmp[3];
0379 int ret;
0380
0381 ret = regmap_read(lmk->regmap, LMK04832_REG_PLL2_MISC, &pll2_misc);
0382 if (ret)
0383 return ret;
0384
0385 p = FIELD_GET(LMK04832_BIT_PLL2_MISC_P, pll2_misc);
0386
0387 ret = regmap_bulk_read(lmk->regmap, LMK04832_REG_PLL2_N_0, &tmp, 3);
0388 if (ret)
0389 return ret;
0390
0391 pll2_n = FIELD_PREP(0x030000, tmp[0]) |
0392 FIELD_PREP(0x00ff00, tmp[1]) |
0393 FIELD_PREP(0x0000ff, tmp[2]);
0394
0395 ret = regmap_bulk_read(lmk->regmap, LMK04832_REG_PLL2_R_MSB, &tmp, 2);
0396 if (ret)
0397 return ret;
0398
0399 pll2_r = FIELD_PREP(0x0f00, tmp[0]) |
0400 FIELD_PREP(0x00ff, tmp[1]);
0401
0402 vco_rate = (prate << FIELD_GET(LMK04832_BIT_PLL2_MISC_REF_2X_EN,
0403 pll2_misc)) * pll2_n * pll2_p[p] / pll2_r;
0404
0405 return vco_rate;
0406 };
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419 static int lmk04832_check_vco_ranges(struct lmk04832 *lmk, unsigned long rate)
0420 {
0421 struct spi_device *spi = to_spi_device(lmk->dev);
0422 const struct lmk04832_device_info *info;
0423 unsigned long mhz = rate / 1000000;
0424
0425 info = &lmk04832_device_info[spi_get_device_id(spi)->driver_data];
0426
0427 if (mhz >= info->vco0_range[0] && mhz <= info->vco0_range[1])
0428 return LMK04832_VAL_VCO_MUX_VCO0;
0429
0430 if (mhz >= info->vco1_range[0] && mhz <= info->vco1_range[1])
0431 return LMK04832_VAL_VCO_MUX_VCO1;
0432
0433 dev_err(lmk->dev, "%lu Hz is out of VCO ranges\n", rate);
0434 return -ERANGE;
0435 }
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456 static long lmk04832_calc_pll2_params(unsigned long prate, unsigned long rate,
0457 unsigned int *n, unsigned int *p,
0458 unsigned int *r)
0459 {
0460 unsigned int pll2_n, pll2_p, pll2_r;
0461 unsigned long num, div;
0462
0463
0464 pll2_p = 2;
0465
0466 div = gcd(rate, prate);
0467
0468 num = DIV_ROUND_CLOSEST(rate, div);
0469 pll2_r = DIV_ROUND_CLOSEST(prate, div);
0470
0471 if (num > 4) {
0472 pll2_n = num >> 2;
0473 } else {
0474 pll2_r = pll2_r << 2;
0475 pll2_n = num;
0476 }
0477
0478 if (pll2_n < 1 || pll2_n > 0x03ffff)
0479 return -EINVAL;
0480 if (pll2_r < 1 || pll2_r > 0xfff)
0481 return -EINVAL;
0482
0483 *n = pll2_n;
0484 *p = pll2_p;
0485 *r = pll2_r;
0486
0487 return DIV_ROUND_CLOSEST(prate * 2 * pll2_p * pll2_n, pll2_r);
0488 }
0489
0490 static long lmk04832_vco_round_rate(struct clk_hw *hw, unsigned long rate,
0491 unsigned long *prate)
0492 {
0493 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0494 unsigned int n, p, r;
0495 long vco_rate;
0496 int ret;
0497
0498 ret = lmk04832_check_vco_ranges(lmk, rate);
0499 if (ret < 0)
0500 return ret;
0501
0502 vco_rate = lmk04832_calc_pll2_params(*prate, rate, &n, &p, &r);
0503 if (vco_rate < 0) {
0504 dev_err(lmk->dev, "PLL2 parameters out of range\n");
0505 return vco_rate;
0506 }
0507
0508 if (rate != vco_rate)
0509 return -EINVAL;
0510
0511 return vco_rate;
0512 };
0513
0514 static int lmk04832_vco_set_rate(struct clk_hw *hw, unsigned long rate,
0515 unsigned long prate)
0516 {
0517 struct lmk04832 *lmk = container_of(hw, struct lmk04832, vco);
0518 unsigned int n, p, r;
0519 long vco_rate;
0520 int vco_mux;
0521 int ret;
0522
0523 vco_mux = lmk04832_check_vco_ranges(lmk, rate);
0524 if (vco_mux < 0)
0525 return vco_mux;
0526
0527 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_VCO_OSCOUT,
0528 LMK04832_BIT_VCO_MUX,
0529 FIELD_PREP(LMK04832_BIT_VCO_MUX, vco_mux));
0530 if (ret)
0531 return ret;
0532
0533 vco_rate = lmk04832_calc_pll2_params(prate, rate, &n, &p, &r);
0534 if (vco_rate < 0) {
0535 dev_err(lmk->dev, "failed to determine PLL2 parameters\n");
0536 return vco_rate;
0537 }
0538
0539 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_PLL2_R_MSB,
0540 LMK04832_BIT_PLL2_R_MSB,
0541 FIELD_GET(0x000700, r));
0542 if (ret)
0543 return ret;
0544
0545 ret = regmap_write(lmk->regmap, LMK04832_REG_PLL2_R_LSB,
0546 FIELD_GET(0x0000ff, r));
0547 if (ret)
0548 return ret;
0549
0550 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_PLL2_MISC,
0551 LMK04832_BIT_PLL2_MISC_P,
0552 FIELD_PREP(LMK04832_BIT_PLL2_MISC_P, p));
0553 if (ret)
0554 return ret;
0555
0556
0557
0558
0559
0560 ret = regmap_write(lmk->regmap, LMK04832_REG_PLL2_N_0,
0561 FIELD_GET(0x030000, n));
0562 if (ret)
0563 return ret;
0564 ret = regmap_write(lmk->regmap, LMK04832_REG_PLL2_N_1,
0565 FIELD_GET(0x00ff00, n));
0566 if (ret)
0567 return ret;
0568
0569 return regmap_write(lmk->regmap, LMK04832_REG_PLL2_N_2,
0570 FIELD_GET(0x0000ff, n));
0571 };
0572
0573 static const struct clk_ops lmk04832_vco_ops = {
0574 .is_enabled = lmk04832_vco_is_enabled,
0575 .prepare = lmk04832_vco_prepare,
0576 .unprepare = lmk04832_vco_unprepare,
0577 .recalc_rate = lmk04832_vco_recalc_rate,
0578 .round_rate = lmk04832_vco_round_rate,
0579 .set_rate = lmk04832_vco_set_rate,
0580 };
0581
0582
0583
0584
0585
0586 static int lmk04832_register_vco(struct lmk04832 *lmk)
0587 {
0588 const char *parent_names[1];
0589 struct clk_init_data init;
0590 int ret;
0591
0592 init.name = "lmk-vco";
0593 parent_names[0] = __clk_get_name(lmk->oscin);
0594 init.parent_names = parent_names;
0595
0596 init.ops = &lmk04832_vco_ops;
0597 init.num_parents = 1;
0598
0599 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_VCO_OSCOUT,
0600 LMK04832_BIT_VCO_MUX,
0601 FIELD_PREP(LMK04832_BIT_VCO_MUX,
0602 LMK04832_VAL_VCO_MUX_VCO1));
0603 if (ret)
0604 return ret;
0605
0606 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_FB_CTRL,
0607 LMK04832_BIT_PLL2_RCLK_MUX |
0608 LMK04832_BIT_PLL2_NCLK_MUX,
0609 FIELD_PREP(LMK04832_BIT_PLL2_RCLK_MUX,
0610 LMK04832_VAL_PLL2_RCLK_MUX_OSCIN)|
0611 FIELD_PREP(LMK04832_BIT_PLL2_NCLK_MUX,
0612 LMK04832_VAL_PLL2_NCLK_MUX_PLL2_P));
0613 if (ret)
0614 return ret;
0615
0616 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_PLL2_MISC,
0617 LMK04832_BIT_PLL2_MISC_REF_2X_EN,
0618 LMK04832_BIT_PLL2_MISC_REF_2X_EN);
0619 if (ret)
0620 return ret;
0621
0622 ret = regmap_write(lmk->regmap, LMK04832_REG_PLL2_LD,
0623 FIELD_PREP(LMK04832_BIT_PLL2_LD_MUX,
0624 LMK04832_VAL_PLL2_LD_MUX_PLL2_DLD) |
0625 FIELD_PREP(LMK04832_BIT_PLL2_LD_TYPE,
0626 LMK04832_VAL_PLL2_LD_TYPE_OUT_PP));
0627 if (ret)
0628 return ret;
0629
0630 lmk->vco.init = &init;
0631 return devm_clk_hw_register(lmk->dev, &lmk->vco);
0632 }
0633
0634 static int lmk04832_clkout_set_ddly(struct lmk04832 *lmk, int id)
0635 {
0636 int dclk_div_adj[] = {0, 0, -2, -2, 0, 3, -1, 0};
0637 unsigned int sclkx_y_ddly = 10;
0638 unsigned int dclkx_y_ddly;
0639 unsigned int dclkx_y_div;
0640 unsigned int sysref_ddly;
0641 unsigned int dclkx_y_hs;
0642 unsigned int lsb, msb;
0643 int ret;
0644
0645 ret = regmap_update_bits(lmk->regmap,
0646 LMK04832_REG_CLKOUT_CTRL2(id),
0647 LMK04832_BIT_DCLKX_Y_DDLY_PD,
0648 FIELD_PREP(LMK04832_BIT_DCLKX_Y_DDLY_PD, 0));
0649 if (ret)
0650 return ret;
0651
0652 ret = regmap_read(lmk->regmap, LMK04832_REG_SYSREF_DDLY_LSB, &lsb);
0653 if (ret)
0654 return ret;
0655
0656 ret = regmap_read(lmk->regmap, LMK04832_REG_SYSREF_DDLY_MSB, &msb);
0657 if (ret)
0658 return ret;
0659
0660 sysref_ddly = FIELD_GET(LMK04832_BIT_SYSREF_DDLY_MSB, msb) << 8 | lsb;
0661
0662 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL0(id), &lsb);
0663 if (ret)
0664 return ret;
0665
0666 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL2(id), &msb);
0667 if (ret)
0668 return ret;
0669
0670 dclkx_y_div = FIELD_GET(LMK04832_BIT_DCLK_DIV_MSB, msb) << 8 | lsb;
0671
0672 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL3(id), &lsb);
0673 if (ret)
0674 return ret;
0675
0676 dclkx_y_hs = FIELD_GET(LMK04832_BIT_DCLKX_Y_HS, lsb);
0677
0678 dclkx_y_ddly = sysref_ddly + 1 -
0679 dclk_div_adj[dclkx_y_div < 6 ? dclkx_y_div : 7] -
0680 dclkx_y_hs + sclkx_y_ddly;
0681
0682 if (dclkx_y_ddly < 7 || dclkx_y_ddly > 0x3fff) {
0683 dev_err(lmk->dev, "DCLKX_Y_DDLY out of range (%d)\n",
0684 dclkx_y_ddly);
0685 return -EINVAL;
0686 }
0687
0688 ret = regmap_write(lmk->regmap,
0689 LMK04832_REG_SCLKX_Y_DDLY(id),
0690 FIELD_GET(LMK04832_BIT_SCLKX_Y_DDLY, sclkx_y_ddly));
0691 if (ret)
0692 return ret;
0693
0694 ret = regmap_write(lmk->regmap, LMK04832_REG_CLKOUT_CTRL1(id),
0695 FIELD_GET(0x00ff, dclkx_y_ddly));
0696 if (ret)
0697 return ret;
0698
0699 dev_dbg(lmk->dev, "clkout%02u: sysref_ddly=%u, dclkx_y_ddly=%u, "
0700 "dclk_div_adj=%+d, dclkx_y_hs=%u, sclkx_y_ddly=%u\n",
0701 id, sysref_ddly, dclkx_y_ddly,
0702 dclk_div_adj[dclkx_y_div < 6 ? dclkx_y_div : 7],
0703 dclkx_y_hs, sclkx_y_ddly);
0704
0705 return regmap_update_bits(lmk->regmap, LMK04832_REG_CLKOUT_CTRL2(id),
0706 LMK04832_BIT_DCLKX_Y_DDLY_MSB,
0707 FIELD_GET(0x0300, dclkx_y_ddly));
0708 }
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722 static int lmk04832_sclk_sync_sequence(struct lmk04832 *lmk)
0723 {
0724 int ret;
0725 int i;
0726
0727
0728
0729 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0730 LMK04832_BIT_SYSREF_DDLY_PD,
0731 FIELD_PREP(LMK04832_BIT_SYSREF_DDLY_PD, 0));
0732 if (ret)
0733 return ret;
0734
0735 for (i = 0; i < lmk->clk_data->num; i += 2) {
0736 ret = lmk04832_clkout_set_ddly(lmk, i);
0737 if (ret)
0738 return ret;
0739 }
0740
0741
0742
0743
0744
0745 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYSREF_OUT,
0746 LMK04832_BIT_SYSREF_REQ_EN |
0747 LMK04832_BIT_SYSREF_MUX,
0748 FIELD_PREP(LMK04832_BIT_SYSREF_REQ_EN, 0) |
0749 FIELD_PREP(LMK04832_BIT_SYSREF_MUX,
0750 LMK04832_VAL_SYSREF_MUX_NORMAL_SYNC));
0751 if (ret)
0752 return ret;
0753
0754 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0755 LMK04832_BIT_SYNC_MODE,
0756 FIELD_PREP(LMK04832_BIT_SYNC_MODE,
0757 LMK04832_VAL_SYNC_MODE_ON));
0758 if (ret)
0759 return ret;
0760
0761
0762 ret = regmap_write(lmk->regmap, LMK04832_REG_SYNC_DIS, 0x00);
0763 if (ret)
0764 return ret;
0765
0766
0767
0768
0769
0770
0771
0772
0773 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0774 LMK04832_BIT_SYNC_CLR,
0775 FIELD_PREP(LMK04832_BIT_SYNC_CLR, 0x01));
0776 if (ret)
0777 return ret;
0778
0779 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0780 LMK04832_BIT_SYNC_CLR,
0781 FIELD_PREP(LMK04832_BIT_SYNC_CLR, 0x00));
0782 if (ret)
0783 return ret;
0784
0785
0786
0787
0788
0789
0790
0791 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0792 LMK04832_BIT_SYNC_POL,
0793 FIELD_PREP(LMK04832_BIT_SYNC_POL, 0x01));
0794 if (ret)
0795 return ret;
0796
0797 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0798 LMK04832_BIT_SYNC_POL,
0799 FIELD_PREP(LMK04832_BIT_SYNC_POL, 0x00));
0800 if (ret)
0801 return ret;
0802
0803
0804 ret = regmap_write(lmk->regmap, LMK04832_REG_SYNC_DIS, 0xff);
0805 if (ret)
0806 return ret;
0807
0808
0809 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYSREF_OUT,
0810 LMK04832_BIT_SYSREF_MUX,
0811 FIELD_PREP(LMK04832_BIT_SYSREF_MUX,
0812 lmk->sysref_mux));
0813 if (ret)
0814 return ret;
0815
0816 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYNC,
0817 LMK04832_BIT_SYNC_MODE,
0818 FIELD_PREP(LMK04832_BIT_SYNC_MODE,
0819 lmk->sync_mode));
0820 if (ret)
0821 return ret;
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837 return ret;
0838 }
0839
0840 static int lmk04832_sclk_is_enabled(struct clk_hw *hw)
0841 {
0842 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0843 unsigned int tmp;
0844 int ret;
0845
0846 ret = regmap_read(lmk->regmap, LMK04832_REG_MAIN_PD, &tmp);
0847 if (ret)
0848 return ret;
0849
0850 return FIELD_GET(LMK04832_BIT_SYSREF_PD, tmp);
0851 }
0852
0853 static int lmk04832_sclk_prepare(struct clk_hw *hw)
0854 {
0855 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0856
0857 return regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0858 LMK04832_BIT_SYSREF_PD, 0x00);
0859 }
0860
0861 static void lmk04832_sclk_unprepare(struct clk_hw *hw)
0862 {
0863 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0864
0865 regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0866 LMK04832_BIT_SYSREF_PD, LMK04832_BIT_SYSREF_PD);
0867 }
0868
0869 static unsigned long lmk04832_sclk_recalc_rate(struct clk_hw *hw,
0870 unsigned long prate)
0871 {
0872 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0873 unsigned int sysref_div;
0874 u8 tmp[2];
0875 int ret;
0876
0877 ret = regmap_bulk_read(lmk->regmap, LMK04832_REG_SYSREF_DIV_MSB, &tmp, 2);
0878 if (ret)
0879 return ret;
0880
0881 sysref_div = FIELD_GET(LMK04832_BIT_SYSREF_DIV_MSB, tmp[0]) << 8 |
0882 tmp[1];
0883
0884 return DIV_ROUND_CLOSEST(prate, sysref_div);
0885 }
0886
0887 static long lmk04832_sclk_round_rate(struct clk_hw *hw, unsigned long rate,
0888 unsigned long *prate)
0889 {
0890 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0891 unsigned long sclk_rate;
0892 unsigned int sysref_div;
0893
0894 sysref_div = DIV_ROUND_CLOSEST(*prate, rate);
0895 sclk_rate = DIV_ROUND_CLOSEST(*prate, sysref_div);
0896
0897 if (sysref_div < 0x07 || sysref_div > 0x1fff) {
0898 dev_err(lmk->dev, "SYSREF divider out of range\n");
0899 return -EINVAL;
0900 }
0901
0902 if (rate != sclk_rate)
0903 return -EINVAL;
0904
0905 return sclk_rate;
0906 }
0907
0908 static int lmk04832_sclk_set_rate(struct clk_hw *hw, unsigned long rate,
0909 unsigned long prate)
0910 {
0911 struct lmk04832 *lmk = container_of(hw, struct lmk04832, sclk);
0912 unsigned int sysref_div;
0913 int ret;
0914
0915 sysref_div = DIV_ROUND_CLOSEST(prate, rate);
0916
0917 if (sysref_div < 0x07 || sysref_div > 0x1fff) {
0918 dev_err(lmk->dev, "SYSREF divider out of range\n");
0919 return -EINVAL;
0920 }
0921
0922 ret = regmap_write(lmk->regmap, LMK04832_REG_SYSREF_DIV_MSB,
0923 FIELD_GET(0x1f00, sysref_div));
0924 if (ret)
0925 return ret;
0926
0927 ret = regmap_write(lmk->regmap, LMK04832_REG_SYSREF_DIV_LSB,
0928 FIELD_GET(0x00ff, sysref_div));
0929 if (ret)
0930 return ret;
0931
0932 ret = lmk04832_sclk_sync_sequence(lmk);
0933 if (ret)
0934 dev_err(lmk->dev, "SYNC sequence failed\n");
0935
0936 return ret;
0937 }
0938
0939 static const struct clk_ops lmk04832_sclk_ops = {
0940 .is_enabled = lmk04832_sclk_is_enabled,
0941 .prepare = lmk04832_sclk_prepare,
0942 .unprepare = lmk04832_sclk_unprepare,
0943 .recalc_rate = lmk04832_sclk_recalc_rate,
0944 .round_rate = lmk04832_sclk_round_rate,
0945 .set_rate = lmk04832_sclk_set_rate,
0946 };
0947
0948 static int lmk04832_register_sclk(struct lmk04832 *lmk)
0949 {
0950 const char *parent_names[1];
0951 struct clk_init_data init;
0952 int ret;
0953
0954 init.name = "lmk-sclk";
0955 parent_names[0] = clk_hw_get_name(&lmk->vco);
0956 init.parent_names = parent_names;
0957
0958 init.ops = &lmk04832_sclk_ops;
0959 init.flags = CLK_SET_RATE_PARENT;
0960 init.num_parents = 1;
0961
0962 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_SYSREF_OUT,
0963 LMK04832_BIT_SYSREF_MUX,
0964 FIELD_PREP(LMK04832_BIT_SYSREF_MUX,
0965 lmk->sysref_mux));
0966 if (ret)
0967 return ret;
0968
0969 ret = regmap_write(lmk->regmap, LMK04832_REG_SYSREF_DDLY_LSB,
0970 FIELD_GET(0x00ff, lmk->sysref_ddly));
0971 if (ret)
0972 return ret;
0973
0974 ret = regmap_write(lmk->regmap, LMK04832_REG_SYSREF_DDLY_MSB,
0975 FIELD_GET(0x1f00, lmk->sysref_ddly));
0976 if (ret)
0977 return ret;
0978
0979 ret = regmap_write(lmk->regmap, LMK04832_REG_SYSREF_PULSE_CNT,
0980 ilog2(lmk->sysref_pulse_cnt));
0981 if (ret)
0982 return ret;
0983
0984 ret = regmap_update_bits(lmk->regmap, LMK04832_REG_MAIN_PD,
0985 LMK04832_BIT_SYSREF_DDLY_PD |
0986 LMK04832_BIT_SYSREF_PLSR_PD,
0987 FIELD_PREP(LMK04832_BIT_SYSREF_DDLY_PD, 0) |
0988 FIELD_PREP(LMK04832_BIT_SYSREF_PLSR_PD, 0));
0989 if (ret)
0990 return ret;
0991
0992 ret = regmap_write(lmk->regmap, LMK04832_REG_SYNC,
0993 FIELD_PREP(LMK04832_BIT_SYNC_POL, 0) |
0994 FIELD_PREP(LMK04832_BIT_SYNC_EN, 1) |
0995 FIELD_PREP(LMK04832_BIT_SYNC_MODE, lmk->sync_mode));
0996 if (ret)
0997 return ret;
0998
0999 ret = regmap_write(lmk->regmap, LMK04832_REG_SYNC_DIS, 0xff);
1000 if (ret)
1001 return ret;
1002
1003 lmk->sclk.init = &init;
1004 return devm_clk_hw_register(lmk->dev, &lmk->sclk);
1005 }
1006
1007 static int lmk04832_dclk_is_enabled(struct clk_hw *hw)
1008 {
1009 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1010 struct lmk04832 *lmk = dclk->lmk;
1011 unsigned int tmp;
1012 int ret;
1013
1014 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL3(dclk->id),
1015 &tmp);
1016 if (ret)
1017 return ret;
1018
1019 return !FIELD_GET(LMK04832_BIT_DCLKX_Y_PD, tmp);
1020 }
1021
1022 static int lmk04832_dclk_prepare(struct clk_hw *hw)
1023 {
1024 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1025 struct lmk04832 *lmk = dclk->lmk;
1026
1027 return regmap_update_bits(lmk->regmap,
1028 LMK04832_REG_CLKOUT_CTRL3(dclk->id),
1029 LMK04832_BIT_DCLKX_Y_PD, 0x00);
1030 }
1031
1032 static void lmk04832_dclk_unprepare(struct clk_hw *hw)
1033 {
1034 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1035 struct lmk04832 *lmk = dclk->lmk;
1036
1037 regmap_update_bits(lmk->regmap,
1038 LMK04832_REG_CLKOUT_CTRL3(dclk->id),
1039 LMK04832_BIT_DCLKX_Y_PD, 0xff);
1040 }
1041
1042 static unsigned long lmk04832_dclk_recalc_rate(struct clk_hw *hw,
1043 unsigned long prate)
1044 {
1045 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1046 struct lmk04832 *lmk = dclk->lmk;
1047 unsigned int dclk_div;
1048 unsigned int lsb, msb;
1049 unsigned long rate;
1050 int ret;
1051
1052 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL0(dclk->id),
1053 &lsb);
1054 if (ret)
1055 return ret;
1056
1057 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL2(dclk->id),
1058 &msb);
1059 if (ret)
1060 return ret;
1061
1062 dclk_div = FIELD_GET(LMK04832_BIT_DCLK_DIV_MSB, msb) << 8 | lsb;
1063 rate = DIV_ROUND_CLOSEST(prate, dclk_div);
1064
1065 return rate;
1066 };
1067
1068 static long lmk04832_dclk_round_rate(struct clk_hw *hw, unsigned long rate,
1069 unsigned long *prate)
1070 {
1071 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1072 struct lmk04832 *lmk = dclk->lmk;
1073 unsigned long dclk_rate;
1074 unsigned int dclk_div;
1075
1076 dclk_div = DIV_ROUND_CLOSEST(*prate, rate);
1077 dclk_rate = DIV_ROUND_CLOSEST(*prate, dclk_div);
1078
1079 if (dclk_div < 1 || dclk_div > 0x3ff) {
1080 dev_err(lmk->dev, "%s_div out of range\n", clk_hw_get_name(hw));
1081 return -EINVAL;
1082 }
1083
1084 if (rate != dclk_rate)
1085 return -EINVAL;
1086
1087 return dclk_rate;
1088 };
1089
1090 static int lmk04832_dclk_set_rate(struct clk_hw *hw, unsigned long rate,
1091 unsigned long prate)
1092 {
1093 struct lmk_dclk *dclk = container_of(hw, struct lmk_dclk, hw);
1094 struct lmk04832 *lmk = dclk->lmk;
1095 unsigned int dclk_div;
1096 int ret;
1097
1098 dclk_div = DIV_ROUND_CLOSEST(prate, rate);
1099
1100 if (dclk_div > 0x3ff) {
1101 dev_err(lmk->dev, "%s_div out of range\n", clk_hw_get_name(hw));
1102 return -EINVAL;
1103 }
1104
1105
1106 if (dclk_div == 1) {
1107 ret = regmap_update_bits(lmk->regmap,
1108 LMK04832_REG_CLKOUT_CTRL3(dclk->id),
1109 LMK04832_BIT_DCLKX_Y_DCC,
1110 FIELD_PREP(LMK04832_BIT_DCLKX_Y_DCC, 1));
1111 if (ret)
1112 return ret;
1113 }
1114
1115
1116
1117
1118
1119
1120 if (dclk_div == 2 || dclk_div == 3) {
1121 ret = regmap_update_bits(lmk->regmap,
1122 LMK04832_REG_CLKOUT_CTRL2(dclk->id),
1123 LMK04832_BIT_DCLK_DIV_MSB, 0x00);
1124 if (ret)
1125 return ret;
1126
1127 ret = regmap_write(lmk->regmap,
1128 LMK04832_REG_CLKOUT_CTRL0(dclk->id), 0x04);
1129 if (ret)
1130 return ret;
1131 }
1132
1133 ret = regmap_write(lmk->regmap, LMK04832_REG_CLKOUT_CTRL0(dclk->id),
1134 FIELD_GET(0x0ff, dclk_div));
1135 if (ret)
1136 return ret;
1137
1138 ret = regmap_update_bits(lmk->regmap,
1139 LMK04832_REG_CLKOUT_CTRL2(dclk->id),
1140 LMK04832_BIT_DCLK_DIV_MSB,
1141 FIELD_GET(0x300, dclk_div));
1142 if (ret)
1143 return ret;
1144
1145 ret = lmk04832_sclk_sync_sequence(lmk);
1146 if (ret)
1147 dev_err(lmk->dev, "SYNC sequence failed\n");
1148
1149 return ret;
1150 };
1151
1152 static const struct clk_ops lmk04832_dclk_ops = {
1153 .is_enabled = lmk04832_dclk_is_enabled,
1154 .prepare = lmk04832_dclk_prepare,
1155 .unprepare = lmk04832_dclk_unprepare,
1156 .recalc_rate = lmk04832_dclk_recalc_rate,
1157 .round_rate = lmk04832_dclk_round_rate,
1158 .set_rate = lmk04832_dclk_set_rate,
1159 };
1160
1161 static int lmk04832_clkout_is_enabled(struct clk_hw *hw)
1162 {
1163 struct lmk_clkout *clkout = container_of(hw, struct lmk_clkout, hw);
1164 struct lmk04832 *lmk = clkout->lmk;
1165 unsigned int clkoutx_y_pd;
1166 unsigned int sclkx_y_pd;
1167 unsigned int tmp;
1168 u32 enabled;
1169 int ret;
1170 u8 fmt;
1171
1172 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_CTRL2(clkout->id),
1173 &clkoutx_y_pd);
1174 if (ret)
1175 return ret;
1176
1177 enabled = !FIELD_GET(LMK04832_BIT_CLKOUTX_Y_PD, clkoutx_y_pd);
1178
1179 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_SRC_MUX(clkout->id),
1180 &tmp);
1181 if (ret)
1182 return ret;
1183
1184 if (FIELD_GET(LMK04832_BIT_CLKOUT_SRC_MUX, tmp)) {
1185 ret = regmap_read(lmk->regmap,
1186 LMK04832_REG_CLKOUT_CTRL4(clkout->id),
1187 &sclkx_y_pd);
1188 if (ret)
1189 return ret;
1190
1191 enabled = enabled && !FIELD_GET(LMK04832_BIT_SCLK_PD, sclkx_y_pd);
1192 }
1193
1194 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_FMT(clkout->id),
1195 &tmp);
1196 if (ret)
1197 return ret;
1198
1199 if (clkout->id % 2)
1200 fmt = FIELD_GET(0xf0, tmp);
1201 else
1202 fmt = FIELD_GET(0x0f, tmp);
1203
1204 return enabled && !fmt;
1205 }
1206
1207 static int lmk04832_clkout_prepare(struct clk_hw *hw)
1208 {
1209 struct lmk_clkout *clkout = container_of(hw, struct lmk_clkout, hw);
1210 struct lmk04832 *lmk = clkout->lmk;
1211 unsigned int tmp;
1212 int ret;
1213
1214 if (clkout->format == LMK04832_VAL_CLKOUT_FMT_POWERDOWN)
1215 dev_err(lmk->dev, "prepared %s but format is powerdown\n",
1216 clk_hw_get_name(hw));
1217
1218 ret = regmap_update_bits(lmk->regmap,
1219 LMK04832_REG_CLKOUT_CTRL2(clkout->id),
1220 LMK04832_BIT_CLKOUTX_Y_PD, 0x00);
1221 if (ret)
1222 return ret;
1223
1224 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_SRC_MUX(clkout->id),
1225 &tmp);
1226 if (ret)
1227 return ret;
1228
1229 if (FIELD_GET(LMK04832_BIT_CLKOUT_SRC_MUX, tmp)) {
1230 ret = regmap_update_bits(lmk->regmap,
1231 LMK04832_REG_CLKOUT_CTRL4(clkout->id),
1232 LMK04832_BIT_SCLK_PD, 0x00);
1233 if (ret)
1234 return ret;
1235 }
1236
1237 return regmap_update_bits(lmk->regmap,
1238 LMK04832_REG_CLKOUT_FMT(clkout->id),
1239 LMK04832_BIT_CLKOUT_FMT(clkout->id),
1240 clkout->format << 4 * (clkout->id % 2));
1241 }
1242
1243 static void lmk04832_clkout_unprepare(struct clk_hw *hw)
1244 {
1245 struct lmk_clkout *clkout = container_of(hw, struct lmk_clkout, hw);
1246 struct lmk04832 *lmk = clkout->lmk;
1247
1248 regmap_update_bits(lmk->regmap, LMK04832_REG_CLKOUT_FMT(clkout->id),
1249 LMK04832_BIT_CLKOUT_FMT(clkout->id),
1250 0x00);
1251 }
1252
1253 static int lmk04832_clkout_set_parent(struct clk_hw *hw, uint8_t index)
1254 {
1255 struct lmk_clkout *clkout = container_of(hw, struct lmk_clkout, hw);
1256 struct lmk04832 *lmk = clkout->lmk;
1257
1258 return regmap_update_bits(lmk->regmap,
1259 LMK04832_REG_CLKOUT_SRC_MUX(clkout->id),
1260 LMK04832_BIT_CLKOUT_SRC_MUX,
1261 FIELD_PREP(LMK04832_BIT_CLKOUT_SRC_MUX,
1262 index));
1263 }
1264
1265 static uint8_t lmk04832_clkout_get_parent(struct clk_hw *hw)
1266 {
1267 struct lmk_clkout *clkout = container_of(hw, struct lmk_clkout, hw);
1268 struct lmk04832 *lmk = clkout->lmk;
1269 unsigned int tmp;
1270 int ret;
1271
1272 ret = regmap_read(lmk->regmap, LMK04832_REG_CLKOUT_SRC_MUX(clkout->id),
1273 &tmp);
1274 if (ret)
1275 return ret;
1276
1277 return FIELD_GET(LMK04832_BIT_CLKOUT_SRC_MUX, tmp);
1278 }
1279
1280 static const struct clk_ops lmk04832_clkout_ops = {
1281 .is_enabled = lmk04832_clkout_is_enabled,
1282 .prepare = lmk04832_clkout_prepare,
1283 .unprepare = lmk04832_clkout_unprepare,
1284 .set_parent = lmk04832_clkout_set_parent,
1285 .get_parent = lmk04832_clkout_get_parent,
1286 };
1287
1288 static int lmk04832_register_clkout(struct lmk04832 *lmk, const int num)
1289 {
1290 char name[] = "lmk-clkoutXX";
1291 char dclk_name[] = "lmk-dclkXX_YY";
1292 const char *parent_names[2];
1293 struct clk_init_data init;
1294 int dclk_num = num / 2;
1295 int ret;
1296
1297 if (num % 2 == 0) {
1298 sprintf(dclk_name, "lmk-dclk%02d_%02d", num, num + 1);
1299 init.name = dclk_name;
1300 parent_names[0] = clk_hw_get_name(&lmk->vco);
1301 init.ops = &lmk04832_dclk_ops;
1302 init.flags = CLK_SET_RATE_PARENT;
1303 init.num_parents = 1;
1304
1305 lmk->dclk[dclk_num].id = num;
1306 lmk->dclk[dclk_num].lmk = lmk;
1307 lmk->dclk[dclk_num].hw.init = &init;
1308
1309 ret = devm_clk_hw_register(lmk->dev, &lmk->dclk[dclk_num].hw);
1310 if (ret)
1311 return ret;
1312 } else {
1313 sprintf(dclk_name, "lmk-dclk%02d_%02d", num - 1, num);
1314 }
1315
1316 if (of_property_read_string_index(lmk->dev->of_node,
1317 "clock-output-names",
1318 num, &init.name)) {
1319 sprintf(name, "lmk-clkout%02d", num);
1320 init.name = name;
1321 }
1322
1323 parent_names[0] = dclk_name;
1324 parent_names[1] = clk_hw_get_name(&lmk->sclk);
1325 init.parent_names = parent_names;
1326 init.ops = &lmk04832_clkout_ops;
1327 init.flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT;
1328 init.num_parents = ARRAY_SIZE(parent_names);
1329
1330 lmk->clkout[num].id = num;
1331 lmk->clkout[num].lmk = lmk;
1332 lmk->clkout[num].hw.init = &init;
1333 lmk->clk_data->hws[num] = &lmk->clkout[num].hw;
1334
1335
1336 regmap_update_bits(lmk->regmap,
1337 LMK04832_REG_CLKOUT_SRC_MUX(num),
1338 LMK04832_BIT_CLKOUT_SRC_MUX,
1339 FIELD_PREP(LMK04832_BIT_CLKOUT_SRC_MUX,
1340 lmk->clkout[num].sysref));
1341
1342 return devm_clk_hw_register(lmk->dev, &lmk->clkout[num].hw);
1343 }
1344
1345 static int lmk04832_set_spi_rdbk(const struct lmk04832 *lmk, const int rdbk_pin)
1346 {
1347 int reg;
1348 int ret;
1349
1350 dev_info(lmk->dev, "setting up 4-wire mode\n");
1351 ret = regmap_write(lmk->regmap, LMK04832_REG_RST3W,
1352 LMK04832_BIT_SPI_3WIRE_DIS);
1353 if (ret)
1354 return ret;
1355
1356 switch (rdbk_pin) {
1357 case RDBK_CLKIN_SEL0:
1358 reg = LMK04832_REG_CLKIN_SEL0;
1359 break;
1360 case RDBK_CLKIN_SEL1:
1361 reg = LMK04832_REG_CLKIN_SEL1;
1362 break;
1363 case RDBK_RESET:
1364 reg = LMK04832_REG_CLKIN_RST;
1365 break;
1366 default:
1367 return -EINVAL;
1368 }
1369
1370 return regmap_write(lmk->regmap, reg,
1371 FIELD_PREP(LMK04832_BIT_CLKIN_SEL_MUX,
1372 LMK04832_VAL_CLKIN_SEL_MUX_SPI_RDBK) |
1373 FIELD_PREP(LMK04832_BIT_CLKIN_SEL_TYPE,
1374 LMK04832_VAL_CLKIN_SEL_TYPE_OUT));
1375 }
1376
1377 static int lmk04832_probe(struct spi_device *spi)
1378 {
1379 const struct lmk04832_device_info *info;
1380 int rdbk_pin = RDBK_CLKIN_SEL1;
1381 struct device_node *child;
1382 struct lmk04832 *lmk;
1383 u8 tmp[3];
1384 int ret;
1385 int i;
1386
1387 info = &lmk04832_device_info[spi_get_device_id(spi)->driver_data];
1388
1389 lmk = devm_kzalloc(&spi->dev, sizeof(struct lmk04832), GFP_KERNEL);
1390 if (!lmk)
1391 return -ENOMEM;
1392
1393 lmk->dev = &spi->dev;
1394
1395 lmk->oscin = devm_clk_get(lmk->dev, "oscin");
1396 if (IS_ERR(lmk->oscin)) {
1397 dev_err(lmk->dev, "failed to get oscin clock\n");
1398 return PTR_ERR(lmk->oscin);
1399 }
1400
1401 ret = clk_prepare_enable(lmk->oscin);
1402 if (ret)
1403 return ret;
1404
1405 lmk->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset",
1406 GPIOD_OUT_LOW);
1407
1408 lmk->dclk = devm_kcalloc(lmk->dev, info->num_channels >> 1,
1409 sizeof(struct lmk_dclk), GFP_KERNEL);
1410 if (!lmk->dclk) {
1411 ret = -ENOMEM;
1412 goto err_disable_oscin;
1413 }
1414
1415 lmk->clkout = devm_kcalloc(lmk->dev, info->num_channels,
1416 sizeof(*lmk->clkout), GFP_KERNEL);
1417 if (!lmk->clkout) {
1418 ret = -ENOMEM;
1419 goto err_disable_oscin;
1420 }
1421
1422 lmk->clk_data = devm_kzalloc(lmk->dev, struct_size(lmk->clk_data, hws,
1423 info->num_channels),
1424 GFP_KERNEL);
1425 if (!lmk->clk_data) {
1426 ret = -ENOMEM;
1427 goto err_disable_oscin;
1428 }
1429
1430 device_property_read_u32(lmk->dev, "ti,vco-hz", &lmk->vco_rate);
1431
1432 lmk->sysref_ddly = 8;
1433 device_property_read_u32(lmk->dev, "ti,sysref-ddly", &lmk->sysref_ddly);
1434
1435 lmk->sysref_mux = LMK04832_VAL_SYSREF_MUX_CONTINUOUS;
1436 device_property_read_u32(lmk->dev, "ti,sysref-mux",
1437 &lmk->sysref_mux);
1438
1439 lmk->sync_mode = LMK04832_VAL_SYNC_MODE_OFF;
1440 device_property_read_u32(lmk->dev, "ti,sync-mode",
1441 &lmk->sync_mode);
1442
1443 lmk->sysref_pulse_cnt = 4;
1444 device_property_read_u32(lmk->dev, "ti,sysref-pulse-count",
1445 &lmk->sysref_pulse_cnt);
1446
1447 for_each_child_of_node(lmk->dev->of_node, child) {
1448 int reg;
1449
1450 ret = of_property_read_u32(child, "reg", ®);
1451 if (ret) {
1452 dev_err(lmk->dev, "missing reg property in child: %s\n",
1453 child->full_name);
1454 of_node_put(child);
1455 goto err_disable_oscin;
1456 }
1457
1458 of_property_read_u32(child, "ti,clkout-fmt",
1459 &lmk->clkout[reg].format);
1460
1461 if (lmk->clkout[reg].format >= 0x0a && reg % 2 == 0
1462 && reg != 8 && reg != 10)
1463 dev_err(lmk->dev, "invalid format for clkout%02d\n",
1464 reg);
1465
1466 lmk->clkout[reg].sysref =
1467 of_property_read_bool(child, "ti,clkout-sysref");
1468 }
1469
1470 lmk->regmap = devm_regmap_init_spi(spi, ®map_config);
1471 if (IS_ERR(lmk->regmap)) {
1472 dev_err(lmk->dev, "%s: regmap allocation failed: %ld\n",
1473
1474 __func__, PTR_ERR(lmk->regmap));
1475 ret = PTR_ERR(lmk->regmap);
1476 goto err_disable_oscin;
1477 }
1478
1479 regmap_write(lmk->regmap, LMK04832_REG_RST3W, LMK04832_BIT_RESET);
1480
1481 if (!(spi->mode & SPI_3WIRE)) {
1482 device_property_read_u32(lmk->dev, "ti,spi-4wire-rdbk",
1483 &rdbk_pin);
1484 ret = lmk04832_set_spi_rdbk(lmk, rdbk_pin);
1485 if (ret)
1486 goto err_disable_oscin;
1487 }
1488
1489 regmap_bulk_read(lmk->regmap, LMK04832_REG_ID_PROD_MSB, &tmp, 3);
1490 if ((tmp[0] << 8 | tmp[1]) != info->pid || tmp[2] != info->maskrev) {
1491 dev_err(lmk->dev, "unsupported device type: pid 0x%04x, maskrev 0x%02x\n",
1492 tmp[0] << 8 | tmp[1], tmp[2]);
1493 ret = -EINVAL;
1494 goto err_disable_oscin;
1495 }
1496
1497 ret = lmk04832_register_vco(lmk);
1498 if (ret) {
1499 dev_err(lmk->dev, "failed to init device clock path\n");
1500 goto err_disable_oscin;
1501 }
1502
1503 if (lmk->vco_rate) {
1504 dev_info(lmk->dev, "setting VCO rate to %u Hz\n", lmk->vco_rate);
1505 ret = clk_set_rate(lmk->vco.clk, lmk->vco_rate);
1506 if (ret) {
1507 dev_err(lmk->dev, "failed to set VCO rate\n");
1508 goto err_disable_vco;
1509 }
1510 }
1511
1512 ret = lmk04832_register_sclk(lmk);
1513 if (ret) {
1514 dev_err(lmk->dev, "failed to init SYNC/SYSREF clock path\n");
1515 goto err_disable_vco;
1516 }
1517
1518 for (i = 0; i < info->num_channels; i++) {
1519 ret = lmk04832_register_clkout(lmk, i);
1520 if (ret) {
1521 dev_err(lmk->dev, "failed to register clk %d\n", i);
1522 goto err_disable_vco;
1523 }
1524 }
1525
1526 lmk->clk_data->num = info->num_channels;
1527 ret = of_clk_add_hw_provider(lmk->dev->of_node, of_clk_hw_onecell_get,
1528 lmk->clk_data);
1529 if (ret) {
1530 dev_err(lmk->dev, "failed to add provider (%d)\n", ret);
1531 goto err_disable_vco;
1532 }
1533
1534 spi_set_drvdata(spi, lmk);
1535
1536 return 0;
1537
1538 err_disable_vco:
1539 clk_disable_unprepare(lmk->vco.clk);
1540
1541 err_disable_oscin:
1542 clk_disable_unprepare(lmk->oscin);
1543
1544 return ret;
1545 }
1546
1547 static void lmk04832_remove(struct spi_device *spi)
1548 {
1549 struct lmk04832 *lmk = spi_get_drvdata(spi);
1550
1551 clk_disable_unprepare(lmk->oscin);
1552 of_clk_del_provider(spi->dev.of_node);
1553 }
1554 static const struct spi_device_id lmk04832_id[] = {
1555 { "lmk04832", LMK04832 },
1556 {}
1557 };
1558 MODULE_DEVICE_TABLE(spi, lmk04832_id);
1559
1560 static const struct of_device_id lmk04832_of_id[] = {
1561 { .compatible = "ti,lmk04832" },
1562 {}
1563 };
1564 MODULE_DEVICE_TABLE(of, lmk04832_of_id);
1565
1566 static struct spi_driver lmk04832_driver = {
1567 .driver = {
1568 .name = "lmk04832",
1569 .of_match_table = lmk04832_of_id,
1570 },
1571 .probe = lmk04832_probe,
1572 .remove = lmk04832_remove,
1573 .id_table = lmk04832_id,
1574 };
1575 module_spi_driver(lmk04832_driver);
1576
1577 MODULE_AUTHOR("Liam Beguin <lvb@xiphos.com>");
1578 MODULE_DESCRIPTION("Texas Instruments LMK04832");
1579 MODULE_LICENSE("GPL v2");