@@ -67,25 +67,20 @@ struct ipa_power {
67
67
spinlock_t spinlock ; /* used with STOPPED/STARTED power flags */
68
68
DECLARE_BITMAP (flags , IPA_POWER_FLAG_COUNT );
69
69
u32 interconnect_count ;
70
- struct icc_bulk_data * interconnect ;
70
+ struct icc_bulk_data interconnect [] ;
71
71
};
72
72
73
73
/* Initialize interconnects required for IPA operation */
74
74
static int ipa_interconnect_init (struct ipa_power * power , struct device * dev ,
75
75
const struct ipa_interconnect_data * data )
76
76
{
77
77
struct icc_bulk_data * interconnect ;
78
- u32 count ;
79
78
int ret ;
80
-
81
- count = power -> interconnect_count ;
82
- interconnect = kcalloc (count , sizeof (* interconnect ), GFP_KERNEL );
83
- if (!interconnect )
84
- return - ENOMEM ;
85
- power -> interconnect = interconnect ;
79
+ u32 i ;
86
80
87
81
/* Initialize our interconnect data array for bulk operations */
88
- while (count -- ) {
82
+ interconnect = & power -> interconnect [0 ];
83
+ for (i = 0 ; i < power -> interconnect_count ; i ++ ) {
89
84
/* interconnect->path is filled in by of_icc_bulk_get() */
90
85
interconnect -> name = data -> name ;
91
86
interconnect -> avg_bw = data -> average_bandwidth ;
@@ -97,23 +92,15 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
97
92
ret = of_icc_bulk_get (dev , power -> interconnect_count ,
98
93
power -> interconnect );
99
94
if (ret )
100
- goto err_free ;
95
+ return ret ;
101
96
102
97
/* All interconnects are initially disabled */
103
98
icc_bulk_disable (power -> interconnect_count , power -> interconnect );
104
99
105
100
/* Set the bandwidth values to be used when enabled */
106
101
ret = icc_bulk_set_bw (power -> interconnect_count , power -> interconnect );
107
102
if (ret )
108
- goto err_bulk_put ;
109
-
110
- return 0 ;
111
-
112
- err_bulk_put :
113
- icc_bulk_put (power -> interconnect_count , power -> interconnect );
114
- err_free :
115
- kfree (power -> interconnect );
116
- power -> interconnect = NULL ;
103
+ icc_bulk_put (power -> interconnect_count , power -> interconnect );
117
104
118
105
return ret ;
119
106
}
@@ -122,8 +109,6 @@ static int ipa_interconnect_init(struct ipa_power *power, struct device *dev,
122
109
static void ipa_interconnect_exit (struct ipa_power * power )
123
110
{
124
111
icc_bulk_put (power -> interconnect_count , power -> interconnect );
125
- kfree (power -> interconnect );
126
- power -> interconnect = NULL ;
127
112
}
128
113
129
114
/* 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
357
{
373
358
struct ipa_power * power ;
374
359
struct clk * clk ;
360
+ size_t size ;
375
361
int ret ;
376
362
377
363
clk = clk_get (dev , "core" );
@@ -388,7 +374,8 @@ ipa_power_init(struct device *dev, const struct ipa_power_data *data)
388
374
goto err_clk_put ;
389
375
}
390
376
391
- power = kzalloc (sizeof (* power ), GFP_KERNEL );
377
+ size = data -> interconnect_count * sizeof (power -> interconnect [0 ]);
378
+ power = kzalloc (sizeof (* power ) + size , GFP_KERNEL );
392
379
if (!power ) {
393
380
ret = - ENOMEM ;
394
381
goto err_clk_put ;
0 commit comments