@@ -90,13 +90,13 @@ static const struct clk_ops s3c24xx_clkout_ops = {
90
90
.determine_rate = __clk_mux_determine_rate ,
91
91
};
92
92
93
- static struct clk * s3c24xx_register_clkout (struct device * dev , const char * name ,
94
- const char * * parent_names , u8 num_parents ,
93
+ static struct clk_hw * s3c24xx_register_clkout (struct device * dev ,
94
+ const char * name , const char * * parent_names , u8 num_parents ,
95
95
u8 shift , u32 mask )
96
96
{
97
97
struct s3c24xx_clkout * clkout ;
98
- struct clk * clk ;
99
98
struct clk_init_data init ;
99
+ int ret ;
100
100
101
101
/* allocate the clkout */
102
102
clkout = kzalloc (sizeof (* clkout ), GFP_KERNEL );
@@ -113,9 +113,11 @@ static struct clk *s3c24xx_register_clkout(struct device *dev, const char *name,
113
113
clkout -> mask = mask ;
114
114
clkout -> hw .init = & init ;
115
115
116
- clk = clk_register (dev , & clkout -> hw );
116
+ ret = clk_hw_register (dev , & clkout -> hw );
117
+ if (ret )
118
+ return ERR_PTR (ret );
117
119
118
- return clk ;
120
+ return & clkout -> hw ;
119
121
}
120
122
121
123
/*
@@ -125,11 +127,12 @@ static struct clk *s3c24xx_register_clkout(struct device *dev, const char *name,
125
127
struct s3c24xx_dclk {
126
128
struct device * dev ;
127
129
void __iomem * base ;
128
- struct clk_onecell_data clk_data ;
129
130
struct notifier_block dclk0_div_change_nb ;
130
131
struct notifier_block dclk1_div_change_nb ;
131
132
spinlock_t dclk_lock ;
132
133
unsigned long reg_save ;
134
+ /* clk_data must be the last entry in the structure */
135
+ struct clk_hw_onecell_data clk_data ;
133
136
};
134
137
135
138
#define to_s3c24xx_dclk0 (x ) \
@@ -240,28 +243,23 @@ static int s3c24xx_dclk_probe(struct platform_device *pdev)
240
243
{
241
244
struct s3c24xx_dclk * s3c24xx_dclk ;
242
245
struct resource * mem ;
243
- struct clk * * clk_table ;
244
246
struct s3c24xx_dclk_drv_data * dclk_variant ;
247
+ struct clk_hw * * clk_table ;
245
248
int ret , i ;
246
249
247
- s3c24xx_dclk = devm_kzalloc (& pdev -> dev , sizeof (* s3c24xx_dclk ),
248
- GFP_KERNEL );
250
+ s3c24xx_dclk = devm_kzalloc (& pdev -> dev , sizeof (* s3c24xx_dclk ) +
251
+ sizeof (* s3c24xx_dclk -> clk_data .hws ) * DCLK_MAX_CLKS ,
252
+ GFP_KERNEL );
249
253
if (!s3c24xx_dclk )
250
254
return - ENOMEM ;
251
255
256
+ clk_table = s3c24xx_dclk -> clk_data .hws ;
257
+
252
258
s3c24xx_dclk -> dev = & pdev -> dev ;
259
+ s3c24xx_dclk -> clk_data .num = DCLK_MAX_CLKS ;
253
260
platform_set_drvdata (pdev , s3c24xx_dclk );
254
261
spin_lock_init (& s3c24xx_dclk -> dclk_lock );
255
262
256
- clk_table = devm_kzalloc (& pdev -> dev ,
257
- sizeof (struct clk * ) * DCLK_MAX_CLKS ,
258
- GFP_KERNEL );
259
- if (!clk_table )
260
- return - ENOMEM ;
261
-
262
- s3c24xx_dclk -> clk_data .clks = clk_table ;
263
- s3c24xx_dclk -> clk_data .clk_num = DCLK_MAX_CLKS ;
264
-
265
263
mem = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
266
264
s3c24xx_dclk -> base = devm_ioremap_resource (& pdev -> dev , mem );
267
265
if (IS_ERR (s3c24xx_dclk -> base ))
@@ -271,29 +269,29 @@ static int s3c24xx_dclk_probe(struct platform_device *pdev)
271
269
platform_get_device_id (pdev )-> driver_data ;
272
270
273
271
274
- clk_table [MUX_DCLK0 ] = clk_register_mux (& pdev -> dev , "mux_dclk0" ,
272
+ clk_table [MUX_DCLK0 ] = clk_hw_register_mux (& pdev -> dev , "mux_dclk0" ,
275
273
dclk_variant -> mux_parent_names ,
276
274
dclk_variant -> mux_num_parents , 0 ,
277
275
s3c24xx_dclk -> base , 1 , 1 , 0 ,
278
276
& s3c24xx_dclk -> dclk_lock );
279
- clk_table [MUX_DCLK1 ] = clk_register_mux (& pdev -> dev , "mux_dclk1" ,
277
+ clk_table [MUX_DCLK1 ] = clk_hw_register_mux (& pdev -> dev , "mux_dclk1" ,
280
278
dclk_variant -> mux_parent_names ,
281
279
dclk_variant -> mux_num_parents , 0 ,
282
280
s3c24xx_dclk -> base , 17 , 1 , 0 ,
283
281
& s3c24xx_dclk -> dclk_lock );
284
282
285
- clk_table [DIV_DCLK0 ] = clk_register_divider (& pdev -> dev , "div_dclk0" ,
283
+ clk_table [DIV_DCLK0 ] = clk_hw_register_divider (& pdev -> dev , "div_dclk0" ,
286
284
"mux_dclk0" , 0 , s3c24xx_dclk -> base ,
287
285
4 , 4 , 0 , & s3c24xx_dclk -> dclk_lock );
288
- clk_table [DIV_DCLK1 ] = clk_register_divider (& pdev -> dev , "div_dclk1" ,
286
+ clk_table [DIV_DCLK1 ] = clk_hw_register_divider (& pdev -> dev , "div_dclk1" ,
289
287
"mux_dclk1" , 0 , s3c24xx_dclk -> base ,
290
288
20 , 4 , 0 , & s3c24xx_dclk -> dclk_lock );
291
289
292
- clk_table [GATE_DCLK0 ] = clk_register_gate (& pdev -> dev , "gate_dclk0" ,
290
+ clk_table [GATE_DCLK0 ] = clk_hw_register_gate (& pdev -> dev , "gate_dclk0" ,
293
291
"div_dclk0" , CLK_SET_RATE_PARENT ,
294
292
s3c24xx_dclk -> base , 0 , 0 ,
295
293
& s3c24xx_dclk -> dclk_lock );
296
- clk_table [GATE_DCLK1 ] = clk_register_gate (& pdev -> dev , "gate_dclk1" ,
294
+ clk_table [GATE_DCLK1 ] = clk_hw_register_gate (& pdev -> dev , "gate_dclk1" ,
297
295
"div_dclk1" , CLK_SET_RATE_PARENT ,
298
296
s3c24xx_dclk -> base , 16 , 0 ,
299
297
& s3c24xx_dclk -> dclk_lock );
@@ -312,15 +310,16 @@ static int s3c24xx_dclk_probe(struct platform_device *pdev)
312
310
goto err_clk_register ;
313
311
}
314
312
315
- ret = clk_register_clkdev (clk_table [MUX_DCLK0 ], "dclk0" , NULL );
313
+ ret = clk_hw_register_clkdev (clk_table [MUX_DCLK0 ], "dclk0" , NULL );
316
314
if (!ret )
317
- ret = clk_register_clkdev (clk_table [MUX_DCLK1 ], "dclk1" , NULL );
315
+ ret = clk_hw_register_clkdev (clk_table [MUX_DCLK1 ], "dclk1" ,
316
+ NULL );
318
317
if (!ret )
319
- ret = clk_register_clkdev (clk_table [MUX_CLKOUT0 ],
320
- "clkout0" , NULL );
318
+ ret = clk_hw_register_clkdev (clk_table [MUX_CLKOUT0 ],
319
+ "clkout0" , NULL );
321
320
if (!ret )
322
- ret = clk_register_clkdev (clk_table [MUX_CLKOUT1 ],
323
- "clkout1" , NULL );
321
+ ret = clk_hw_register_clkdev (clk_table [MUX_CLKOUT1 ],
322
+ "clkout1" , NULL );
324
323
if (ret ) {
325
324
dev_err (& pdev -> dev , "failed to register aliases, %d\n" , ret );
326
325
goto err_clk_register ;
@@ -332,42 +331,42 @@ static int s3c24xx_dclk_probe(struct platform_device *pdev)
332
331
s3c24xx_dclk -> dclk1_div_change_nb .notifier_call =
333
332
s3c24xx_dclk1_div_notify ;
334
333
335
- ret = clk_notifier_register (clk_table [DIV_DCLK0 ],
334
+ ret = clk_notifier_register (clk_table [DIV_DCLK0 ]-> clk ,
336
335
& s3c24xx_dclk -> dclk0_div_change_nb );
337
336
if (ret )
338
337
goto err_clk_register ;
339
338
340
- ret = clk_notifier_register (clk_table [DIV_DCLK1 ],
339
+ ret = clk_notifier_register (clk_table [DIV_DCLK1 ]-> clk ,
341
340
& s3c24xx_dclk -> dclk1_div_change_nb );
342
341
if (ret )
343
342
goto err_dclk_notify ;
344
343
345
344
return 0 ;
346
345
347
346
err_dclk_notify :
348
- clk_notifier_unregister (clk_table [DIV_DCLK0 ],
347
+ clk_notifier_unregister (clk_table [DIV_DCLK0 ]-> clk ,
349
348
& s3c24xx_dclk -> dclk0_div_change_nb );
350
349
err_clk_register :
351
350
for (i = 0 ; i < DCLK_MAX_CLKS ; i ++ )
352
351
if (clk_table [i ] && !IS_ERR (clk_table [i ]))
353
- clk_unregister (clk_table [i ]);
352
+ clk_hw_unregister (clk_table [i ]);
354
353
355
354
return ret ;
356
355
}
357
356
358
357
static int s3c24xx_dclk_remove (struct platform_device * pdev )
359
358
{
360
359
struct s3c24xx_dclk * s3c24xx_dclk = platform_get_drvdata (pdev );
361
- struct clk * * clk_table = s3c24xx_dclk -> clk_data .clks ;
360
+ struct clk_hw * * clk_table = s3c24xx_dclk -> clk_data .hws ;
362
361
int i ;
363
362
364
- clk_notifier_unregister (clk_table [DIV_DCLK1 ],
363
+ clk_notifier_unregister (clk_table [DIV_DCLK1 ]-> clk ,
365
364
& s3c24xx_dclk -> dclk1_div_change_nb );
366
- clk_notifier_unregister (clk_table [DIV_DCLK0 ],
365
+ clk_notifier_unregister (clk_table [DIV_DCLK0 ]-> clk ,
367
366
& s3c24xx_dclk -> dclk0_div_change_nb );
368
367
369
368
for (i = 0 ; i < DCLK_MAX_CLKS ; i ++ )
370
- clk_unregister (clk_table [i ]);
369
+ clk_hw_unregister (clk_table [i ]);
371
370
372
371
return 0 ;
373
372
}
0 commit comments