• Home
  • Raw
  • Download

Lines Matching +full:attr +full:- +full:cnt +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * PTP 1588 clock support - sysfs interface.
13 struct device_attribute *attr, char *page) in clock_name_show() argument
16 return sysfs_emit(page, "%s\n", ptp->info->name); in clock_name_show()
20 #define PTP_SHOW_INT(name, var) \ argument
22 struct device_attribute *attr, char *page) \
25 return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->var); \
27 static DEVICE_ATTR(name, 0444, var##_show, NULL);
37 struct device_attribute *attr, in extts_enable_store() argument
41 struct ptp_clock_info *ops = ptp->info; in extts_enable_store()
43 int cnt, enable; in extts_enable_store() local
44 int err = -EINVAL; in extts_enable_store()
46 cnt = sscanf(buf, "%u %d", &req.extts.index, &enable); in extts_enable_store()
47 if (cnt != 2) in extts_enable_store()
49 if (req.extts.index >= ops->n_ext_ts) in extts_enable_store()
52 err = ops->enable(ops, &req, enable ? 1 : 0); in extts_enable_store()
63 struct device_attribute *attr, char *page) in extts_fifo_show() argument
66 struct timestamp_event_queue *queue = &ptp->tsevq; in extts_fifo_show()
70 int cnt = 0; in extts_fifo_show() local
74 if (mutex_lock_interruptible(&ptp->tsevq_mux)) in extts_fifo_show()
75 return -ERESTARTSYS; in extts_fifo_show()
77 spin_lock_irqsave(&queue->lock, flags); in extts_fifo_show()
80 event = queue->buf[queue->head]; in extts_fifo_show()
82 WRITE_ONCE(queue->head, (queue->head + 1) % PTP_MAX_TIMESTAMPS); in extts_fifo_show()
84 spin_unlock_irqrestore(&queue->lock, flags); in extts_fifo_show()
89 cnt = snprintf(page, PAGE_SIZE, "%u %lld %u\n", in extts_fifo_show()
92 mutex_unlock(&ptp->tsevq_mux); in extts_fifo_show()
93 return cnt; in extts_fifo_show()
98 struct device_attribute *attr, in period_store() argument
102 struct ptp_clock_info *ops = ptp->info; in period_store()
104 int cnt, enable, err = -EINVAL; in period_store() local
106 cnt = sscanf(buf, "%u %lld %u %lld %u", &req.perout.index, in period_store()
109 if (cnt != 5) in period_store()
111 if (req.perout.index >= ops->n_per_out) in period_store()
115 err = ops->enable(ops, &req, enable); in period_store()
126 struct device_attribute *attr, in pps_enable_store() argument
130 struct ptp_clock_info *ops = ptp->info; in pps_enable_store()
132 int cnt, enable; in pps_enable_store() local
133 int err = -EINVAL; in pps_enable_store()
136 return -EPERM; in pps_enable_store()
138 cnt = sscanf(buf, "%d", &enable); in pps_enable_store()
139 if (cnt != 1) in pps_enable_store()
142 err = ops->enable(ops, &req, enable ? 1 : 0); in pps_enable_store()
153 &dev_attr_clock_name.attr,
155 &dev_attr_max_adjustment.attr,
156 &dev_attr_n_alarms.attr,
157 &dev_attr_n_external_timestamps.attr,
158 &dev_attr_n_periodic_outputs.attr,
159 &dev_attr_n_programmable_pins.attr,
160 &dev_attr_pps_available.attr,
162 &dev_attr_extts_enable.attr,
163 &dev_attr_fifo.attr,
164 &dev_attr_period.attr,
165 &dev_attr_pps_enable.attr,
170 struct attribute *attr, int n) in ptp_is_attribute_visible() argument
174 struct ptp_clock_info *info = ptp->info; in ptp_is_attribute_visible()
175 umode_t mode = attr->mode; in ptp_is_attribute_visible()
177 if (attr == &dev_attr_extts_enable.attr || in ptp_is_attribute_visible()
178 attr == &dev_attr_fifo.attr) { in ptp_is_attribute_visible()
179 if (!info->n_ext_ts) in ptp_is_attribute_visible()
181 } else if (attr == &dev_attr_period.attr) { in ptp_is_attribute_visible()
182 if (!info->n_per_out) in ptp_is_attribute_visible()
184 } else if (attr == &dev_attr_pps_enable.attr) { in ptp_is_attribute_visible()
185 if (!info->pps) in ptp_is_attribute_visible()
202 static int ptp_pin_name2index(struct ptp_clock *ptp, const char *name) in ptp_pin_name2index() argument
205 for (i = 0; i < ptp->info->n_pins; i++) { in ptp_pin_name2index()
206 if (!strcmp(ptp->info->pin_config[i].name, name)) in ptp_pin_name2index()
209 return -1; in ptp_pin_name2index()
212 static ssize_t ptp_pin_show(struct device *dev, struct device_attribute *attr, in ptp_pin_show() argument
219 index = ptp_pin_name2index(ptp, attr->attr.name); in ptp_pin_show()
221 return -EINVAL; in ptp_pin_show()
223 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_pin_show()
224 return -ERESTARTSYS; in ptp_pin_show()
226 func = ptp->info->pin_config[index].func; in ptp_pin_show()
227 chan = ptp->info->pin_config[index].chan; in ptp_pin_show()
229 mutex_unlock(&ptp->pincfg_mux); in ptp_pin_show()
234 static ssize_t ptp_pin_store(struct device *dev, struct device_attribute *attr, in ptp_pin_store() argument
239 int cnt, err, index; in ptp_pin_store() local
241 cnt = sscanf(buf, "%u %u", &func, &chan); in ptp_pin_store()
242 if (cnt != 2) in ptp_pin_store()
243 return -EINVAL; in ptp_pin_store()
245 index = ptp_pin_name2index(ptp, attr->attr.name); in ptp_pin_store()
247 return -EINVAL; in ptp_pin_store()
249 if (mutex_lock_interruptible(&ptp->pincfg_mux)) in ptp_pin_store()
250 return -ERESTARTSYS; in ptp_pin_store()
252 mutex_unlock(&ptp->pincfg_mux); in ptp_pin_store()
261 struct ptp_clock_info *info = ptp->info; in ptp_populate_pin_groups()
262 int err = -ENOMEM, i, n_pins = info->n_pins; in ptp_populate_pin_groups()
267 ptp->pin_dev_attr = kcalloc(n_pins, sizeof(*ptp->pin_dev_attr), in ptp_populate_pin_groups()
269 if (!ptp->pin_dev_attr) in ptp_populate_pin_groups()
272 ptp->pin_attr = kcalloc(1 + n_pins, sizeof(*ptp->pin_attr), GFP_KERNEL); in ptp_populate_pin_groups()
273 if (!ptp->pin_attr) in ptp_populate_pin_groups()
277 struct device_attribute *da = &ptp->pin_dev_attr[i]; in ptp_populate_pin_groups()
278 sysfs_attr_init(&da->attr); in ptp_populate_pin_groups()
279 da->attr.name = info->pin_config[i].name; in ptp_populate_pin_groups()
280 da->attr.mode = 0644; in ptp_populate_pin_groups()
281 da->show = ptp_pin_show; in ptp_populate_pin_groups()
282 da->store = ptp_pin_store; in ptp_populate_pin_groups()
283 ptp->pin_attr[i] = &da->attr; in ptp_populate_pin_groups()
286 ptp->pin_attr_group.name = "pins"; in ptp_populate_pin_groups()
287 ptp->pin_attr_group.attrs = ptp->pin_attr; in ptp_populate_pin_groups()
289 ptp->pin_attr_groups[0] = &ptp->pin_attr_group; in ptp_populate_pin_groups()
294 kfree(ptp->pin_dev_attr); in ptp_populate_pin_groups()
301 kfree(ptp->pin_attr); in ptp_cleanup_pin_groups()
302 kfree(ptp->pin_dev_attr); in ptp_cleanup_pin_groups()