@@ -218,6 +218,13 @@ struct ptp_ocp_sma_connector {
218
218
bool disabled ;
219
219
};
220
220
221
+ struct ocp_attr_group {
222
+ u64 cap ;
223
+ const struct attribute_group * group ;
224
+ };
225
+
226
+ #define OCP_CAP_BASIC BIT(0)
227
+
221
228
#define OCP_BOARD_ID_LEN 13
222
229
#define OCP_SERIAL_LEN 6
223
230
@@ -248,6 +255,7 @@ struct ptp_ocp {
248
255
struct platform_device * spi_flash ;
249
256
struct clk_hw * i2c_clk ;
250
257
struct timer_list watchdog ;
258
+ const struct ocp_attr_group * attr_tbl ;
251
259
const struct ptp_ocp_eeprom_map * eeprom_map ;
252
260
struct dentry * debug_root ;
253
261
time64_t gnss_lost ;
@@ -265,6 +273,7 @@ struct ptp_ocp {
265
273
int flash_start ;
266
274
u32 utc_tai_offset ;
267
275
u32 ts_window_adjust ;
276
+ u64 fw_cap ;
268
277
struct ptp_ocp_sma_connector sma [4 ];
269
278
};
270
279
@@ -290,6 +299,8 @@ static int ptp_ocp_fb_board_init(struct ptp_ocp *bp, struct ocp_resource *r);
290
299
static irqreturn_t ptp_ocp_ts_irq (int irq , void * priv );
291
300
static int ptp_ocp_ts_enable (void * priv , u32 req , bool enable );
292
301
302
+ static const struct ocp_attr_group fb_timecard_groups [];
303
+
293
304
struct ptp_ocp_eeprom_map {
294
305
u16 off ;
295
306
u16 len ;
@@ -1526,6 +1537,8 @@ ptp_ocp_fb_board_init(struct ptp_ocp *bp, struct ocp_resource *r)
1526
1537
bp -> flash_start = 1024 * 4096 ;
1527
1538
bp -> eeprom_map = fb_eeprom_map ;
1528
1539
bp -> fw_version = ioread32 (& bp -> image -> version );
1540
+ bp -> attr_tbl = fb_timecard_groups ;
1541
+ bp -> fw_cap = OCP_CAP_BASIC ;
1529
1542
1530
1543
ptp_ocp_tod_init (bp );
1531
1544
ptp_ocp_nmea_out_init (bp );
@@ -2167,7 +2180,7 @@ tod_correction_store(struct device *dev, struct device_attribute *attr,
2167
2180
}
2168
2181
static DEVICE_ATTR_RW (tod_correction );
2169
2182
2170
- static struct attribute * timecard_attrs [] = {
2183
+ static struct attribute * fb_timecard_attrs [] = {
2171
2184
& dev_attr_serialnum .attr ,
2172
2185
& dev_attr_gnss_sync .attr ,
2173
2186
& dev_attr_clock_source .attr ,
@@ -2186,7 +2199,13 @@ static struct attribute *timecard_attrs[] = {
2186
2199
& dev_attr_tod_correction .attr ,
2187
2200
NULL ,
2188
2201
};
2189
- ATTRIBUTE_GROUPS (timecard );
2202
+ static const struct attribute_group fb_timecard_group = {
2203
+ .attrs = fb_timecard_attrs ,
2204
+ };
2205
+ static const struct ocp_attr_group fb_timecard_groups [] = {
2206
+ { .cap = OCP_CAP_BASIC , .group = & fb_timecard_group },
2207
+ { },
2208
+ };
2190
2209
2191
2210
static void
2192
2211
gpio_input_map (char * buf , struct ptp_ocp * bp , u16 map [][2 ], u16 bit ,
@@ -2605,6 +2624,7 @@ ptp_ocp_complete(struct ptp_ocp *bp)
2605
2624
{
2606
2625
struct pps_device * pps ;
2607
2626
char buf [32 ];
2627
+ int i , err ;
2608
2628
2609
2629
if (bp -> gnss_port != -1 ) {
2610
2630
sprintf (buf , "ttyS%d" , bp -> gnss_port );
@@ -2629,8 +2649,13 @@ ptp_ocp_complete(struct ptp_ocp *bp)
2629
2649
if (pps )
2630
2650
ptp_ocp_symlink (bp , pps -> dev , "pps" );
2631
2651
2632
- if (device_add_groups (& bp -> dev , timecard_groups ))
2633
- pr_err ("device add groups failed\n" );
2652
+ for (i = 0 ; bp -> attr_tbl [i ].cap ; i ++ ) {
2653
+ if (!(bp -> attr_tbl [i ].cap & bp -> fw_cap ))
2654
+ continue ;
2655
+ err = sysfs_create_group (& bp -> dev .kobj , bp -> attr_tbl [i ].group );
2656
+ if (err )
2657
+ return err ;
2658
+ }
2634
2659
2635
2660
ptp_ocp_debugfs_add_device (bp );
2636
2661
@@ -2703,12 +2728,15 @@ static void
2703
2728
ptp_ocp_detach_sysfs (struct ptp_ocp * bp )
2704
2729
{
2705
2730
struct device * dev = & bp -> dev ;
2731
+ int i ;
2706
2732
2707
2733
sysfs_remove_link (& dev -> kobj , "ttyGNSS" );
2708
2734
sysfs_remove_link (& dev -> kobj , "ttyMAC" );
2709
2735
sysfs_remove_link (& dev -> kobj , "ptp" );
2710
2736
sysfs_remove_link (& dev -> kobj , "pps" );
2711
- device_remove_groups (dev , timecard_groups );
2737
+ if (bp -> attr_tbl )
2738
+ for (i = 0 ; bp -> attr_tbl [i ].cap ; i ++ )
2739
+ sysfs_remove_group (& dev -> kobj , bp -> attr_tbl [i ].group );
2712
2740
}
2713
2741
2714
2742
static void
0 commit comments