@@ -316,6 +316,15 @@ struct ptp_ocp_serial_port {
316
316
#define OCP_SERIAL_LEN 6
317
317
#define OCP_SMA_NUM 4
318
318
319
+ enum {
320
+ PORT_GNSS ,
321
+ PORT_GNSS2 ,
322
+ PORT_MAC , /* miniature atomic clock */
323
+ PORT_NMEA ,
324
+
325
+ __PORT_COUNT ,
326
+ };
327
+
319
328
struct ptp_ocp {
320
329
struct pci_dev * pdev ;
321
330
struct device dev ;
@@ -357,10 +366,7 @@ struct ptp_ocp {
357
366
struct delayed_work sync_work ;
358
367
int id ;
359
368
int n_irqs ;
360
- struct ptp_ocp_serial_port gnss_port ;
361
- struct ptp_ocp_serial_port gnss2_port ;
362
- struct ptp_ocp_serial_port mac_port ; /* miniature atomic clock */
363
- struct ptp_ocp_serial_port nmea_port ;
369
+ struct ptp_ocp_serial_port port [__PORT_COUNT ];
364
370
bool fw_loader ;
365
371
u8 fw_tag ;
366
372
u16 fw_version ;
@@ -655,28 +661,28 @@ static struct ocp_resource ocp_fb_resource[] = {
655
661
},
656
662
},
657
663
{
658
- OCP_SERIAL_RESOURCE (gnss_port ),
664
+ OCP_SERIAL_RESOURCE (port [ PORT_GNSS ] ),
659
665
.offset = 0x00160000 + 0x1000 , .irq_vec = 3 ,
660
666
.extra = & (struct ptp_ocp_serial_port ) {
661
667
.baud = 115200 ,
662
668
},
663
669
},
664
670
{
665
- OCP_SERIAL_RESOURCE (gnss2_port ),
671
+ OCP_SERIAL_RESOURCE (port [ PORT_GNSS2 ] ),
666
672
.offset = 0x00170000 + 0x1000 , .irq_vec = 4 ,
667
673
.extra = & (struct ptp_ocp_serial_port ) {
668
674
.baud = 115200 ,
669
675
},
670
676
},
671
677
{
672
- OCP_SERIAL_RESOURCE (mac_port ),
678
+ OCP_SERIAL_RESOURCE (port [ PORT_MAC ] ),
673
679
.offset = 0x00180000 + 0x1000 , .irq_vec = 5 ,
674
680
.extra = & (struct ptp_ocp_serial_port ) {
675
681
.baud = 57600 ,
676
682
},
677
683
},
678
684
{
679
- OCP_SERIAL_RESOURCE (nmea_port ),
685
+ OCP_SERIAL_RESOURCE (port [ PORT_NMEA ] ),
680
686
.offset = 0x00190000 + 0x1000 , .irq_vec = 10 ,
681
687
},
682
688
{
@@ -740,7 +746,7 @@ static struct ocp_resource ocp_art_resource[] = {
740
746
.offset = 0x01000000 , .size = 0x10000 ,
741
747
},
742
748
{
743
- OCP_SERIAL_RESOURCE (gnss_port ),
749
+ OCP_SERIAL_RESOURCE (port [ PORT_GNSS ] ),
744
750
.offset = 0x00160000 + 0x1000 , .irq_vec = 3 ,
745
751
.extra = & (struct ptp_ocp_serial_port ) {
746
752
.baud = 115200 ,
@@ -839,7 +845,7 @@ static struct ocp_resource ocp_art_resource[] = {
839
845
},
840
846
},
841
847
{
842
- OCP_SERIAL_RESOURCE (mac_port ),
848
+ OCP_SERIAL_RESOURCE (port [ PORT_MAC ] ),
843
849
.offset = 0x00190000 , .irq_vec = 7 ,
844
850
.extra = & (struct ptp_ocp_serial_port ) {
845
851
.baud = 9600 ,
@@ -950,14 +956,14 @@ static struct ocp_resource ocp_adva_resource[] = {
950
956
.offset = 0x00220000 , .size = 0x1000 ,
951
957
},
952
958
{
953
- OCP_SERIAL_RESOURCE (gnss_port ),
959
+ OCP_SERIAL_RESOURCE (port [ PORT_GNSS ] ),
954
960
.offset = 0x00160000 + 0x1000 , .irq_vec = 3 ,
955
961
.extra = & (struct ptp_ocp_serial_port ) {
956
962
.baud = 9600 ,
957
963
},
958
964
},
959
965
{
960
- OCP_SERIAL_RESOURCE (mac_port ),
966
+ OCP_SERIAL_RESOURCE (port [ PORT_MAC ] ),
961
967
.offset = 0x00180000 + 0x1000 , .irq_vec = 5 ,
962
968
.extra = & (struct ptp_ocp_serial_port ) {
963
969
.baud = 115200 ,
@@ -1649,6 +1655,15 @@ ptp_ocp_tod_gnss_name(int idx)
1649
1655
return gnss_name [idx ];
1650
1656
}
1651
1657
1658
+ static const char *
1659
+ ptp_ocp_tty_port_name (int idx )
1660
+ {
1661
+ static const char * const tty_name [] = {
1662
+ "GNSS" , "GNSS2" , "MAC" , "NMEA"
1663
+ };
1664
+ return tty_name [idx ];
1665
+ }
1666
+
1652
1667
struct ptp_ocp_nvmem_match_info {
1653
1668
struct ptp_ocp * bp ;
1654
1669
const void * const tag ;
@@ -3346,6 +3361,54 @@ static EXT_ATTR_RO(freq, frequency, 1);
3346
3361
static EXT_ATTR_RO (freq , frequency , 2 ) ;
3347
3362
static EXT_ATTR_RO (freq , frequency , 3 ) ;
3348
3363
3364
+ static ssize_t
3365
+ ptp_ocp_tty_show (struct device * dev , struct device_attribute * attr , char * buf )
3366
+ {
3367
+ struct dev_ext_attribute * ea = to_ext_attr (attr );
3368
+ struct ptp_ocp * bp = dev_get_drvdata (dev );
3369
+
3370
+ return sysfs_emit (buf , "ttyS%d" , bp -> port [(uintptr_t )ea -> var ].line );
3371
+ }
3372
+
3373
+ static umode_t
3374
+ ptp_ocp_timecard_tty_is_visible (struct kobject * kobj , struct attribute * attr , int n )
3375
+ {
3376
+ struct ptp_ocp * bp = dev_get_drvdata (kobj_to_dev (kobj ));
3377
+ struct ptp_ocp_serial_port * port ;
3378
+ struct device_attribute * dattr ;
3379
+ struct dev_ext_attribute * ea ;
3380
+
3381
+ if (strncmp (attr -> name , "tty" , 3 ))
3382
+ return attr -> mode ;
3383
+
3384
+ dattr = container_of (attr , struct device_attribute , attr );
3385
+ ea = container_of (dattr , struct dev_ext_attribute , attr );
3386
+ port = & bp -> port [(uintptr_t )ea -> var ];
3387
+ return port -> line == -1 ? 0 : 0444 ;
3388
+ }
3389
+
3390
+ #define EXT_TTY_ATTR_RO (_name , _val ) \
3391
+ struct dev_ext_attribute dev_attr_tty##_name = \
3392
+ { __ATTR(tty##_name, 0444, ptp_ocp_tty_show, NULL), (void *)_val }
3393
+
3394
+ static EXT_TTY_ATTR_RO (GNSS , PORT_GNSS ) ;
3395
+ static EXT_TTY_ATTR_RO (GNSS2 , PORT_GNSS2 ) ;
3396
+ static EXT_TTY_ATTR_RO (MAC , PORT_MAC ) ;
3397
+ static EXT_TTY_ATTR_RO (NMEA , PORT_NMEA ) ;
3398
+ static struct attribute * ptp_ocp_timecard_tty_attrs [] = {
3399
+ & dev_attr_ttyGNSS .attr .attr ,
3400
+ & dev_attr_ttyGNSS2 .attr .attr ,
3401
+ & dev_attr_ttyMAC .attr .attr ,
3402
+ & dev_attr_ttyNMEA .attr .attr ,
3403
+ NULL ,
3404
+ };
3405
+
3406
+ static const struct attribute_group ptp_ocp_timecard_tty_group = {
3407
+ .name = "tty" ,
3408
+ .attrs = ptp_ocp_timecard_tty_attrs ,
3409
+ .is_visible = ptp_ocp_timecard_tty_is_visible ,
3410
+ };
3411
+
3349
3412
static ssize_t
3350
3413
serialnum_show (struct device * dev , struct device_attribute * attr , char * buf )
3351
3414
{
@@ -3775,6 +3838,7 @@ static const struct attribute_group fb_timecard_group = {
3775
3838
3776
3839
static const struct ocp_attr_group fb_timecard_groups [] = {
3777
3840
{ .cap = OCP_CAP_BASIC , .group = & fb_timecard_group },
3841
+ { .cap = OCP_CAP_BASIC , .group = & ptp_ocp_timecard_tty_group },
3778
3842
{ .cap = OCP_CAP_SIGNAL , .group = & fb_timecard_signal0_group },
3779
3843
{ .cap = OCP_CAP_SIGNAL , .group = & fb_timecard_signal1_group },
3780
3844
{ .cap = OCP_CAP_SIGNAL , .group = & fb_timecard_signal2_group },
@@ -3814,6 +3878,7 @@ static const struct attribute_group art_timecard_group = {
3814
3878
3815
3879
static const struct ocp_attr_group art_timecard_groups [] = {
3816
3880
{ .cap = OCP_CAP_BASIC , .group = & art_timecard_group },
3881
+ { .cap = OCP_CAP_BASIC , .group = & ptp_ocp_timecard_tty_group },
3817
3882
{ },
3818
3883
};
3819
3884
@@ -3841,6 +3906,7 @@ static const struct attribute_group adva_timecard_group = {
3841
3906
3842
3907
static const struct ocp_attr_group adva_timecard_groups [] = {
3843
3908
{ .cap = OCP_CAP_BASIC , .group = & adva_timecard_group },
3909
+ { .cap = OCP_CAP_BASIC , .group = & ptp_ocp_timecard_tty_group },
3844
3910
{ .cap = OCP_CAP_SIGNAL , .group = & fb_timecard_signal0_group },
3845
3911
{ .cap = OCP_CAP_SIGNAL , .group = & fb_timecard_signal1_group },
3846
3912
{ .cap = OCP_CAP_FREQ , .group = & fb_timecard_freq0_group },
@@ -3960,16 +4026,11 @@ ptp_ocp_summary_show(struct seq_file *s, void *data)
3960
4026
bp = dev_get_drvdata (dev );
3961
4027
3962
4028
seq_printf (s , "%7s: /dev/ptp%d\n" , "PTP" , ptp_clock_index (bp -> ptp ));
3963
- if (bp -> gnss_port .line != -1 )
3964
- seq_printf (s , "%7s: /dev/ttyS%d\n" , "GNSS1" ,
3965
- bp -> gnss_port .line );
3966
- if (bp -> gnss2_port .line != -1 )
3967
- seq_printf (s , "%7s: /dev/ttyS%d\n" , "GNSS2" ,
3968
- bp -> gnss2_port .line );
3969
- if (bp -> mac_port .line != -1 )
3970
- seq_printf (s , "%7s: /dev/ttyS%d\n" , "MAC" , bp -> mac_port .line );
3971
- if (bp -> nmea_port .line != -1 )
3972
- seq_printf (s , "%7s: /dev/ttyS%d\n" , "NMEA" , bp -> nmea_port .line );
4029
+ for (i = 0 ; i < __PORT_COUNT ; i ++ ) {
4030
+ if (bp -> port [i ].line != -1 )
4031
+ seq_printf (s , "%7s: /dev/ttyS%d\n" , ptp_ocp_tty_port_name (i ),
4032
+ bp -> port [i ].line );
4033
+ }
3973
4034
3974
4035
memset (sma_val , 0xff , sizeof (sma_val ));
3975
4036
if (bp -> sma_map1 ) {
@@ -4279,7 +4340,7 @@ ptp_ocp_dev_release(struct device *dev)
4279
4340
static int
4280
4341
ptp_ocp_device_init (struct ptp_ocp * bp , struct pci_dev * pdev )
4281
4342
{
4282
- int err ;
4343
+ int i , err ;
4283
4344
4284
4345
mutex_lock (& ptp_ocp_lock );
4285
4346
err = idr_alloc (& ptp_ocp_idr , bp , 0 , 0 , GFP_KERNEL );
@@ -4292,10 +4353,10 @@ ptp_ocp_device_init(struct ptp_ocp *bp, struct pci_dev *pdev)
4292
4353
4293
4354
bp -> ptp_info = ptp_ocp_clock_info ;
4294
4355
spin_lock_init (& bp -> lock );
4295
- bp -> gnss_port . line = -1 ;
4296
- bp -> gnss2_port . line = -1 ;
4297
- bp -> mac_port .line = -1 ;
4298
- bp -> nmea_port . line = -1 ;
4356
+
4357
+ for ( i = 0 ; i < __PORT_COUNT ; i ++ )
4358
+ bp -> port [ i ] .line = -1 ;
4359
+
4299
4360
bp -> pdev = pdev ;
4300
4361
4301
4362
device_initialize (& bp -> dev );
@@ -4352,22 +4413,6 @@ ptp_ocp_complete(struct ptp_ocp *bp)
4352
4413
struct pps_device * pps ;
4353
4414
char buf [32 ];
4354
4415
4355
- if (bp -> gnss_port .line != -1 ) {
4356
- sprintf (buf , "ttyS%d" , bp -> gnss_port .line );
4357
- ptp_ocp_link_child (bp , buf , "ttyGNSS" );
4358
- }
4359
- if (bp -> gnss2_port .line != -1 ) {
4360
- sprintf (buf , "ttyS%d" , bp -> gnss2_port .line );
4361
- ptp_ocp_link_child (bp , buf , "ttyGNSS2" );
4362
- }
4363
- if (bp -> mac_port .line != -1 ) {
4364
- sprintf (buf , "ttyS%d" , bp -> mac_port .line );
4365
- ptp_ocp_link_child (bp , buf , "ttyMAC" );
4366
- }
4367
- if (bp -> nmea_port .line != -1 ) {
4368
- sprintf (buf , "ttyS%d" , bp -> nmea_port .line );
4369
- ptp_ocp_link_child (bp , buf , "ttyNMEA" );
4370
- }
4371
4416
sprintf (buf , "ptp%d" , ptp_clock_index (bp -> ptp ));
4372
4417
ptp_ocp_link_child (bp , buf , "ptp" );
4373
4418
@@ -4416,23 +4461,20 @@ ptp_ocp_info(struct ptp_ocp *bp)
4416
4461
};
4417
4462
struct device * dev = & bp -> pdev -> dev ;
4418
4463
u32 reg ;
4464
+ int i ;
4419
4465
4420
4466
ptp_ocp_phc_info (bp );
4421
4467
4422
- ptp_ocp_serial_info (dev , "GNSS" , bp -> gnss_port .line ,
4423
- bp -> gnss_port .baud );
4424
- ptp_ocp_serial_info (dev , "GNSS2" , bp -> gnss2_port .line ,
4425
- bp -> gnss2_port .baud );
4426
- ptp_ocp_serial_info (dev , "MAC" , bp -> mac_port .line , bp -> mac_port .baud );
4427
- if (bp -> nmea_out && bp -> nmea_port .line != -1 ) {
4428
- bp -> nmea_port .baud = -1 ;
4468
+ for (i = 0 ; i < __PORT_COUNT ; i ++ ) {
4469
+ if (i == PORT_NMEA && bp -> nmea_out && bp -> port [PORT_NMEA ].line != -1 ) {
4470
+ bp -> port [PORT_NMEA ].baud = -1 ;
4429
4471
4430
- reg = ioread32 (& bp -> nmea_out -> uart_baud );
4431
- if (reg < ARRAY_SIZE (nmea_baud ))
4432
- bp -> nmea_port .baud = nmea_baud [reg ];
4433
-
4434
- ptp_ocp_serial_info (dev , "NMEA" , bp -> nmea_port .line ,
4435
- bp -> nmea_port .baud );
4472
+ reg = ioread32 (& bp -> nmea_out -> uart_baud );
4473
+ if (reg < ARRAY_SIZE (nmea_baud ))
4474
+ bp -> port [ PORT_NMEA ] .baud = nmea_baud [reg ];
4475
+ }
4476
+ ptp_ocp_serial_info (dev , ptp_ocp_tty_port_name ( i ) , bp -> port [ i ] .line ,
4477
+ bp -> port [ i ] .baud );
4436
4478
}
4437
4479
}
4438
4480
@@ -4441,9 +4483,6 @@ ptp_ocp_detach_sysfs(struct ptp_ocp *bp)
4441
4483
{
4442
4484
struct device * dev = & bp -> dev ;
4443
4485
4444
- sysfs_remove_link (& dev -> kobj , "ttyGNSS" );
4445
- sysfs_remove_link (& dev -> kobj , "ttyGNSS2" );
4446
- sysfs_remove_link (& dev -> kobj , "ttyMAC" );
4447
4486
sysfs_remove_link (& dev -> kobj , "ptp" );
4448
4487
sysfs_remove_link (& dev -> kobj , "pps" );
4449
4488
}
@@ -4473,14 +4512,9 @@ ptp_ocp_detach(struct ptp_ocp *bp)
4473
4512
for (i = 0 ; i < 4 ; i ++ )
4474
4513
if (bp -> signal_out [i ])
4475
4514
ptp_ocp_unregister_ext (bp -> signal_out [i ]);
4476
- if (bp -> gnss_port .line != -1 )
4477
- serial8250_unregister_port (bp -> gnss_port .line );
4478
- if (bp -> gnss2_port .line != -1 )
4479
- serial8250_unregister_port (bp -> gnss2_port .line );
4480
- if (bp -> mac_port .line != -1 )
4481
- serial8250_unregister_port (bp -> mac_port .line );
4482
- if (bp -> nmea_port .line != -1 )
4483
- serial8250_unregister_port (bp -> nmea_port .line );
4515
+ for (i = 0 ; i < __PORT_COUNT ; i ++ )
4516
+ if (bp -> port [i ].line != -1 )
4517
+ serial8250_unregister_port (bp -> port [i ].line );
4484
4518
platform_device_unregister (bp -> spi_flash );
4485
4519
platform_device_unregister (bp -> i2c_ctrl );
4486
4520
if (bp -> i2c_clk )
0 commit comments