drivers/net/phy/microchip_rds_ptp.c

Source file repositories/reference/linux-study-clean/drivers/net/phy/microchip_rds_ptp.c

File Facts

System
Linux kernel
Corpus path
drivers/net/phy/microchip_rds_ptp.c
Extension
.c
Size
34008 bytes
Lines
1331
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ts_on_nsec <= sup_on_necs[i]) {
			*pulse_width = i;
			break;
		}
	}

	phydev_info(phydev, "pulse width is %d\n", *pulse_width);
	return 0;
}

static int mchp_general_event_config(struct mchp_rds_ptp_clock *clock,
				     int pulse_width)
{
	int general_config;

	general_config = mchp_rds_phy_read_mmd(clock, MCHP_RDS_PTP_GEN_CFG,
					       MCHP_RDS_PTP_CLOCK);
	if (general_config < 0)
		return general_config;

	general_config &= ~MCHP_RDS_PTP_GEN_CFG_LTC_EVT_MASK;
	general_config |= MCHP_RDS_PTP_GEN_CFG_LTC_EVT_SET(pulse_width);
	general_config &= ~MCHP_RDS_PTP_GEN_CFG_RELOAD_ADD;
	general_config |= MCHP_RDS_PTP_GEN_CFG_POLARITY;

	return mchp_rds_phy_write_mmd(clock, MCHP_RDS_PTP_GEN_CFG,
				      MCHP_RDS_PTP_CLOCK, general_config);
}

static int mchp_set_clock_reload(struct mchp_rds_ptp_clock *clock,
				 s64 period_sec, u32 period_nsec)
{
	int rc;

	rc = mchp_rds_phy_write_mmd(clock,
				    MCHP_RDS_PTP_CLK_TRGT_RELOAD_SEC_LO,
				    MCHP_RDS_PTP_CLOCK,
				    lower_16_bits(period_sec));
	if (rc < 0)
		return rc;

	rc = mchp_rds_phy_write_mmd(clock,
				    MCHP_RDS_PTP_CLK_TRGT_RELOAD_SEC_HI,
				    MCHP_RDS_PTP_CLOCK,
				    upper_16_bits(period_sec));
	if (rc < 0)
		return rc;

	rc = mchp_rds_phy_write_mmd(clock,
				    MCHP_RDS_PTP_CLK_TRGT_RELOAD_NS_LO,
				    MCHP_RDS_PTP_CLOCK,
				    lower_16_bits(period_nsec));
	if (rc < 0)
		return rc;

	return mchp_rds_phy_write_mmd(clock,
				      MCHP_RDS_PTP_CLK_TRGT_RELOAD_NS_HI,
				      MCHP_RDS_PTP_CLOCK,
				      upper_16_bits(period_nsec) & 0x3fff);
}

static int mchp_set_clock_target(struct mchp_rds_ptp_clock *clock,
				 s64 start_sec, u32 start_nsec)
{
	int rc;

	/* Set the start time */
	rc = mchp_rds_phy_write_mmd(clock, MCHP_RDS_PTP_CLK_TRGT_SEC_LO,
				    MCHP_RDS_PTP_CLOCK,
				    lower_16_bits(start_sec));
	if (rc < 0)
		return rc;

	rc = mchp_rds_phy_write_mmd(clock, MCHP_RDS_PTP_CLK_TRGT_SEC_HI,
				    MCHP_RDS_PTP_CLOCK,
				    upper_16_bits(start_sec));
	if (rc < 0)
		return rc;

	rc = mchp_rds_phy_write_mmd(clock, MCHP_RDS_PTP_CLK_TRGT_NS_LO,
				    MCHP_RDS_PTP_CLOCK,
				    lower_16_bits(start_nsec));
	if (rc < 0)
		return rc;

	return mchp_rds_phy_write_mmd(clock, MCHP_RDS_PTP_CLK_TRGT_NS_HI,
				      MCHP_RDS_PTP_CLOCK,
				      upper_16_bits(start_nsec) & 0x3fff);
}

Annotation

Implementation Notes