ptp_ocp.c (14e77332e74603efab8347c89d3cda447c3b97c9) ptp_ocp.c (895ac5a51fe280e9898e212da7803ec9babf137f)
1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2020 Facebook */
3
4#include <linux/bits.h>
5#include <linux/err.h>
6#include <linux/kernel.h>
7#include <linux/module.h>
8#include <linux/debugfs.h>

--- 264 unchanged lines hidden (view full) ---

273 ktime_t pulse;
274 ktime_t phase;
275 ktime_t start;
276 int duty;
277 bool polarity;
278 bool running;
279};
280
1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright (c) 2020 Facebook */
3
4#include <linux/bits.h>
5#include <linux/err.h>
6#include <linux/kernel.h>
7#include <linux/module.h>
8#include <linux/debugfs.h>

--- 264 unchanged lines hidden (view full) ---

273 ktime_t pulse;
274 ktime_t phase;
275 ktime_t start;
276 int duty;
277 bool polarity;
278 bool running;
279};
280
281struct ptp_ocp_serial_port {
282 int line;
283 int baud;
284};
285
281#define OCP_BOARD_ID_LEN 13
282#define OCP_SERIAL_LEN 6
283
284struct ptp_ocp {
285 struct pci_dev *pdev;
286 struct device dev;
287 spinlock_t lock;
288 struct ocp_reg __iomem *reg;

--- 24 unchanged lines hidden (view full) ---

313 struct clk_hw *i2c_clk;
314 struct timer_list watchdog;
315 const struct attribute_group **attr_group;
316 const struct ptp_ocp_eeprom_map *eeprom_map;
317 struct dentry *debug_root;
318 time64_t gnss_lost;
319 int id;
320 int n_irqs;
286#define OCP_BOARD_ID_LEN 13
287#define OCP_SERIAL_LEN 6
288
289struct ptp_ocp {
290 struct pci_dev *pdev;
291 struct device dev;
292 spinlock_t lock;
293 struct ocp_reg __iomem *reg;

--- 24 unchanged lines hidden (view full) ---

318 struct clk_hw *i2c_clk;
319 struct timer_list watchdog;
320 const struct attribute_group **attr_group;
321 const struct ptp_ocp_eeprom_map *eeprom_map;
322 struct dentry *debug_root;
323 time64_t gnss_lost;
324 int id;
325 int n_irqs;
321 int gnss_port;
322 int gnss2_port;
323 int mac_port; /* miniature atomic clock */
324 int nmea_port;
326 struct ptp_ocp_serial_port gnss_port;
327 struct ptp_ocp_serial_port gnss2_port;
328 struct ptp_ocp_serial_port mac_port; /* miniature atomic clock */
329 struct ptp_ocp_serial_port nmea_port;
325 bool fw_loader;
326 u8 fw_tag;
327 u16 fw_version;
328 u8 board_id[OCP_BOARD_ID_LEN];
329 u8 serial[OCP_SERIAL_LEN];
330 bool has_eeprom_data;
331 u32 pps_req_map;
332 int flash_start;

--- 258 unchanged lines hidden (view full) ---

591 .platform_data = "mac" },
592 },
593 },
594 },
595 },
596 {
597 OCP_SERIAL_RESOURCE(gnss_port),
598 .offset = 0x00160000 + 0x1000, .irq_vec = 3,
330 bool fw_loader;
331 u8 fw_tag;
332 u16 fw_version;
333 u8 board_id[OCP_BOARD_ID_LEN];
334 u8 serial[OCP_SERIAL_LEN];
335 bool has_eeprom_data;
336 u32 pps_req_map;
337 int flash_start;

--- 258 unchanged lines hidden (view full) ---

596 .platform_data = "mac" },
597 },
598 },
599 },
600 },
601 {
602 OCP_SERIAL_RESOURCE(gnss_port),
603 .offset = 0x00160000 + 0x1000, .irq_vec = 3,
604 .extra = &(struct ptp_ocp_serial_port) {
605 .baud = 115200,
606 },
599 },
600 {
601 OCP_SERIAL_RESOURCE(gnss2_port),
602 .offset = 0x00170000 + 0x1000, .irq_vec = 4,
607 },
608 {
609 OCP_SERIAL_RESOURCE(gnss2_port),
610 .offset = 0x00170000 + 0x1000, .irq_vec = 4,
611 .extra = &(struct ptp_ocp_serial_port) {
612 .baud = 115200,
613 },
603 },
604 {
605 OCP_SERIAL_RESOURCE(mac_port),
606 .offset = 0x00180000 + 0x1000, .irq_vec = 5,
614 },
615 {
616 OCP_SERIAL_RESOURCE(mac_port),
617 .offset = 0x00180000 + 0x1000, .irq_vec = 5,
618 .extra = &(struct ptp_ocp_serial_port) {
619 .baud = 57600,
620 },
607 },
608 {
609 OCP_SERIAL_RESOURCE(nmea_port),
610 .offset = 0x00190000 + 0x1000, .irq_vec = 10,
611 },
612 {
613 OCP_SPI_RESOURCE(spi_flash),
614 .offset = 0x00310000, .size = 0x10000, .irq_vec = 9,

--- 1252 unchanged lines hidden (view full) ---

1867 uart.port.type = PORT_16550A;
1868
1869 return serial8250_register_8250_port(&uart);
1870}
1871
1872static int
1873ptp_ocp_register_serial(struct ptp_ocp *bp, struct ocp_resource *r)
1874{
621 },
622 {
623 OCP_SERIAL_RESOURCE(nmea_port),
624 .offset = 0x00190000 + 0x1000, .irq_vec = 10,
625 },
626 {
627 OCP_SPI_RESOURCE(spi_flash),
628 .offset = 0x00310000, .size = 0x10000, .irq_vec = 9,

--- 1252 unchanged lines hidden (view full) ---

1881 uart.port.type = PORT_16550A;
1882
1883 return serial8250_register_8250_port(&uart);
1884}
1885
1886static int
1887ptp_ocp_register_serial(struct ptp_ocp *bp, struct ocp_resource *r)
1888{
1875 int port;
1889 struct ptp_ocp_serial_port *p = (struct ptp_ocp_serial_port *)r->extra;
1890 struct ptp_ocp_serial_port port = {};
1876
1891
1877 port = ptp_ocp_serial_line(bp, r);
1878 if (port < 0)
1879 return port;
1892 port.line = ptp_ocp_serial_line(bp, r);
1893 if (port.line < 0)
1894 return port.line;
1880
1895
1896 if (p)
1897 port.baud = p->baud;
1898
1881 bp_assign_entry(bp, r, port);
1882
1883 return 0;
1884}
1885
1886static int
1887ptp_ocp_register_mem(struct ptp_ocp *bp, struct ocp_resource *r)
1888{

--- 1283 unchanged lines hidden (view full) ---

3172
3173 buf = (char *)__get_free_page(GFP_KERNEL);
3174 if (!buf)
3175 return -ENOMEM;
3176
3177 bp = dev_get_drvdata(dev);
3178
3179 seq_printf(s, "%7s: /dev/ptp%d\n", "PTP", ptp_clock_index(bp->ptp));
1899 bp_assign_entry(bp, r, port);
1900
1901 return 0;
1902}
1903
1904static int
1905ptp_ocp_register_mem(struct ptp_ocp *bp, struct ocp_resource *r)
1906{

--- 1283 unchanged lines hidden (view full) ---

3190
3191 buf = (char *)__get_free_page(GFP_KERNEL);
3192 if (!buf)
3193 return -ENOMEM;
3194
3195 bp = dev_get_drvdata(dev);
3196
3197 seq_printf(s, "%7s: /dev/ptp%d\n", "PTP", ptp_clock_index(bp->ptp));
3180 if (bp->gnss_port != -1)
3181 seq_printf(s, "%7s: /dev/ttyS%d\n", "GNSS1", bp->gnss_port);
3182 if (bp->gnss2_port != -1)
3183 seq_printf(s, "%7s: /dev/ttyS%d\n", "GNSS2", bp->gnss2_port);
3184 if (bp->mac_port != -1)
3185 seq_printf(s, "%7s: /dev/ttyS%d\n", "MAC", bp->mac_port);
3186 if (bp->nmea_port != -1)
3187 seq_printf(s, "%7s: /dev/ttyS%d\n", "NMEA", bp->nmea_port);
3198 if (bp->gnss_port.line != -1)
3199 seq_printf(s, "%7s: /dev/ttyS%d\n", "GNSS1",
3200 bp->gnss_port.line);
3201 if (bp->gnss2_port.line != -1)
3202 seq_printf(s, "%7s: /dev/ttyS%d\n", "GNSS2",
3203 bp->gnss2_port.line);
3204 if (bp->mac_port.line != -1)
3205 seq_printf(s, "%7s: /dev/ttyS%d\n", "MAC", bp->mac_port.line);
3206 if (bp->nmea_port.line != -1)
3207 seq_printf(s, "%7s: /dev/ttyS%d\n", "NMEA", bp->nmea_port.line);
3188
3189 memset(sma_val, 0xff, sizeof(sma_val));
3190 if (bp->sma_map1) {
3191 u32 reg;
3192
3193 reg = ioread32(&bp->sma_map1->gpio1);
3194 sma_val[0][0] = reg & 0xffff;
3195 sma_val[1][0] = reg >> 16;

--- 307 unchanged lines hidden (view full) ---

3503 if (err < 0) {
3504 dev_err(&pdev->dev, "idr_alloc failed: %d\n", err);
3505 return err;
3506 }
3507 bp->id = err;
3508
3509 bp->ptp_info = ptp_ocp_clock_info;
3510 spin_lock_init(&bp->lock);
3208
3209 memset(sma_val, 0xff, sizeof(sma_val));
3210 if (bp->sma_map1) {
3211 u32 reg;
3212
3213 reg = ioread32(&bp->sma_map1->gpio1);
3214 sma_val[0][0] = reg & 0xffff;
3215 sma_val[1][0] = reg >> 16;

--- 307 unchanged lines hidden (view full) ---

3523 if (err < 0) {
3524 dev_err(&pdev->dev, "idr_alloc failed: %d\n", err);
3525 return err;
3526 }
3527 bp->id = err;
3528
3529 bp->ptp_info = ptp_ocp_clock_info;
3530 spin_lock_init(&bp->lock);
3511 bp->gnss_port = -1;
3512 bp->gnss2_port = -1;
3513 bp->mac_port = -1;
3514 bp->nmea_port = -1;
3531 bp->gnss_port.line = -1;
3532 bp->gnss2_port.line = -1;
3533 bp->mac_port.line = -1;
3534 bp->nmea_port.line = -1;
3515 bp->pdev = pdev;
3516
3517 device_initialize(&bp->dev);
3518 dev_set_name(&bp->dev, "ocp%d", bp->id);
3519 bp->dev.class = &timecard_class;
3520 bp->dev.parent = &pdev->dev;
3521 bp->dev.release = ptp_ocp_dev_release;
3522 dev_set_drvdata(&bp->dev, bp);

--- 41 unchanged lines hidden (view full) ---

3564}
3565
3566static int
3567ptp_ocp_complete(struct ptp_ocp *bp)
3568{
3569 struct pps_device *pps;
3570 char buf[32];
3571
3535 bp->pdev = pdev;
3536
3537 device_initialize(&bp->dev);
3538 dev_set_name(&bp->dev, "ocp%d", bp->id);
3539 bp->dev.class = &timecard_class;
3540 bp->dev.parent = &pdev->dev;
3541 bp->dev.release = ptp_ocp_dev_release;
3542 dev_set_drvdata(&bp->dev, bp);

--- 41 unchanged lines hidden (view full) ---

3584}
3585
3586static int
3587ptp_ocp_complete(struct ptp_ocp *bp)
3588{
3589 struct pps_device *pps;
3590 char buf[32];
3591
3572 if (bp->gnss_port != -1) {
3573 sprintf(buf, "ttyS%d", bp->gnss_port);
3592 if (bp->gnss_port.line != -1) {
3593 sprintf(buf, "ttyS%d", bp->gnss_port.line);
3574 ptp_ocp_link_child(bp, buf, "ttyGNSS");
3575 }
3594 ptp_ocp_link_child(bp, buf, "ttyGNSS");
3595 }
3576 if (bp->gnss2_port != -1) {
3577 sprintf(buf, "ttyS%d", bp->gnss2_port);
3596 if (bp->gnss2_port.line != -1) {
3597 sprintf(buf, "ttyS%d", bp->gnss2_port.line);
3578 ptp_ocp_link_child(bp, buf, "ttyGNSS2");
3579 }
3598 ptp_ocp_link_child(bp, buf, "ttyGNSS2");
3599 }
3580 if (bp->mac_port != -1) {
3581 sprintf(buf, "ttyS%d", bp->mac_port);
3600 if (bp->mac_port.line != -1) {
3601 sprintf(buf, "ttyS%d", bp->mac_port.line);
3582 ptp_ocp_link_child(bp, buf, "ttyMAC");
3583 }
3602 ptp_ocp_link_child(bp, buf, "ttyMAC");
3603 }
3584 if (bp->nmea_port != -1) {
3585 sprintf(buf, "ttyS%d", bp->nmea_port);
3604 if (bp->nmea_port.line != -1) {
3605 sprintf(buf, "ttyS%d", bp->nmea_port.line);
3586 ptp_ocp_link_child(bp, buf, "ttyNMEA");
3587 }
3588 sprintf(buf, "ptp%d", ptp_clock_index(bp->ptp));
3589 ptp_ocp_link_child(bp, buf, "ptp");
3590
3591 pps = pps_lookup_dev(bp->ptp);
3592 if (pps)
3593 ptp_ocp_symlink(bp, pps->dev, "pps");

--- 39 unchanged lines hidden (view full) ---

3633 57600, 115200, 230400, 460800, 921600,
3634 1000000, 2000000
3635 };
3636 struct device *dev = &bp->pdev->dev;
3637 u32 reg;
3638
3639 ptp_ocp_phc_info(bp);
3640
3606 ptp_ocp_link_child(bp, buf, "ttyNMEA");
3607 }
3608 sprintf(buf, "ptp%d", ptp_clock_index(bp->ptp));
3609 ptp_ocp_link_child(bp, buf, "ptp");
3610
3611 pps = pps_lookup_dev(bp->ptp);
3612 if (pps)
3613 ptp_ocp_symlink(bp, pps->dev, "pps");

--- 39 unchanged lines hidden (view full) ---

3653 57600, 115200, 230400, 460800, 921600,
3654 1000000, 2000000
3655 };
3656 struct device *dev = &bp->pdev->dev;
3657 u32 reg;
3658
3659 ptp_ocp_phc_info(bp);
3660
3641 ptp_ocp_serial_info(dev, "GNSS", bp->gnss_port, 115200);
3642 ptp_ocp_serial_info(dev, "GNSS2", bp->gnss2_port, 115200);
3643 ptp_ocp_serial_info(dev, "MAC", bp->mac_port, 57600);
3644 if (bp->nmea_out && bp->nmea_port != -1) {
3645 int baud = -1;
3661 ptp_ocp_serial_info(dev, "GNSS", bp->gnss_port.line,
3662 bp->gnss_port.baud);
3663 ptp_ocp_serial_info(dev, "GNSS2", bp->gnss2_port.line,
3664 bp->gnss2_port.baud);
3665 ptp_ocp_serial_info(dev, "MAC", bp->mac_port.line, bp->mac_port.baud);
3666 if (bp->nmea_out && bp->nmea_port.line != -1) {
3667 bp->nmea_port.baud = -1;
3646
3647 reg = ioread32(&bp->nmea_out->uart_baud);
3648 if (reg < ARRAY_SIZE(nmea_baud))
3668
3669 reg = ioread32(&bp->nmea_out->uart_baud);
3670 if (reg < ARRAY_SIZE(nmea_baud))
3649 baud = nmea_baud[reg];
3650 ptp_ocp_serial_info(dev, "NMEA", bp->nmea_port, baud);
3671 bp->nmea_port.baud = nmea_baud[reg];
3672
3673 ptp_ocp_serial_info(dev, "NMEA", bp->nmea_port.line,
3674 bp->nmea_port.baud);
3651 }
3652}
3653
3654static void
3655ptp_ocp_detach_sysfs(struct ptp_ocp *bp)
3656{
3657 struct device *dev = &bp->dev;
3658

--- 24 unchanged lines hidden (view full) ---

3683 ptp_ocp_unregister_ext(bp->ts3);
3684 if (bp->ts4)
3685 ptp_ocp_unregister_ext(bp->ts4);
3686 if (bp->pps)
3687 ptp_ocp_unregister_ext(bp->pps);
3688 for (i = 0; i < 4; i++)
3689 if (bp->signal_out[i])
3690 ptp_ocp_unregister_ext(bp->signal_out[i]);
3675 }
3676}
3677
3678static void
3679ptp_ocp_detach_sysfs(struct ptp_ocp *bp)
3680{
3681 struct device *dev = &bp->dev;
3682

--- 24 unchanged lines hidden (view full) ---

3707 ptp_ocp_unregister_ext(bp->ts3);
3708 if (bp->ts4)
3709 ptp_ocp_unregister_ext(bp->ts4);
3710 if (bp->pps)
3711 ptp_ocp_unregister_ext(bp->pps);
3712 for (i = 0; i < 4; i++)
3713 if (bp->signal_out[i])
3714 ptp_ocp_unregister_ext(bp->signal_out[i]);
3691 if (bp->gnss_port != -1)
3692 serial8250_unregister_port(bp->gnss_port);
3693 if (bp->gnss2_port != -1)
3694 serial8250_unregister_port(bp->gnss2_port);
3695 if (bp->mac_port != -1)
3696 serial8250_unregister_port(bp->mac_port);
3697 if (bp->nmea_port != -1)
3698 serial8250_unregister_port(bp->nmea_port);
3715 if (bp->gnss_port.line != -1)
3716 serial8250_unregister_port(bp->gnss_port.line);
3717 if (bp->gnss2_port.line != -1)
3718 serial8250_unregister_port(bp->gnss2_port.line);
3719 if (bp->mac_port.line != -1)
3720 serial8250_unregister_port(bp->mac_port.line);
3721 if (bp->nmea_port.line != -1)
3722 serial8250_unregister_port(bp->nmea_port.line);
3699 platform_device_unregister(bp->spi_flash);
3700 platform_device_unregister(bp->i2c_ctrl);
3701 if (bp->i2c_clk)
3702 clk_hw_unregister_fixed_rate(bp->i2c_clk);
3703 if (bp->n_irqs)
3704 pci_free_irq_vectors(bp->pdev);
3705 if (bp->ptp)
3706 ptp_clock_unregister(bp->ptp);

--- 179 unchanged lines hidden ---
3723 platform_device_unregister(bp->spi_flash);
3724 platform_device_unregister(bp->i2c_ctrl);
3725 if (bp->i2c_clk)
3726 clk_hw_unregister_fixed_rate(bp->i2c_clk);
3727 if (bp->n_irqs)
3728 pci_free_irq_vectors(bp->pdev);
3729 if (bp->ptp)
3730 ptp_clock_unregister(bp->ptp);

--- 179 unchanged lines hidden ---