@@ -46,27 +46,6 @@ PTP_SHOW_INT(n_periodic_outputs, n_per_out);
46
46
PTP_SHOW_INT (n_programmable_pins , n_pins );
47
47
PTP_SHOW_INT (pps_available , pps );
48
48
49
- static struct attribute * ptp_attrs [] = {
50
- & dev_attr_clock_name .attr ,
51
- & dev_attr_max_adjustment .attr ,
52
- & dev_attr_n_alarms .attr ,
53
- & dev_attr_n_external_timestamps .attr ,
54
- & dev_attr_n_periodic_outputs .attr ,
55
- & dev_attr_n_programmable_pins .attr ,
56
- & dev_attr_pps_available .attr ,
57
- NULL ,
58
- };
59
-
60
- static const struct attribute_group ptp_group = {
61
- .attrs = ptp_attrs ,
62
- };
63
-
64
- const struct attribute_group * ptp_groups [] = {
65
- & ptp_group ,
66
- NULL ,
67
- };
68
-
69
-
70
49
static ssize_t extts_enable_store (struct device * dev ,
71
50
struct device_attribute * attr ,
72
51
const char * buf , size_t count )
@@ -91,6 +70,7 @@ static ssize_t extts_enable_store(struct device *dev,
91
70
out :
92
71
return err ;
93
72
}
73
+ static DEVICE_ATTR (extts_enable , 0220 , NULL, extts_enable_store ) ;
94
74
95
75
static ssize_t extts_fifo_show (struct device * dev ,
96
76
struct device_attribute * attr , char * page )
@@ -124,6 +104,7 @@ static ssize_t extts_fifo_show(struct device *dev,
124
104
mutex_unlock (& ptp -> tsevq_mux );
125
105
return cnt ;
126
106
}
107
+ static DEVICE_ATTR (fifo , 0444 , extts_fifo_show , NULL) ;
127
108
128
109
static ssize_t period_store (struct device * dev ,
129
110
struct device_attribute * attr ,
@@ -151,6 +132,7 @@ static ssize_t period_store(struct device *dev,
151
132
out :
152
133
return err ;
153
134
}
135
+ static DEVICE_ATTR (period , 0220 , NULL, period_store ) ;
154
136
155
137
static ssize_t pps_enable_store (struct device * dev ,
156
138
struct device_attribute * attr ,
@@ -177,6 +159,57 @@ static ssize_t pps_enable_store(struct device *dev,
177
159
out :
178
160
return err ;
179
161
}
162
+ static DEVICE_ATTR (pps_enable , 0220 , NULL, pps_enable_store ) ;
163
+
164
+ static struct attribute * ptp_attrs [] = {
165
+ & dev_attr_clock_name .attr ,
166
+
167
+ & dev_attr_max_adjustment .attr ,
168
+ & dev_attr_n_alarms .attr ,
169
+ & dev_attr_n_external_timestamps .attr ,
170
+ & dev_attr_n_periodic_outputs .attr ,
171
+ & dev_attr_n_programmable_pins .attr ,
172
+ & dev_attr_pps_available .attr ,
173
+
174
+ & dev_attr_extts_enable .attr ,
175
+ & dev_attr_fifo .attr ,
176
+ & dev_attr_period .attr ,
177
+ & dev_attr_pps_enable .attr ,
178
+ NULL
179
+ };
180
+
181
+ static umode_t ptp_is_attribute_visible (struct kobject * kobj ,
182
+ struct attribute * attr , int n )
183
+ {
184
+ struct device * dev = kobj_to_dev (kobj );
185
+ struct ptp_clock * ptp = dev_get_drvdata (dev );
186
+ struct ptp_clock_info * info = ptp -> info ;
187
+ umode_t mode = attr -> mode ;
188
+
189
+ if (attr == & dev_attr_extts_enable .attr ||
190
+ attr == & dev_attr_fifo .attr ) {
191
+ if (!info -> n_ext_ts )
192
+ mode = 0 ;
193
+ } else if (attr == & dev_attr_period .attr ) {
194
+ if (!info -> n_per_out )
195
+ mode = 0 ;
196
+ } else if (attr == & dev_attr_pps_enable .attr ) {
197
+ if (!info -> pps )
198
+ mode = 0 ;
199
+ }
200
+
201
+ return mode ;
202
+ }
203
+
204
+ static const struct attribute_group ptp_group = {
205
+ .is_visible = ptp_is_attribute_visible ,
206
+ .attrs = ptp_attrs ,
207
+ };
208
+
209
+ const struct attribute_group * ptp_groups [] = {
210
+ & ptp_group ,
211
+ NULL
212
+ };
180
213
181
214
static int ptp_pin_name2index (struct ptp_clock * ptp , const char * name )
182
215
{
@@ -235,26 +268,11 @@ static ssize_t ptp_pin_store(struct device *dev, struct device_attribute *attr,
235
268
return count ;
236
269
}
237
270
238
- static DEVICE_ATTR (extts_enable , 0220 , NULL, extts_enable_store ) ;
239
- static DEVICE_ATTR (fifo , 0444 , extts_fifo_show , NULL) ;
240
- static DEVICE_ATTR (period , 0220 , NULL, period_store ) ;
241
- static DEVICE_ATTR (pps_enable , 0220 , NULL, pps_enable_store ) ;
242
-
243
271
int ptp_cleanup_sysfs (struct ptp_clock * ptp )
244
272
{
245
273
struct device * dev = ptp -> dev ;
246
274
struct ptp_clock_info * info = ptp -> info ;
247
275
248
- if (info -> n_ext_ts ) {
249
- device_remove_file (dev , & dev_attr_extts_enable );
250
- device_remove_file (dev , & dev_attr_fifo );
251
- }
252
- if (info -> n_per_out )
253
- device_remove_file (dev , & dev_attr_period );
254
-
255
- if (info -> pps )
256
- device_remove_file (dev , & dev_attr_pps_enable );
257
-
258
276
if (info -> n_pins ) {
259
277
sysfs_remove_group (& dev -> kobj , & ptp -> pin_attr_group );
260
278
kfree (ptp -> pin_attr );
@@ -307,46 +325,13 @@ static int ptp_populate_pins(struct ptp_clock *ptp)
307
325
308
326
int ptp_populate_sysfs (struct ptp_clock * ptp )
309
327
{
310
- struct device * dev = ptp -> dev ;
311
328
struct ptp_clock_info * info = ptp -> info ;
312
329
int err ;
313
330
314
- if (info -> n_ext_ts ) {
315
- err = device_create_file (dev , & dev_attr_extts_enable );
316
- if (err )
317
- goto out1 ;
318
- err = device_create_file (dev , & dev_attr_fifo );
319
- if (err )
320
- goto out2 ;
321
- }
322
- if (info -> n_per_out ) {
323
- err = device_create_file (dev , & dev_attr_period );
324
- if (err )
325
- goto out3 ;
326
- }
327
- if (info -> pps ) {
328
- err = device_create_file (dev , & dev_attr_pps_enable );
329
- if (err )
330
- goto out4 ;
331
- }
332
331
if (info -> n_pins ) {
333
332
err = ptp_populate_pins (ptp );
334
333
if (err )
335
- goto out5 ;
334
+ return err ;
336
335
}
337
336
return 0 ;
338
- out5 :
339
- if (info -> pps )
340
- device_remove_file (dev , & dev_attr_pps_enable );
341
- out4 :
342
- if (info -> n_per_out )
343
- device_remove_file (dev , & dev_attr_period );
344
- out3 :
345
- if (info -> n_ext_ts )
346
- device_remove_file (dev , & dev_attr_fifo );
347
- out2 :
348
- if (info -> n_ext_ts )
349
- device_remove_file (dev , & dev_attr_extts_enable );
350
- out1 :
351
- return err ;
352
337
}
0 commit comments