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 --- |