bulk.c (2810B)
1// SPDX-License-Identifier: GPL-2.0 2 3#include <linux/interconnect-provider.h> 4#include <linux/device.h> 5#include <linux/export.h> 6 7/** 8 * of_icc_bulk_get() - get interconnect paths 9 * @dev: the device requesting the path 10 * @num_paths: the number of icc_bulk_data 11 * @paths: the table with the paths we want to get 12 * 13 * Returns 0 on success or negative errno otherwise. 14 */ 15int __must_check of_icc_bulk_get(struct device *dev, int num_paths, 16 struct icc_bulk_data *paths) 17{ 18 int ret, i; 19 20 for (i = 0; i < num_paths; i++) { 21 paths[i].path = of_icc_get(dev, paths[i].name); 22 if (IS_ERR(paths[i].path)) { 23 ret = PTR_ERR(paths[i].path); 24 if (ret != -EPROBE_DEFER) 25 dev_err(dev, "of_icc_get() failed on path %s (%d)\n", 26 paths[i].name, ret); 27 paths[i].path = NULL; 28 goto err; 29 } 30 } 31 32 return 0; 33 34err: 35 icc_bulk_put(i, paths); 36 37 return ret; 38} 39EXPORT_SYMBOL_GPL(of_icc_bulk_get); 40 41/** 42 * icc_bulk_put() - put a list of interconnect paths 43 * @num_paths: the number of icc_bulk_data 44 * @paths: the icc_bulk_data table with the paths being put 45 */ 46void icc_bulk_put(int num_paths, struct icc_bulk_data *paths) 47{ 48 while (--num_paths >= 0) { 49 icc_put(paths[num_paths].path); 50 paths[num_paths].path = NULL; 51 } 52} 53EXPORT_SYMBOL_GPL(icc_bulk_put); 54 55/** 56 * icc_bulk_set_bw() - set bandwidth to a set of paths 57 * @num_paths: the number of icc_bulk_data 58 * @paths: the icc_bulk_data table containing the paths and bandwidth 59 * 60 * Returns 0 on success or negative errno otherwise. 61 */ 62int icc_bulk_set_bw(int num_paths, const struct icc_bulk_data *paths) 63{ 64 int ret = 0; 65 int i; 66 67 for (i = 0; i < num_paths; i++) { 68 ret = icc_set_bw(paths[i].path, paths[i].avg_bw, paths[i].peak_bw); 69 if (ret) { 70 pr_err("icc_set_bw() failed on path %s (%d)\n", paths[i].name, ret); 71 return ret; 72 } 73 } 74 75 return ret; 76} 77EXPORT_SYMBOL_GPL(icc_bulk_set_bw); 78 79/** 80 * icc_bulk_enable() - enable a previously disabled set of paths 81 * @num_paths: the number of icc_bulk_data 82 * @paths: the icc_bulk_data table containing the paths and bandwidth 83 * 84 * Returns 0 on success or negative errno otherwise. 85 */ 86int icc_bulk_enable(int num_paths, const struct icc_bulk_data *paths) 87{ 88 int ret, i; 89 90 for (i = 0; i < num_paths; i++) { 91 ret = icc_enable(paths[i].path); 92 if (ret) { 93 pr_err("icc_enable() failed on path %s (%d)\n", paths[i].name, ret); 94 goto err; 95 } 96 } 97 98 return 0; 99 100err: 101 icc_bulk_disable(i, paths); 102 103 return ret; 104} 105EXPORT_SYMBOL_GPL(icc_bulk_enable); 106 107/** 108 * icc_bulk_disable() - disable a set of interconnect paths 109 * @num_paths: the number of icc_bulk_data 110 * @paths: the icc_bulk_data table containing the paths and bandwidth 111 */ 112void icc_bulk_disable(int num_paths, const struct icc_bulk_data *paths) 113{ 114 while (--num_paths >= 0) 115 icc_disable(paths[num_paths].path); 116} 117EXPORT_SYMBOL_GPL(icc_bulk_disable);