• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 //
3 // Framework for Ethernet Power Sourcing Equipment
4 //
5 // Copyright (c) 2022 Pengutronix, Oleksij Rempel <kernel@pengutronix.de>
6 //
7 
8 #include <linux/device.h>
9 #include <linux/of.h>
10 #include <linux/pse-pd/pse.h>
11 #include <linux/regulator/driver.h>
12 #include <linux/regulator/machine.h>
13 
14 static DEFINE_MUTEX(pse_list_mutex);
15 static LIST_HEAD(pse_controller_list);
16 
17 /**
18  * struct pse_control - a PSE control
19  * @pcdev: a pointer to the PSE controller device
20  *         this PSE control belongs to
21  * @ps: PSE PI supply of the PSE control
22  * @list: list entry for the pcdev's PSE controller list
23  * @id: ID of the PSE line in the PSE controller device
24  * @refcnt: Number of gets of this pse_control
25  */
26 struct pse_control {
27 	struct pse_controller_dev *pcdev;
28 	struct regulator *ps;
29 	struct list_head list;
30 	unsigned int id;
31 	struct kref refcnt;
32 };
33 
of_load_single_pse_pi_pairset(struct device_node * node,struct pse_pi * pi,int pairset_num)34 static int of_load_single_pse_pi_pairset(struct device_node *node,
35 					 struct pse_pi *pi,
36 					 int pairset_num)
37 {
38 	struct device_node *pairset_np;
39 	const char *name;
40 	int ret;
41 
42 	ret = of_property_read_string_index(node, "pairset-names",
43 					    pairset_num, &name);
44 	if (ret)
45 		return ret;
46 
47 	if (!strcmp(name, "alternative-a")) {
48 		pi->pairset[pairset_num].pinout = ALTERNATIVE_A;
49 	} else if (!strcmp(name, "alternative-b")) {
50 		pi->pairset[pairset_num].pinout = ALTERNATIVE_B;
51 	} else {
52 		pr_err("pse: wrong pairset-names value %s (%pOF)\n",
53 		       name, node);
54 		return -EINVAL;
55 	}
56 
57 	pairset_np = of_parse_phandle(node, "pairsets", pairset_num);
58 	if (!pairset_np)
59 		return -ENODEV;
60 
61 	pi->pairset[pairset_num].np = pairset_np;
62 
63 	return 0;
64 }
65 
66 /**
67  * of_load_pse_pi_pairsets - load PSE PI pairsets pinout and polarity
68  * @node: a pointer of the device node
69  * @pi: a pointer of the PSE PI to fill
70  * @npairsets: the number of pairsets (1 or 2) used by the PI
71  *
72  * Return: 0 on success and failure value on error
73  */
of_load_pse_pi_pairsets(struct device_node * node,struct pse_pi * pi,int npairsets)74 static int of_load_pse_pi_pairsets(struct device_node *node,
75 				   struct pse_pi *pi,
76 				   int npairsets)
77 {
78 	int i, ret;
79 
80 	ret = of_property_count_strings(node, "pairset-names");
81 	if (ret != npairsets) {
82 		pr_err("pse: amount of pairsets and pairset-names is not equal %d != %d (%pOF)\n",
83 		       npairsets, ret, node);
84 		return -EINVAL;
85 	}
86 
87 	for (i = 0; i < npairsets; i++) {
88 		ret = of_load_single_pse_pi_pairset(node, pi, i);
89 		if (ret)
90 			goto out;
91 	}
92 
93 	if (npairsets == 2 &&
94 	    pi->pairset[0].pinout == pi->pairset[1].pinout) {
95 		pr_err("pse: two PI pairsets can not have identical pinout (%pOF)",
96 		       node);
97 		ret = -EINVAL;
98 	}
99 
100 out:
101 	/* If an error appears, release all the pairset device node kref */
102 	if (ret) {
103 		of_node_put(pi->pairset[0].np);
104 		pi->pairset[0].np = NULL;
105 		of_node_put(pi->pairset[1].np);
106 		pi->pairset[1].np = NULL;
107 	}
108 
109 	return ret;
110 }
111 
pse_release_pis(struct pse_controller_dev * pcdev)112 static void pse_release_pis(struct pse_controller_dev *pcdev)
113 {
114 	int i;
115 
116 	for (i = 0; i < pcdev->nr_lines; i++) {
117 		of_node_put(pcdev->pi[i].pairset[0].np);
118 		of_node_put(pcdev->pi[i].pairset[1].np);
119 		of_node_put(pcdev->pi[i].np);
120 	}
121 	kfree(pcdev->pi);
122 }
123 
124 /**
125  * of_load_pse_pis - load all the PSE PIs
126  * @pcdev: a pointer to the PSE controller device
127  *
128  * Return: 0 on success and failure value on error
129  */
of_load_pse_pis(struct pse_controller_dev * pcdev)130 static int of_load_pse_pis(struct pse_controller_dev *pcdev)
131 {
132 	struct device_node *np = pcdev->dev->of_node;
133 	struct device_node *node, *pis;
134 	int ret;
135 
136 	if (!np)
137 		return -ENODEV;
138 
139 	pcdev->pi = kcalloc(pcdev->nr_lines, sizeof(*pcdev->pi), GFP_KERNEL);
140 	if (!pcdev->pi)
141 		return -ENOMEM;
142 
143 	pis = of_get_child_by_name(np, "pse-pis");
144 	if (!pis) {
145 		/* no description of PSE PIs */
146 		pcdev->no_of_pse_pi = true;
147 		return 0;
148 	}
149 
150 	for_each_child_of_node(pis, node) {
151 		struct pse_pi pi = {0};
152 		u32 id;
153 
154 		if (!of_node_name_eq(node, "pse-pi"))
155 			continue;
156 
157 		ret = of_property_read_u32(node, "reg", &id);
158 		if (ret) {
159 			dev_err(pcdev->dev,
160 				"can't get reg property for node '%pOF'",
161 				node);
162 			goto out;
163 		}
164 
165 		if (id >= pcdev->nr_lines) {
166 			dev_err(pcdev->dev,
167 				"reg value (%u) is out of range (%u) (%pOF)\n",
168 				id, pcdev->nr_lines, node);
169 			ret = -EINVAL;
170 			goto out;
171 		}
172 
173 		if (pcdev->pi[id].np) {
174 			dev_err(pcdev->dev,
175 				"other node with same reg value was already registered. %pOF : %pOF\n",
176 				pcdev->pi[id].np, node);
177 			ret = -EINVAL;
178 			goto out;
179 		}
180 
181 		ret = of_count_phandle_with_args(node, "pairsets", NULL);
182 		/* npairsets is limited to value one or two */
183 		if (ret == 1 || ret == 2) {
184 			ret = of_load_pse_pi_pairsets(node, &pi, ret);
185 			if (ret)
186 				goto out;
187 		} else if (ret != ENOENT) {
188 			dev_err(pcdev->dev,
189 				"error: wrong number of pairsets. Should be 1 or 2, got %d (%pOF)\n",
190 				ret, node);
191 			ret = -EINVAL;
192 			goto out;
193 		}
194 
195 		of_node_get(node);
196 		pi.np = node;
197 		memcpy(&pcdev->pi[id], &pi, sizeof(pi));
198 	}
199 
200 	of_node_put(pis);
201 	return 0;
202 
203 out:
204 	pse_release_pis(pcdev);
205 	of_node_put(node);
206 	of_node_put(pis);
207 	return ret;
208 }
209 
pse_pi_is_enabled(struct regulator_dev * rdev)210 static int pse_pi_is_enabled(struct regulator_dev *rdev)
211 {
212 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
213 	const struct pse_controller_ops *ops;
214 	int id, ret;
215 
216 	ops = pcdev->ops;
217 	if (!ops->pi_is_enabled)
218 		return -EOPNOTSUPP;
219 
220 	id = rdev_get_id(rdev);
221 	mutex_lock(&pcdev->lock);
222 	ret = ops->pi_is_enabled(pcdev, id);
223 	mutex_unlock(&pcdev->lock);
224 
225 	return ret;
226 }
227 
pse_pi_enable(struct regulator_dev * rdev)228 static int pse_pi_enable(struct regulator_dev *rdev)
229 {
230 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
231 	const struct pse_controller_ops *ops;
232 	int id, ret;
233 
234 	ops = pcdev->ops;
235 	if (!ops->pi_enable)
236 		return -EOPNOTSUPP;
237 
238 	id = rdev_get_id(rdev);
239 	mutex_lock(&pcdev->lock);
240 	ret = ops->pi_enable(pcdev, id);
241 	if (!ret)
242 		pcdev->pi[id].admin_state_enabled = 1;
243 	mutex_unlock(&pcdev->lock);
244 
245 	return ret;
246 }
247 
pse_pi_disable(struct regulator_dev * rdev)248 static int pse_pi_disable(struct regulator_dev *rdev)
249 {
250 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
251 	const struct pse_controller_ops *ops;
252 	int id, ret;
253 
254 	ops = pcdev->ops;
255 	if (!ops->pi_disable)
256 		return -EOPNOTSUPP;
257 
258 	id = rdev_get_id(rdev);
259 	mutex_lock(&pcdev->lock);
260 	ret = ops->pi_disable(pcdev, id);
261 	if (!ret)
262 		pcdev->pi[id].admin_state_enabled = 0;
263 	mutex_unlock(&pcdev->lock);
264 
265 	return ret;
266 }
267 
_pse_pi_get_voltage(struct regulator_dev * rdev)268 static int _pse_pi_get_voltage(struct regulator_dev *rdev)
269 {
270 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
271 	const struct pse_controller_ops *ops;
272 	int id;
273 
274 	ops = pcdev->ops;
275 	if (!ops->pi_get_voltage)
276 		return -EOPNOTSUPP;
277 
278 	id = rdev_get_id(rdev);
279 	return ops->pi_get_voltage(pcdev, id);
280 }
281 
pse_pi_get_voltage(struct regulator_dev * rdev)282 static int pse_pi_get_voltage(struct regulator_dev *rdev)
283 {
284 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
285 	int ret;
286 
287 	mutex_lock(&pcdev->lock);
288 	ret = _pse_pi_get_voltage(rdev);
289 	mutex_unlock(&pcdev->lock);
290 
291 	return ret;
292 }
293 
pse_pi_get_current_limit(struct regulator_dev * rdev)294 static int pse_pi_get_current_limit(struct regulator_dev *rdev)
295 {
296 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
297 	const struct pse_controller_ops *ops;
298 	int id, uV, mW, ret;
299 	s64 tmp_64;
300 
301 	ops = pcdev->ops;
302 	id = rdev_get_id(rdev);
303 	if (!ops->pi_get_pw_limit || !ops->pi_get_voltage)
304 		return -EOPNOTSUPP;
305 
306 	mutex_lock(&pcdev->lock);
307 	ret = ops->pi_get_pw_limit(pcdev, id);
308 	if (ret < 0)
309 		goto out;
310 	mW = ret;
311 
312 	ret = _pse_pi_get_voltage(rdev);
313 	if (!ret) {
314 		dev_err(pcdev->dev, "Voltage null\n");
315 		ret = -ERANGE;
316 		goto out;
317 	}
318 	if (ret < 0)
319 		goto out;
320 	uV = ret;
321 
322 	tmp_64 = mW;
323 	tmp_64 *= 1000000000ull;
324 	/* uA = mW * 1000000000 / uV */
325 	ret = DIV_ROUND_CLOSEST_ULL(tmp_64, uV);
326 
327 out:
328 	mutex_unlock(&pcdev->lock);
329 	return ret;
330 }
331 
pse_pi_set_current_limit(struct regulator_dev * rdev,int min_uA,int max_uA)332 static int pse_pi_set_current_limit(struct regulator_dev *rdev, int min_uA,
333 				    int max_uA)
334 {
335 	struct pse_controller_dev *pcdev = rdev_get_drvdata(rdev);
336 	const struct pse_controller_ops *ops;
337 	int id, mW, ret;
338 	s64 tmp_64;
339 
340 	ops = pcdev->ops;
341 	if (!ops->pi_set_pw_limit || !ops->pi_get_voltage)
342 		return -EOPNOTSUPP;
343 
344 	if (max_uA > MAX_PI_CURRENT)
345 		return -ERANGE;
346 
347 	id = rdev_get_id(rdev);
348 	mutex_lock(&pcdev->lock);
349 	ret = _pse_pi_get_voltage(rdev);
350 	if (!ret) {
351 		dev_err(pcdev->dev, "Voltage null\n");
352 		ret = -ERANGE;
353 		goto out;
354 	}
355 	if (ret < 0)
356 		goto out;
357 
358 	tmp_64 = ret;
359 	tmp_64 *= max_uA;
360 	/* mW = uA * uV / 1000000000 */
361 	mW = DIV_ROUND_CLOSEST_ULL(tmp_64, 1000000000);
362 	ret = ops->pi_set_pw_limit(pcdev, id, mW);
363 out:
364 	mutex_unlock(&pcdev->lock);
365 
366 	return ret;
367 }
368 
369 static const struct regulator_ops pse_pi_ops = {
370 	.is_enabled = pse_pi_is_enabled,
371 	.enable = pse_pi_enable,
372 	.disable = pse_pi_disable,
373 	.get_voltage = pse_pi_get_voltage,
374 	.get_current_limit = pse_pi_get_current_limit,
375 	.set_current_limit = pse_pi_set_current_limit,
376 };
377 
378 static int
devm_pse_pi_regulator_register(struct pse_controller_dev * pcdev,char * name,int id)379 devm_pse_pi_regulator_register(struct pse_controller_dev *pcdev,
380 			       char *name, int id)
381 {
382 	struct regulator_init_data *rinit_data;
383 	struct regulator_config rconfig = {0};
384 	struct regulator_desc *rdesc;
385 	struct regulator_dev *rdev;
386 
387 	rinit_data = devm_kzalloc(pcdev->dev, sizeof(*rinit_data),
388 				  GFP_KERNEL);
389 	if (!rinit_data)
390 		return -ENOMEM;
391 
392 	rdesc = devm_kzalloc(pcdev->dev, sizeof(*rdesc), GFP_KERNEL);
393 	if (!rdesc)
394 		return -ENOMEM;
395 
396 	/* Regulator descriptor id have to be the same as its associated
397 	 * PSE PI id for the well functioning of the PSE controls.
398 	 */
399 	rdesc->id = id;
400 	rdesc->name = name;
401 	rdesc->type = REGULATOR_VOLTAGE;
402 	rdesc->ops = &pse_pi_ops;
403 	rdesc->owner = pcdev->owner;
404 
405 	rinit_data->constraints.valid_ops_mask = REGULATOR_CHANGE_STATUS;
406 
407 	if (pcdev->ops->pi_set_pw_limit)
408 		rinit_data->constraints.valid_ops_mask |=
409 			REGULATOR_CHANGE_CURRENT;
410 
411 	rinit_data->supply_regulator = "vpwr";
412 
413 	rconfig.dev = pcdev->dev;
414 	rconfig.driver_data = pcdev;
415 	rconfig.init_data = rinit_data;
416 
417 	rdev = devm_regulator_register(pcdev->dev, rdesc, &rconfig);
418 	if (IS_ERR(rdev)) {
419 		dev_err_probe(pcdev->dev, PTR_ERR(rdev),
420 			      "Failed to register regulator\n");
421 		return PTR_ERR(rdev);
422 	}
423 
424 	pcdev->pi[id].rdev = rdev;
425 
426 	return 0;
427 }
428 
429 /**
430  * pse_controller_register - register a PSE controller device
431  * @pcdev: a pointer to the initialized PSE controller device
432  *
433  * Return: 0 on success and failure value on error
434  */
pse_controller_register(struct pse_controller_dev * pcdev)435 int pse_controller_register(struct pse_controller_dev *pcdev)
436 {
437 	size_t reg_name_len;
438 	int ret, i;
439 
440 	mutex_init(&pcdev->lock);
441 	INIT_LIST_HEAD(&pcdev->pse_control_head);
442 
443 	if (!pcdev->nr_lines)
444 		pcdev->nr_lines = 1;
445 
446 	ret = of_load_pse_pis(pcdev);
447 	if (ret)
448 		return ret;
449 
450 	if (pcdev->ops->setup_pi_matrix) {
451 		ret = pcdev->ops->setup_pi_matrix(pcdev);
452 		if (ret)
453 			return ret;
454 	}
455 
456 	/* Each regulator name len is pcdev dev name + 7 char +
457 	 * int max digit number (10) + 1
458 	 */
459 	reg_name_len = strlen(dev_name(pcdev->dev)) + 18;
460 
461 	/* Register PI regulators */
462 	for (i = 0; i < pcdev->nr_lines; i++) {
463 		char *reg_name;
464 
465 		/* Do not register regulator for PIs not described */
466 		if (!pcdev->no_of_pse_pi && !pcdev->pi[i].np)
467 			continue;
468 
469 		reg_name = devm_kzalloc(pcdev->dev, reg_name_len, GFP_KERNEL);
470 		if (!reg_name)
471 			return -ENOMEM;
472 
473 		snprintf(reg_name, reg_name_len, "pse-%s_pi%d",
474 			 dev_name(pcdev->dev), i);
475 
476 		ret = devm_pse_pi_regulator_register(pcdev, reg_name, i);
477 		if (ret)
478 			return ret;
479 	}
480 
481 	mutex_lock(&pse_list_mutex);
482 	list_add(&pcdev->list, &pse_controller_list);
483 	mutex_unlock(&pse_list_mutex);
484 
485 	return 0;
486 }
487 EXPORT_SYMBOL_GPL(pse_controller_register);
488 
489 /**
490  * pse_controller_unregister - unregister a PSE controller device
491  * @pcdev: a pointer to the PSE controller device
492  */
pse_controller_unregister(struct pse_controller_dev * pcdev)493 void pse_controller_unregister(struct pse_controller_dev *pcdev)
494 {
495 	pse_release_pis(pcdev);
496 	mutex_lock(&pse_list_mutex);
497 	list_del(&pcdev->list);
498 	mutex_unlock(&pse_list_mutex);
499 }
500 EXPORT_SYMBOL_GPL(pse_controller_unregister);
501 
devm_pse_controller_release(struct device * dev,void * res)502 static void devm_pse_controller_release(struct device *dev, void *res)
503 {
504 	pse_controller_unregister(*(struct pse_controller_dev **)res);
505 }
506 
507 /**
508  * devm_pse_controller_register - resource managed pse_controller_register()
509  * @dev: device that is registering this PSE controller
510  * @pcdev: a pointer to the initialized PSE controller device
511  *
512  * Managed pse_controller_register(). For PSE controllers registered by
513  * this function, pse_controller_unregister() is automatically called on
514  * driver detach. See pse_controller_register() for more information.
515  *
516  * Return: 0 on success and failure value on error
517  */
devm_pse_controller_register(struct device * dev,struct pse_controller_dev * pcdev)518 int devm_pse_controller_register(struct device *dev,
519 				 struct pse_controller_dev *pcdev)
520 {
521 	struct pse_controller_dev **pcdevp;
522 	int ret;
523 
524 	pcdevp = devres_alloc(devm_pse_controller_release, sizeof(*pcdevp),
525 			      GFP_KERNEL);
526 	if (!pcdevp)
527 		return -ENOMEM;
528 
529 	ret = pse_controller_register(pcdev);
530 	if (ret) {
531 		devres_free(pcdevp);
532 		return ret;
533 	}
534 
535 	*pcdevp = pcdev;
536 	devres_add(dev, pcdevp);
537 
538 	return 0;
539 }
540 EXPORT_SYMBOL_GPL(devm_pse_controller_register);
541 
542 /* PSE control section */
543 
__pse_control_release(struct kref * kref)544 static void __pse_control_release(struct kref *kref)
545 {
546 	struct pse_control *psec = container_of(kref, struct pse_control,
547 						  refcnt);
548 
549 	lockdep_assert_held(&pse_list_mutex);
550 
551 	if (psec->pcdev->pi[psec->id].admin_state_enabled)
552 		regulator_disable(psec->ps);
553 	devm_regulator_put(psec->ps);
554 
555 	module_put(psec->pcdev->owner);
556 
557 	list_del(&psec->list);
558 	kfree(psec);
559 }
560 
__pse_control_put_internal(struct pse_control * psec)561 static void __pse_control_put_internal(struct pse_control *psec)
562 {
563 	lockdep_assert_held(&pse_list_mutex);
564 
565 	kref_put(&psec->refcnt, __pse_control_release);
566 }
567 
568 /**
569  * pse_control_put - free the PSE control
570  * @psec: PSE control pointer
571  */
pse_control_put(struct pse_control * psec)572 void pse_control_put(struct pse_control *psec)
573 {
574 	if (IS_ERR_OR_NULL(psec))
575 		return;
576 
577 	mutex_lock(&pse_list_mutex);
578 	__pse_control_put_internal(psec);
579 	mutex_unlock(&pse_list_mutex);
580 }
581 EXPORT_SYMBOL_GPL(pse_control_put);
582 
583 static struct pse_control *
pse_control_get_internal(struct pse_controller_dev * pcdev,unsigned int index)584 pse_control_get_internal(struct pse_controller_dev *pcdev, unsigned int index)
585 {
586 	struct pse_control *psec;
587 	int ret;
588 
589 	lockdep_assert_held(&pse_list_mutex);
590 
591 	list_for_each_entry(psec, &pcdev->pse_control_head, list) {
592 		if (psec->id == index) {
593 			kref_get(&psec->refcnt);
594 			return psec;
595 		}
596 	}
597 
598 	psec = kzalloc(sizeof(*psec), GFP_KERNEL);
599 	if (!psec)
600 		return ERR_PTR(-ENOMEM);
601 
602 	if (!try_module_get(pcdev->owner)) {
603 		ret = -ENODEV;
604 		goto free_psec;
605 	}
606 
607 	psec->ps = devm_regulator_get_exclusive(pcdev->dev,
608 						rdev_get_name(pcdev->pi[index].rdev));
609 	if (IS_ERR(psec->ps)) {
610 		ret = PTR_ERR(psec->ps);
611 		goto put_module;
612 	}
613 
614 	ret = regulator_is_enabled(psec->ps);
615 	if (ret < 0)
616 		goto regulator_put;
617 
618 	pcdev->pi[index].admin_state_enabled = ret;
619 
620 	psec->pcdev = pcdev;
621 	list_add(&psec->list, &pcdev->pse_control_head);
622 	psec->id = index;
623 	kref_init(&psec->refcnt);
624 
625 	return psec;
626 
627 regulator_put:
628 	devm_regulator_put(psec->ps);
629 put_module:
630 	module_put(pcdev->owner);
631 free_psec:
632 	kfree(psec);
633 
634 	return ERR_PTR(ret);
635 }
636 
637 /**
638  * of_pse_match_pi - Find the PSE PI id matching the device node phandle
639  * @pcdev: a pointer to the PSE controller device
640  * @np: a pointer to the device node
641  *
642  * Return: id of the PSE PI, -EINVAL if not found
643  */
of_pse_match_pi(struct pse_controller_dev * pcdev,struct device_node * np)644 static int of_pse_match_pi(struct pse_controller_dev *pcdev,
645 			   struct device_node *np)
646 {
647 	int i;
648 
649 	for (i = 0; i < pcdev->nr_lines; i++) {
650 		if (pcdev->pi[i].np == np)
651 			return i;
652 	}
653 
654 	return -EINVAL;
655 }
656 
657 /**
658  * psec_id_xlate - translate pse_spec to the PSE line number according
659  *		   to the number of pse-cells in case of no pse_pi node
660  * @pcdev: a pointer to the PSE controller device
661  * @pse_spec: PSE line specifier as found in the device tree
662  *
663  * Return: 0 if #pse-cells = <0>. Return PSE line number otherwise.
664  */
psec_id_xlate(struct pse_controller_dev * pcdev,const struct of_phandle_args * pse_spec)665 static int psec_id_xlate(struct pse_controller_dev *pcdev,
666 			 const struct of_phandle_args *pse_spec)
667 {
668 	if (!pcdev->of_pse_n_cells)
669 		return 0;
670 
671 	if (pcdev->of_pse_n_cells > 1 ||
672 	    pse_spec->args[0] >= pcdev->nr_lines)
673 		return -EINVAL;
674 
675 	return pse_spec->args[0];
676 }
677 
of_pse_control_get(struct device_node * node)678 struct pse_control *of_pse_control_get(struct device_node *node)
679 {
680 	struct pse_controller_dev *r, *pcdev;
681 	struct of_phandle_args args;
682 	struct pse_control *psec;
683 	int psec_id;
684 	int ret;
685 
686 	if (!node)
687 		return ERR_PTR(-EINVAL);
688 
689 	ret = of_parse_phandle_with_args(node, "pses", "#pse-cells", 0, &args);
690 	if (ret)
691 		return ERR_PTR(ret);
692 
693 	mutex_lock(&pse_list_mutex);
694 	pcdev = NULL;
695 	list_for_each_entry(r, &pse_controller_list, list) {
696 		if (!r->no_of_pse_pi) {
697 			ret = of_pse_match_pi(r, args.np);
698 			if (ret >= 0) {
699 				pcdev = r;
700 				psec_id = ret;
701 				break;
702 			}
703 		} else if (args.np == r->dev->of_node) {
704 			pcdev = r;
705 			break;
706 		}
707 	}
708 
709 	if (!pcdev) {
710 		psec = ERR_PTR(-EPROBE_DEFER);
711 		goto out;
712 	}
713 
714 	if (WARN_ON(args.args_count != pcdev->of_pse_n_cells)) {
715 		psec = ERR_PTR(-EINVAL);
716 		goto out;
717 	}
718 
719 	if (pcdev->no_of_pse_pi) {
720 		psec_id = psec_id_xlate(pcdev, &args);
721 		if (psec_id < 0) {
722 			psec = ERR_PTR(psec_id);
723 			goto out;
724 		}
725 	}
726 
727 	/* pse_list_mutex also protects the pcdev's pse_control list */
728 	psec = pse_control_get_internal(pcdev, psec_id);
729 
730 out:
731 	mutex_unlock(&pse_list_mutex);
732 	of_node_put(args.np);
733 
734 	return psec;
735 }
736 EXPORT_SYMBOL_GPL(of_pse_control_get);
737 
738 /**
739  * pse_ethtool_get_status - get status of PSE control
740  * @psec: PSE control pointer
741  * @extack: extack for reporting useful error messages
742  * @status: struct to store PSE status
743  *
744  * Return: 0 on success and failure value on error
745  */
pse_ethtool_get_status(struct pse_control * psec,struct netlink_ext_ack * extack,struct pse_control_status * status)746 int pse_ethtool_get_status(struct pse_control *psec,
747 			   struct netlink_ext_ack *extack,
748 			   struct pse_control_status *status)
749 {
750 	const struct pse_controller_ops *ops;
751 	struct pse_controller_dev *pcdev;
752 	int err;
753 
754 	pcdev = psec->pcdev;
755 	ops = pcdev->ops;
756 	if (!ops->ethtool_get_status) {
757 		NL_SET_ERR_MSG(extack,
758 			       "PSE driver does not support status report");
759 		return -EOPNOTSUPP;
760 	}
761 
762 	mutex_lock(&pcdev->lock);
763 	err = ops->ethtool_get_status(pcdev, psec->id, extack, status);
764 	mutex_unlock(&pcdev->lock);
765 
766 	return err;
767 }
768 EXPORT_SYMBOL_GPL(pse_ethtool_get_status);
769 
pse_ethtool_c33_set_config(struct pse_control * psec,const struct pse_control_config * config)770 static int pse_ethtool_c33_set_config(struct pse_control *psec,
771 				      const struct pse_control_config *config)
772 {
773 	int err = 0;
774 
775 	/* Look at admin_state_enabled status to not call regulator_enable
776 	 * or regulator_disable twice creating a regulator counter mismatch
777 	 */
778 	switch (config->c33_admin_control) {
779 	case ETHTOOL_C33_PSE_ADMIN_STATE_ENABLED:
780 		/* We could have mismatch between admin_state_enabled and
781 		 * state reported by regulator_is_enabled. This can occur when
782 		 * the PI is forcibly turn off by the controller. Call
783 		 * regulator_disable on that case to fix the counters state.
784 		 */
785 		if (psec->pcdev->pi[psec->id].admin_state_enabled &&
786 		    !regulator_is_enabled(psec->ps)) {
787 			err = regulator_disable(psec->ps);
788 			if (err)
789 				break;
790 		}
791 		if (!psec->pcdev->pi[psec->id].admin_state_enabled)
792 			err = regulator_enable(psec->ps);
793 		break;
794 	case ETHTOOL_C33_PSE_ADMIN_STATE_DISABLED:
795 		if (psec->pcdev->pi[psec->id].admin_state_enabled)
796 			err = regulator_disable(psec->ps);
797 		break;
798 	default:
799 		err = -EOPNOTSUPP;
800 	}
801 
802 	return err;
803 }
804 
pse_ethtool_podl_set_config(struct pse_control * psec,const struct pse_control_config * config)805 static int pse_ethtool_podl_set_config(struct pse_control *psec,
806 				       const struct pse_control_config *config)
807 {
808 	int err = 0;
809 
810 	/* Look at admin_state_enabled status to not call regulator_enable
811 	 * or regulator_disable twice creating a regulator counter mismatch
812 	 */
813 	switch (config->podl_admin_control) {
814 	case ETHTOOL_PODL_PSE_ADMIN_STATE_ENABLED:
815 		if (!psec->pcdev->pi[psec->id].admin_state_enabled)
816 			err = regulator_enable(psec->ps);
817 		break;
818 	case ETHTOOL_PODL_PSE_ADMIN_STATE_DISABLED:
819 		if (psec->pcdev->pi[psec->id].admin_state_enabled)
820 			err = regulator_disable(psec->ps);
821 		break;
822 	default:
823 		err = -EOPNOTSUPP;
824 	}
825 
826 	return err;
827 }
828 
829 /**
830  * pse_ethtool_set_config - set PSE control configuration
831  * @psec: PSE control pointer
832  * @extack: extack for reporting useful error messages
833  * @config: Configuration of the test to run
834  *
835  * Return: 0 on success and failure value on error
836  */
pse_ethtool_set_config(struct pse_control * psec,struct netlink_ext_ack * extack,const struct pse_control_config * config)837 int pse_ethtool_set_config(struct pse_control *psec,
838 			   struct netlink_ext_ack *extack,
839 			   const struct pse_control_config *config)
840 {
841 	int err = 0;
842 
843 	if (pse_has_c33(psec) && config->c33_admin_control) {
844 		err = pse_ethtool_c33_set_config(psec, config);
845 		if (err)
846 			return err;
847 	}
848 
849 	if (pse_has_podl(psec) && config->podl_admin_control)
850 		err = pse_ethtool_podl_set_config(psec, config);
851 
852 	return err;
853 }
854 EXPORT_SYMBOL_GPL(pse_ethtool_set_config);
855 
856 /**
857  * pse_ethtool_set_pw_limit - set PSE control power limit
858  * @psec: PSE control pointer
859  * @extack: extack for reporting useful error messages
860  * @pw_limit: power limit value in mW
861  *
862  * Return: 0 on success and failure value on error
863  */
pse_ethtool_set_pw_limit(struct pse_control * psec,struct netlink_ext_ack * extack,const unsigned int pw_limit)864 int pse_ethtool_set_pw_limit(struct pse_control *psec,
865 			     struct netlink_ext_ack *extack,
866 			     const unsigned int pw_limit)
867 {
868 	int uV, uA, ret;
869 	s64 tmp_64;
870 
871 	ret = regulator_get_voltage(psec->ps);
872 	if (!ret) {
873 		NL_SET_ERR_MSG(extack,
874 			       "Can't calculate the current, PSE voltage read is 0");
875 		return -ERANGE;
876 	}
877 	if (ret < 0) {
878 		NL_SET_ERR_MSG(extack,
879 			       "Error reading PSE voltage");
880 		return ret;
881 	}
882 	uV = ret;
883 
884 	tmp_64 = pw_limit;
885 	tmp_64 *= 1000000000ull;
886 	/* uA = mW * 1000000000 / uV */
887 	uA = DIV_ROUND_CLOSEST_ULL(tmp_64, uV);
888 
889 	return regulator_set_current_limit(psec->ps, 0, uA);
890 }
891 EXPORT_SYMBOL_GPL(pse_ethtool_set_pw_limit);
892 
pse_has_podl(struct pse_control * psec)893 bool pse_has_podl(struct pse_control *psec)
894 {
895 	return psec->pcdev->types & ETHTOOL_PSE_PODL;
896 }
897 EXPORT_SYMBOL_GPL(pse_has_podl);
898 
pse_has_c33(struct pse_control * psec)899 bool pse_has_c33(struct pse_control *psec)
900 {
901 	return psec->pcdev->types & ETHTOOL_PSE_C33;
902 }
903 EXPORT_SYMBOL_GPL(pse_has_c33);
904