Lines Matching +full:ext +full:- +full:gen

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>
393 static int ptp_ocp_signal_from_perout(struct ptp_ocp *bp, int gen,
417 (void *)((uintptr_t)(bp) + (map)->bp_offset); \
433 uintptr_t addr = (uintptr_t)(bp) + (res)->bp_offset; \
473 --
630 .name = "xiic-i2c",
680 .modalias = "spi-nor",
799 .modalias = "spi-nor",
808 .name = "ocores-i2c",
864 { .name = "EXT", .value = 0xff },
931 return bp->sma_op->init(bp); in ptp_ocp_sma_init()
937 return bp->sma_op->get(bp, sma_nr); in ptp_ocp_sma_get()
943 return bp->sma_op->set_inputs(bp, sma_nr, val); in ptp_ocp_sma_set_inputs()
949 return bp->sma_op->set_output(bp, sma_nr, val); in ptp_ocp_sma_set_output()
974 return -EINVAL; in ptp_ocp_select_val_from_name()
987 count--; in ptp_ocp_select_table_show()
1002 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_gettime_locked()
1005 ctrl = ioread32(&bp->reg->ctrl); in __ptp_ocp_gettime_locked()
1011 if (sts && bp->ts_window_adjust) { in __ptp_ocp_gettime_locked()
1012 s64 ns = timespec64_to_ns(&sts->post_ts); in __ptp_ocp_gettime_locked()
1014 sts->post_ts = ns_to_timespec64(ns - bp->ts_window_adjust); in __ptp_ocp_gettime_locked()
1017 time_ns = ioread32(&bp->reg->time_ns); in __ptp_ocp_gettime_locked()
1018 time_sec = ioread32(&bp->reg->time_sec); in __ptp_ocp_gettime_locked()
1020 ts->tv_sec = time_sec; in __ptp_ocp_gettime_locked()
1021 ts->tv_nsec = time_ns; in __ptp_ocp_gettime_locked()
1023 return ctrl & OCP_CTRL_READ_TIME_DONE ? 0 : -ETIMEDOUT; in __ptp_ocp_gettime_locked()
1034 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_gettimex()
1036 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_gettimex()
1047 time_ns = ts->tv_nsec; in __ptp_ocp_settime_locked()
1048 time_sec = ts->tv_sec; in __ptp_ocp_settime_locked()
1050 select = ioread32(&bp->reg->select); in __ptp_ocp_settime_locked()
1051 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_settime_locked()
1053 iowrite32(time_ns, &bp->reg->adjust_ns); in __ptp_ocp_settime_locked()
1054 iowrite32(time_sec, &bp->reg->adjust_sec); in __ptp_ocp_settime_locked()
1057 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_settime_locked()
1060 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_settime_locked()
1069 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_settime()
1071 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_settime()
1081 select = ioread32(&bp->reg->select); in __ptp_ocp_adjtime_locked()
1082 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_adjtime_locked()
1084 iowrite32(adj_val, &bp->reg->offset_ns); in __ptp_ocp_adjtime_locked()
1085 iowrite32(NSEC_PER_SEC, &bp->reg->offset_window_ns); in __ptp_ocp_adjtime_locked()
1088 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_adjtime_locked()
1091 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_adjtime_locked()
1101 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_adjtime_coarse()
1108 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_adjtime_coarse()
1118 if (delta_ns > NSEC_PER_SEC || -delta_ns > NSEC_PER_SEC) { in ptp_ocp_adjtime()
1124 adj_ns = sign ? -delta_ns : delta_ns; in ptp_ocp_adjtime()
1126 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_adjtime()
1128 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_adjtime()
1139 return -EOPNOTSUPP; in ptp_ocp_null_adjfine()
1151 return -EOPNOTSUPP; in ptp_ocp_null_adjphase()
1159 struct ptp_ocp_ext_src *ext = NULL; in ptp_ocp_enable() local
1163 switch (rq->type) { in ptp_ocp_enable()
1166 switch (rq->extts.index) { in ptp_ocp_enable()
1168 ext = bp->ts0; in ptp_ocp_enable()
1171 ext = bp->ts1; in ptp_ocp_enable()
1174 ext = bp->ts2; in ptp_ocp_enable()
1177 ext = bp->ts3; in ptp_ocp_enable()
1180 ext = bp->ts4; in ptp_ocp_enable()
1183 ext = bp->pps; in ptp_ocp_enable()
1189 ext = bp->pps; in ptp_ocp_enable()
1192 switch (rq->perout.index) { in ptp_ocp_enable()
1197 if (on && (rq->perout.period.sec != 1 || in ptp_ocp_enable()
1198 rq->perout.period.nsec != 0)) in ptp_ocp_enable()
1199 return -EINVAL; in ptp_ocp_enable()
1205 req = rq->perout.index - 1; in ptp_ocp_enable()
1206 ext = bp->signal_out[req]; in ptp_ocp_enable()
1207 err = ptp_ocp_signal_from_perout(bp, req, &rq->perout); in ptp_ocp_enable()
1214 return -EOPNOTSUPP; in ptp_ocp_enable()
1217 err = -ENXIO; in ptp_ocp_enable()
1218 if (ext) in ptp_ocp_enable()
1219 err = ext->info->enable(ext, req, on); in ptp_ocp_enable()
1243 snprintf(buf, sizeof(buf), "OUT: GEN%d", chan); in ptp_ocp_verify()
1248 return -EOPNOTSUPP; in ptp_ocp_verify()
1276 select = ioread32(&bp->reg->select); in __ptp_ocp_clear_drift_locked()
1277 iowrite32(OCP_SELECT_CLK_REG, &bp->reg->select); in __ptp_ocp_clear_drift_locked()
1279 iowrite32(0, &bp->reg->drift_ns); in __ptp_ocp_clear_drift_locked()
1282 iowrite32(ctrl, &bp->reg->ctrl); in __ptp_ocp_clear_drift_locked()
1285 iowrite32(select >> 16, &bp->reg->select); in __ptp_ocp_clear_drift_locked()
1293 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_utc_distribute()
1295 bp->utc_tai_offset = val; in ptp_ocp_utc_distribute()
1297 if (bp->irig_out) in ptp_ocp_utc_distribute()
1298 iowrite32(val, &bp->irig_out->adj_sec); in ptp_ocp_utc_distribute()
1299 if (bp->dcf_out) in ptp_ocp_utc_distribute()
1300 iowrite32(val, &bp->dcf_out->adj_sec); in ptp_ocp_utc_distribute()
1301 if (bp->nmea_out) in ptp_ocp_utc_distribute()
1302 iowrite32(val, &bp->nmea_out->adj_sec); in ptp_ocp_utc_distribute()
1304 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_utc_distribute()
1314 status = ioread32(&bp->pps_to_clk->status); in ptp_ocp_watchdog()
1317 iowrite32(status, &bp->pps_to_clk->status); in ptp_ocp_watchdog()
1318 if (!bp->gnss_lost) { in ptp_ocp_watchdog()
1319 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_watchdog()
1321 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_watchdog()
1322 bp->gnss_lost = ktime_get_real_seconds(); in ptp_ocp_watchdog()
1325 } else if (bp->gnss_lost) { in ptp_ocp_watchdog()
1326 bp->gnss_lost = 0; in ptp_ocp_watchdog()
1332 if (bp->tod) { in ptp_ocp_watchdog()
1333 status = ioread32(&bp->tod->utc_status); in ptp_ocp_watchdog()
1336 utc_offset != bp->utc_tai_offset) in ptp_ocp_watchdog()
1340 mod_timer(&bp->watchdog, jiffies + HZ); in ptp_ocp_watchdog()
1350 ctrl = ioread32(&bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1353 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1357 ctrl = ioread32(&bp->reg->ctrl); in ptp_ocp_estimate_pci_timing()
1361 delay = end - start; in ptp_ocp_estimate_pci_timing()
1362 bp->ts_window_adjust = (delay >> 5) * 3; in ptp_ocp_estimate_pci_timing()
1372 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_init_clock()
1376 iowrite32(0x2000, &bp->reg->servo_offset_p); in ptp_ocp_init_clock()
1377 iowrite32(0x1000, &bp->reg->servo_offset_i); in ptp_ocp_init_clock()
1378 iowrite32(0, &bp->reg->servo_drift_p); in ptp_ocp_init_clock()
1379 iowrite32(0, &bp->reg->servo_drift_i); in ptp_ocp_init_clock()
1383 iowrite32(ctrl, &bp->reg->ctrl); in ptp_ocp_init_clock()
1385 if ((ioread32(&bp->reg->ctrl) & OCP_CTRL_ENABLE) == 0) { in ptp_ocp_init_clock()
1386 dev_err(&bp->pdev->dev, "clock not enabled\n"); in ptp_ocp_init_clock()
1387 return -ENODEV; in ptp_ocp_init_clock()
1392 bp->sync = ioread32(&bp->reg->status) & OCP_STATUS_IN_SYNC; in ptp_ocp_init_clock()
1393 if (!bp->sync) { in ptp_ocp_init_clock()
1395 ptp_ocp_settime(&bp->ptp_info, &ts); in ptp_ocp_init_clock()
1399 if (bp->pps_to_clk) { in ptp_ocp_init_clock()
1400 timer_setup(&bp->watchdog, ptp_ocp_watchdog, 0); in ptp_ocp_init_clock()
1401 mod_timer(&bp->watchdog, jiffies + HZ); in ptp_ocp_init_clock()
1412 ctrl = ioread32(&bp->tod->ctrl); in ptp_ocp_tod_init()
1415 iowrite32(ctrl, &bp->tod->ctrl); in ptp_ocp_tod_init()
1417 reg = ioread32(&bp->tod->utc_status); in ptp_ocp_tod_init()
1440 idx = ARRAY_SIZE(gnss_name) - 1; in ptp_ocp_tod_gnss_name()
1454 dev = dev->parent; in ptp_ocp_nvmem_match()
1455 if (!i2c_verify_client(dev) || info->tag != dev->platform_data) in ptp_ocp_nvmem_match()
1458 while ((dev = dev->parent)) in ptp_ocp_nvmem_match()
1459 if (dev->driver && !strcmp(dev->driver->name, KBUILD_MODNAME)) in ptp_ocp_nvmem_match()
1460 return info->bp == dev_get_drvdata(dev); in ptp_ocp_nvmem_match()
1488 if (!bp->i2c_ctrl) in ptp_ocp_read_eeprom()
1494 for (map = bp->eeprom_map; map->len; map++) { in ptp_ocp_read_eeprom()
1495 if (map->tag != tag) { in ptp_ocp_read_eeprom()
1496 tag = map->tag; in ptp_ocp_read_eeprom()
1506 ret = nvmem_device_read(nvmem, map->off, map->len, in ptp_ocp_read_eeprom()
1508 if (ret != map->len) in ptp_ocp_read_eeprom()
1512 bp->has_eeprom_data = true; in ptp_ocp_read_eeprom()
1519 dev_err(&bp->pdev->dev, "could not read eeprom: %d\n", ret); in ptp_ocp_read_eeprom()
1529 dev = &bp->spi_flash->dev; in ptp_ocp_find_flash()
1551 hdr = (const struct ptp_ocp_firmware_header *)fw->data; in ptp_ocp_devlink_fw_image()
1552 if (memcmp(hdr->magic, OCP_FIRMWARE_MAGIC_HEADER, 4)) { in ptp_ocp_devlink_fw_image()
1556 return -EINVAL; in ptp_ocp_devlink_fw_image()
1559 if (be16_to_cpu(hdr->pci_vendor_id) != bp->pdev->vendor || in ptp_ocp_devlink_fw_image()
1560 be16_to_cpu(hdr->pci_device_id) != bp->pdev->device) { in ptp_ocp_devlink_fw_image()
1564 return -EINVAL; in ptp_ocp_devlink_fw_image()
1568 length = be32_to_cpu(hdr->image_size); in ptp_ocp_devlink_fw_image()
1569 if (length != (fw->size - offset)) { in ptp_ocp_devlink_fw_image()
1573 return -EINVAL; in ptp_ocp_devlink_fw_image()
1576 crc = crc16(0xffff, &fw->data[offset], length); in ptp_ocp_devlink_fw_image()
1577 if (be16_to_cpu(hdr->crc) != crc) { in ptp_ocp_devlink_fw_image()
1581 return -EINVAL; in ptp_ocp_devlink_fw_image()
1584 *data = &fw->data[offset]; in ptp_ocp_devlink_fw_image()
1607 base = bp->flash_start; in ptp_ocp_devlink_flash()
1628 resid -= len; in ptp_ocp_devlink_flash()
1646 dev_err(&bp->pdev->dev, "Can't find Flash SPI adapter\n"); in ptp_ocp_devlink_flash_update()
1647 return -ENODEV; in ptp_ocp_devlink_flash_update()
1653 err = ptp_ocp_devlink_flash(devlink, dev, params->fw); in ptp_ocp_devlink_flash_update()
1671 fw_image = bp->fw_loader ? "loader" : "fw"; in ptp_ocp_devlink_info_get()
1672 sprintf(buf, "%d.%d", bp->fw_tag, bp->fw_version); in ptp_ocp_devlink_info_get()
1677 if (!bp->has_eeprom_data) { in ptp_ocp_devlink_info_get()
1679 if (!bp->has_eeprom_data) in ptp_ocp_devlink_info_get()
1683 sprintf(buf, "%pM", bp->serial); in ptp_ocp_devlink_info_get()
1690 bp->board_id); in ptp_ocp_devlink_info_get()
1707 return devm_ioremap_resource(&bp->pdev->dev, &res); in __ptp_ocp_get_mem()
1715 start = pci_resource_start(bp->pdev, 0) + r->offset; in ptp_ocp_get_mem()
1716 return __ptp_ocp_get_mem(bp, start, r->size); in ptp_ocp_get_mem()
1723 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_spi()
1729 start = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_register_spi()
1730 res[0] = DEFINE_RES_MEM(start, r->size); in ptp_ocp_register_spi()
1731 res[1] = DEFINE_RES_IRQ(pci_irq_vector(pdev, r->irq_vec)); in ptp_ocp_register_spi()
1733 info = r->extra; in ptp_ocp_register_spi()
1735 id += info->pci_offset; in ptp_ocp_register_spi()
1737 p = platform_device_register_resndata(&pdev->dev, info->name, id, in ptp_ocp_register_spi()
1738 res, ARRAY_SIZE(res), info->data, in ptp_ocp_register_spi()
1739 info->data_size); in ptp_ocp_register_spi()
1755 info = r->extra; in ptp_ocp_i2c_bus()
1756 start = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_i2c_bus()
1757 res[0] = DEFINE_RES_MEM(start, r->size); in ptp_ocp_i2c_bus()
1758 res[1] = DEFINE_RES_IRQ(pci_irq_vector(pdev, r->irq_vec)); in ptp_ocp_i2c_bus()
1760 return platform_device_register_resndata(&pdev->dev, info->name, in ptp_ocp_i2c_bus()
1762 info->data, info->data_size); in ptp_ocp_i2c_bus()
1768 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_i2c()
1775 info = r->extra; in ptp_ocp_register_i2c()
1776 id = pci_dev_id(bp->pdev); in ptp_ocp_register_i2c()
1779 clk = clk_hw_register_fixed_rate(&pdev->dev, buf, NULL, 0, in ptp_ocp_register_i2c()
1780 info->fixed_rate); in ptp_ocp_register_i2c()
1783 bp->i2c_clk = clk; in ptp_ocp_register_i2c()
1785 sprintf(buf, "%s.%d", info->name, id); in ptp_ocp_register_i2c()
1786 devm_clk_hw_register_clkdev(&pdev->dev, clk, NULL, buf); in ptp_ocp_register_i2c()
1787 p = ptp_ocp_i2c_bus(bp->pdev, r, id); in ptp_ocp_register_i2c()
1800 struct ptp_ocp_ext_src *ext = priv; in ptp_ocp_signal_irq() local
1801 struct signal_reg __iomem *reg = ext->mem; in ptp_ocp_signal_irq()
1802 struct ptp_ocp *bp = ext->bp; in ptp_ocp_signal_irq()
1804 int gen; in ptp_ocp_signal_irq() local
1806 gen = ext->info->index - 1; in ptp_ocp_signal_irq()
1808 enable = ioread32(&reg->enable); in ptp_ocp_signal_irq()
1809 status = ioread32(&reg->status); in ptp_ocp_signal_irq()
1813 iowrite32(0, &reg->intr_mask); in ptp_ocp_signal_irq()
1814 iowrite32(0, &reg->enable); in ptp_ocp_signal_irq()
1815 bp->signal[gen].running = false; in ptp_ocp_signal_irq()
1818 iowrite32(0, &reg->intr); /* ack interrupt */ in ptp_ocp_signal_irq()
1824 ptp_ocp_signal_set(struct ptp_ocp *bp, int gen, struct ptp_ocp_signal *s) in ptp_ocp_signal_set() argument
1831 if (!s->period) in ptp_ocp_signal_set()
1834 if (!s->pulse) in ptp_ocp_signal_set()
1835 s->pulse = ktime_divns(s->period * s->duty, 100); in ptp_ocp_signal_set()
1837 err = ptp_ocp_gettimex(&bp->ptp_info, &ts, &sts); in ptp_ocp_signal_set()
1842 if (!s->start) { in ptp_ocp_signal_set()
1843 /* roundup() does not work on 32-bit systems */ in ptp_ocp_signal_set()
1844 s->start = DIV64_U64_ROUND_UP(start_ns, s->period); in ptp_ocp_signal_set()
1845 s->start = ktime_add(s->start, s->phase); in ptp_ocp_signal_set()
1848 if (s->duty < 1 || s->duty > 99) in ptp_ocp_signal_set()
1849 return -EINVAL; in ptp_ocp_signal_set()
1851 if (s->pulse < 1 || s->pulse > s->period) in ptp_ocp_signal_set()
1852 return -EINVAL; in ptp_ocp_signal_set()
1854 if (s->start < start_ns) in ptp_ocp_signal_set()
1855 return -EINVAL; in ptp_ocp_signal_set()
1857 bp->signal[gen] = *s; in ptp_ocp_signal_set()
1863 ptp_ocp_signal_from_perout(struct ptp_ocp *bp, int gen, in ptp_ocp_signal_from_perout() argument
1868 s.polarity = bp->signal[gen].polarity; in ptp_ocp_signal_from_perout()
1869 s.period = ktime_set(req->period.sec, req->period.nsec); in ptp_ocp_signal_from_perout()
1873 if (req->flags & PTP_PEROUT_DUTY_CYCLE) { in ptp_ocp_signal_from_perout()
1874 s.pulse = ktime_set(req->on.sec, req->on.nsec); in ptp_ocp_signal_from_perout()
1878 if (req->flags & PTP_PEROUT_PHASE) in ptp_ocp_signal_from_perout()
1879 s.phase = ktime_set(req->phase.sec, req->phase.nsec); in ptp_ocp_signal_from_perout()
1881 s.start = ktime_set(req->start.sec, req->start.nsec); in ptp_ocp_signal_from_perout()
1883 return ptp_ocp_signal_set(bp, gen, &s); in ptp_ocp_signal_from_perout()
1889 struct ptp_ocp_ext_src *ext = priv; in ptp_ocp_signal_enable() local
1890 struct signal_reg __iomem *reg = ext->mem; in ptp_ocp_signal_enable()
1891 struct ptp_ocp *bp = ext->bp; in ptp_ocp_signal_enable()
1893 int gen; in ptp_ocp_signal_enable() local
1895 gen = ext->info->index - 1; in ptp_ocp_signal_enable()
1897 iowrite32(0, &reg->intr_mask); in ptp_ocp_signal_enable()
1898 iowrite32(0, &reg->enable); in ptp_ocp_signal_enable()
1899 bp->signal[gen].running = false; in ptp_ocp_signal_enable()
1903 ts = ktime_to_timespec64(bp->signal[gen].start); in ptp_ocp_signal_enable()
1904 iowrite32(ts.tv_sec, &reg->start_sec); in ptp_ocp_signal_enable()
1905 iowrite32(ts.tv_nsec, &reg->start_ns); in ptp_ocp_signal_enable()
1907 ts = ktime_to_timespec64(bp->signal[gen].period); in ptp_ocp_signal_enable()
1908 iowrite32(ts.tv_sec, &reg->period_sec); in ptp_ocp_signal_enable()
1909 iowrite32(ts.tv_nsec, &reg->period_ns); in ptp_ocp_signal_enable()
1911 ts = ktime_to_timespec64(bp->signal[gen].pulse); in ptp_ocp_signal_enable()
1912 iowrite32(ts.tv_sec, &reg->pulse_sec); in ptp_ocp_signal_enable()
1913 iowrite32(ts.tv_nsec, &reg->pulse_ns); in ptp_ocp_signal_enable()
1915 iowrite32(bp->signal[gen].polarity, &reg->polarity); in ptp_ocp_signal_enable()
1916 iowrite32(0, &reg->repeat_count); in ptp_ocp_signal_enable()
1918 iowrite32(0, &reg->intr); /* clear interrupt state */ in ptp_ocp_signal_enable()
1919 iowrite32(1, &reg->intr_mask); /* enable interrupt */ in ptp_ocp_signal_enable()
1920 iowrite32(3, &reg->enable); /* valid & enable */ in ptp_ocp_signal_enable()
1922 bp->signal[gen].running = true; in ptp_ocp_signal_enable()
1930 struct ptp_ocp_ext_src *ext = priv; in ptp_ocp_ts_irq() local
1931 struct ts_reg __iomem *reg = ext->mem; in ptp_ocp_ts_irq()
1935 if (ext == ext->bp->pps) { in ptp_ocp_ts_irq()
1936 if (ext->bp->pps_req_map & OCP_REQ_PPS) { in ptp_ocp_ts_irq()
1938 ptp_clock_event(ext->bp->ptp, &ev); in ptp_ocp_ts_irq()
1941 if ((ext->bp->pps_req_map & ~OCP_REQ_PPS) == 0) in ptp_ocp_ts_irq()
1945 /* XXX should fix API - this converts s/ns -> ts -> s/ns */ in ptp_ocp_ts_irq()
1946 sec = ioread32(&reg->time_sec); in ptp_ocp_ts_irq()
1947 nsec = ioread32(&reg->time_ns); in ptp_ocp_ts_irq()
1950 ev.index = ext->info->index; in ptp_ocp_ts_irq()
1953 ptp_clock_event(ext->bp->ptp, &ev); in ptp_ocp_ts_irq()
1956 iowrite32(1, &reg->intr); /* write 1 to ack */ in ptp_ocp_ts_irq()
1964 struct ptp_ocp_ext_src *ext = priv; in ptp_ocp_ts_enable() local
1965 struct ts_reg __iomem *reg = ext->mem; in ptp_ocp_ts_enable()
1966 struct ptp_ocp *bp = ext->bp; in ptp_ocp_ts_enable()
1968 if (ext == bp->pps) { in ptp_ocp_ts_enable()
1969 u32 old_map = bp->pps_req_map; in ptp_ocp_ts_enable()
1972 bp->pps_req_map |= req; in ptp_ocp_ts_enable()
1974 bp->pps_req_map &= ~req; in ptp_ocp_ts_enable()
1977 if ((!!old_map ^ !!bp->pps_req_map) == 0) in ptp_ocp_ts_enable()
1982 iowrite32(1, &reg->enable); in ptp_ocp_ts_enable()
1983 iowrite32(1, &reg->intr_mask); in ptp_ocp_ts_enable()
1984 iowrite32(1, &reg->intr); in ptp_ocp_ts_enable()
1986 iowrite32(0, &reg->intr_mask); in ptp_ocp_ts_enable()
1987 iowrite32(0, &reg->enable); in ptp_ocp_ts_enable()
1994 ptp_ocp_unregister_ext(struct ptp_ocp_ext_src *ext) in ptp_ocp_unregister_ext() argument
1996 ext->info->enable(ext, ~0, false); in ptp_ocp_unregister_ext()
1997 pci_free_irq(ext->bp->pdev, ext->irq_vec, ext); in ptp_ocp_unregister_ext()
1998 kfree(ext); in ptp_ocp_unregister_ext()
2004 struct pci_dev *pdev = bp->pdev; in ptp_ocp_register_ext()
2005 struct ptp_ocp_ext_src *ext; in ptp_ocp_register_ext() local
2008 ext = kzalloc(sizeof(*ext), GFP_KERNEL); in ptp_ocp_register_ext()
2009 if (!ext) in ptp_ocp_register_ext()
2010 return -ENOMEM; in ptp_ocp_register_ext()
2012 ext->mem = ptp_ocp_get_mem(bp, r); in ptp_ocp_register_ext()
2013 if (IS_ERR(ext->mem)) { in ptp_ocp_register_ext()
2014 err = PTR_ERR(ext->mem); in ptp_ocp_register_ext()
2018 ext->bp = bp; in ptp_ocp_register_ext()
2019 ext->info = r->extra; in ptp_ocp_register_ext()
2020 ext->irq_vec = r->irq_vec; in ptp_ocp_register_ext()
2022 err = pci_request_irq(pdev, r->irq_vec, ext->info->irq_fcn, NULL, in ptp_ocp_register_ext()
2023 ext, "ocp%d.%s", bp->id, r->name); in ptp_ocp_register_ext()
2025 dev_err(&pdev->dev, "Could not get irq %d\n", r->irq_vec); in ptp_ocp_register_ext()
2029 bp_assign_entry(bp, r, ext); in ptp_ocp_register_ext()
2034 kfree(ext); in ptp_ocp_register_ext()
2041 struct pci_dev *pdev = bp->pdev; in ptp_ocp_serial_line()
2048 uart.port.dev = &pdev->dev; in ptp_ocp_serial_line()
2051 uart.port.mapbase = pci_resource_start(pdev, 0) + r->offset; in ptp_ocp_serial_line()
2052 uart.port.irq = pci_irq_vector(pdev, r->irq_vec); in ptp_ocp_serial_line()
2063 struct ptp_ocp_serial_port *p = (struct ptp_ocp_serial_port *)r->extra; in ptp_ocp_register_serial()
2071 port.baud = p->baud; in ptp_ocp_register_serial()
2095 if (!bp->nmea_out) in ptp_ocp_nmea_out_init()
2098 iowrite32(0, &bp->nmea_out->ctrl); /* disable */ in ptp_ocp_nmea_out_init()
2099 iowrite32(7, &bp->nmea_out->uart_baud); /* 115200 */ in ptp_ocp_nmea_out_init()
2100 iowrite32(1, &bp->nmea_out->ctrl); /* enable */ in ptp_ocp_nmea_out_init()
2108 iowrite32(0, &reg->enable); /* disable */ in _ptp_ocp_signal_init()
2110 val = ioread32(&reg->polarity); in _ptp_ocp_signal_init()
2111 s->polarity = val ? true : false; in _ptp_ocp_signal_init()
2112 s->duty = 50; in _ptp_ocp_signal_init()
2121 if (bp->signal_out[i]) in ptp_ocp_signal_init()
2122 _ptp_ocp_signal_init(&bp->signal[i], in ptp_ocp_signal_init()
2123 bp->signal_out[i]->mem); in ptp_ocp_signal_init()
2129 sysfs_remove_groups(&bp->dev.kobj, bp->attr_group); in ptp_ocp_attr_group_del()
2130 kfree(bp->attr_group); in ptp_ocp_attr_group_del()
2142 if (attr_tbl[i].cap & bp->fw_cap) in ptp_ocp_attr_group_add()
2145 bp->attr_group = kcalloc(count + 1, sizeof(struct attribute_group *), in ptp_ocp_attr_group_add()
2147 if (!bp->attr_group) in ptp_ocp_attr_group_add()
2148 return -ENOMEM; in ptp_ocp_attr_group_add()
2152 if (attr_tbl[i].cap & bp->fw_cap) in ptp_ocp_attr_group_add()
2153 bp->attr_group[count++] = attr_tbl[i].group; in ptp_ocp_attr_group_add()
2155 err = sysfs_create_groups(&bp->dev.kobj, bp->attr_group); in ptp_ocp_attr_group_add()
2157 bp->attr_group[0] = NULL; in ptp_ocp_attr_group_add()
2180 return ptp_ocp_enable_fpga(&bp->irig_out->ctrl, in ptp_ocp_irig_out()
2187 return ptp_ocp_enable_fpga(&bp->irig_in->ctrl, in ptp_ocp_irig_in()
2194 return ptp_ocp_enable_fpga(&bp->dcf_out->ctrl, in ptp_ocp_dcf_out()
2201 return ptp_ocp_enable_fpga(&bp->dcf_in->ctrl, in ptp_ocp_dcf_in()
2225 if (bp->sma[sma_nr - 1].fixed_fcn) in ptp_ocp_sma_fb_get()
2226 return (sma_nr - 1) & 1; in ptp_ocp_sma_fb_get()
2228 if (bp->sma[sma_nr - 1].mode == SMA_MODE_IN) in ptp_ocp_sma_fb_get()
2229 gpio = sma_nr > 2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; in ptp_ocp_sma_fb_get()
2231 gpio = sma_nr > 2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; in ptp_ocp_sma_fb_get()
2244 gpio = sma_nr > 2 ? &bp->sma_map1->gpio2 : &bp->sma_map2->gpio2; in ptp_ocp_sma_fb_set_output()
2247 mask = 0xffff << (16 - shift); in ptp_ocp_sma_fb_set_output()
2249 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_fb_set_output()
2258 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_fb_set_output()
2270 gpio = sma_nr > 2 ? &bp->sma_map2->gpio1 : &bp->sma_map1->gpio1; in ptp_ocp_sma_fb_set_inputs()
2273 mask = 0xffff << (16 - shift); in ptp_ocp_sma_fb_set_inputs()
2275 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_sma_fb_set_inputs()
2284 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_sma_fb_set_inputs()
2305 bp->sma[i].default_fcn = i & 1; in ptp_ocp_sma_fb_init()
2306 bp->sma[i].dpll_prop = prop; in ptp_ocp_sma_fb_init()
2307 bp->sma[i].dpll_prop.board_label = in ptp_ocp_sma_fb_init()
2308 bp->ptp_info.pin_config[i].name; in ptp_ocp_sma_fb_init()
2310 bp->sma[0].mode = SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2311 bp->sma[1].mode = SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2312 bp->sma[2].mode = SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2313 bp->sma[3].mode = SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2315 if (!bp->sma_map1) { in ptp_ocp_sma_fb_init()
2317 bp->sma[i].fixed_fcn = true; in ptp_ocp_sma_fb_init()
2318 bp->sma[i].fixed_dir = true; in ptp_ocp_sma_fb_init()
2319 bp->sma[1].dpll_prop.capabilities &= in ptp_ocp_sma_fb_init()
2328 reg = ioread32(&bp->sma_map2->gpio2); in ptp_ocp_sma_fb_init()
2331 bp->sma[i].fixed_dir = true; in ptp_ocp_sma_fb_init()
2333 reg = ioread32(&bp->sma_map1->gpio1); in ptp_ocp_sma_fb_init()
2334 bp->sma[0].mode = reg & BIT(15) ? SMA_MODE_IN : SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2335 bp->sma[1].mode = reg & BIT(31) ? SMA_MODE_IN : SMA_MODE_OUT; in ptp_ocp_sma_fb_init()
2337 reg = ioread32(&bp->sma_map1->gpio2); in ptp_ocp_sma_fb_init()
2338 bp->sma[2].mode = reg & BIT(15) ? SMA_MODE_OUT : SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2339 bp->sma[3].mode = reg & BIT(31) ? SMA_MODE_OUT : SMA_MODE_IN; in ptp_ocp_sma_fb_init()
2359 return -ENOMEM; in ptp_ocp_set_pins()
2366 bp->ptp_info.n_pins = 4; in ptp_ocp_set_pins()
2367 bp->ptp_info.pin_config = config; in ptp_ocp_set_pins()
2378 version = ioread32(&bp->image->version); in ptp_ocp_fb_set_version()
2383 bp->fw_loader = true; in ptp_ocp_fb_set_version()
2386 bp->fw_tag = version >> 15; in ptp_ocp_fb_set_version()
2387 bp->fw_version = version & 0x7fff; in ptp_ocp_fb_set_version()
2389 if (bp->fw_tag) { in ptp_ocp_fb_set_version()
2401 bp->fw_cap = cap; in ptp_ocp_fb_set_version()
2410 bp->flash_start = 1024 * 4096; in ptp_ocp_fb_board_init()
2411 bp->eeprom_map = fb_eeprom_map; in ptp_ocp_fb_board_init()
2412 bp->fw_version = ioread32(&bp->image->version); in ptp_ocp_fb_board_init()
2413 bp->sma_op = &ocp_fb_sma_op; in ptp_ocp_fb_board_init()
2436 bool allow = !r->irq_vec || r->irq_vec < bp->n_irqs; in ptp_ocp_allow_irq()
2439 dev_err(&bp->pdev->dev, "irq %d out of range, skipping %s\n", in ptp_ocp_allow_irq()
2440 r->irq_vec, r->name); in ptp_ocp_allow_irq()
2451 for (r = table; r->setup; r++) { in ptp_ocp_register_resources()
2454 err = r->setup(bp, r); in ptp_ocp_register_resources()
2456 dev_err(&bp->pdev->dev, in ptp_ocp_register_resources()
2458 r->name, err); in ptp_ocp_register_resources()
2480 bp->sma[0].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2481 bp->sma[1].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2482 bp->sma[2].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2483 bp->sma[3].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2485 bp->sma[0].default_fcn = 0x08; /* IN: 10Mhz */ in ptp_ocp_art_sma_init()
2486 bp->sma[1].default_fcn = 0x01; /* IN: PPS1 */ in ptp_ocp_art_sma_init()
2487 bp->sma[2].default_fcn = 0x10; /* OUT: 10Mhz */ in ptp_ocp_art_sma_init()
2488 bp->sma[3].default_fcn = 0x02; /* OUT: PHC */ in ptp_ocp_art_sma_init()
2492 bp->sma[i].dpll_prop = prop; in ptp_ocp_art_sma_init()
2493 bp->sma[i].dpll_prop.board_label = in ptp_ocp_art_sma_init()
2494 bp->ptp_info.pin_config[i].name; in ptp_ocp_art_sma_init()
2495 if (!bp->art_sma) { in ptp_ocp_art_sma_init()
2496 bp->sma[i].fixed_fcn = true; in ptp_ocp_art_sma_init()
2497 bp->sma[i].fixed_dir = true; in ptp_ocp_art_sma_init()
2500 reg = ioread32(&bp->art_sma->map[i].gpio); in ptp_ocp_art_sma_init()
2504 bp->sma[i].fixed_fcn = true; in ptp_ocp_art_sma_init()
2505 bp->sma[i].fixed_dir = true; in ptp_ocp_art_sma_init()
2509 bp->sma[i].mode = SMA_MODE_IN; in ptp_ocp_art_sma_init()
2510 bp->sma[i].dpll_prop.capabilities = in ptp_ocp_art_sma_init()
2514 bp->sma[i].mode = SMA_MODE_OUT; in ptp_ocp_art_sma_init()
2515 bp->sma[i].dpll_prop.capabilities = in ptp_ocp_art_sma_init()
2525 if (bp->sma[sma_nr - 1].fixed_fcn) in ptp_ocp_art_sma_get()
2526 return bp->sma[sma_nr - 1].default_fcn; in ptp_ocp_art_sma_get()
2528 return ioread32(&bp->art_sma->map[sma_nr - 1].gpio) & 0xff; in ptp_ocp_art_sma_get()
2542 return -EINVAL; in ptp_ocp_art_sma_set()
2544 gpio = &bp->art_sma->map[sma_nr - 1].gpio; in ptp_ocp_art_sma_set()
2546 spin_lock_irqsave(&bp->lock, flags); in ptp_ocp_art_sma_set()
2549 err = -EOPNOTSUPP; in ptp_ocp_art_sma_set()
2554 spin_unlock_irqrestore(&bp->lock, flags); in ptp_ocp_art_sma_set()
2573 bp->flash_start = 0x1000000; in ptp_ocp_art_board_init()
2574 bp->eeprom_map = art_eeprom_map; in ptp_ocp_art_board_init()
2575 bp->fw_cap = OCP_CAP_BASIC; in ptp_ocp_art_board_init()
2576 bp->fw_version = ioread32(&bp->reg->version); in ptp_ocp_art_board_init()
2577 bp->fw_tag = 2; in ptp_ocp_art_board_init()
2578 bp->sma_op = &ocp_art_sma_op; in ptp_ocp_art_board_init()
2581 iowrite32(1, &bp->board_config->mro50_serial_activate); in ptp_ocp_art_board_init()
2630 count--; in ptp_ocp_show_inputs()
2645 return -ENOMEM; in sma_parse_inputs()
2647 ret = -EINVAL; in sma_parse_inputs()
2667 ret = -EINVAL; in sma_parse_inputs()
2678 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_show()
2682 tbl = bp->sma_op->tbl; in ptp_ocp_sma_show()
2685 if (sma->mode == SMA_MODE_IN) { in ptp_ocp_sma_show()
2686 if (sma->disabled) in ptp_ocp_sma_show()
2707 return ptp_ocp_sma_show(bp, 2, buf, -1, 1); in sma2_show()
2715 return ptp_ocp_sma_show(bp, 3, buf, -1, 0); in sma3_show()
2723 return ptp_ocp_sma_show(bp, 4, buf, -1, 1); in sma4_show()
2729 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_store_val()
2731 if (sma->fixed_dir && (mode != sma->mode || val & SMA_DISABLE)) in ptp_ocp_sma_store_val()
2732 return -EOPNOTSUPP; in ptp_ocp_sma_store_val()
2734 if (sma->fixed_fcn) { in ptp_ocp_sma_store_val()
2735 if (val != sma->default_fcn) in ptp_ocp_sma_store_val()
2736 return -EOPNOTSUPP; in ptp_ocp_sma_store_val()
2740 sma->disabled = !!(val & SMA_DISABLE); in ptp_ocp_sma_store_val()
2742 if (mode != sma->mode) { in ptp_ocp_sma_store_val()
2747 sma->mode = mode; in ptp_ocp_sma_store_val()
2750 if (!sma->fixed_dir) in ptp_ocp_sma_store_val()
2753 if (sma->disabled) in ptp_ocp_sma_store_val()
2767 struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1]; in ptp_ocp_sma_store()
2771 mode = sma->mode; in ptp_ocp_sma_store()
2772 val = sma_parse_inputs(bp->sma_op->tbl, buf, &mode); in ptp_ocp_sma_store()
2832 return ptp_ocp_select_table_show(bp->sma_op->tbl[0], buf); in available_sma_inputs_show()
2842 return ptp_ocp_select_table_show(bp->sma_op->tbl[1], buf); in available_sma_outputs_show()
2862 int gen = (uintptr_t)ea->var; in signal_store() local
2868 return -ENOMEM; in signal_store()
2870 err = -EINVAL; in signal_store()
2871 s.duty = bp->signal[gen].duty; in signal_store()
2872 s.phase = bp->signal[gen].phase; in signal_store()
2873 s.period = bp->signal[gen].period; in signal_store()
2874 s.polarity = bp->signal[gen].polarity; in signal_store()
2878 argc--; in signal_store()
2884 argc--; in signal_store()
2890 argc--; in signal_store()
2896 argc--; in signal_store()
2905 err = ptp_ocp_signal_set(bp, gen, &s); in signal_store()
2909 err = ptp_ocp_signal_enable(bp->signal_out[gen], gen, s.period != 0); in signal_store()
2926 i = (uintptr_t)ea->var; in signal_show()
2927 signal = &bp->signal[i]; in signal_show()
2929 count = sysfs_emit(buf, "%llu %d %llu %d", signal->period, in signal_show()
2930 signal->duty, signal->phase, signal->polarity); in signal_show()
2932 ts = ktime_to_timespec64(signal->start); in signal_show()
2947 int i = (uintptr_t)ea->var; in duty_show()
2949 return sysfs_emit(buf, "%d\n", bp->signal[i].duty); in duty_show()
2961 int i = (uintptr_t)ea->var; in period_show()
2963 return sysfs_emit(buf, "%llu\n", bp->signal[i].period); in period_show()
2975 int i = (uintptr_t)ea->var; in phase_show()
2977 return sysfs_emit(buf, "%llu\n", bp->signal[i].phase); in phase_show()
2990 int i = (uintptr_t)ea->var; in polarity_show()
2992 return sysfs_emit(buf, "%d\n", bp->signal[i].polarity); in polarity_show()
3004 int i = (uintptr_t)ea->var; in running_show()
3006 return sysfs_emit(buf, "%d\n", bp->signal[i].running); in running_show()
3018 int i = (uintptr_t)ea->var; in start_show()
3021 ts = ktime_to_timespec64(bp->signal[i].start); in start_show()
3035 int idx = (uintptr_t)ea->var; in seconds_store()
3043 return -EINVAL; in seconds_store()
3048 iowrite32(val, &bp->freq_in[idx]->ctrl); in seconds_store()
3058 int idx = (uintptr_t)ea->var; in seconds_show()
3061 val = ioread32(&bp->freq_in[idx]->ctrl); in seconds_show()
3079 int idx = (uintptr_t)ea->var; in frequency_show()
3082 val = ioread32(&bp->freq_in[idx]->status); in frequency_show()
3101 if (!bp->has_eeprom_data) in serialnum_show()
3104 return sysfs_emit(buf, "%pM\n", bp->serial); in serialnum_show()
3114 if (bp->gnss_lost) in gnss_sync_show()
3115 ret = sysfs_emit(buf, "LOST @ %ptT\n", &bp->gnss_lost); in gnss_sync_show()
3129 return sysfs_emit(buf, "%d\n", bp->utc_tai_offset); in utc_tai_offset_show()
3157 return sysfs_emit(buf, "%d\n", bp->ts_window_adjust); in ts_window_adjust_show()
3173 bp->ts_window_adjust = val; in ts_window_adjust_store()
3185 val = ioread32(&bp->irig_out->ctrl); in irig_b_mode_show()
3205 return -EINVAL; in irig_b_mode_store()
3209 spin_lock_irqsave(&bp->lock, flags); in irig_b_mode_store()
3210 iowrite32(0, &bp->irig_out->ctrl); /* disable */ in irig_b_mode_store()
3211 iowrite32(reg, &bp->irig_out->ctrl); /* change mode */ in irig_b_mode_store()
3212 iowrite32(reg | IRIG_M_CTRL_ENABLE, &bp->irig_out->ctrl); in irig_b_mode_store()
3213 spin_unlock_irqrestore(&bp->lock, flags); in irig_b_mode_store()
3226 select = ioread32(&bp->reg->select); in clock_source_show()
3244 spin_lock_irqsave(&bp->lock, flags); in clock_source_store()
3245 iowrite32(val, &bp->reg->select); in clock_source_store()
3246 spin_unlock_irqrestore(&bp->lock, flags); in clock_source_store()
3268 val = ioread32(&bp->reg->status_drift); in clock_status_drift_show()
3269 res = (val & ~INT_MAX) ? -1 : 1; in clock_status_drift_show()
3283 val = ioread32(&bp->reg->status_offset); in clock_status_offset_show()
3284 res = (val & ~INT_MAX) ? -1 : 1; in clock_status_offset_show()
3298 val = ioread32(&bp->tod->adj_sec); in tod_correction_show()
3299 res = (val & ~INT_MAX) ? -1 : 1; in tod_correction_show()
3317 res *= -1; in tod_correction_store()
3322 spin_lock_irqsave(&bp->lock, flags); in tod_correction_store()
3323 iowrite32(val, &bp->tod->adj_sec); in tod_correction_store()
3324 spin_unlock_irqrestore(&bp->lock, flags); in tod_correction_store()
3395 count = size - off; in disciplining_config_read()
3400 err = -EFAULT; in disciplining_config_read()
3421 return -EFAULT; in disciplining_config_write()
3429 err = -EFAULT; in disciplining_config_write()
3457 count = size - off; in temperature_table_read()
3462 err = -EFAULT; in temperature_table_read()
3483 return -EFAULT; in temperature_table_write()
3491 err = -EFAULT; in temperature_table_write()
3574 if (bp->sma[i].mode != SMA_MODE_IN) in gpio_input_map()
3582 def = "----"; in gpio_input_map()
3592 strcpy(ans, "----"); in gpio_output_map()
3594 if (bp->sma[i].mode != SMA_MODE_OUT) in gpio_output_map()
3604 struct signal_reg __iomem *reg = bp->signal_out[nr]->mem; in _signal_summary_show()
3605 struct ptp_ocp_signal *signal = &bp->signal[nr]; in _signal_summary_show()
3613 on = signal->running; in _signal_summary_show()
3614 sprintf(label, "GEN%d", nr + 1); in _signal_summary_show()
3617 signal->period, signal->duty, signal->phase, in _signal_summary_show()
3618 signal->polarity); in _signal_summary_show()
3620 val = ioread32(&reg->enable); in _signal_summary_show()
3622 val = ioread32(&reg->status); in _signal_summary_show()
3625 seq_printf(s, " start:%llu\n", signal->start); in _signal_summary_show()
3640 val = ioread32(&reg->ctrl); in _frequency_summary_show()
3648 val = ioread32(&reg->status); in _frequency_summary_show()
3661 struct device *dev = s->private; in ptp_ocp_summary_show()
3674 return -ENOMEM; in ptp_ocp_summary_show()
3678 seq_printf(s, "%7s: /dev/ptp%d\n", "PTP", ptp_clock_index(bp->ptp)); in ptp_ocp_summary_show()
3679 if (bp->gnss_port.line != -1) in ptp_ocp_summary_show()
3681 bp->gnss_port.line); in ptp_ocp_summary_show()
3682 if (bp->gnss2_port.line != -1) in ptp_ocp_summary_show()
3684 bp->gnss2_port.line); in ptp_ocp_summary_show()
3685 if (bp->mac_port.line != -1) in ptp_ocp_summary_show()
3686 seq_printf(s, "%7s: /dev/ttyS%d\n", "MAC", bp->mac_port.line); in ptp_ocp_summary_show()
3687 if (bp->nmea_port.line != -1) in ptp_ocp_summary_show()
3688 seq_printf(s, "%7s: /dev/ttyS%d\n", "NMEA", bp->nmea_port.line); in ptp_ocp_summary_show()
3691 if (bp->sma_map1) { in ptp_ocp_summary_show()
3694 reg = ioread32(&bp->sma_map1->gpio1); in ptp_ocp_summary_show()
3698 reg = ioread32(&bp->sma_map1->gpio2); in ptp_ocp_summary_show()
3702 reg = ioread32(&bp->sma_map2->gpio1); in ptp_ocp_summary_show()
3706 reg = ioread32(&bp->sma_map2->gpio2); in ptp_ocp_summary_show()
3727 if (bp->ts0) { in ptp_ocp_summary_show()
3728 ts_reg = bp->ts0->mem; in ptp_ocp_summary_show()
3729 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3735 if (bp->ts1) { in ptp_ocp_summary_show()
3736 ts_reg = bp->ts1->mem; in ptp_ocp_summary_show()
3737 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3743 if (bp->ts2) { in ptp_ocp_summary_show()
3744 ts_reg = bp->ts2->mem; in ptp_ocp_summary_show()
3745 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3751 if (bp->ts3) { in ptp_ocp_summary_show()
3752 ts_reg = bp->ts3->mem; in ptp_ocp_summary_show()
3753 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3759 if (bp->ts4) { in ptp_ocp_summary_show()
3760 ts_reg = bp->ts4->mem; in ptp_ocp_summary_show()
3761 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3767 if (bp->pps) { in ptp_ocp_summary_show()
3768 ts_reg = bp->pps->mem; in ptp_ocp_summary_show()
3770 on = ioread32(&ts_reg->enable); in ptp_ocp_summary_show()
3771 map = !!(bp->pps_req_map & OCP_REQ_TIMESTAMP); in ptp_ocp_summary_show()
3775 map = !!(bp->pps_req_map & OCP_REQ_PPS); in ptp_ocp_summary_show()
3780 if (bp->fw_cap & OCP_CAP_SIGNAL) in ptp_ocp_summary_show()
3784 if (bp->fw_cap & OCP_CAP_FREQ) in ptp_ocp_summary_show()
3786 _frequency_summary_show(s, i, bp->freq_in[i]); in ptp_ocp_summary_show()
3788 if (bp->irig_out) { in ptp_ocp_summary_show()
3789 ctrl = ioread32(&bp->irig_out->ctrl); in ptp_ocp_summary_show()
3791 val = ioread32(&bp->irig_out->status); in ptp_ocp_summary_show()
3797 if (bp->irig_in) { in ptp_ocp_summary_show()
3798 on = ioread32(&bp->irig_in->ctrl) & IRIG_S_CTRL_ENABLE; in ptp_ocp_summary_show()
3799 val = ioread32(&bp->irig_in->status); in ptp_ocp_summary_show()
3805 if (bp->dcf_out) { in ptp_ocp_summary_show()
3806 on = ioread32(&bp->dcf_out->ctrl) & DCF_M_CTRL_ENABLE; in ptp_ocp_summary_show()
3807 val = ioread32(&bp->dcf_out->status); in ptp_ocp_summary_show()
3813 if (bp->dcf_in) { in ptp_ocp_summary_show()
3814 on = ioread32(&bp->dcf_in->ctrl) & DCF_S_CTRL_ENABLE; in ptp_ocp_summary_show()
3815 val = ioread32(&bp->dcf_in->status); in ptp_ocp_summary_show()
3821 if (bp->nmea_out) { in ptp_ocp_summary_show()
3822 on = ioread32(&bp->nmea_out->ctrl) & 1; in ptp_ocp_summary_show()
3823 val = ioread32(&bp->nmea_out->status); in ptp_ocp_summary_show()
3829 if (bp->pps_select) { in ptp_ocp_summary_show()
3830 val = ioread32(&bp->pps_select->gpio1); in ptp_ocp_summary_show()
3841 src = "----"; in ptp_ocp_summary_show()
3854 val = ioread32(&bp->reg->select); in ptp_ocp_summary_show()
3857 sprintf(buf, "----"); in ptp_ocp_summary_show()
3873 bp->sync ? "sync" : "unsynced"); in ptp_ocp_summary_show()
3875 if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, &sts)) { in ptp_ocp_summary_show()
3882 ns += (s64)bp->utc_tai_offset * NSEC_PER_SEC; in ptp_ocp_summary_show()
3889 bp->utc_tai_offset); in ptp_ocp_summary_show()
3891 timespec64_to_ns(&ts) - ns, in ptp_ocp_summary_show()
3892 post_ns - pre_ns); in ptp_ocp_summary_show()
3903 struct device *dev = s->private; in ptp_ocp_tod_status_show()
3910 val = ioread32(&bp->tod->ctrl); in ptp_ocp_tod_status_show()
3924 val = ioread32(&bp->tod->version); in ptp_ocp_tod_status_show()
3928 val = ioread32(&bp->tod->status); in ptp_ocp_tod_status_show()
3931 val = ioread32(&bp->tod->adj_sec); in ptp_ocp_tod_status_show()
3932 idx = (val & ~INT_MAX) ? -1 : 1; in ptp_ocp_tod_status_show()
3936 val = ioread32(&bp->tod->utc_status); in ptp_ocp_tod_status_show()
3944 val = ioread32(&bp->tod->leap); in ptp_ocp_tod_status_show()
3958 d = debugfs_create_dir(dev_name(&bp->dev), ptp_ocp_debugfs_root); in ptp_ocp_debugfs_add_device()
3959 bp->debug_root = d; in ptp_ocp_debugfs_add_device()
3960 debugfs_create_file("summary", 0444, bp->debug_root, in ptp_ocp_debugfs_add_device()
3961 &bp->dev, &ptp_ocp_summary_fops); in ptp_ocp_debugfs_add_device()
3962 if (bp->tod) in ptp_ocp_debugfs_add_device()
3963 debugfs_create_file("tod_status", 0444, bp->debug_root, in ptp_ocp_debugfs_add_device()
3964 &bp->dev, &ptp_ocp_tod_status_fops); in ptp_ocp_debugfs_add_device()
3970 debugfs_remove_recursive(bp->debug_root); in ptp_ocp_debugfs_remove_device()
3991 idr_remove(&ptp_ocp_idr, bp->id); in ptp_ocp_dev_release()
4004 dev_err(&pdev->dev, "idr_alloc failed: %d\n", err); in ptp_ocp_device_init()
4007 bp->id = err; in ptp_ocp_device_init()
4009 bp->ptp_info = ptp_ocp_clock_info; in ptp_ocp_device_init()
4010 spin_lock_init(&bp->lock); in ptp_ocp_device_init()
4011 bp->gnss_port.line = -1; in ptp_ocp_device_init()
4012 bp->gnss2_port.line = -1; in ptp_ocp_device_init()
4013 bp->mac_port.line = -1; in ptp_ocp_device_init()
4014 bp->nmea_port.line = -1; in ptp_ocp_device_init()
4015 bp->pdev = pdev; in ptp_ocp_device_init()
4017 device_initialize(&bp->dev); in ptp_ocp_device_init()
4018 dev_set_name(&bp->dev, "ocp%d", bp->id); in ptp_ocp_device_init()
4019 bp->dev.class = &timecard_class; in ptp_ocp_device_init()
4020 bp->dev.parent = &pdev->dev; in ptp_ocp_device_init()
4021 bp->dev.release = ptp_ocp_dev_release; in ptp_ocp_device_init()
4022 dev_set_drvdata(&bp->dev, bp); in ptp_ocp_device_init()
4024 err = device_add(&bp->dev); in ptp_ocp_device_init()
4026 dev_err(&bp->dev, "device add failed: %d\n", err); in ptp_ocp_device_init()
4035 put_device(&bp->dev); in ptp_ocp_device_init()
4042 struct device *dev = &bp->dev; in ptp_ocp_symlink()
4044 if (sysfs_create_link(&dev->kobj, &child->kobj, link)) in ptp_ocp_symlink()
4053 dev = &bp->pdev->dev; in ptp_ocp_link_child()
4071 if (bp->gnss_port.line != -1) { in ptp_ocp_complete()
4072 sprintf(buf, "ttyS%d", bp->gnss_port.line); in ptp_ocp_complete()
4075 if (bp->gnss2_port.line != -1) { in ptp_ocp_complete()
4076 sprintf(buf, "ttyS%d", bp->gnss2_port.line); in ptp_ocp_complete()
4079 if (bp->mac_port.line != -1) { in ptp_ocp_complete()
4080 sprintf(buf, "ttyS%d", bp->mac_port.line); in ptp_ocp_complete()
4083 if (bp->nmea_port.line != -1) { in ptp_ocp_complete()
4084 sprintf(buf, "ttyS%d", bp->nmea_port.line); in ptp_ocp_complete()
4087 sprintf(buf, "ptp%d", ptp_clock_index(bp->ptp)); in ptp_ocp_complete()
4090 pps = pps_lookup_dev(bp->ptp); in ptp_ocp_complete()
4092 ptp_ocp_symlink(bp, pps->dev, "pps"); in ptp_ocp_complete()
4105 version = ioread32(&bp->reg->version); in ptp_ocp_phc_info()
4106 select = ioread32(&bp->reg->select); in ptp_ocp_phc_info()
4107 dev_info(&bp->pdev->dev, "Version %d.%d.%d, clock %s, device ptp%d\n", in ptp_ocp_phc_info()
4110 ptp_clock_index(bp->ptp)); in ptp_ocp_phc_info()
4112 if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, NULL)) in ptp_ocp_phc_info()
4113 dev_info(&bp->pdev->dev, "Time: %lld.%ld, %s\n", in ptp_ocp_phc_info()
4115 bp->sync ? "in-sync" : "UNSYNCED"); in ptp_ocp_phc_info()
4121 if (port != -1) in ptp_ocp_serial_info()
4122 dev_info(dev, "%5s: /dev/ttyS%-2d @ %6d\n", name, port, baud); in ptp_ocp_serial_info()
4133 struct device *dev = &bp->pdev->dev; in ptp_ocp_info()
4138 ptp_ocp_serial_info(dev, "GNSS", bp->gnss_port.line, in ptp_ocp_info()
4139 bp->gnss_port.baud); in ptp_ocp_info()
4140 ptp_ocp_serial_info(dev, "GNSS2", bp->gnss2_port.line, in ptp_ocp_info()
4141 bp->gnss2_port.baud); in ptp_ocp_info()
4142 ptp_ocp_serial_info(dev, "MAC", bp->mac_port.line, bp->mac_port.baud); in ptp_ocp_info()
4143 if (bp->nmea_out && bp->nmea_port.line != -1) { in ptp_ocp_info()
4144 bp->nmea_port.baud = -1; in ptp_ocp_info()
4146 reg = ioread32(&bp->nmea_out->uart_baud); in ptp_ocp_info()
4148 bp->nmea_port.baud = nmea_baud[reg]; in ptp_ocp_info()
4150 ptp_ocp_serial_info(dev, "NMEA", bp->nmea_port.line, in ptp_ocp_info()
4151 bp->nmea_port.baud); in ptp_ocp_info()
4158 struct device *dev = &bp->dev; in ptp_ocp_detach_sysfs()
4160 sysfs_remove_link(&dev->kobj, "ttyGNSS"); in ptp_ocp_detach_sysfs()
4161 sysfs_remove_link(&dev->kobj, "ttyGNSS2"); in ptp_ocp_detach_sysfs()
4162 sysfs_remove_link(&dev->kobj, "ttyMAC"); in ptp_ocp_detach_sysfs()
4163 sysfs_remove_link(&dev->kobj, "ptp"); in ptp_ocp_detach_sysfs()
4164 sysfs_remove_link(&dev->kobj, "pps"); in ptp_ocp_detach_sysfs()
4175 if (timer_pending(&bp->watchdog)) in ptp_ocp_detach()
4176 del_timer_sync(&bp->watchdog); in ptp_ocp_detach()
4177 if (bp->ts0) in ptp_ocp_detach()
4178 ptp_ocp_unregister_ext(bp->ts0); in ptp_ocp_detach()
4179 if (bp->ts1) in ptp_ocp_detach()
4180 ptp_ocp_unregister_ext(bp->ts1); in ptp_ocp_detach()
4181 if (bp->ts2) in ptp_ocp_detach()
4182 ptp_ocp_unregister_ext(bp->ts2); in ptp_ocp_detach()
4183 if (bp->ts3) in ptp_ocp_detach()
4184 ptp_ocp_unregister_ext(bp->ts3); in ptp_ocp_detach()
4185 if (bp->ts4) in ptp_ocp_detach()
4186 ptp_ocp_unregister_ext(bp->ts4); in ptp_ocp_detach()
4187 if (bp->pps) in ptp_ocp_detach()
4188 ptp_ocp_unregister_ext(bp->pps); in ptp_ocp_detach()
4190 if (bp->signal_out[i]) in ptp_ocp_detach()
4191 ptp_ocp_unregister_ext(bp->signal_out[i]); in ptp_ocp_detach()
4192 if (bp->gnss_port.line != -1) in ptp_ocp_detach()
4193 serial8250_unregister_port(bp->gnss_port.line); in ptp_ocp_detach()
4194 if (bp->gnss2_port.line != -1) in ptp_ocp_detach()
4195 serial8250_unregister_port(bp->gnss2_port.line); in ptp_ocp_detach()
4196 if (bp->mac_port.line != -1) in ptp_ocp_detach()
4197 serial8250_unregister_port(bp->mac_port.line); in ptp_ocp_detach()
4198 if (bp->nmea_port.line != -1) in ptp_ocp_detach()
4199 serial8250_unregister_port(bp->nmea_port.line); in ptp_ocp_detach()
4200 platform_device_unregister(bp->spi_flash); in ptp_ocp_detach()
4201 platform_device_unregister(bp->i2c_ctrl); in ptp_ocp_detach()
4202 if (bp->i2c_clk) in ptp_ocp_detach()
4203 clk_hw_unregister_fixed_rate(bp->i2c_clk); in ptp_ocp_detach()
4204 if (bp->n_irqs) in ptp_ocp_detach()
4205 pci_free_irq_vectors(bp->pdev); in ptp_ocp_detach()
4206 if (bp->ptp) in ptp_ocp_detach()
4207 ptp_clock_unregister(bp->ptp); in ptp_ocp_detach()
4208 kfree(bp->ptp_info.pin_config); in ptp_ocp_detach()
4209 device_unregister(&bp->dev); in ptp_ocp_detach()
4219 *status = bp->sync ? DPLL_LOCK_STATUS_LOCKED : DPLL_LOCK_STATUS_UNLOCKED; in ptp_ocp_dpll_lock_status_get()
4232 if (bp->pps_select) { in ptp_ocp_dpll_state_get()
4233 idx = ioread32(&bp->pps_select->gpio1); in ptp_ocp_dpll_state_get()
4234 *state = (&bp->sma[idx] == pin_priv) ? DPLL_PIN_STATE_CONNECTED : in ptp_ocp_dpll_state_get()
4239 return -EINVAL; in ptp_ocp_dpll_state_get()
4258 *direction = sma->mode == SMA_MODE_IN ? in ptp_ocp_dpll_direction_get()
4274 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_direction_set()
4276 if (sma->fixed_dir) in ptp_ocp_dpll_direction_set()
4277 return -EOPNOTSUPP; in ptp_ocp_dpll_direction_set()
4292 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_frequency_set()
4295 if (sma->fixed_fcn) in ptp_ocp_dpll_frequency_set()
4296 return -EOPNOTSUPP; in ptp_ocp_dpll_frequency_set()
4298 tbl = bp->sma_op->tbl[sma->mode]; in ptp_ocp_dpll_frequency_set()
4301 return ptp_ocp_sma_store_val(bp, i, sma->mode, sma_nr); in ptp_ocp_dpll_frequency_set()
4302 return -EINVAL; in ptp_ocp_dpll_frequency_set()
4314 int sma_nr = (sma - bp->sma); in ptp_ocp_dpll_frequency_get()
4318 val = bp->sma_op->get(bp, sma_nr); in ptp_ocp_dpll_frequency_get()
4319 tbl = bp->sma_op->tbl[sma->mode]; in ptp_ocp_dpll_frequency_get()
4326 return -EINVAL; in ptp_ocp_dpll_frequency_get()
4349 sync = !!(ioread32(&bp->reg->status) & OCP_STATUS_IN_SYNC); in ptp_ocp_sync_work()
4351 if (bp->sync != sync) in ptp_ocp_sync_work()
4352 dpll_device_change_ntf(bp->dpll); in ptp_ocp_sync_work()
4354 bp->sync = sync; in ptp_ocp_sync_work()
4356 queue_delayed_work(system_power_efficient_wq, &bp->sync_work, HZ); in ptp_ocp_sync_work()
4367 devlink = devlink_alloc(&ptp_ocp_devlink_ops, sizeof(*bp), &pdev->dev); in ptp_ocp_probe()
4369 dev_err(&pdev->dev, "devlink_alloc failed\n"); in ptp_ocp_probe()
4370 return -ENOMEM; in ptp_ocp_probe()
4375 dev_err(&pdev->dev, "pci_enable_device\n"); in ptp_ocp_probe()
4384 INIT_DELAYED_WORK(&bp->sync_work, ptp_ocp_sync_work); in ptp_ocp_probe()
4388 * allow this - if not all of the IRQ's are returned, skip the in ptp_ocp_probe()
4393 dev_err(&pdev->dev, "alloc_irq_vectors err: %d\n", err); in ptp_ocp_probe()
4396 bp->n_irqs = err; in ptp_ocp_probe()
4399 err = ptp_ocp_register_resources(bp, id->driver_data); in ptp_ocp_probe()
4403 bp->ptp = ptp_clock_register(&bp->ptp_info, &pdev->dev); in ptp_ocp_probe()
4404 if (IS_ERR(bp->ptp)) { in ptp_ocp_probe()
4405 err = PTR_ERR(bp->ptp); in ptp_ocp_probe()
4406 dev_err(&pdev->dev, "ptp_clock_register: %d\n", err); in ptp_ocp_probe()
4407 bp->ptp = NULL; in ptp_ocp_probe()
4419 bp->dpll = dpll_device_get(clkid, 0, THIS_MODULE); in ptp_ocp_probe()
4420 if (IS_ERR(bp->dpll)) { in ptp_ocp_probe()
4421 err = PTR_ERR(bp->dpll); in ptp_ocp_probe()
4422 dev_err(&pdev->dev, "dpll_device_alloc failed\n"); in ptp_ocp_probe()
4426 err = dpll_device_register(bp->dpll, DPLL_TYPE_PPS, &dpll_ops, bp); in ptp_ocp_probe()
4431 bp->sma[i].dpll_pin = dpll_pin_get(clkid, i, THIS_MODULE, &bp->sma[i].dpll_prop); in ptp_ocp_probe()
4432 if (IS_ERR(bp->sma[i].dpll_pin)) { in ptp_ocp_probe()
4433 err = PTR_ERR(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4437 err = dpll_pin_register(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, in ptp_ocp_probe()
4438 &bp->sma[i]); in ptp_ocp_probe()
4440 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4444 queue_delayed_work(system_power_efficient_wq, &bp->sync_work, HZ); in ptp_ocp_probe()
4449 --i; in ptp_ocp_probe()
4450 dpll_pin_unregister(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, &bp->sma[i]); in ptp_ocp_probe()
4451 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_probe()
4453 dpll_device_put(bp->dpll); in ptp_ocp_probe()
4470 cancel_delayed_work_sync(&bp->sync_work); in ptp_ocp_remove()
4472 if (bp->sma[i].dpll_pin) { in ptp_ocp_remove()
4473 dpll_pin_unregister(bp->dpll, bp->sma[i].dpll_pin, &dpll_pins_ops, &bp->sma[i]); in ptp_ocp_remove()
4474 dpll_pin_put(bp->sma[i].dpll_pin); in ptp_ocp_remove()
4477 dpll_device_unregister(bp->dpll, &dpll_ops, bp); in ptp_ocp_remove()
4478 dpll_device_put(bp->dpll); in ptp_ocp_remove()
4514 while ((dev = dev->parent)) in ptp_ocp_i2c_notifier_call()
4515 if (dev->driver && !strcmp(dev->driver->name, KBUILD_MODNAME)) in ptp_ocp_i2c_notifier_call()
4524 sysfs_remove_link(&bp->dev.kobj, "i2c"); in ptp_ocp_i2c_notifier_call()