static void bfin_mac_hwtstamp_init(struct net_device *netdev) { struct bfin_mac_local *lp = netdev_priv(netdev); u64 append; append = PTP_CLK * (1ULL << 32); do_div(append, get_sclk()); bfin_write_EMAC_PTP_ADDEND((u32)append); memset(&lp->cycles, 0, sizeof(lp->cycles)); lp->cycles.read = bfin_read_clock; lp->cycles.mask = CLOCKSOURCE_MASK(64); lp->cycles.mult = 1000000000 / PTP_CLK; lp->cycles.shift = 0; memset(&lp->compare, 0, sizeof(lp->compare)); lp->compare.source = &lp->clock; lp->compare.target = ktime_get_real; lp->compare.num_samples = 10; lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE; lp->stamp_cfg.tx_type = HWTSTAMP_TX_OFF; }
static void bfin_mac_hwtstamp_init(struct net_device *netdev) { struct bfin_mac_local *lp = netdev_priv(netdev); u64 addend, ppb; u32 input_clk, phc_clk; /* Initialize hardware timer */ input_clk = get_sclk(); phc_clk = bfin_select_phc_clock(input_clk, &lp->shift); addend = phc_clk * (1ULL << 32); do_div(addend, input_clk); bfin_write_EMAC_PTP_ADDEND((u32)addend); lp->addend = addend; ppb = 1000000000ULL * input_clk; do_div(ppb, phc_clk); lp->max_ppb = ppb - 1000000000ULL - 1ULL; /* Initialize hwstamp config */ lp->stamp_cfg.rx_filter = HWTSTAMP_FILTER_NONE; lp->stamp_cfg.tx_type = HWTSTAMP_TX_OFF; }
static int bfin_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb) { u64 adj; u32 diff, addend; int neg_adj = 0; struct bfin_mac_local *lp = container_of(ptp, struct bfin_mac_local, caps); if (ppb < 0) { neg_adj = 1; ppb = -ppb; } addend = lp->addend; adj = addend; adj *= ppb; diff = div_u64(adj, 1000000000ULL); addend = neg_adj ? addend - diff : addend + diff; bfin_write_EMAC_PTP_ADDEND(addend); return 0; }