static ssize_t xgmac_reg_value_write(struct file *filp, const char __user *buffer, size_t count, loff_t *ppos) { struct xgbe_prv_data *pdata = filp->private_data; unsigned int value; ssize_t len; len = xgbe_common_write(buffer, count, ppos, &value); if (len < 0) return len; XGMAC_IOWRITE(pdata, pdata->debugfs_xgmac_reg, value); return len; }
void xgbe_ptp_register(struct xgbe_prv_data *pdata) { struct ptp_clock_info *info = &pdata->ptp_clock_info; struct ptp_clock *clock; struct cyclecounter *cc = &pdata->tstamp_cc; u64 dividend; snprintf(info->name, sizeof(info->name), "%s", netdev_name(pdata->netdev)); info->owner = THIS_MODULE; info->max_adj = clk_get_rate(pdata->ptpclk); info->adjfreq = xgbe_adjfreq; info->adjtime = xgbe_adjtime; info->gettime = xgbe_gettime; info->settime = xgbe_settime; info->enable = xgbe_enable; clock = ptp_clock_register(info, pdata->dev); if (IS_ERR(clock)) { dev_err(pdata->dev, "ptp_clock_register failed\n"); return; } pdata->ptp_clock = clock; /* Calculate the addend: * addend = 2^32 / (PTP ref clock / 50Mhz) * = (2^32 * 50Mhz) / PTP ref clock */ dividend = 50000000; dividend <<= 32; pdata->tstamp_addend = div_u64(dividend, clk_get_rate(pdata->ptpclk)); /* Setup the timecounter */ cc->read = xgbe_cc_read; cc->mask = CLOCKSOURCE_MASK(64); cc->mult = 1; cc->shift = 0; timecounter_init(&pdata->tstamp_tc, &pdata->tstamp_cc, ktime_to_ns(ktime_get_real())); /* Disable all timestamping to start */ XGMAC_IOWRITE(pdata, MAC_TCR, 0); pdata->tstamp_config.tx_type = HWTSTAMP_TX_OFF; pdata->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; }