File Index
Files and directories
Sign in
FILE

core.c

File preview with syntax highlighting.

linux-6.19.14/drivers/dpll/zl3073x/core.c C
   1// SPDX-License-Identifier: GPL-2.0-only
   2
   3#include <linux/array_size.h>
   4#include <linux/bitfield.h>
   5#include <linux/bits.h>
   6#include <linux/dev_printk.h>
   7#include <linux/device.h>
   8#include <linux/export.h>
   9#include <linux/math64.h>
  10#include <linux/module.h>
  11#include <linux/netlink.h>
  12#include <linux/regmap.h>
  13#include <linux/sprintf.h>
  14#include <linux/string_choices.h>
  15#include <linux/unaligned.h>
  16#include <net/devlink.h>
  17
  18#include "core.h"
  19#include "devlink.h"
  20#include "dpll.h"
  21#include "regs.h"
  22
  23/* Chip IDs for zl30731 */
  24static const u16 zl30731_ids[] = {
  25	0x0E93,
  26	0x1E93,
  27	0x2E93,
  28};
  29
  30const struct zl3073x_chip_info zl30731_chip_info = {
  31	.ids = zl30731_ids,
  32	.num_ids = ARRAY_SIZE(zl30731_ids),
  33	.num_channels = 1,
  34};
  35EXPORT_SYMBOL_NS_GPL(zl30731_chip_info, "ZL3073X");
  36
  37/* Chip IDs for zl30732 */
  38static const u16 zl30732_ids[] = {
  39	0x0E30,
  40	0x0E94,
  41	0x1E94,
  42	0x1F60,
  43	0x2E94,
  44	0x3FC4,
  45};
  46
  47const struct zl3073x_chip_info zl30732_chip_info = {
  48	.ids = zl30732_ids,
  49	.num_ids = ARRAY_SIZE(zl30732_ids),
  50	.num_channels = 2,
  51};
  52EXPORT_SYMBOL_NS_GPL(zl30732_chip_info, "ZL3073X");
  53
  54/* Chip IDs for zl30733 */
  55static const u16 zl30733_ids[] = {
  56	0x0E95,
  57	0x1E95,
  58	0x2E95,
  59};
  60
  61const struct zl3073x_chip_info zl30733_chip_info = {
  62	.ids = zl30733_ids,
  63	.num_ids = ARRAY_SIZE(zl30733_ids),
  64	.num_channels = 3,
  65};
  66EXPORT_SYMBOL_NS_GPL(zl30733_chip_info, "ZL3073X");
  67
  68/* Chip IDs for zl30734 */
  69static const u16 zl30734_ids[] = {
  70	0x0E96,
  71	0x1E96,
  72	0x2E96,
  73};
  74
  75const struct zl3073x_chip_info zl30734_chip_info = {
  76	.ids = zl30734_ids,
  77	.num_ids = ARRAY_SIZE(zl30734_ids),
  78	.num_channels = 4,
  79};
  80EXPORT_SYMBOL_NS_GPL(zl30734_chip_info, "ZL3073X");
  81
  82/* Chip IDs for zl30735 */
  83static const u16 zl30735_ids[] = {
  84	0x0E97,
  85	0x1E97,
  86	0x2E97,
  87};
  88
  89const struct zl3073x_chip_info zl30735_chip_info = {
  90	.ids = zl30735_ids,
  91	.num_ids = ARRAY_SIZE(zl30735_ids),
  92	.num_channels = 5,
  93};
  94EXPORT_SYMBOL_NS_GPL(zl30735_chip_info, "ZL3073X");
  95
  96#define ZL_RANGE_OFFSET		0x80
  97#define ZL_PAGE_SIZE		0x80
  98#define ZL_NUM_PAGES		256
  99#define ZL_PAGE_SEL		0x7F
 100#define ZL_PAGE_SEL_MASK	GENMASK(7, 0)
 101#define ZL_NUM_REGS		(ZL_NUM_PAGES * ZL_PAGE_SIZE)
 102
 103/* Regmap range configuration */
 104static const struct regmap_range_cfg zl3073x_regmap_range = {
 105	.range_min	= ZL_RANGE_OFFSET,
 106	.range_max	= ZL_RANGE_OFFSET + ZL_NUM_REGS - 1,
 107	.selector_reg	= ZL_PAGE_SEL,
 108	.selector_mask	= ZL_PAGE_SEL_MASK,
 109	.selector_shift	= 0,
 110	.window_start	= 0,
 111	.window_len	= ZL_PAGE_SIZE,
 112};
 113
 114static bool
 115zl3073x_is_volatile_reg(struct device *dev __maybe_unused, unsigned int reg)
 116{
 117	/* Only page selector is non-volatile */
 118	return reg != ZL_PAGE_SEL;
 119}
 120
 121const struct regmap_config zl3073x_regmap_config = {
 122	.reg_bits	= 8,
 123	.val_bits	= 8,
 124	.max_register	= ZL_RANGE_OFFSET + ZL_NUM_REGS - 1,
 125	.ranges		= &zl3073x_regmap_range,
 126	.num_ranges	= 1,
 127	.cache_type	= REGCACHE_MAPLE,
 128	.volatile_reg	= zl3073x_is_volatile_reg,
 129};
 130EXPORT_SYMBOL_NS_GPL(zl3073x_regmap_config, "ZL3073X");
 131
 132static bool
 133zl3073x_check_reg(struct zl3073x_dev *zldev, unsigned int reg, size_t size)
 134{
 135	/* Check that multiop lock is held when accessing registers
 136	 * from page 10 and above except the page 255 that does not
 137	 * need this protection.
 138	 */
 139	if (ZL_REG_PAGE(reg) >= 10 && ZL_REG_PAGE(reg) < 255)
 140		lockdep_assert_held(&zldev->multiop_lock);
 141
 142	/* Check the index is in valid range for indexed register */
 143	if (ZL_REG_OFFSET(reg) > ZL_REG_MAX_OFFSET(reg)) {
 144		dev_err(zldev->dev, "Index out of range for reg 0x%04lx\n",
 145			ZL_REG_ADDR(reg));
 146		return false;
 147	}
 148	/* Check the requested size corresponds to register size */
 149	if (ZL_REG_SIZE(reg) != size) {
 150		dev_err(zldev->dev, "Invalid size %zu for reg 0x%04lx\n",
 151			size, ZL_REG_ADDR(reg));
 152		return false;
 153	}
 154
 155	return true;
 156}
 157
 158static int
 159zl3073x_read_reg(struct zl3073x_dev *zldev, unsigned int reg, void *val,
 160		 size_t size)
 161{
 162	int rc;
 163
 164	if (!zl3073x_check_reg(zldev, reg, size))
 165		return -EINVAL;
 166
 167	/* Map the register address to virtual range */
 168	reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
 169
 170	rc = regmap_bulk_read(zldev->regmap, reg, val, size);
 171	if (rc) {
 172		dev_err(zldev->dev, "Failed to read reg 0x%04x: %pe\n", reg,
 173			ERR_PTR(rc));
 174		return rc;
 175	}
 176
 177	return 0;
 178}
 179
 180static int
 181zl3073x_write_reg(struct zl3073x_dev *zldev, unsigned int reg, const void *val,
 182		  size_t size)
 183{
 184	int rc;
 185
 186	if (!zl3073x_check_reg(zldev, reg, size))
 187		return -EINVAL;
 188
 189	/* Map the register address to virtual range */
 190	reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
 191
 192	rc = regmap_bulk_write(zldev->regmap, reg, val, size);
 193	if (rc) {
 194		dev_err(zldev->dev, "Failed to write reg 0x%04x: %pe\n", reg,
 195			ERR_PTR(rc));
 196		return rc;
 197	}
 198
 199	return 0;
 200}
 201
 202/**
 203 * zl3073x_read_u8 - read value from 8bit register
 204 * @zldev: zl3073x device pointer
 205 * @reg: register to write to
 206 * @val: value to write
 207 *
 208 * Reads value from given 8bit register.
 209 *
 210 * Returns: 0 on success, <0 on error
 211 */
 212int zl3073x_read_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 *val)
 213{
 214	return zl3073x_read_reg(zldev, reg, val, sizeof(*val));
 215}
 216
 217/**
 218 * zl3073x_write_u8 - write value to 16bit register
 219 * @zldev: zl3073x device pointer
 220 * @reg: register to write to
 221 * @val: value to write
 222 *
 223 * Writes value into given 8bit register.
 224 *
 225 * Returns: 0 on success, <0 on error
 226 */
 227int zl3073x_write_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 val)
 228{
 229	return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
 230}
 231
 232/**
 233 * zl3073x_read_u16 - read value from 16bit register
 234 * @zldev: zl3073x device pointer
 235 * @reg: register to write to
 236 * @val: value to write
 237 *
 238 * Reads value from given 16bit register.
 239 *
 240 * Returns: 0 on success, <0 on error
 241 */
 242int zl3073x_read_u16(struct zl3073x_dev *zldev, unsigned int reg, u16 *val)
 243{
 244	int rc;
 245
 246	rc = zl3073x_read_reg(zldev, reg, val, sizeof(*val));
 247	if (!rc)
 248		be16_to_cpus(val);
 249
 250	return rc;
 251}
 252
 253/**
 254 * zl3073x_write_u16 - write value to 16bit register
 255 * @zldev: zl3073x device pointer
 256 * @reg: register to write to
 257 * @val: value to write
 258 *
 259 * Writes value into given 16bit register.
 260 *
 261 * Returns: 0 on success, <0 on error
 262 */
 263int zl3073x_write_u16(struct zl3073x_dev *zldev, unsigned int reg, u16 val)
 264{
 265	cpu_to_be16s(&val);
 266
 267	return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
 268}
 269
 270/**
 271 * zl3073x_read_u32 - read value from 32bit register
 272 * @zldev: zl3073x device pointer
 273 * @reg: register to write to
 274 * @val: value to write
 275 *
 276 * Reads value from given 32bit register.
 277 *
 278 * Returns: 0 on success, <0 on error
 279 */
 280int zl3073x_read_u32(struct zl3073x_dev *zldev, unsigned int reg, u32 *val)
 281{
 282	int rc;
 283
 284	rc = zl3073x_read_reg(zldev, reg, val, sizeof(*val));
 285	if (!rc)
 286		be32_to_cpus(val);
 287
 288	return rc;
 289}
 290
 291/**
 292 * zl3073x_write_u32 - write value to 32bit register
 293 * @zldev: zl3073x device pointer
 294 * @reg: register to write to
 295 * @val: value to write
 296 *
 297 * Writes value into given 32bit register.
 298 *
 299 * Returns: 0 on success, <0 on error
 300 */
 301int zl3073x_write_u32(struct zl3073x_dev *zldev, unsigned int reg, u32 val)
 302{
 303	cpu_to_be32s(&val);
 304
 305	return zl3073x_write_reg(zldev, reg, &val, sizeof(val));
 306}
 307
 308/**
 309 * zl3073x_read_u48 - read value from 48bit register
 310 * @zldev: zl3073x device pointer
 311 * @reg: register to write to
 312 * @val: value to write
 313 *
 314 * Reads value from given 48bit register.
 315 *
 316 * Returns: 0 on success, <0 on error
 317 */
 318int zl3073x_read_u48(struct zl3073x_dev *zldev, unsigned int reg, u64 *val)
 319{
 320	u8 buf[6];
 321	int rc;
 322
 323	rc = zl3073x_read_reg(zldev, reg, buf, sizeof(buf));
 324	if (!rc)
 325		*val = get_unaligned_be48(buf);
 326
 327	return rc;
 328}
 329
 330/**
 331 * zl3073x_write_u48 - write value to 48bit register
 332 * @zldev: zl3073x device pointer
 333 * @reg: register to write to
 334 * @val: value to write
 335 *
 336 * Writes value into given 48bit register.
 337 * The value must be from the interval -S48_MIN to U48_MAX.
 338 *
 339 * Returns: 0 on success, <0 on error
 340 */
 341int zl3073x_write_u48(struct zl3073x_dev *zldev, unsigned int reg, u64 val)
 342{
 343	u8 buf[6];
 344
 345	/* Check the value belongs to <S48_MIN, U48_MAX>
 346	 * Any value >= S48_MIN has bits 47..63 set.
 347	 */
 348	if (val > GENMASK_ULL(47, 0) && val < GENMASK_ULL(63, 47)) {
 349		dev_err(zldev->dev, "Value 0x%0llx out of range\n", val);
 350		return -EINVAL;
 351	}
 352
 353	put_unaligned_be48(val, buf);
 354
 355	return zl3073x_write_reg(zldev, reg, buf, sizeof(buf));
 356}
 357
 358/**
 359 * zl3073x_poll_zero_u8 - wait for register to be cleared by device
 360 * @zldev: zl3073x device pointer
 361 * @reg: register to poll (has to be 8bit register)
 362 * @mask: bit mask for polling
 363 *
 364 * Waits for bits specified by @mask in register @reg value to be cleared
 365 * by the device.
 366 *
 367 * Returns: 0 on success, <0 on error
 368 */
 369int zl3073x_poll_zero_u8(struct zl3073x_dev *zldev, unsigned int reg, u8 mask)
 370{
 371	/* Register polling sleep & timeout */
 372#define ZL_POLL_SLEEP_US   10
 373#define ZL_POLL_TIMEOUT_US 2000000
 374	unsigned int val;
 375
 376	/* Check the register is 8bit */
 377	if (ZL_REG_SIZE(reg) != 1) {
 378		dev_err(zldev->dev, "Invalid reg 0x%04lx size for polling\n",
 379			ZL_REG_ADDR(reg));
 380		return -EINVAL;
 381	}
 382
 383	/* Map the register address to virtual range */
 384	reg = ZL_REG_ADDR(reg) + ZL_RANGE_OFFSET;
 385
 386	return regmap_read_poll_timeout(zldev->regmap, reg, val, !(val & mask),
 387					ZL_POLL_SLEEP_US, ZL_POLL_TIMEOUT_US);
 388}
 389
 390int zl3073x_mb_op(struct zl3073x_dev *zldev, unsigned int op_reg, u8 op_val,
 391		  unsigned int mask_reg, u16 mask_val)
 392{
 393	int rc;
 394
 395	/* Set mask for the operation */
 396	rc = zl3073x_write_u16(zldev, mask_reg, mask_val);
 397	if (rc)
 398		return rc;
 399
 400	/* Trigger the operation */
 401	rc = zl3073x_write_u8(zldev, op_reg, op_val);
 402	if (rc)
 403		return rc;
 404
 405	/* Wait for the operation to actually finish */
 406	return zl3073x_poll_zero_u8(zldev, op_reg, op_val);
 407}
 408
 409/**
 410 * zl3073x_do_hwreg_op - Perform HW register read/write operation
 411 * @zldev: zl3073x device pointer
 412 * @op: operation to perform
 413 *
 414 * Performs requested operation and waits for its completion.
 415 *
 416 * Return: 0 on success, <0 on error
 417 */
 418static int
 419zl3073x_do_hwreg_op(struct zl3073x_dev *zldev, u8 op)
 420{
 421	int rc;
 422
 423	/* Set requested operation and set pending bit */
 424	rc = zl3073x_write_u8(zldev, ZL_REG_HWREG_OP, op | ZL_HWREG_OP_PENDING);
 425	if (rc)
 426		return rc;
 427
 428	/* Poll for completion - pending bit cleared */
 429	return zl3073x_poll_zero_u8(zldev, ZL_REG_HWREG_OP,
 430				    ZL_HWREG_OP_PENDING);
 431}
 432
 433/**
 434 * zl3073x_read_hwreg - Read HW register
 435 * @zldev: zl3073x device pointer
 436 * @addr: HW register address
 437 * @value: Value of the HW register
 438 *
 439 * Reads HW register value and stores it into @value.
 440 *
 441 * Return: 0 on success, <0 on error
 442 */
 443int zl3073x_read_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 *value)
 444{
 445	int rc;
 446
 447	/* Set address to read data from */
 448	rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_ADDR, addr);
 449	if (rc)
 450		return rc;
 451
 452	/* Perform the read operation */
 453	rc = zl3073x_do_hwreg_op(zldev, ZL_HWREG_OP_READ);
 454	if (rc)
 455		return rc;
 456
 457	/* Read the received data */
 458	return zl3073x_read_u32(zldev, ZL_REG_HWREG_READ_DATA, value);
 459}
 460
 461/**
 462 * zl3073x_write_hwreg - Write value to HW register
 463 * @zldev: zl3073x device pointer
 464 * @addr: HW registers address
 465 * @value: Value to be written to HW register
 466 *
 467 * Stores the requested value into HW register.
 468 *
 469 * Return: 0 on success, <0 on error
 470 */
 471int zl3073x_write_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 value)
 472{
 473	int rc;
 474
 475	/* Set address to write data to */
 476	rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_ADDR, addr);
 477	if (rc)
 478		return rc;
 479
 480	/* Set data to be written */
 481	rc = zl3073x_write_u32(zldev, ZL_REG_HWREG_WRITE_DATA, value);
 482	if (rc)
 483		return rc;
 484
 485	/* Perform the write operation */
 486	return zl3073x_do_hwreg_op(zldev, ZL_HWREG_OP_WRITE);
 487}
 488
 489/**
 490 * zl3073x_update_hwreg - Update certain bits in HW register
 491 * @zldev: zl3073x device pointer
 492 * @addr: HW register address
 493 * @value: Value to be written into HW register
 494 * @mask: Bitmask indicating bits to be updated
 495 *
 496 * Reads given HW register, updates requested bits specified by value and
 497 * mask and writes result back to HW register.
 498 *
 499 * Return: 0 on success, <0 on error
 500 */
 501int zl3073x_update_hwreg(struct zl3073x_dev *zldev, u32 addr, u32 value,
 502			 u32 mask)
 503{
 504	u32 tmp;
 505	int rc;
 506
 507	rc = zl3073x_read_hwreg(zldev, addr, &tmp);
 508	if (rc)
 509		return rc;
 510
 511	tmp &= ~mask;
 512	tmp |= value & mask;
 513
 514	return zl3073x_write_hwreg(zldev, addr, tmp);
 515}
 516
 517/**
 518 * zl3073x_write_hwreg_seq - Write HW registers sequence
 519 * @zldev: pointer to device structure
 520 * @seq: pointer to first sequence item
 521 * @num_items: number of items in sequence
 522 *
 523 * Writes given HW registers sequence.
 524 *
 525 * Return: 0 on success, <0 on error
 526 */
 527int zl3073x_write_hwreg_seq(struct zl3073x_dev *zldev,
 528			    const struct zl3073x_hwreg_seq_item *seq,
 529			    size_t num_items)
 530{
 531	int i, rc = 0;
 532
 533	for (i = 0; i < num_items; i++) {
 534		dev_dbg(zldev->dev, "Write 0x%0x [0x%0x] to 0x%0x",
 535			seq[i].value, seq[i].mask, seq[i].addr);
 536
 537		if (seq[i].mask == U32_MAX)
 538			/* Write value directly */
 539			rc = zl3073x_write_hwreg(zldev, seq[i].addr,
 540						 seq[i].value);
 541		else
 542			/* Update only bits specified by the mask */
 543			rc = zl3073x_update_hwreg(zldev, seq[i].addr,
 544						  seq[i].value, seq[i].mask);
 545		if (rc)
 546			return rc;
 547
 548		if (seq->wait)
 549			msleep(seq->wait);
 550	}
 551
 552	return rc;
 553}
 554
 555static int
 556zl3073x_dev_state_fetch(struct zl3073x_dev *zldev)
 557{
 558	int rc;
 559	u8 i;
 560
 561	for (i = 0; i < ZL3073X_NUM_REFS; i++) {
 562		rc = zl3073x_ref_state_fetch(zldev, i);
 563		if (rc) {
 564			dev_err(zldev->dev,
 565				"Failed to fetch input state: %pe\n",
 566				ERR_PTR(rc));
 567			return rc;
 568		}
 569	}
 570
 571	for (i = 0; i < ZL3073X_NUM_SYNTHS; i++) {
 572		rc = zl3073x_synth_state_fetch(zldev, i);
 573		if (rc) {
 574			dev_err(zldev->dev,
 575				"Failed to fetch synth state: %pe\n",
 576				ERR_PTR(rc));
 577			return rc;
 578		}
 579	}
 580
 581	for (i = 0; i < ZL3073X_NUM_OUTS; i++) {
 582		rc = zl3073x_out_state_fetch(zldev, i);
 583		if (rc) {
 584			dev_err(zldev->dev,
 585				"Failed to fetch output state: %pe\n",
 586				ERR_PTR(rc));
 587			return rc;
 588		}
 589	}
 590
 591	return rc;
 592}
 593
 594static void
 595zl3073x_dev_ref_status_update(struct zl3073x_dev *zldev)
 596{
 597	int i, rc;
 598
 599	for (i = 0; i < ZL3073X_NUM_REFS; i++) {
 600		rc = zl3073x_read_u8(zldev, ZL_REG_REF_MON_STATUS(i),
 601				     &zldev->ref[i].mon_status);
 602		if (rc)
 603			dev_warn(zldev->dev,
 604				 "Failed to get REF%u status: %pe\n", i,
 605				 ERR_PTR(rc));
 606	}
 607}
 608
 609/**
 610 * zl3073x_ref_phase_offsets_update - update reference phase offsets
 611 * @zldev: pointer to zl3073x_dev structure
 612 * @channel: DPLL channel number or -1
 613 *
 614 * The function asks device to update phase offsets latch registers with
 615 * the latest measured values. There are 2 sets of latch registers:
 616 *
 617 * 1) Up to 5 DPLL-to-connected-ref registers that contain phase offset
 618 *    values between particular DPLL channel and its *connected* input
 619 *    reference.
 620 *
 621 * 2) 10 selected-DPLL-to-all-ref registers that contain phase offset values
 622 *    between selected DPLL channel and all input references.
 623 *
 624 * If the caller is interested in 2) then it has to pass DPLL channel number
 625 * in @channel parameter. If it is interested only in 1) then it should pass
 626 * @channel parameter with value of -1.
 627 *
 628 * Return: 0 on success, <0 on error
 629 */
 630int zl3073x_ref_phase_offsets_update(struct zl3073x_dev *zldev, int channel)
 631{
 632	int rc;
 633
 634	/* Per datasheet we have to wait for 'dpll_ref_phase_err_rqst_rd'
 635	 * to be zero to ensure that the measured data are coherent.
 636	 */
 637	rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
 638				  ZL_REF_PHASE_ERR_READ_RQST_RD);
 639	if (rc)
 640		return rc;
 641
 642	/* Select DPLL channel if it is specified */
 643	if (channel != -1) {
 644		rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_IDX, channel);
 645		if (rc)
 646			return rc;
 647	}
 648
 649	/* Request to update phase offsets measurement values */
 650	rc = zl3073x_write_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
 651			      ZL_REF_PHASE_ERR_READ_RQST_RD);
 652	if (rc)
 653		return rc;
 654
 655	/* Wait for finish */
 656	return zl3073x_poll_zero_u8(zldev, ZL_REG_REF_PHASE_ERR_READ_RQST,
 657				    ZL_REF_PHASE_ERR_READ_RQST_RD);
 658}
 659
 660/**
 661 * zl3073x_ref_ffo_update - update reference fractional frequency offsets
 662 * @zldev: pointer to zl3073x_dev structure
 663 *
 664 * The function asks device to update fractional frequency offsets latch
 665 * registers the latest measured values, reads and stores them into
 666 *
 667 * Return: 0 on success, <0 on error
 668 */
 669static int
 670zl3073x_ref_ffo_update(struct zl3073x_dev *zldev)
 671{
 672	int i, rc;
 673
 674	/* Per datasheet we have to wait for 'ref_freq_meas_ctrl' to be zero
 675	 * to ensure that the measured data are coherent.
 676	 */
 677	rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
 678				  ZL_REF_FREQ_MEAS_CTRL);
 679	if (rc)
 680		return rc;
 681
 682	/* Select all references for measurement */
 683	rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_MASK_3_0,
 684			      GENMASK(7, 0)); /* REF0P..REF3N */
 685	if (rc)
 686		return rc;
 687	rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_MASK_4,
 688			      GENMASK(1, 0)); /* REF4P..REF4N */
 689	if (rc)
 690		return rc;
 691
 692	/* Request frequency offset measurement */
 693	rc = zl3073x_write_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
 694			      ZL_REF_FREQ_MEAS_CTRL_REF_FREQ_OFF);
 695	if (rc)
 696		return rc;
 697
 698	/* Wait for finish */
 699	rc = zl3073x_poll_zero_u8(zldev, ZL_REG_REF_FREQ_MEAS_CTRL,
 700				  ZL_REF_FREQ_MEAS_CTRL);
 701	if (rc)
 702		return rc;
 703
 704	/* Read DPLL-to-REFx frequency offset measurements */
 705	for (i = 0; i < ZL3073X_NUM_REFS; i++) {
 706		s32 value;
 707
 708		/* Read value stored in units of 2^-32 signed */
 709		rc = zl3073x_read_u32(zldev, ZL_REG_REF_FREQ(i), &value);
 710		if (rc)
 711			return rc;
 712
 713		/* Convert to ppm -> ffo = (10^6 * value) / 2^32 */
 714		zldev->ref[i].ffo = mul_s64_u64_shr(value, 1000000, 32);
 715	}
 716
 717	return 0;
 718}
 719
 720static void
 721zl3073x_dev_periodic_work(struct kthread_work *work)
 722{
 723	struct zl3073x_dev *zldev = container_of(work, struct zl3073x_dev,
 724						 work.work);
 725	struct zl3073x_dpll *zldpll;
 726	int rc;
 727
 728	/* Update input references status */
 729	zl3073x_dev_ref_status_update(zldev);
 730
 731	/* Update DPLL-to-connected-ref phase offsets registers */
 732	rc = zl3073x_ref_phase_offsets_update(zldev, -1);
 733	if (rc)
 734		dev_warn(zldev->dev, "Failed to update phase offsets: %pe\n",
 735			 ERR_PTR(rc));
 736
 737	/* Update references' fractional frequency offsets */
 738	rc = zl3073x_ref_ffo_update(zldev);
 739	if (rc)
 740		dev_warn(zldev->dev,
 741			 "Failed to update fractional frequency offsets: %pe\n",
 742			 ERR_PTR(rc));
 743
 744	list_for_each_entry(zldpll, &zldev->dplls, list)
 745		zl3073x_dpll_changes_check(zldpll);
 746
 747	/* Run twice a second */
 748	kthread_queue_delayed_work(zldev->kworker, &zldev->work,
 749				   msecs_to_jiffies(500));
 750}
 751
 752int zl3073x_dev_phase_avg_factor_set(struct zl3073x_dev *zldev, u8 factor)
 753{
 754	u8 dpll_meas_ctrl, value;
 755	int rc;
 756
 757	/* Read DPLL phase measurement control register */
 758	rc = zl3073x_read_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, &dpll_meas_ctrl);
 759	if (rc)
 760		return rc;
 761
 762	/* Convert requested factor to register value */
 763	value = (factor + 1) & 0x0f;
 764
 765	/* Update phase measurement control register */
 766	dpll_meas_ctrl &= ~ZL_DPLL_MEAS_CTRL_AVG_FACTOR;
 767	dpll_meas_ctrl |= FIELD_PREP(ZL_DPLL_MEAS_CTRL_AVG_FACTOR, value);
 768	rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, dpll_meas_ctrl);
 769	if (rc)
 770		return rc;
 771
 772	/* Save the new factor */
 773	zldev->phase_avg_factor = factor;
 774
 775	return 0;
 776}
 777
 778/**
 779 * zl3073x_dev_phase_meas_setup - setup phase offset measurement
 780 * @zldev: pointer to zl3073x_dev structure
 781 *
 782 * Enable phase offset measurement block, set measurement averaging factor
 783 * and enable DPLL-to-its-ref phase measurement for all DPLLs.
 784 *
 785 * Returns: 0 on success, <0 on error
 786 */
 787static int
 788zl3073x_dev_phase_meas_setup(struct zl3073x_dev *zldev)
 789{
 790	struct zl3073x_dpll *zldpll;
 791	u8 dpll_meas_ctrl, mask = 0;
 792	int rc;
 793
 794	/* Setup phase measurement averaging factor */
 795	rc = zl3073x_dev_phase_avg_factor_set(zldev, zldev->phase_avg_factor);
 796	if (rc)
 797		return rc;
 798
 799	/* Read DPLL phase measurement control register */
 800	rc = zl3073x_read_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, &dpll_meas_ctrl);
 801	if (rc)
 802		return rc;
 803
 804	/* Enable DPLL measurement block */
 805	dpll_meas_ctrl |= ZL_DPLL_MEAS_CTRL_EN;
 806
 807	/* Update phase measurement control register */
 808	rc = zl3073x_write_u8(zldev, ZL_REG_DPLL_MEAS_CTRL, dpll_meas_ctrl);
 809	if (rc)
 810		return rc;
 811
 812	/* Enable DPLL-to-connected-ref measurement for each channel */
 813	list_for_each_entry(zldpll, &zldev->dplls, list)
 814		mask |= BIT(zldpll->id);
 815
 816	return zl3073x_write_u8(zldev, ZL_REG_DPLL_PHASE_ERR_READ_MASK, mask);
 817}
 818
 819/**
 820 * zl3073x_dev_start - Start normal operation
 821 * @zldev: zl3073x device pointer
 822 * @full: perform full initialization
 823 *
 824 * The function starts normal operation, which means registering all DPLLs and
 825 * their pins, and starting monitoring. If full initialization is requested,
 826 * the function additionally initializes the phase offset measurement block and
 827 * fetches hardware-invariant parameters.
 828 *
 829 * Return: 0 on success, <0 on error
 830 */
 831int zl3073x_dev_start(struct zl3073x_dev *zldev, bool full)
 832{
 833	struct zl3073x_dpll *zldpll;
 834	u8 info;
 835	int rc;
 836
 837	rc = zl3073x_read_u8(zldev, ZL_REG_INFO, &info);
 838	if (rc) {
 839		dev_err(zldev->dev, "Failed to read device status info\n");
 840		return rc;
 841	}
 842
 843	if (!FIELD_GET(ZL_INFO_READY, info)) {
 844		/* The ready bit indicates that the firmware was successfully
 845		 * configured and is ready for normal operation. If it is
 846		 * cleared then the configuration stored in flash is wrong
 847		 * or missing. In this situation the driver will expose
 848		 * only devlink interface to give an opportunity to flash
 849		 * the correct config.
 850		 */
 851		dev_info(zldev->dev,
 852			 "FW not fully ready - missing or corrupted config\n");
 853
 854		return 0;
 855	}
 856
 857	if (full) {
 858		/* Fetch device state */
 859		rc = zl3073x_dev_state_fetch(zldev);
 860		if (rc)
 861			return rc;
 862
 863		/* Setup phase offset measurement block */
 864		rc = zl3073x_dev_phase_meas_setup(zldev);
 865		if (rc) {
 866			dev_err(zldev->dev,
 867				"Failed to setup phase measurement\n");
 868			return rc;
 869		}
 870	}
 871
 872	/* Register all DPLLs */
 873	list_for_each_entry(zldpll, &zldev->dplls, list) {
 874		rc = zl3073x_dpll_register(zldpll);
 875		if (rc) {
 876			dev_err_probe(zldev->dev, rc,
 877				      "Failed to register DPLL%u\n",
 878				      zldpll->id);
 879			return rc;
 880		}
 881	}
 882
 883	/* Perform initial firmware fine phase correction */
 884	rc = zl3073x_dpll_init_fine_phase_adjust(zldev);
 885	if (rc) {
 886		dev_err_probe(zldev->dev, rc,
 887			      "Failed to init fine phase correction\n");
 888		return rc;
 889	}
 890
 891	/* Start monitoring */
 892	kthread_queue_delayed_work(zldev->kworker, &zldev->work, 0);
 893
 894	return 0;
 895}
 896
 897/**
 898 * zl3073x_dev_stop - Stop normal operation
 899 * @zldev: zl3073x device pointer
 900 *
 901 * The function stops the normal operation that mean deregistration of all
 902 * DPLLs and their pins and stop monitoring.
 903 *
 904 * Return: 0 on success, <0 on error
 905 */
 906void zl3073x_dev_stop(struct zl3073x_dev *zldev)
 907{
 908	struct zl3073x_dpll *zldpll;
 909
 910	/* Stop monitoring */
 911	kthread_cancel_delayed_work_sync(&zldev->work);
 912
 913	/* Unregister all DPLLs */
 914	list_for_each_entry(zldpll, &zldev->dplls, list) {
 915		if (zldpll->dpll_dev)
 916			zl3073x_dpll_unregister(zldpll);
 917	}
 918}
 919
 920static void zl3073x_dev_dpll_fini(void *ptr)
 921{
 922	struct zl3073x_dpll *zldpll, *next;
 923	struct zl3073x_dev *zldev = ptr;
 924
 925	/* Stop monitoring and unregister DPLLs */
 926	zl3073x_dev_stop(zldev);
 927
 928	/* Destroy monitoring thread */
 929	if (zldev->kworker) {
 930		kthread_destroy_worker(zldev->kworker);
 931		zldev->kworker = NULL;
 932	}
 933
 934	/* Free all DPLLs */
 935	list_for_each_entry_safe(zldpll, next, &zldev->dplls, list) {
 936		list_del(&zldpll->list);
 937		zl3073x_dpll_free(zldpll);
 938	}
 939}
 940
 941static int
 942zl3073x_devm_dpll_init(struct zl3073x_dev *zldev, u8 num_dplls)
 943{
 944	struct kthread_worker *kworker;
 945	struct zl3073x_dpll *zldpll;
 946	unsigned int i;
 947	int rc;
 948
 949	INIT_LIST_HEAD(&zldev->dplls);
 950
 951	/* Allocate all DPLLs */
 952	for (i = 0; i < num_dplls; i++) {
 953		zldpll = zl3073x_dpll_alloc(zldev, i);
 954		if (IS_ERR(zldpll)) {
 955			dev_err_probe(zldev->dev, PTR_ERR(zldpll),
 956				      "Failed to alloc DPLL%u\n", i);
 957			rc = PTR_ERR(zldpll);
 958			goto error;
 959		}
 960
 961		list_add_tail(&zldpll->list, &zldev->dplls);
 962	}
 963
 964	/* Initialize monitoring thread */
 965	kthread_init_delayed_work(&zldev->work, zl3073x_dev_periodic_work);
 966	kworker = kthread_run_worker(0, "zl3073x-%s", dev_name(zldev->dev));
 967	if (IS_ERR(kworker)) {
 968		rc = PTR_ERR(kworker);
 969		goto error;
 970	}
 971	zldev->kworker = kworker;
 972
 973	/* Start normal operation */
 974	rc = zl3073x_dev_start(zldev, true);
 975	if (rc) {
 976		dev_err_probe(zldev->dev, rc, "Failed to start device\n");
 977		goto error;
 978	}
 979
 980	/* Add devres action to release DPLL related resources */
 981	return devm_add_action_or_reset(zldev->dev, zl3073x_dev_dpll_fini, zldev);
 982
 983error:
 984	zl3073x_dev_dpll_fini(zldev);
 985
 986	return rc;
 987}
 988
 989/**
 990 * zl3073x_dev_probe - initialize zl3073x device
 991 * @zldev: pointer to zl3073x device
 992 * @chip_info: chip info based on compatible
 993 *
 994 * Common initialization of zl3073x device structure.
 995 *
 996 * Returns: 0 on success, <0 on error
 997 */
 998int zl3073x_dev_probe(struct zl3073x_dev *zldev,
 999		      const struct zl3073x_chip_info *chip_info)
