Commit 8ee7ec48 authored by Alex Elder's avatar Alex Elder Committed by Jakub Kicinski

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: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 63ac8cce
...@@ -67,7 +67,7 @@ struct ipa_power { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev, ...@@ -122,8 +109,6 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment