Lines Matching +full:gpio +full:- +full:out +full:- +full:pol
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/clk-provider.h>
15 #include <linux/platform_data/i2c-xiic.h>
16 #include <linux/platform_data/i2c-ocores.h>
24 #include <linux/nvmem-consumer.h>
441 (void *)((uintptr_t)(bp) + (map)->bp_offset); \
457 uintptr_t addr = (uintptr_t)(bp) + (res)->bp_offset; \
497 --
654 .name = "xiic-i2c",
704 .modalias = "spi-nor",
742 u32 gpio; member
829 .modalias = "spi-nor",
838 .name = "ocores-i2c",
994 .modalias = "spi-nor",
1003 .name = "ocores-i2c",
1009 .reg_io_width = 4, // 32-bit/4-byte
1010 .reg_shift = 2, // 32-bit addressing
1150 return bp->sma_op->init(bp); in ptp_ocp_sma_init()
1156 return bp->sma_op->get(bp, sma_nr); in ptp_ocp_sma_get()
1162 return bp->sma_op->set_inputs(bp, sma_nr, val); in ptp_ocp_sma_set_inputs()
1168 return bp->sma_op->set_output(bp, sma_nr, val); in ptp_ocp_sma_set_output()
1193 return -EINVAL; in ptp_ocp_select_val_from_name()
1206 count--; in ptp_ocp_select_table_show()
1221 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_gettime_locked()
1224 ctrl = ioread32(&bp->reg->ctrl); in __ptp_ocp_gettime_locked()
1230 if (sts && bp->ts_window_adjust) { in __ptp_ocp_gettime_locked()
1231 s64 ns = timespec64_to_ns(&sts->post_ts); in __ptp_ocp_gettime_locked()
1233 sts->post_ts = ns_to_timespec64(ns - bp->ts_window_adjust); in __ptp_ocp_gettime_locked()
1236 time_ns = ioread32(&bp->reg->time_ns); in __ptp_ocp_gettime_locked()
1237 time_sec = ioread32(&bp->reg->time_sec); in __ptp_ocp_gettime_locked()
1239 ts->tv_sec = time_sec; in __ptp_ocp_gettime_locked()
1240 ts->tv_nsec = time_ns; in __ptp_ocp_gettime_locked()
1242 return ctrl & OCP_CTRL_READ_TIME_DONE ? 0 : -ETIMEDOUT; in __ptp_ocp_gettime_locked()
1253 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_gettimex()
1255 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_gettimex()
1266 time_ns = ts->tv_nsec; in __ptp_ocp_settime_locked()
1267 time_sec = ts->tv_sec; in __ptp_ocp_settime_locked()
1269 select = ioread32(&bp->reg->select); in __ptp_ocp_settime_locked()
1270 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_settime_locked()
1272 iowrite32(time_ns, &bp->reg->adjust_ns); in __ptp_ocp_settime_locked()
1273 iowrite32(time_sec, &bp->reg->adjust_sec); in __ptp_ocp_settime_locked()
1276 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_settime_locked()
1279 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_settime_locked()
1288 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_settime()
1290 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_settime()
1300 select = ioread32(&bp->reg->select); in __ptp_ocp_adjtime_locked()
1301 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_adjtime_locked()
1303 iowrite32(adj_val, &bp->reg->offset_ns); in __ptp_ocp_adjtime_locked()
1304 iowrite32(NSEC_PER_SEC, &bp->reg->offset_window_ns); in __ptp_ocp_adjtime_locked()
1307 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_adjtime_locked()
1310 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_adjtime_locked()
1320 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_adjtime_coarse()
1327 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_adjtime_coarse()
1337 if (delta_ns > NSEC_PER_SEC || -delta_ns > NSEC_PER_SEC) { in ptp_ocp_adjtime()
1343 adj_ns = sign ? -delta_ns : delta_ns; in ptp_ocp_adjtime()
1345 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_adjtime()
1347 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_adjtime()
1358 return -EOPNOTSUPP; in ptp_ocp_null_adjfine()
1370 return -EOPNOTSUPP; in ptp_ocp_null_adjphase()
1382 switch (rq->type) { in ptp_ocp_enable()
1385 switch (rq->extts.index) { in ptp_ocp_enable()
1387 ext = bp->ts0; in ptp_ocp_enable()
1390 ext = bp->ts1; in ptp_ocp_enable()
1393 ext = bp->ts2; in ptp_ocp_enable()
1396 ext = bp->ts3; in ptp_ocp_enable()
1399 ext = bp->ts4; in ptp_ocp_enable()
1402 ext = bp->pps; in ptp_ocp_enable()
1408 ext = bp->pps; in ptp_ocp_enable()
1411 switch (rq->perout.index) { in ptp_ocp_enable()
1416 if (on && (rq->perout.period.sec != 1 || in ptp_ocp_enable()
1417 rq->perout.period.nsec != 0)) in ptp_ocp_enable()
1418 return -EINVAL; in ptp_ocp_enable()
1424 req = rq->perout.index - 1; in ptp_ocp_enable()
1425 ext = bp->signal_out[req]; in ptp_ocp_enable()
1426 err = ptp_ocp_signal_from_perout(bp, req, &rq->perout); in ptp_ocp_enable()
1433 return -EOPNOTSUPP; in ptp_ocp_enable()
1436 err = -ENXIO; in ptp_ocp_enable()
1438 err = ext->info->enable(ext, req, on); in ptp_ocp_enable()
1462 snprintf(buf, sizeof(buf), "OUT: GEN%d", chan); in ptp_ocp_verify()
1464 snprintf(buf, sizeof(buf), "OUT: PHC"); in ptp_ocp_verify()
1467 return -EOPNOTSUPP; in ptp_ocp_verify()
1495 select = ioread32(&bp->reg->select); in __ptp_ocp_clear_drift_locked()
1496 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_clear_drift_locked()
1498 iowrite32(0, &bp->reg->drift_ns); in __ptp_ocp_clear_drift_locked()
1501 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_clear_drift_locked()
1504 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_clear_drift_locked()
1512 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_utc_distribute()
1514 bp->utc_tai_offset = val; in ptp_ocp_utc_distribute()
1516 if (bp->irig_out) in ptp_ocp_utc_distribute()
1517 iowrite32(val, &bp->irig_out->adj_sec); in ptp_ocp_utc_distribute()
1518 if (bp->dcf_out) in ptp_ocp_utc_distribute()
1519 iowrite32(val, &bp->dcf_out->adj_sec); in ptp_ocp_utc_distribute()
1520 if (bp->nmea_out) in ptp_ocp_utc_distribute()
1521 iowrite32(val, &bp->nmea_out->adj_sec); in ptp_ocp_utc_distribute()
1523 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_utc_distribute()
1533 status = ioread32(&bp->pps_to_clk->status); in ptp_ocp_watchdog()
1536 iowrite32(status, &bp->pps_to_clk->status); in ptp_ocp_watchdog()
1537 if (!bp->gnss_lost) { in ptp_ocp_watchdog()
1538 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_watchdog()
1540 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_watchdog()
1541 bp->gnss_lost = ktime_get_real_seconds(); in ptp_ocp_watchdog()
1544 } else if (bp->gnss_lost) { in ptp_ocp_watchdog()
1545 bp->gnss_lost = 0; in ptp_ocp_watchdog()
1551 if (bp->tod) { in ptp_ocp_watchdog()
1552 status = ioread32(&bp->tod->utc_status); in ptp_ocp_watchdog()
1555 utc_offset != bp->utc_tai_offset) in ptp_ocp_watchdog()
1559 mod_timer(&bp->watchdog, jiffies + HZ); in ptp_ocp_watchdog()
1570 ctrl = ioread32(&bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1573 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1577 ctrl = ioread32(&bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1581 delay = min(delay, end - start); in ptp_ocp_estimate_pci_timing()
1583 bp->ts_window_adjust = (delay >> 5) * 3; in ptp_ocp_estimate_pci_timing()
1593 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_init_clock()
1596 iowrite32(servo_conf->servo_offset_p, &bp->reg->servo_offset_p); in ptp_ocp_init_clock()
1597 iowrite32(servo_conf->servo_offset_i, &bp->reg->servo_offset_i); in ptp_ocp_init_clock()
1598 iowrite32(servo_conf->servo_drift_p, &bp->reg->servo_drift_p); in ptp_ocp_init_clock()
1599 iowrite32(servo_conf->servo_drift_p, &bp->reg->servo_drift_i); in ptp_ocp_init_clock()
1603 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_init_clock()
1605 if ((ioread32(&bp->reg->ctrl) & OCP_CTRL_ENABLE) == 0) { in ptp_ocp_init_clock()
1606 dev_err(&bp->pdev->dev, "clock not enabled\n"); in ptp_ocp_init_clock()
1607 return -ENODEV; in ptp_ocp_init_clock()
1612 bp->sync = ioread32(&bp->reg->status) & OCP_STATUS_IN_SYNC; in ptp_ocp_init_clock()
1613 if (!bp->sync) { in ptp_ocp_init_clock()
1615 ptp_ocp_settime(&bp->ptp_info, &ts); in ptp_ocp_init_clock()
1619 if (bp->pps_to_clk) { in ptp_ocp_init_clock()
1620 timer_setup(&bp->watchdog, ptp_ocp_watchdog, 0); in ptp_ocp_init_clock()
1621 mod_timer(&bp->watchdog, jiffies + HZ); in ptp_ocp_init_clock()
1632 ctrl = ioread32(&bp->tod->ctrl); in ptp_ocp_tod_init()
1635 iowrite32(ctrl, &bp->tod->ctrl); in ptp_ocp_tod_init()
1637 reg = ioread32(&bp->tod->utc_status); in ptp_ocp_tod_init()
1660 idx = ARRAY_SIZE(gnss_name) - 1; in ptp_ocp_tod_gnss_name()
1683 dev = dev->parent; in ptp_ocp_nvmem_match()
1684 if (!i2c_verify_client(dev) || info->tag != dev->platform_data) in ptp_ocp_nvmem_match()
1687 while ((dev = dev->parent)) in ptp_ocp_nvmem_match()
1688 if (dev->driver && !strcmp(dev->driver->name, KBUILD_MODNAME)) in ptp_ocp_nvmem_match()
1689 return info->bp == dev_get_drvdata(dev); in ptp_ocp_nvmem_match()
1717 if (!bp->i2c_ctrl) in ptp_ocp_read_eeprom()
1723 for (map = bp->eeprom_map; map->len; map++) { in ptp_ocp_read_eeprom()
1724 if (map->tag != tag) { in ptp_ocp_read_eeprom()
1725 tag = map->tag; in ptp_ocp_read_eeprom()
1735 ret = nvmem_device_read(nvmem, map->off, map->len, in ptp_ocp_read_eeprom()
1737 if (ret != map->len) in ptp_ocp_read_eeprom()
1741 bp->has_eeprom_data = true; in ptp_ocp_read_eeprom()
1743 out: in ptp_ocp_read_eeprom()
1748 dev_err(&bp->pdev->dev, "could not read eeprom: %d\n", ret); in ptp_ocp_read_eeprom()
1749 goto out; in ptp_ocp_read_eeprom()
1758 dev = &bp->spi_flash->dev; in ptp_ocp_find_flash()
1780 hdr = (const struct ptp_ocp_firmware_header *)fw->data; in ptp_ocp_devlink_fw_image()
1781 if (memcmp(hdr->magic, OCP_FIRMWARE_MAGIC_HEADER, 4)) { in ptp_ocp_devlink_fw_image()
1785 return -EINVAL; in ptp_ocp_devlink_fw_image()
1788 if (be16_to_cpu(hdr->pci_vendor_id) != bp->pdev->vendor || in ptp_ocp_devlink_fw_image()
1789 be16_to_cpu(hdr->pci_device_id) != bp->pdev->device) { in ptp_ocp_devlink_fw_image()
1793 return -EINVAL; in ptp_ocp_devlink_fw_image()
1797 length = be32_to_cpu(hdr->image_size); in ptp_ocp_devlink_fw_image()
1798 if (length != (fw->size - offset)) { in ptp_ocp_devlink_fw_image()
1802 return -EINVAL; in ptp_ocp_devlink_fw_image()
1805 crc = crc16(0xffff, &fw->data[offset], length); in ptp_ocp_devlink_fw_image()
1806 if (be16_to_cpu(hdr->crc) != crc) { in ptp_ocp_devlink_fw_image()
1810 return -EINVAL; in ptp_ocp_devlink_fw_image()
1813 *data = &fw->data[offset]; in ptp_ocp_devlink_fw_image()
1833 goto out; in ptp_ocp_devlink_flash()
1836 base = bp->flash_start; in ptp_ocp_devlink_flash()
1850 goto out; in ptp_ocp_devlink_flash()
1854 goto out; in ptp_ocp_devlink_flash()
1857 resid -= len; in ptp_ocp_devlink_flash()
1859 out: in ptp_ocp_devlink_flash()
1875 dev_err(&bp->pdev->dev, "Can't find Flash SPI adapter\n"); in ptp_ocp_devlink_flash_update()
1876 return -ENODEV; in ptp_ocp_devlink_flash_update()
1882 err = ptp_ocp_devlink_flash(devlink, dev, params->fw); in ptp_ocp_devlink_flash_update()
1900 fw_image = bp->fw_loader ? "loader" : "fw"; in ptp_ocp_devlink_info_get()
1901 sprintf(buf, "%d.%d", bp->fw_tag, bp->fw_version); in ptp_ocp_devlink_info_get()
1906 if (!bp->has_eeprom_data) { in ptp_ocp_devlink_info_get()
1908 if (!bp->has_eeprom_data) in ptp_ocp_devlink_info_get()
1912 sprintf(buf, "%pM", bp->serial); in ptp_ocp_devlink_info_get()
1919 bp->board_id); in ptp_ocp_devlink_info_get()
1936 return devm_ioremap_resource(&bp->pdev->dev, &res); in __ptp_ocp_get_mem()
1944 start = pci_resource_start(bp->pdev, 0) + r->offset; in ptp_ocp_get_mem()
1945 return __ptp_ocp_get_mem(bp, start, r->size); in ptp_ocp_get_mem()
1952 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_spi()
1958 start = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_register_spi()
1959 res[0] = DEFINE_RES_MEM(start, r->size); in ptp_ocp_register_spi()
1960 res[1] = DEFINE_RES_IRQ(pci_irq_vector(pdev, r->irq_vec)); in ptp_ocp_register_spi()
1962 info = r->extra; in ptp_ocp_register_spi()
1964 id += info->pci_offset; in ptp_ocp_register_spi()
1966 p = platform_device_register_resndata(&pdev->dev, info->name, id, in ptp_ocp_register_spi()
1967 res, ARRAY_SIZE(res), info->data, in ptp_ocp_register_spi()
1968 info->data_size); in ptp_ocp_register_spi()
1984 info = r->extra; in ptp_ocp_i2c_bus()
1985 start = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_i2c_bus()
1986 res[0] = DEFINE_RES_MEM(start, r->size); in ptp_ocp_i2c_bus()
1987 res[1] = DEFINE_RES_IRQ(pci_irq_vector(pdev, r->irq_vec)); in ptp_ocp_i2c_bus()
1989 return platform_device_register_resndata(&pdev->dev, info->name, in ptp_ocp_i2c_bus()
1991 info->data, info->data_size); in ptp_ocp_i2c_bus()
1997 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_i2c()
2004 info = r->extra; in ptp_ocp_register_i2c()
2005 id = pci_dev_id(bp->pdev); in ptp_ocp_register_i2c()
2008 clk = clk_hw_register_fixed_rate(&pdev->dev, buf, NULL, 0, in ptp_ocp_register_i2c()
2009 info->fixed_rate); in ptp_ocp_register_i2c()
2012 bp->i2c_clk = clk; in ptp_ocp_register_i2c()
2014 sprintf(buf, "%s.%d", info->name, id); in ptp_ocp_register_i2c()
2015 devm_clk_hw_register_clkdev(&pdev->dev, clk, NULL, buf); in ptp_ocp_register_i2c()
2016 p = ptp_ocp_i2c_bus(bp->pdev, r, id); in ptp_ocp_register_i2c()
2030 struct signal_reg __iomem *reg = ext->mem; in ptp_ocp_signal_irq()
2031 struct ptp_ocp *bp = ext->bp; in ptp_ocp_signal_irq()
2035 gen = ext->info->index - 1; in ptp_ocp_signal_irq()
2037 enable = ioread32(®->enable); in ptp_ocp_signal_irq()
2038 status = ioread32(®->status); in ptp_ocp_signal_irq()
2042 iowrite32(0, ®->intr_mask); in ptp_ocp_signal_irq()
2043 iowrite32(0, ®->enable); in ptp_ocp_signal_irq()
2044 bp->signal[gen].running = false; in ptp_ocp_signal_irq()
2047 iowrite32(0, ®->intr); /* ack interrupt */ in ptp_ocp_signal_irq()
2060 if (!s->period) in ptp_ocp_signal_set()
2063 if (!s->pulse) in ptp_ocp_signal_set()
2064 s->pulse = ktime_divns(s->period * s->duty, 100); in ptp_ocp_signal_set()
2066 err = ptp_ocp_gettimex(&bp->ptp_info, &ts, &sts); in ptp_ocp_signal_set()
2071 if (!s->start) { in ptp_ocp_signal_set()
2072 /* roundup() does not work on 32-bit systems */ in ptp_ocp_signal_set()
2073 s->start = DIV64_U64_ROUND_UP(start_ns, s->period); in ptp_ocp_signal_set()
2074 s->start *= s->period; in ptp_ocp_signal_set()
2075 s->start = ktime_add(s->start, s->phase); in ptp_ocp_signal_set()
2078 if (s->duty < 1 || s->duty > 99) in ptp_ocp_signal_set()
2079 return -EINVAL; in ptp_ocp_signal_set()
2081 if (s->pulse < 1 || s->pulse > s->period) in ptp_ocp_signal_set()
2082 return -EINVAL; in ptp_ocp_signal_set()
2084 if (s->start < start_ns) in ptp_ocp_signal_set()
2085 return -EINVAL; in ptp_ocp_signal_set()
2087 bp->signal[gen] = *s; in ptp_ocp_signal_set()
2098 if (req->flags & ~(PTP_PEROUT_DUTY_CYCLE | in ptp_ocp_signal_from_perout()
2100 return -EOPNOTSUPP; in ptp_ocp_signal_from_perout()
2102 s.polarity = bp->signal[gen].polarity; in ptp_ocp_signal_from_perout()
2103 s.period = ktime_set(req->period.sec, req->period.nsec); in ptp_ocp_signal_from_perout()
2107 if (req->flags & PTP_PEROUT_DUTY_CYCLE) { in ptp_ocp_signal_from_perout()
2108 s.pulse = ktime_set(req->on.sec, req->on.nsec); in ptp_ocp_signal_from_perout()
2112 if (req->flags & PTP_PEROUT_PHASE) in ptp_ocp_signal_from_perout()
2113 s.phase = ktime_set(req->phase.sec, req->phase.nsec); in ptp_ocp_signal_from_perout()
2115 s.start = ktime_set(req->start.sec, req->start.nsec); in ptp_ocp_signal_from_perout()
2124 struct signal_reg __iomem *reg = ext->mem; in ptp_ocp_signal_enable()
2125 struct ptp_ocp *bp = ext->bp; in ptp_ocp_signal_enable()
2129 gen = ext->info->index - 1; in ptp_ocp_signal_enable()
2131 iowrite32(0, ®->intr_mask); in ptp_ocp_signal_enable()
2132 iowrite32(0, ®->enable); in ptp_ocp_signal_enable()
2133 bp->signal[gen].running = false; in ptp_ocp_signal_enable()
2137 ts = ktime_to_timespec64(bp->signal[gen].start); in ptp_ocp_signal_enable()
2138 iowrite32(ts.tv_sec, ®->start_sec); in ptp_ocp_signal_enable()
2139 iowrite32(ts.tv_nsec, ®->start_ns); in ptp_ocp_signal_enable()
2141 ts = ktime_to_timespec64(bp->signal[gen].period); in ptp_ocp_signal_enable()
2142 iowrite32(ts.tv_sec, ®->period_sec); in ptp_ocp_signal_enable()
2143 iowrite32(ts.tv_nsec, ®->period_ns); in ptp_ocp_signal_enable()
2145 ts = ktime_to_timespec64(bp->signal[gen].pulse); in ptp_ocp_signal_enable()
2146 iowrite32(ts.tv_sec, ®->pulse_sec); in ptp_ocp_signal_enable()
2147 iowrite32(ts.tv_nsec, ®->pulse_ns); in ptp_ocp_signal_enable()
2149 iowrite32(bp->signal[gen].polarity, ®->polarity); in ptp_ocp_signal_enable()
2150 iowrite32(0, ®->repeat_count); in ptp_ocp_signal_enable()
2152 iowrite32(0, ®->intr); /* clear interrupt state */ in ptp_ocp_signal_enable()
2153 iowrite32(1, ®->intr_mask); /* enable interrupt */ in ptp_ocp_signal_enable()
2154 iowrite32(3, ®->enable); /* valid & enable */ in ptp_ocp_signal_enable()
2156 bp->signal[gen].running = true; in ptp_ocp_signal_enable()
2165 struct ts_reg __iomem *reg = ext->mem; in ptp_ocp_ts_irq()
2169 if (ext == ext->bp->pps) { in ptp_ocp_ts_irq()
2170 if (ext->bp->pps_req_map & OCP_REQ_PPS) { in ptp_ocp_ts_irq()
2172 ptp_clock_event(ext->bp->ptp, &ev); in ptp_ocp_ts_irq()
2175 if ((ext->bp->pps_req_map & ~OCP_REQ_PPS) == 0) in ptp_ocp_ts_irq()
2176 goto out; in ptp_ocp_ts_irq()
2179 /* XXX should fix API - this converts s/ns -> ts -> s/ns */ in ptp_ocp_ts_irq()
2180 sec = ioread32(®->time_sec); in ptp_ocp_ts_irq()
2181 nsec = ioread32(®->time_ns); in ptp_ocp_ts_irq()
2184 ev.index = ext->info->index; in ptp_ocp_ts_irq()
2187 ptp_clock_event(ext->bp->ptp, &ev); in ptp_ocp_ts_irq()
2189 out: in ptp_ocp_ts_irq()
2190 iowrite32(1, ®->intr); /* write 1 to ack */ in ptp_ocp_ts_irq()
2199 struct ts_reg __iomem *reg = ext->mem; in ptp_ocp_ts_enable()
2200 struct ptp_ocp *bp = ext->bp; in ptp_ocp_ts_enable()
2202 if (ext == bp->pps) { in ptp_ocp_ts_enable()
2203 u32 old_map = bp->pps_req_map; in ptp_ocp_ts_enable()
2206 bp->pps_req_map |= req; in ptp_ocp_ts_enable()
2208 bp->pps_req_map &= ~req; in ptp_ocp_ts_enable()
2211 if ((!!old_map ^ !!bp->pps_req_map) == 0) in ptp_ocp_ts_enable()
2216 iowrite32(1, ®->enable); in ptp_ocp_ts_enable()
2217 iowrite32(1, ®->intr_mask); in ptp_ocp_ts_enable()
2218 iowrite32(1, ®->intr); in ptp_ocp_ts_enable()
2220 iowrite32(0, ®->intr_mask); in ptp_ocp_ts_enable()
2221 iowrite32(0, ®->enable); in ptp_ocp_ts_enable()
2230 ext->info->enable(ext, ~0, false); in ptp_ocp_unregister_ext()
2231 pci_free_irq(ext->bp->pdev, ext->irq_vec, ext); in ptp_ocp_unregister_ext()
2238 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_ext()
2244 return -ENOMEM; in ptp_ocp_register_ext()
2246 ext->mem = ptp_ocp_get_mem(bp, r); in ptp_ocp_register_ext()
2247 if (IS_ERR(ext->mem)) { in ptp_ocp_register_ext()
2248 err = PTR_ERR(ext->mem); in ptp_ocp_register_ext()
2249 goto out; in ptp_ocp_register_ext()
2252 ext->bp = bp; in ptp_ocp_register_ext()
2253 ext->info = r->extra; in ptp_ocp_register_ext()
2254 ext->irq_vec = r->irq_vec; in ptp_ocp_register_ext()
2256 err = pci_request_irq(pdev, r->irq_vec, ext->info->irq_fcn, NULL, in ptp_ocp_register_ext()
2257 ext, "ocp%d.%s", bp->id, r->name); in ptp_ocp_register_ext()
2259 dev_err(&pdev->dev, "Could not get irq %d\n", r->irq_vec); in ptp_ocp_register_ext()
2260 goto out; in ptp_ocp_register_ext()
2267 out: in ptp_ocp_register_ext()
2275 struct pci_dev *pdev = bp->pdev; in ptp_ocp_serial_line()
2282 uart.port.dev = &pdev->dev; in ptp_ocp_serial_line()
2285 uart.port.mapbase = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_serial_line()
2286 uart.port.irq = pci_irq_vector(pdev, r->irq_vec); in ptp_ocp_serial_line()
2297 struct ptp_ocp_serial_port *p = (struct ptp_ocp_serial_port *)r->extra; in ptp_ocp_register_serial()
2305 port.baud = p->baud; in ptp_ocp_register_serial()
2329 if (!bp->nmea_out) in ptp_ocp_nmea_out_init()
2332 iowrite32(0, &bp->nmea_out->ctrl); /* disable */ in ptp_ocp_nmea_out_init()
2333 iowrite32(7, &bp->nmea_out->uart_baud); /* 115200 */ in ptp_ocp_nmea_out_init()
2334 iowrite32(1, &bp->nmea_out->ctrl); /* enable */ in ptp_ocp_nmea_out_init()
2342 iowrite32(0, ®->enable); /* disable */ in _ptp_ocp_signal_init()
2344 val = ioread32(®->polarity); in _ptp_ocp_signal_init()
2345 s->polarity = val ? true : false; in _ptp_ocp_signal_init()
2346 s->duty = 50; in _ptp_ocp_signal_init()
2355 if (bp->signal_out[i]) in ptp_ocp_signal_init()
2356 _ptp_ocp_signal_init(&bp->signal[i], in ptp_ocp_signal_init()
2357 bp->signal_out[i]->mem); in ptp_ocp_signal_init()
2363 sysfs_remove_groups(&bp->dev.kobj, bp->attr_group); in ptp_ocp_attr_group_del()
2364 kfree(bp->attr_group); in ptp_ocp_attr_group_del()
2376 if (attr_tbl[i].cap & bp->fw_cap) in ptp_ocp_attr_group_add()
2379 bp->attr_group = kcalloc(count + 1, sizeof(*bp->attr_group), in ptp_ocp_attr_group_add()
2381 if (!bp->attr_group) in ptp_ocp_attr_group_add()
2382 return -ENOMEM; in ptp_ocp_attr_group_add()
2386 if (attr_tbl[i].cap & bp->fw_cap) in ptp_ocp_attr_group_add()
2387 bp->attr_group[count++] = attr_tbl[i].group; in ptp_ocp_attr_group_add()
2389 err = sysfs_create_groups(&bp->dev.kobj, bp->attr_group); in ptp_ocp_attr_group_add()
2391 bp->attr_group[0] = NULL; in ptp_ocp_attr_group_add()
2414 return ptp_ocp_enable_fpga(&bp->irig_out->ctrl, in ptp_ocp_irig_out()
2421 return ptp_ocp_enable_fpga(&bp->irig_in->ctrl, in ptp_ocp_irig_in()
2428 return ptp_ocp_enable_fpga(&bp->dcf_out->ctrl, in ptp_ocp_dcf_out()
2435 return ptp_ocp_enable_fpga(&bp->dcf_in->ctrl, in ptp_ocp_dcf_in()
2456 u32 __iomem *gpio; in ptp_ocp_sma_fb_get() local
2459 if (bp->sma[sma_nr - 1].fixed_fcn) in ptp_ocp_sma_fb_get()
2460 return (sma_nr - 1) & 1; in ptp_ocp_sma_fb_get()
2462 if (bp->sma[sma_nr - 1].mode == SMA_MODE_IN) in ptp_ocp_sma_fb_get()
2463 gpio = sma_nr > 2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; in ptp_ocp_sma_fb_get()
2465 gpio = sma_nr > 2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; in ptp_ocp_sma_fb_get()
2468 return (ioread32(gpio) >> shift) & 0xffff; in ptp_ocp_sma_fb_get()
2476 u32 __iomem *gpio; in ptp_ocp_sma_fb_set_output() local
2478 gpio = sma_nr > 2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; in ptp_ocp_sma_fb_set_output()
2481 mask = 0xffff << (16 - shift); in ptp_ocp_sma_fb_set_output()
2483 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_fb_set_output()
2485 reg = ioread32(gpio); in ptp_ocp_sma_fb_set_output()
2490 iowrite32(reg, gpio); in ptp_ocp_sma_fb_set_output()
2492 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_fb_set_output()
2502 u32 __iomem *gpio; in ptp_ocp_sma_fb_set_inputs() local
2504 gpio = sma_nr > 2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; in ptp_ocp_sma_fb_set_inputs()
2507 mask = 0xffff << (16 - shift); in ptp_ocp_sma_fb_set_inputs()
2509 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_fb_set_inputs()
2511 reg = ioread32(gpio); in ptp_ocp_sma_fb_set_inputs()
2516 iowrite32(reg, gpio); in ptp_ocp_sma_fb_set_inputs()
2518 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_fb_set_inputs()
2539 bp->sma[i].default_fcn = i & 1; in ptp_ocp_sma_fb_init()
2540 bp->sma[i].dpll_prop = prop; in ptp_ocp_sma_fb_init()
2541 bp->sma[i].dpll_prop.board_label = in ptp_ocp_sma_fb_init()
2542 bp->ptp_info.pin_config[i].name; in ptp_ocp_sma_fb_init()
2544 bp->sma[0].mode = SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2545 bp->sma[1].mode = SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2546 bp->sma[2].mode = SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2547 bp->sma[3].mode = SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2549 if (!bp->sma_map1) { in ptp_ocp_sma_fb_init()
2551 bp->sma[i].fixed_fcn = true; in ptp_ocp_sma_fb_init()
2552 bp->sma[i].fixed_dir = true; in ptp_ocp_sma_fb_init()
2553 bp->sma[1].dpll_prop.capabilities &= in ptp_ocp_sma_fb_init()
2559 /* If SMA2 GPIO output map is all 1, it is not present. in ptp_ocp_sma_fb_init()
2562 reg = ioread32(&bp->sma_map2->gpio2); in ptp_ocp_sma_fb_init()
2565 bp->sma[i].fixed_dir = true; in ptp_ocp_sma_fb_init()
2567 reg = ioread32(&bp->sma_map1->gpio1); in ptp_ocp_sma_fb_init()
2568 bp->sma[0].mode = reg & BIT(15) ? SMA_MODE_IN : SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2569 bp->sma[1].mode = reg & BIT(31) ? SMA_MODE_IN : SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2571 reg = ioread32(&bp->sma_map1->gpio2); in ptp_ocp_sma_fb_init()
2572 bp->sma[2].mode = reg & BIT(15) ? SMA_MODE_OUT : SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2573 bp->sma[3].mode = reg & BIT(31) ? SMA_MODE_OUT : SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2590 u32 __iomem *gpio; in ptp_ocp_sma_adva_set_output() local
2592 gpio = sma_nr > 2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; in ptp_ocp_sma_adva_set_output()
2595 mask = 0xffff << (16 - shift); in ptp_ocp_sma_adva_set_output()
2597 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_adva_set_output()
2599 reg = ioread32(gpio); in ptp_ocp_sma_adva_set_output()
2602 iowrite32(reg, gpio); in ptp_ocp_sma_adva_set_output()
2604 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_adva_set_output()
2614 u32 __iomem *gpio; in ptp_ocp_sma_adva_set_inputs() local
2616 gpio = sma_nr > 2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; in ptp_ocp_sma_adva_set_inputs()
2619 mask = 0xffff << (16 - shift); in ptp_ocp_sma_adva_set_inputs()
2621 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_adva_set_inputs()
2623 reg = ioread32(gpio); in ptp_ocp_sma_adva_set_inputs()
2626 iowrite32(reg, gpio); in ptp_ocp_sma_adva_set_inputs()
2628 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_adva_set_inputs()
2649 return -ENOMEM; in ptp_ocp_set_pins()
2656 bp->ptp_info.n_pins = 4; in ptp_ocp_set_pins()
2657 bp->ptp_info.pin_config = config; in ptp_ocp_set_pins()
2668 version = ioread32(&bp->image->version); in ptp_ocp_fb_set_version()
2673 bp->fw_loader = true; in ptp_ocp_fb_set_version()
2676 bp->fw_tag = version >> 15; in ptp_ocp_fb_set_version()
2677 bp->fw_version = version & 0x7fff; in ptp_ocp_fb_set_version()
2679 if (bp->fw_tag) { in ptp_ocp_fb_set_version()
2691 bp->fw_cap = cap; in ptp_ocp_fb_set_version()
2700 bp->flash_start = 1024 * 4096; in ptp_ocp_fb_board_init()
2701 bp->eeprom_map = fb_eeprom_map; in ptp_ocp_fb_board_init()
2702 bp->fw_version = ioread32(&bp->image->version); in ptp_ocp_fb_board_init()
2703 bp->sma_op = &ocp_fb_sma_op; in ptp_ocp_fb_board_init()
2704 bp->signals_nr = 4; in ptp_ocp_fb_board_init()
2705 bp->freq_in_nr = 4; in ptp_ocp_fb_board_init()
2722 return ptp_ocp_init_clock(bp, r->extra); in ptp_ocp_fb_board_init()
2728 bool allow = !r->irq_vec || r->irq_vec < bp->n_irqs; in ptp_ocp_allow_irq()
2731 dev_err(&bp->pdev->dev, "irq %d out of range, skipping %s\n", in ptp_ocp_allow_irq()
2732 r->irq_vec, r->name); in ptp_ocp_allow_irq()
2743 for (r = table; r->setup; r++) { in ptp_ocp_register_resources()
2746 err = r->setup(bp, r); in ptp_ocp_register_resources()
2748 dev_err(&bp->pdev->dev, in ptp_ocp_register_resources()
2750 r->name, err); in ptp_ocp_register_resources()
2772 bp->sma[0].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2773 bp->sma[1].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2774 bp->sma[2].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2775 bp->sma[3].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2777 bp->sma[0].default_fcn = 0x08; /* IN: 10Mhz */ in ptp_ocp_art_sma_init()
2778 bp->sma[1].default_fcn = 0x01; /* IN: PPS1 */ in ptp_ocp_art_sma_init()
2779 bp->sma[2].default_fcn = 0x10; /* OUT: 10Mhz */ in ptp_ocp_art_sma_init()
2780 bp->sma[3].default_fcn = 0x02; /* OUT: PHC */ in ptp_ocp_art_sma_init()
2784 bp->sma[i].dpll_prop = prop; in ptp_ocp_art_sma_init()
2785 bp->sma[i].dpll_prop.board_label = in ptp_ocp_art_sma_init()
2786 bp->ptp_info.pin_config[i].name; in ptp_ocp_art_sma_init()
2787 if (!bp->art_sma) { in ptp_ocp_art_sma_init()
2788 bp->sma[i].fixed_fcn = true; in ptp_ocp_art_sma_init()
2789 bp->sma[i].fixed_dir = true; in ptp_ocp_art_sma_init()
2792 reg = ioread32(&bp->art_sma->map[i].gpio); in ptp_ocp_art_sma_init()
2796 bp->sma[i].fixed_fcn = true; in ptp_ocp_art_sma_init()
2797 bp->sma[i].fixed_dir = true; in ptp_ocp_art_sma_init()
2801 bp->sma[i].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2802 bp->sma[i].dpll_prop.capabilities = in ptp_ocp_art_sma_init()
2806 bp->sma[i].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2807 bp->sma[i].dpll_prop.capabilities = in ptp_ocp_art_sma_init()
2817 if (bp->sma[sma_nr - 1].fixed_fcn) in ptp_ocp_art_sma_get()
2818 return bp->sma[sma_nr - 1].default_fcn; in ptp_ocp_art_sma_get()
2820 return ioread32(&bp->art_sma->map[sma_nr - 1].gpio) & 0xff; in ptp_ocp_art_sma_get()
2828 u32 __iomem *gpio; in ptp_ocp_art_sma_set() local
2834 return -EINVAL; in ptp_ocp_art_sma_set()
2836 gpio = &bp->art_sma->map[sma_nr - 1].gpio; in ptp_ocp_art_sma_set()
2838 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_art_sma_set()
2839 reg = ioread32(gpio); in ptp_ocp_art_sma_set()
2841 err = -EOPNOTSUPP; in ptp_ocp_art_sma_set()
2844 iowrite32(reg, gpio); in ptp_ocp_art_sma_set()
2846 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_art_sma_set()
2865 bp->flash_start = 0x1000000; in ptp_ocp_art_board_init()
2866 bp->eeprom_map = art_eeprom_map; in ptp_ocp_art_board_init()
2867 bp->fw_cap = OCP_CAP_BASIC; in ptp_ocp_art_board_init()
2868 bp->fw_version = ioread32(&bp->reg->version); in ptp_ocp_art_board_init()
2869 bp->fw_tag = 2; in ptp_ocp_art_board_init()
2870 bp->sma_op = &ocp_art_sma_op; in ptp_ocp_art_board_init()
2871 bp->signals_nr = 4; in ptp_ocp_art_board_init()
2872 bp->freq_in_nr = 4; in ptp_ocp_art_board_init()
2875 iowrite32(1, &bp->board_config->mro50_serial_activate); in ptp_ocp_art_board_init()
2886 return ptp_ocp_init_clock(bp, r->extra); in ptp_ocp_art_board_init()
2896 bp->flash_start = 0xA00000; in ptp_ocp_adva_board_init()
2897 bp->eeprom_map = fb_eeprom_map; in ptp_ocp_adva_board_init()
2898 bp->sma_op = &ocp_adva_sma_op; in ptp_ocp_adva_board_init()
2899 bp->signals_nr = 2; in ptp_ocp_adva_board_init()
2900 bp->freq_in_nr = 2; in ptp_ocp_adva_board_init()
2902 version = ioread32(&bp->image->version); in ptp_ocp_adva_board_init()
2906 bp->fw_loader = true; in ptp_ocp_adva_board_init()
2908 bp->fw_tag = 3; in ptp_ocp_adva_board_init()
2909 bp->fw_version = version & 0xffff; in ptp_ocp_adva_board_init()
2910 bp->fw_cap = OCP_CAP_BASIC | OCP_CAP_SIGNAL | OCP_CAP_FREQ; in ptp_ocp_adva_board_init()
2925 return ptp_ocp_init_clock(bp, r->extra); in ptp_ocp_adva_board_init()
2935 count = sysfs_emit(buf, "OUT: "); in ptp_ocp_show_output()
2963 count--; in ptp_ocp_show_inputs()
2978 return -ENOMEM; in sma_parse_inputs()
2980 ret = -EINVAL; in sma_parse_inputs()
2982 goto out; in sma_parse_inputs()
2990 if (!strcasecmp("OUT:", argv[0])) { in sma_parse_inputs()
3000 ret = -EINVAL; in sma_parse_inputs()
3002 out: in sma_parse_inputs()
3011 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_show()
3015 tbl = bp->sma_op->tbl; in ptp_ocp_sma_show()
3018 if (sma->mode == SMA_MODE_IN) { in ptp_ocp_sma_show()
3019 if (sma->disabled) in ptp_ocp_sma_show()
3040 return ptp_ocp_sma_show(bp, 2, buf, -1, 1); in sma2_show()
3048 return ptp_ocp_sma_show(bp, 3, buf, -1, 0); in sma3_show()
3056 return ptp_ocp_sma_show(bp, 4, buf, -1, 1); in sma4_show()
3062 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_store_val()
3064 if (sma->fixed_dir && (mode != sma->mode || val & SMA_DISABLE)) in ptp_ocp_sma_store_val()
3065 return -EOPNOTSUPP; in ptp_ocp_sma_store_val()
3067 if (sma->fixed_fcn) { in ptp_ocp_sma_store_val()
3068 if (val != sma->default_fcn) in ptp_ocp_sma_store_val()
3069 return -EOPNOTSUPP; in ptp_ocp_sma_store_val()
3073 sma->disabled = !!(val & SMA_DISABLE); in ptp_ocp_sma_store_val()
3075 if (mode != sma->mode) { in ptp_ocp_sma_store_val()
3080 sma->mode = mode; in ptp_ocp_sma_store_val()
3083 if (!sma->fixed_dir) in ptp_ocp_sma_store_val()
3086 if (sma->disabled) in ptp_ocp_sma_store_val()
3100 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_store()
3104 mode = sma->mode; in ptp_ocp_sma_store()
3105 val = sma_parse_inputs(bp->sma_op->tbl, buf, &mode); in ptp_ocp_sma_store()
3165 return ptp_ocp_select_table_show(bp->sma_op->tbl[0], buf); in available_sma_inputs_show()
3175 return ptp_ocp_select_table_show(bp->sma_op->tbl[1], buf); in available_sma_outputs_show()
3195 int gen = (uintptr_t)ea->var; in signal_store()
3201 return -ENOMEM; in signal_store()
3203 err = -EINVAL; in signal_store()
3204 s.duty = bp->signal[gen].duty; in signal_store()
3205 s.phase = bp->signal[gen].phase; in signal_store()
3206 s.period = bp->signal[gen].period; in signal_store()
3207 s.polarity = bp->signal[gen].polarity; in signal_store()
3211 argc--; in signal_store()
3214 goto out; in signal_store()
3217 argc--; in signal_store()
3220 goto out; in signal_store()
3223 argc--; in signal_store()
3226 goto out; in signal_store()
3229 argc--; in signal_store()
3232 goto out; in signal_store()
3235 goto out; in signal_store()
3240 goto out; in signal_store()
3242 err = ptp_ocp_signal_enable(bp->signal_out[gen], gen, s.period != 0); in signal_store()
3244 out: in signal_store()
3259 i = (uintptr_t)ea->var; in signal_show()
3260 signal = &bp->signal[i]; in signal_show()
3262 count = sysfs_emit(buf, "%llu %d %llu %d", signal->period, in signal_show()
3263 signal->duty, signal->phase, signal->polarity); in signal_show()
3265 ts = ktime_to_timespec64(signal->start); in signal_show()
3280 int i = (uintptr_t)ea->var; in duty_show()
3282 return sysfs_emit(buf, "%d\n", bp->signal[i].duty); in duty_show()
3294 int i = (uintptr_t)ea->var; in period_show()
3296 return sysfs_emit(buf, "%llu\n", bp->signal[i].period); in period_show()
3308 int i = (uintptr_t)ea->var; in phase_show()
3310 return sysfs_emit(buf, "%llu\n", bp->signal[i].phase); in phase_show()
3323 int i = (uintptr_t)ea->var; in polarity_show()
3325 return sysfs_emit(buf, "%d\n", bp->signal[i].polarity); in polarity_show()
3337 int i = (uintptr_t)ea->var; in running_show()
3339 return sysfs_emit(buf, "%d\n", bp->signal[i].running); in running_show()
3351 int i = (uintptr_t)ea->var; in start_show()
3354 ts = ktime_to_timespec64(bp->signal[i].start); in start_show()
3368 int idx = (uintptr_t)ea->var; in seconds_store()
3376 return -EINVAL; in seconds_store()
3381 iowrite32(val, &bp->freq_in[idx]->ctrl); in seconds_store()
3391 int idx = (uintptr_t)ea->var; in seconds_show()
3394 val = ioread32(&bp->freq_in[idx]->ctrl); in seconds_show()
3412 int idx = (uintptr_t)ea->var; in frequency_show()
3415 val = ioread32(&bp->freq_in[idx]->status); in frequency_show()
3435 return sysfs_emit(buf, "ttyS%d", bp->port[(uintptr_t)ea->var].line); in ptp_ocp_tty_show()
3446 if (strncmp(attr->name, "tty", 3)) in ptp_ocp_timecard_tty_is_visible()
3447 return attr->mode; in ptp_ocp_timecard_tty_is_visible()
3451 port = &bp->port[(uintptr_t)ea->var]; in ptp_ocp_timecard_tty_is_visible()
3452 return port->line == -1 ? 0 : 0444; in ptp_ocp_timecard_tty_is_visible()
3482 if (!bp->has_eeprom_data) in serialnum_show()
3485 return sysfs_emit(buf, "%pM\n", bp->serial); in serialnum_show()
3495 if (bp->gnss_lost) in gnss_sync_show()
3496 ret = sysfs_emit(buf, "LOST @ %ptT\n", &bp->gnss_lost); in gnss_sync_show()
3510 return sysfs_emit(buf, "%d\n", bp->utc_tai_offset); in utc_tai_offset_show()
3538 return sysfs_emit(buf, "%d\n", bp->ts_window_adjust); in ts_window_adjust_show()
3554 bp->ts_window_adjust = val; in ts_window_adjust_store()
3566 val = ioread32(&bp->irig_out->ctrl); in irig_b_mode_show()
3586 return -EINVAL; in irig_b_mode_store()
3590 spin_lock_irqsave(&bp->lock, flags); in irig_b_mode_store()
3591 iowrite32(0, &bp->irig_out->ctrl); /* disable */ in irig_b_mode_store()
3592 iowrite32(reg, &bp->irig_out->ctrl); /* change mode */ in irig_b_mode_store()
3593 iowrite32(reg | IRIG_M_CTRL_ENABLE, &bp->irig_out->ctrl); in irig_b_mode_store()
3594 spin_unlock_irqrestore(&bp->lock, flags); in irig_b_mode_store()
3607 select = ioread32(&bp->reg->select); in clock_source_show()
3625 spin_lock_irqsave(&bp->lock, flags); in clock_source_store()
3626 iowrite32(val, &bp->reg->select); in clock_source_store()
3627 spin_unlock_irqrestore(&bp->lock, flags); in clock_source_store()
3649 val = ioread32(&bp->reg->status_drift); in clock_status_drift_show()
3650 res = (val & ~INT_MAX) ? -1 : 1; in clock_status_drift_show()
3664 val = ioread32(&bp->reg->status_offset); in clock_status_offset_show()
3665 res = (val & ~INT_MAX) ? -1 : 1; in clock_status_offset_show()
3679 val = ioread32(&bp->tod->adj_sec); in tod_correction_show()
3680 res = (val & ~INT_MAX) ? -1 : 1; in tod_correction_show()
3698 res *= -1; in tod_correction_store()
3703 spin_lock_irqsave(&bp->lock, flags); in tod_correction_store()
3704 iowrite32(val, &bp->tod->adj_sec); in tod_correction_store()
3705 spin_unlock_irqrestore(&bp->lock, flags); in tod_correction_store()
3772 goto out; in disciplining_config_read()
3776 count = size - off; in disciplining_config_read()
3781 err = -EFAULT; in disciplining_config_read()
3782 goto out; in disciplining_config_read()
3785 out: in disciplining_config_read()
3802 return -EFAULT; in disciplining_config_write()
3810 err = -EFAULT; in disciplining_config_write()
3834 goto out; in temperature_table_read()
3838 count = size - off; in temperature_table_read()
3843 err = -EFAULT; in temperature_table_read()
3844 goto out; in temperature_table_read()
3847 out: in temperature_table_read()
3864 return -EFAULT; in temperature_table_write()
3872 err = -EFAULT; in temperature_table_write()
3989 if (bp->sma[i].mode != SMA_MODE_IN) in gpio_input_map()
3997 def = "----"; in gpio_input_map()
4007 strcpy(ans, "----"); in gpio_output_map()
4009 if (bp->sma[i].mode != SMA_MODE_OUT) in gpio_output_map()
4019 struct signal_reg __iomem *reg = bp->signal_out[nr]->mem; in _signal_summary_show()
4020 struct ptp_ocp_signal *signal = &bp->signal[nr]; in _signal_summary_show()
4025 on = signal->running; in _signal_summary_show()
4027 seq_printf(s, "%7s: %s, period:%llu duty:%d%% phase:%llu pol:%d", in _signal_summary_show()
4029 signal->period, signal->duty, signal->phase, in _signal_summary_show()
4030 signal->polarity); in _signal_summary_show()
4032 val = ioread32(®->enable); in _signal_summary_show()
4034 val = ioread32(®->status); in _signal_summary_show()
4037 seq_printf(s, " start:%llu\n", signal->start); in _signal_summary_show()
4052 val = ioread32(®->ctrl); in _frequency_summary_show()
4060 val = ioread32(®->status); in _frequency_summary_show()
4073 struct device *dev = s->private; in ptp_ocp_summary_show()
4086 return -ENOMEM; in ptp_ocp_summary_show()
4090 seq_printf(s, "%7s: /dev/ptp%d\n", "PTP", ptp_clock_index(bp->ptp)); in ptp_ocp_summary_show()
4092 if (bp->port[i].line != -1) in ptp_ocp_summary_show()
4094 bp->port[i].line); in ptp_ocp_summary_show()
4098 if (bp->sma_map1) { in ptp_ocp_summary_show()
4101 reg = ioread32(&bp->sma_map1->gpio1); in ptp_ocp_summary_show()
4105 reg = ioread32(&bp->sma_map1->gpio2); in ptp_ocp_summary_show()
4109 reg = ioread32(&bp->sma_map2->gpio1); in ptp_ocp_summary_show()
4113 reg = ioread32(&bp->sma_map2->gpio2); in ptp_ocp_summary_show()
4134 if (bp->ts0) { in ptp_ocp_summary_show()
4135 ts_reg = bp->ts0->mem; in ptp_ocp_summary_show()
4136 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4142 if (bp->ts1) { in ptp_ocp_summary_show()
4143 ts_reg = bp->ts1->mem; in ptp_ocp_summary_show()
4144 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4150 if (bp->ts2) { in ptp_ocp_summary_show()
4151 ts_reg = bp->ts2->mem; in ptp_ocp_summary_show()
4152 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4158 if (bp->ts3) { in ptp_ocp_summary_show()
4159 ts_reg = bp->ts3->mem; in ptp_ocp_summary_show()
4160 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4166 if (bp->ts4) { in ptp_ocp_summary_show()
4167 ts_reg = bp->ts4->mem; in ptp_ocp_summary_show()
4168 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4174 if (bp->pps) { in ptp_ocp_summary_show()
4175 ts_reg = bp->pps->mem; in ptp_ocp_summary_show()
4177 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
4178 map = !!(bp->pps_req_map & OCP_REQ_TIMESTAMP); in ptp_ocp_summary_show()
4182 map = !!(bp->pps_req_map & OCP_REQ_PPS); in ptp_ocp_summary_show()
4187 if (bp->fw_cap & OCP_CAP_SIGNAL) in ptp_ocp_summary_show()
4188 for (i = 0; i < bp->signals_nr; i++) in ptp_ocp_summary_show()
4191 if (bp->fw_cap & OCP_CAP_FREQ) in ptp_ocp_summary_show()
4192 for (i = 0; i < bp->freq_in_nr; i++) in ptp_ocp_summary_show()
4193 _frequency_summary_show(s, i, bp->freq_in[i]); in ptp_ocp_summary_show()
4195 if (bp->irig_out) { in ptp_ocp_summary_show()
4196 ctrl = ioread32(&bp->irig_out->ctrl); in ptp_ocp_summary_show()
4198 val = ioread32(&bp->irig_out->status); in ptp_ocp_summary_show()
4200 seq_printf(s, "%7s: %s, error: %d, mode %d, out: %s\n", "IRIG", in ptp_ocp_summary_show()
4204 if (bp->irig_in) { in ptp_ocp_summary_show()
4205 on = ioread32(&bp->irig_in->ctrl) & IRIG_S_CTRL_ENABLE; in ptp_ocp_summary_show()
4206 val = ioread32(&bp->irig_in->status); in ptp_ocp_summary_show()
4212 if (bp->dcf_out) { in ptp_ocp_summary_show()
4213 on = ioread32(&bp->dcf_out->ctrl) & DCF_M_CTRL_ENABLE; in ptp_ocp_summary_show()
4214 val = ioread32(&bp->dcf_out->status); in ptp_ocp_summary_show()
4216 seq_printf(s, "%7s: %s, error: %d, out: %s\n", "DCF", in ptp_ocp_summary_show()
4220 if (bp->dcf_in) { in ptp_ocp_summary_show()
4221 on = ioread32(&bp->dcf_in->ctrl) & DCF_S_CTRL_ENABLE; in ptp_ocp_summary_show()
4222 val = ioread32(&bp->dcf_in->status); in ptp_ocp_summary_show()
4228 if (bp->nmea_out) { in ptp_ocp_summary_show()
4229 on = ioread32(&bp->nmea_out->ctrl) & 1; in ptp_ocp_summary_show()
4230 val = ioread32(&bp->nmea_out->status); in ptp_ocp_summary_show()
4236 if (bp->pps_select) { in ptp_ocp_summary_show()
4237 val = ioread32(&bp->pps_select->gpio1); in ptp_ocp_summary_show()
4248 src = "----"; in ptp_ocp_summary_show()
4261 val = ioread32(&bp->reg->select); in ptp_ocp_summary_show()
4264 sprintf(buf, "----"); in ptp_ocp_summary_show()
4280 bp->sync ? "sync" : "unsynced"); in ptp_ocp_summary_show()
4282 if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, &sts)) { in ptp_ocp_summary_show()
4289 ns += (s64)bp->utc_tai_offset * NSEC_PER_SEC; in ptp_ocp_summary_show()
4296 bp->utc_tai_offset); in ptp_ocp_summary_show()
4298 timespec64_to_ns(&ts) - ns, in ptp_ocp_summary_show()
4299 post_ns - pre_ns); in ptp_ocp_summary_show()
4310 struct device *dev = s->private; in ptp_ocp_tod_status_show()
4317 val = ioread32(&bp->tod->ctrl); in ptp_ocp_tod_status_show()
4331 val = ioread32(&bp->tod->version); in ptp_ocp_tod_status_show()
4335 val = ioread32(&bp->tod->status); in ptp_ocp_tod_status_show()
4338 val = ioread32(&bp->tod->adj_sec); in ptp_ocp_tod_status_show()
4339 idx = (val & ~INT_MAX) ? -1 : 1; in ptp_ocp_tod_status_show()
4343 val = ioread32(&bp->tod->utc_status); in ptp_ocp_tod_status_show()
4351 val = ioread32(&bp->tod->leap); in ptp_ocp_tod_status_show()
4365 d = debugfs_create_dir(dev_name(&bp->dev), ptp_ocp_debugfs_root); in ptp_ocp_debugfs_add_device()
4366 bp->debug_root = d; in ptp_ocp_debugfs_add_device()
4367 debugfs_create_file("summary", 0444, bp->debug_root, in ptp_ocp_debugfs_add_device()
4368 &bp->dev, &ptp_ocp_summary_fops); in ptp_ocp_debugfs_add_device()
4369 if (bp->tod) in ptp_ocp_debugfs_add_device()
4370 debugfs_create_file("tod_status", 0444, bp->debug_root, in ptp_ocp_debugfs_add_device()
4371 &bp->dev, &ptp_ocp_tod_status_fops); in ptp_ocp_debugfs_add_device()
4377 debugfs_remove_recursive(bp->debug_root); in ptp_ocp_debugfs_remove_device()
4398 idr_remove(&ptp_ocp_idr, bp->id); in ptp_ocp_dev_release()
4411 dev_err(&pdev->dev, "idr_alloc failed: %d\n", err); in ptp_ocp_device_init()
4414 bp->id = err; in ptp_ocp_device_init()
4416 bp->ptp_info = ptp_ocp_clock_info; in ptp_ocp_device_init()
4417 spin_lock_init(&bp->lock); in ptp_ocp_device_init()
4420 bp->port[i].line = -1; in ptp_ocp_device_init()
4422 bp->pdev = pdev; in ptp_ocp_device_init()
4424 device_initialize(&bp->dev); in ptp_ocp_device_init()
4425 dev_set_name(&bp->dev, "ocp%d", bp->id); in ptp_ocp_device_init()
4426 bp->dev.class = &timecard_class; in ptp_ocp_device_init()
4427 bp->dev.parent = &pdev->dev; in ptp_ocp_device_init()
4428 bp->dev.release = ptp_ocp_dev_release; in ptp_ocp_device_init()
4429 dev_set_drvdata(&bp->dev, bp); in ptp_ocp_device_init()
4431 err = device_add(&bp->dev); in ptp_ocp_device_init()
4433 dev_err(&bp->dev, "device add failed: %d\n", err); in ptp_ocp_device_init()
4434 goto out; in ptp_ocp_device_init()
4441 out: in ptp_ocp_device_init()
4442 put_device(&bp->dev); in ptp_ocp_device_init()
4449 struct device *dev = &bp->dev; in ptp_ocp_symlink()
4451 if (sysfs_create_link(&dev->kobj, &child->kobj, link)) in ptp_ocp_symlink()
4460 dev = &bp->pdev->dev; in ptp_ocp_link_child()
4478 sprintf(buf, "ptp%d", ptp_clock_index(bp->ptp)); in ptp_ocp_complete()
4481 pps = pps_lookup_dev(bp->ptp); in ptp_ocp_complete()
4483 ptp_ocp_symlink(bp, &pps->dev, "pps"); in ptp_ocp_complete()
4496 version = ioread32(&bp->reg->version); in ptp_ocp_phc_info()
4497 select = ioread32(&bp->reg->select); in ptp_ocp_phc_info()
4498 dev_info(&bp->pdev->dev, "Version %d.%d.%d, clock %s, device ptp%d\n", in ptp_ocp_phc_info()
4501 ptp_clock_index(bp->ptp)); in ptp_ocp_phc_info()
4503 if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, NULL)) in ptp_ocp_phc_info()
4504 dev_info(&bp->pdev->dev, "Time: %lld.%ld, %s\n", in ptp_ocp_phc_info()
4506 bp->sync ? "in-sync" : "UNSYNCED"); in ptp_ocp_phc_info()
4512 if (port != -1) in ptp_ocp_serial_info()
4513 dev_info(dev, "%5s: /dev/ttyS%-2d @ %6d\n", name, port, baud); in ptp_ocp_serial_info()
4524 struct device *dev = &bp->pdev->dev; in ptp_ocp_info()
4531 if (i == PORT_NMEA && bp->nmea_out && bp->port[PORT_NMEA].line != -1) { in ptp_ocp_info()
4532 bp->port[PORT_NMEA].baud = -1; in ptp_ocp_info()
4534 reg = ioread32(&bp->nmea_out->uart_baud); in ptp_ocp_info()
4536 bp->port[PORT_NMEA].baud = nmea_baud[reg]; in ptp_ocp_info()
4538 ptp_ocp_serial_info(dev, ptp_ocp_tty_port_name(i), bp->port[i].line, in ptp_ocp_info()
4539 bp->port[i].baud); in ptp_ocp_info()
4546 struct device *dev = &bp->dev; in ptp_ocp_detach_sysfs()
4548 sysfs_remove_link(&dev->kobj, "ptp"); in ptp_ocp_detach_sysfs()
4549 sysfs_remove_link(&dev->kobj, "pps"); in ptp_ocp_detach_sysfs()
4560 if (timer_pending(&bp->watchdog)) in ptp_ocp_detach()
4561 timer_delete_sync(&bp->watchdog); in ptp_ocp_detach()
4562 if (bp->ts0) in ptp_ocp_detach()
4563 ptp_ocp_unregister_ext(bp->ts0); in ptp_ocp_detach()
4564 if (bp->ts1) in ptp_ocp_detach()
4565 ptp_ocp_unregister_ext(bp->ts1); in ptp_ocp_detach()
4566 if (bp->ts2) in ptp_ocp_detach()
4567 ptp_ocp_unregister_ext(bp->ts2); in ptp_ocp_detach()
4568 if (bp->ts3) in ptp_ocp_detach()
4569 ptp_ocp_unregister_ext(bp->ts3); in ptp_ocp_detach()
4570 if (bp->ts4) in ptp_ocp_detach()
4571 ptp_ocp_unregister_ext(bp->ts4); in ptp_ocp_detach()
4572 if (bp->pps) in ptp_ocp_detach()
4573 ptp_ocp_unregister_ext(bp->pps); in ptp_ocp_detach()
4575 if (bp->signal_out[i]) in ptp_ocp_detach()
4576 ptp_ocp_unregister_ext(bp->signal_out[i]); in ptp_ocp_detach()
4578 if (bp->port[i].line != -1) in ptp_ocp_detach()
4579 serial8250_unregister_port(bp->port[i].line); in ptp_ocp_detach()
4580 platform_device_unregister(bp->spi_flash); in ptp_ocp_detach()
4581 platform_device_unregister(bp->i2c_ctrl); in ptp_ocp_detach()
4582 if (bp->i2c_clk) in ptp_ocp_detach()
4583 clk_hw_unregister_fixed_rate(bp->i2c_clk); in ptp_ocp_detach()
4584 if (bp->n_irqs) in ptp_ocp_detach()
4585 pci_free_irq_vectors(bp->pdev); in ptp_ocp_detach()
4586 if (bp->ptp) in ptp_ocp_detach()
4587 ptp_clock_unregister(bp->ptp); in ptp_ocp_detach()
4588 kfree(bp->ptp_info.pin_config); in ptp_ocp_detach()
4589 device_unregister(&bp->dev); in ptp_ocp_detach()
4600 *status = bp->sync ? DPLL_LOCK_STATUS_LOCKED : DPLL_LOCK_STATUS_UNLOCKED; in ptp_ocp_dpll_lock_status_get()
4613 if (bp->pps_select) { in ptp_ocp_dpll_state_get()
4614 idx = ioread32(&bp->pps_select->gpio1); in ptp_ocp_dpll_state_get()
4615 *state = (&bp->sma[idx] == pin_priv) ? DPLL_PIN_STATE_CONNECTED : in ptp_ocp_dpll_state_get()
4620 return -EINVAL; in ptp_ocp_dpll_state_get()
4639 *direction = sma->mode == SMA_MODE_IN ? in ptp_ocp_dpll_direction_get()
4655 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_direction_set()
4657 if (sma->fixed_dir) in ptp_ocp_dpll_direction_set()
4658 return -EOPNOTSUPP; in ptp_ocp_dpll_direction_set()
4673 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_frequency_set()
4676 if (sma->fixed_fcn) in ptp_ocp_dpll_frequency_set()
4677 return -EOPNOTSUPP; in ptp_ocp_dpll_frequency_set()
4679 tbl = bp->sma_op->tbl[sma->mode]; in ptp_ocp_dpll_frequency_set()
4682 return ptp_ocp_sma_store_val(bp, i, sma->mode, sma_nr + 1); in ptp_ocp_dpll_frequency_set()
4683 return -EINVAL; in ptp_ocp_dpll_frequency_set()
4695 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_frequency_get()
4699 val = bp->sma_op->get(bp, sma_nr + 1); in ptp_ocp_dpll_frequency_get()
4700 tbl = bp->sma_op->tbl[sma->mode]; in ptp_ocp_dpll_frequency_get()
4707 return -EINVAL; in ptp_ocp_dpll_frequency_get()
4730 sync = !!(ioread32(&bp->reg->status) & OCP_STATUS_IN_SYNC); in ptp_ocp_sync_work()
4732 if (bp->sync != sync) in ptp_ocp_sync_work()
4733 dpll_device_change_ntf(bp->dpll); in ptp_ocp_sync_work()
4735 bp->sync = sync; in ptp_ocp_sync_work()
4737 queue_delayed_work(system_power_efficient_wq, &bp->sync_work, HZ); in ptp_ocp_sync_work()
4748 devlink = devlink_alloc(&ptp_ocp_devlink_ops, sizeof(*bp), &pdev->dev); in ptp_ocp_probe()
4750 dev_err(&pdev->dev, "devlink_alloc failed\n"); in ptp_ocp_probe()
4751 return -ENOMEM; in ptp_ocp_probe()
4756 dev_err(&pdev->dev, "pci_enable_device\n"); in ptp_ocp_probe()
4765 INIT_DELAYED_WORK(&bp->sync_work, ptp_ocp_sync_work); in ptp_ocp_probe()
4769 * allow this - if not all of the IRQ's are returned, skip the in ptp_ocp_probe()
4774 dev_err(&pdev->dev, "alloc_irq_vectors err: %d\n", err); in ptp_ocp_probe()
4775 goto out; in ptp_ocp_probe()
4777 bp->n_irqs = err; in ptp_ocp_probe()
4780 err = ptp_ocp_register_resources(bp, id->driver_data); in ptp_ocp_probe()
4782 goto out; in ptp_ocp_probe()
4784 bp->ptp = ptp_clock_register(&bp->ptp_info, &pdev->dev); in ptp_ocp_probe()
4785 if (IS_ERR(bp->ptp)) { in ptp_ocp_probe()
4786 err = PTR_ERR(bp->ptp); in ptp_ocp_probe()
4787 dev_err(&pdev->dev, "ptp_clock_register: %d\n", err); in ptp_ocp_probe()
4788 bp->ptp = NULL; in ptp_ocp_probe()
4789 goto out; in ptp_ocp_probe()
4794 goto out; in ptp_ocp_probe()
4800 bp->dpll = dpll_device_get(clkid, 0, THIS_MODULE); in ptp_ocp_probe()
4801 if (IS_ERR(bp->dpll)) { in ptp_ocp_probe()
4802 err = PTR_ERR(bp->dpll); in ptp_ocp_probe()
4803 dev_err(&pdev->dev, "dpll_device_alloc failed\n"); in ptp_ocp_probe()
4804 goto out; in ptp_ocp_probe()
4807 err = dpll_device_register(bp->dpll, DPLL_TYPE_PPS, &dpll_ops, bp); in ptp_ocp_probe()
4809 goto out; in ptp_ocp_probe()
4812 bp->sma[i].dpll_pin = dpll_pin_get(clkid, i, THIS_MODULE, &bp->sma[i].dpll_prop); in ptp_ocp_probe()
4813 if (IS_ERR(bp->sma[i].dpll_pin)) { in ptp_ocp_probe()
4814 err = PTR_ERR(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4818 err = dpll_pin_register(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, in ptp_ocp_probe()
4819 &bp->sma[i]); in ptp_ocp_probe()
4821 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4825 queue_delayed_work(system_power_efficient_wq, &bp->sync_work, HZ); in ptp_ocp_probe()
4830 --i; in ptp_ocp_probe()
4831 dpll_pin_unregister(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, &bp->sma[i]); in ptp_ocp_probe()
4832 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4834 dpll_device_put(bp->dpll); in ptp_ocp_probe()
4835 out: in ptp_ocp_probe()
4851 cancel_delayed_work_sync(&bp->sync_work); in ptp_ocp_remove()
4853 if (bp->sma[i].dpll_pin) { in ptp_ocp_remove()
4854 dpll_pin_unregister(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, &bp->sma[i]); in ptp_ocp_remove()
4855 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_remove()
4858 dpll_device_unregister(bp->dpll, &dpll_ops, bp); in ptp_ocp_remove()
4859 dpll_device_put(bp->dpll); in ptp_ocp_remove()
4895 while ((dev = dev->parent)) in ptp_ocp_i2c_notifier_call()
4896 if (dev->driver && !strcmp(dev->driver->name, KBUILD_MODNAME)) in ptp_ocp_i2c_notifier_call()
4905 sysfs_remove_link(&bp->dev.kobj, "i2c"); in ptp_ocp_i2c_notifier_call()
4925 goto out; in ptp_ocp_init()
4943 out: in ptp_ocp_init()