1000{
1001	u16 id, revision, fw_ver;
1002	unsigned int i;
1003	u32 cfg_ver;
1004	int rc;
1005
1006	/* Read chip ID */
1007	rc = zl3073x_read_u16(zldev, ZL_REG_ID, &id);
1008	if (rc)
1009		return rc;
1010
1011	/* Check it matches */
1012	for (i = 0; i < chip_info->num_ids; i++) {
1013		if (id == chip_info->ids[i])
1014			break;
1015	}
1016
1017	if (i == chip_info->num_ids) {
1018		return dev_err_probe(zldev->dev, -ENODEV,
1019				     "Unknown or non-match chip ID: 0x%0x\n",
1020				     id);
1021	}
1022	zldev->chip_id = id;
1023
1024	/* Read revision, firmware version and custom config version */
1025	rc = zl3073x_read_u16(zldev, ZL_REG_REVISION, &revision);
1026	if (rc)
1027		return rc;
1028	rc = zl3073x_read_u16(zldev, ZL_REG_FW_VER, &fw_ver);
1029	if (rc)
1030		return rc;
1031	rc = zl3073x_read_u32(zldev, ZL_REG_CUSTOM_CONFIG_VER, &cfg_ver);
1032	if (rc)
1033		return rc;
1034
1035	dev_dbg(zldev->dev, "ChipID(%X), ChipRev(%X), FwVer(%u)\n", id,
1036		revision, fw_ver);
1037	dev_dbg(zldev->dev, "Custom config version: %lu.%lu.%lu.%lu\n",
1038		FIELD_GET(GENMASK(31, 24), cfg_ver),
1039		FIELD_GET(GENMASK(23, 16), cfg_ver),
1040		FIELD_GET(GENMASK(15, 8), cfg_ver),
1041		FIELD_GET(GENMASK(7, 0), cfg_ver));
1042
1043	/* Generate random clock ID as the device has not such property that
1044	 * could be used for this purpose. A user can later change this value
1045	 * using devlink.
1046	 */
1047	zldev->clock_id = get_random_u64();
1048
1049	/* Default phase offset averaging factor */
1050	zldev->phase_avg_factor = 2;
1051
1052	/* Initialize mutex for operations where multiple reads, writes
1053	 * and/or polls are required to be done atomically.
1054	 */
1055	rc = devm_mutex_init(zldev->dev, &zldev->multiop_lock);
1056	if (rc)
1057		return dev_err_probe(zldev->dev, rc,
1058				     "Failed to initialize mutex\n");
1059
1060	/* Register DPLL channels */
1061	rc = zl3073x_devm_dpll_init(zldev, chip_info->num_channels);
1062	if (rc)
1063		return rc;
1064
1065	/* Register the devlink instance and parameters */
1066	rc = zl3073x_devlink_register(zldev);
1067	if (rc)
1068		return dev_err_probe(zldev->dev, rc,
1069				     "Failed to register devlink instance\n");
1070
1071	return 0;
1072}
1073EXPORT_SYMBOL_NS_GPL(zl3073x_dev_probe, "ZL3073X");
1074
1075MODULE_AUTHOR("Ivan Vecera <ivecera@redhat.com>");
1076MODULE_DESCRIPTION("Microchip ZL3073x core driver");
1077MODULE_LICENSE("GPL");
~/ Read-only file preview.