net: ipa: embed interconnect array in the power structure
Rather than allocating the interconnect array dynamically, represent the interconnects with a variable-length array at the end of the ipa_power structure. Signed-off-by: Alex Elder <elder@linaro.org> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
63ac8cce50
commit
8ee7ec4890
@ -67,7 +67,7 @@ struct ipa_power {
|
|||||||
spinlock_t spinlock; /* used with STOPPED/STARTED power flags */
|
spinlock_t spinlock; /* used with STOPPED/STARTED power flags */
|
||||||
DECLARE_BITMAP(flags, IPA_POWER_FLAG_COUNT);
|
DECLARE_BITMAP(flags, IPA_POWER_FLAG_COUNT);
|
||||||
u32 interconnect_count;
|
u32 interconnect_count;
|
||||||
struct icc_bulk_data *interconnect;
|
struct icc_bulk_data interconnect[];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Initialize interconnects required for IPA operation */
|
/* Initialize interconnects required for IPA operation */
|
||||||
@ -75,17 +75,12 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
|
|||||||
const struct ipa_interconnect_data *data)
|
const struct ipa_interconnect_data *data)
|
||||||
{
|
{
|
||||||
struct icc_bulk_data *interconnect;
|
struct icc_bulk_data *interconnect;
|
||||||
u32 count;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
u32 i;
|
||||||
count = power->interconnect_count;
|
|
||||||
interconnect = kcalloc(count, sizeof(*interconnect), GFP_KERNEL);
|
|
||||||
if (!interconnect)
|
|
||||||
return -ENOMEM;
|
|
||||||
power->interconnect = interconnect;
|
|
||||||
|
|
||||||
/* Initialize our interconnect data array for bulk operations */
|
/* Initialize our interconnect data array for bulk operations */
|
||||||
while (count--) {
|
interconnect = &power->interconnect[0];
|
||||||
|
for (i = 0; i < power->interconnect_count; i++) {
|
||||||
/* interconnect->path is filled in by of_icc_bulk_get() */
|
/* interconnect->path is filled in by of_icc_bulk_get() */
|
||||||
interconnect->name = data->name;
|
interconnect->name = data->name;
|
||||||
interconnect->avg_bw = data->average_bandwidth;
|
interconnect->avg_bw = data->average_bandwidth;
|
||||||
@ -97,7 +92,7 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
|
|||||||
ret = of_icc_bulk_get(dev, power->interconnect_count,
|
ret = of_icc_bulk_get(dev, power->interconnect_count,
|
||||||
power->interconnect);
|
power->interconnect);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_free;
|
return ret;
|
||||||
|
|
||||||
/* All interconnects are initially disabled */
|
/* All interconnects are initially disabled */
|
||||||
icc_bulk_disable(power->interconnect_count, power->interconnect);
|
icc_bulk_disable(power->interconnect_count, power->interconnect);
|
||||||
@ -105,15 +100,7 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
|
|||||||
/* Set the bandwidth values to be used when enabled */
|
/* Set the bandwidth values to be used when enabled */
|
||||||
ret = icc_bulk_set_bw(power->interconnect_count, power->interconnect);
|
ret = icc_bulk_set_bw(power->interconnect_count, power->interconnect);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_bulk_put;
|
icc_bulk_put(power->interconnect_count, power->interconnect);
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err_bulk_put:
|
|
||||||
icc_bulk_put(power->interconnect_count, power->interconnect);
|
|
||||||
err_free:
|
|
||||||
kfree(power->interconnect);
|
|
||||||
power->interconnect = NULL;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -122,8 +109,6 @@ err_free:
|
|||||||
static void ipa_interconnect_exit(struct ipa_power *power)
|
static void ipa_interconnect_exit(struct ipa_power *power)
|
||||||
{
|
{
|
||||||
icc_bulk_put(power->interconnect_count, power->interconnect);
|
icc_bulk_put(power->interconnect_count, power->interconnect);
|
||||||
kfree(power->interconnect);
|
|
||||||
power->interconnect = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable IPA power, enabling interconnects and the core clock */
|
/* Enable IPA power, enabling interconnects and the core clock */
|
||||||
@ -372,6 +357,7 @@ ipa_power_init(struct device *dev, const struct ipa_power_data *data)
|
|||||||
{
|
{
|
||||||
struct ipa_power *power;
|
struct ipa_power *power;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
|
size_t size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
clk = clk_get(dev, "core");
|
clk = clk_get(dev, "core");
|
||||||
@ -388,7 +374,8 @@ ipa_power_init(struct device *dev, const struct ipa_power_data *data)
|
|||||||
goto err_clk_put;
|
goto err_clk_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
power = kzalloc(sizeof(*power), GFP_KERNEL);
|
size = data->interconnect_count * sizeof(power->interconnect[0]);
|
||||||
|
power = kzalloc(sizeof(*power) + size, GFP_KERNEL);
|
||||||
if (!power) {
|
if (!power) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_clk_put;
|
goto err_clk_put;
|
||||||
|
Loading…
Reference in New Issue
Block a user