~ubuntu-branches/debian/wheezy/linux-2.6/wheezy

« back to all changes in this revision

Viewing changes to arch/arm/plat-spear/clock.c

  • Committer: Bazaar Package Importer
  • Author(s): Ben Hutchings, Ben Hutchings, Aurelien Jarno
  • Date: 2011-06-07 12:14:05 UTC
  • mfrom: (43.1.9 sid)
  • Revision ID: james.westby@ubuntu.com-20110607121405-i3h1rd7nrnd2b73h
Tags: 2.6.39-2
[ Ben Hutchings ]
* [x86] Enable BACKLIGHT_APPLE, replacing BACKLIGHT_MBP_NVIDIA
  (Closes: #627492)
* cgroups: Disable memory resource controller by default. Allow it
  to be enabled using kernel parameter 'cgroup_enable=memory'.
* rt2800usb: Enable support for more USB devices including
  Linksys WUSB600N (Closes: #596626) (this change was accidentally
  omitted from 2.6.39-1)
* [x86] Remove Celeron from list of processors supporting PAE. Most
  'Celeron M' models do not.
* Update debconf template translations:
  - Swedish (Martin Bagge) (Closes: #628932)
  - French (David Prévot) (Closes: #628191)
* aufs: Update for 2.6.39 (Closes: #627837)
* Add stable 2.6.39.1, including:
  - ext4: dont set PageUptodate in ext4_end_bio()
  - pata_cmd64x: fix boot crash on parisc (Closes: #622997, #622745)
  - ext3: Fix fs corruption when make_indexed_dir() fails
  - netfilter: nf_ct_sip: validate Content-Length in TCP SIP messages
  - sctp: fix race between sctp_bind_addr_free() and
    sctp_bind_addr_conflict()
  - sctp: fix memory leak of the ASCONF queue when free asoc
  - md/bitmap: fix saving of events_cleared and other state
  - cdc_acm: Fix oops when Droids MuIn LCD is connected
  - cx88: Fix conversion from BKL to fine-grained locks (Closes: #619827)
  - keys: Set cred->user_ns in key_replace_session_keyring (CVE-2011-2184)
  - tmpfs: fix race between truncate and writepage
  - nfs41: Correct offset for LAYOUTCOMMIT
  - xen/mmu: fix a race window causing leave_mm BUG()
  - ext4: fix possible use-after-free in ext4_remove_li_request()
  For the complete list of changes, see:
   http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.39.1
* Bump ABI to 2
* netfilter: Enable IP_SET, IP_SET_BITMAP_IP, IP_SET_BITMAP_IPMAC,
  IP_SET_BITMAP_PORT, IP_SET_HASH_IP, IP_SET_HASH_IPPORT,
  IP_SET_HASH_IPPORTIP, IP_SET_HASH_IPPORTNET, IP_SET_HASH_NET,
  IP_SET_HASH_NETPORT, IP_SET_LIST_SET, NETFILTER_XT_SET as modules
  (Closes: #629401)

[ Aurelien Jarno ]
* [mipsel/loongson-2f] Disable_SCSI_LPFC to workaround GCC ICE.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
 */
13
13
 
14
14
#include <linux/bug.h>
 
15
#include <linux/clk.h>
 
16
#include <linux/debugfs.h>
15
17
#include <linux/err.h>
16
18
#include <linux/io.h>
17
19
#include <linux/list.h>
18
20
#include <linux/module.h>
19
21
#include <linux/spinlock.h>
20
 
#include <mach/misc_regs.h>
21
22
#include <plat/clock.h>
22
23
 
23
24
static DEFINE_SPINLOCK(clocks_lock);
24
25
static LIST_HEAD(root_clks);
 
26
#ifdef CONFIG_DEBUG_FS
 
27
static LIST_HEAD(clocks);
 
28
#endif
25
29
 
26
 
static void propagate_rate(struct list_head *);
 
30
static void propagate_rate(struct clk *, int on_init);
 
31
#ifdef CONFIG_DEBUG_FS
 
32
static int clk_debugfs_reparent(struct clk *);
 
33
#endif
27
34
 
28
35
static int generic_clk_enable(struct clk *clk)
29
36
{
65
72
        .disable = generic_clk_disable,
66
73
};
67
74
 
 
75
/* returns current programmed clocks clock info structure */
 
76
static struct pclk_info *pclk_info_get(struct clk *clk)
 
77
{
 
78
        unsigned int val, i;
 
79
        struct pclk_info *info = NULL;
 
80
 
 
81
        val = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift)
 
82
                & clk->pclk_sel->pclk_sel_mask;
 
83
 
 
84
        for (i = 0; i < clk->pclk_sel->pclk_count; i++) {
 
85
                if (clk->pclk_sel->pclk_info[i].pclk_val == val)
 
86
                        info = &clk->pclk_sel->pclk_info[i];
 
87
        }
 
88
 
 
89
        return info;
 
90
}
 
91
 
 
92
/*
 
93
 * Set Update pclk, and pclk_info of clk and add clock sibling node to current
 
94
 * parents children list
 
95
 */
 
96
static void clk_reparent(struct clk *clk, struct pclk_info *pclk_info)
 
97
{
 
98
        unsigned long flags;
 
99
 
 
100
        spin_lock_irqsave(&clocks_lock, flags);
 
101
        list_del(&clk->sibling);
 
102
        list_add(&clk->sibling, &pclk_info->pclk->children);
 
103
 
 
104
        clk->pclk = pclk_info->pclk;
 
105
        spin_unlock_irqrestore(&clocks_lock, flags);
 
106
 
 
107
#ifdef CONFIG_DEBUG_FS
 
108
        clk_debugfs_reparent(clk);
 
109
#endif
 
110
}
 
111
 
 
112
static void do_clk_disable(struct clk *clk)
 
113
{
 
114
        if (!clk)
 
115
                return;
 
116
 
 
117
        if (!clk->usage_count) {
 
118
                WARN_ON(1);
 
119
                return;
 
120
        }
 
121
 
 
122
        clk->usage_count--;
 
123
 
 
124
        if (clk->usage_count == 0) {
 
125
                /*
 
126
                 * Surely, there are no active childrens or direct users
 
127
                 * of this clock
 
128
                 */
 
129
                if (clk->pclk)
 
130
                        do_clk_disable(clk->pclk);
 
131
 
 
132
                if (clk->ops && clk->ops->disable)
 
133
                        clk->ops->disable(clk);
 
134
        }
 
135
}
 
136
 
 
137
static int do_clk_enable(struct clk *clk)
 
138
{
 
139
        int ret = 0;
 
140
 
 
141
        if (!clk)
 
142
                return -EFAULT;
 
143
 
 
144
        if (clk->usage_count == 0) {
 
145
                if (clk->pclk) {
 
146
                        ret = do_clk_enable(clk->pclk);
 
147
                        if (ret)
 
148
                                goto err;
 
149
                }
 
150
                if (clk->ops && clk->ops->enable) {
 
151
                        ret = clk->ops->enable(clk);
 
152
                        if (ret) {
 
153
                                if (clk->pclk)
 
154
                                        do_clk_disable(clk->pclk);
 
155
                                goto err;
 
156
                        }
 
157
                }
 
158
                /*
 
159
                 * Since the clock is going to be used for the first
 
160
                 * time please reclac
 
161
                 */
 
162
                if (clk->recalc) {
 
163
                        ret = clk->recalc(clk);
 
164
                        if (ret)
 
165
                                goto err;
 
166
                }
 
167
        }
 
168
        clk->usage_count++;
 
169
err:
 
170
        return ret;
 
171
}
 
172
 
68
173
/*
69
174
 * clk_enable - inform the system when the clock source should be running.
70
175
 * @clk: clock source
78
183
        unsigned long flags;
79
184
        int ret = 0;
80
185
 
81
 
        if (!clk || IS_ERR(clk))
82
 
                return -EFAULT;
83
 
 
84
186
        spin_lock_irqsave(&clocks_lock, flags);
85
 
        if (clk->usage_count == 0) {
86
 
                if (clk->ops && clk->ops->enable)
87
 
                        ret = clk->ops->enable(clk);
88
 
        }
89
 
        clk->usage_count++;
 
187
        ret = do_clk_enable(clk);
90
188
        spin_unlock_irqrestore(&clocks_lock, flags);
91
 
 
92
189
        return ret;
93
190
}
94
191
EXPORT_SYMBOL(clk_enable);
109
206
{
110
207
        unsigned long flags;
111
208
 
112
 
        if (!clk || IS_ERR(clk))
113
 
                return;
114
 
 
115
 
        WARN_ON(clk->usage_count == 0);
116
 
 
117
209
        spin_lock_irqsave(&clocks_lock, flags);
118
 
        clk->usage_count--;
119
 
        if (clk->usage_count == 0) {
120
 
                if (clk->ops && clk->ops->disable)
121
 
                        clk->ops->disable(clk);
122
 
        }
 
210
        do_clk_disable(clk);
123
211
        spin_unlock_irqrestore(&clocks_lock, flags);
124
212
}
125
213
EXPORT_SYMBOL(clk_disable);
153
241
        int i, found = 0, val = 0;
154
242
        unsigned long flags;
155
243
 
156
 
        if (!clk || IS_ERR(clk) || !parent || IS_ERR(parent))
 
244
        if (!clk || !parent)
157
245
                return -EFAULT;
158
 
        if (clk->usage_count)
159
 
                return -EBUSY;
 
246
        if (clk->pclk == parent)
 
247
                return 0;
160
248
        if (!clk->pclk_sel)
161
249
                return -EPERM;
162
 
        if (clk->pclk == parent)
163
 
                return 0;
164
250
 
 
251
        /* check if requested parent is in clk parent list */
165
252
        for (i = 0; i < clk->pclk_sel->pclk_count; i++) {
166
253
                if (clk->pclk_sel->pclk_info[i].pclk == parent) {
167
254
                        found = 1;
176
263
        /* reflect parent change in hardware */
177
264
        val = readl(clk->pclk_sel->pclk_sel_reg);
178
265
        val &= ~(clk->pclk_sel->pclk_sel_mask << clk->pclk_sel_shift);
179
 
        val |= clk->pclk_sel->pclk_info[i].pclk_mask << clk->pclk_sel_shift;
 
266
        val |= clk->pclk_sel->pclk_info[i].pclk_val << clk->pclk_sel_shift;
180
267
        writel(val, clk->pclk_sel->pclk_sel_reg);
181
268
        spin_unlock_irqrestore(&clocks_lock, flags);
182
269
 
183
270
        /* reflect parent change in software */
184
 
        clk->recalc(clk);
185
 
        propagate_rate(&clk->children);
 
271
        clk_reparent(clk, &clk->pclk_sel->pclk_info[i]);
 
272
 
 
273
        propagate_rate(clk, 0);
186
274
        return 0;
187
275
}
188
276
EXPORT_SYMBOL(clk_set_parent);
189
277
 
 
278
/**
 
279
 * clk_set_rate - set the clock rate for a clock source
 
280
 * @clk: clock source
 
281
 * @rate: desired clock rate in Hz
 
282
 *
 
283
 * Returns success (0) or negative errno.
 
284
 */
 
285
int clk_set_rate(struct clk *clk, unsigned long rate)
 
286
{
 
287
        unsigned long flags;
 
288
        int ret = -EINVAL;
 
289
 
 
290
        if (!clk || !rate)
 
291
                return -EFAULT;
 
292
 
 
293
        if (clk->set_rate) {
 
294
                spin_lock_irqsave(&clocks_lock, flags);
 
295
                ret = clk->set_rate(clk, rate);
 
296
                if (!ret)
 
297
                        /* if successful -> propagate */
 
298
                        propagate_rate(clk, 0);
 
299
                spin_unlock_irqrestore(&clocks_lock, flags);
 
300
        } else if (clk->pclk) {
 
301
                u32 mult = clk->div_factor ? clk->div_factor : 1;
 
302
                ret = clk_set_rate(clk->pclk, mult * rate);
 
303
        }
 
304
 
 
305
        return ret;
 
306
}
 
307
EXPORT_SYMBOL(clk_set_rate);
 
308
 
190
309
/* registers clock in platform clock framework */
191
310
void clk_register(struct clk_lookup *cl)
192
311
{
193
 
        struct clk *clk = cl->clk;
 
312
        struct clk *clk;
194
313
        unsigned long flags;
195
314
 
196
 
        if (!clk || IS_ERR(clk))
 
315
        if (!cl || !cl->clk)
197
316
                return;
 
317
        clk = cl->clk;
198
318
 
199
319
        spin_lock_irqsave(&clocks_lock, flags);
200
320
 
207
327
        /* root clock don't have any parents */
208
328
        if (!clk->pclk && !clk->pclk_sel) {
209
329
                list_add(&clk->sibling, &root_clks);
 
330
        } else if (clk->pclk && !clk->pclk_sel) {
210
331
                /* add clocks with only one parent to parent's children list */
211
 
        } else if (clk->pclk && !clk->pclk_sel) {
212
332
                list_add(&clk->sibling, &clk->pclk->children);
213
333
        } else {
214
 
                /* add clocks with > 1 parent to 1st parent's children list */
215
 
                list_add(&clk->sibling,
216
 
                         &clk->pclk_sel->pclk_info[0].pclk->children);
 
334
                /* clocks with more than one parent */
 
335
                struct pclk_info *pclk_info;
 
336
 
 
337
                pclk_info = pclk_info_get(clk);
 
338
                if (!pclk_info) {
 
339
                        pr_err("CLKDEV: invalid pclk info of clk with"
 
340
                                        " %s dev_id and %s con_id\n",
 
341
                                        cl->dev_id, cl->con_id);
 
342
                } else {
 
343
                        clk->pclk = pclk_info->pclk;
 
344
                        list_add(&clk->sibling, &pclk_info->pclk->children);
 
345
                }
217
346
        }
 
347
 
218
348
        spin_unlock_irqrestore(&clocks_lock, flags);
219
349
 
 
350
        /* debugfs specific */
 
351
#ifdef CONFIG_DEBUG_FS
 
352
        list_add(&clk->node, &clocks);
 
353
        clk->cl = cl;
 
354
#endif
 
355
 
220
356
        /* add clock to arm clockdev framework */
221
357
        clkdev_add(cl);
222
358
}
223
359
 
224
360
/**
225
 
 * propagate_rate - recalculate and propagate all clocks in list head
226
 
 *
227
 
 * Recalculates all root clocks in list head, which if the clock's .recalc is
228
 
 * set correctly, should also propagate their rates.
229
 
 */
230
 
static void propagate_rate(struct list_head *lhead)
231
 
{
232
 
        struct clk *clkp, *_temp;
233
 
 
234
 
        list_for_each_entry_safe(clkp, _temp, lhead, sibling) {
235
 
                if (clkp->recalc)
236
 
                        clkp->recalc(clkp);
237
 
                propagate_rate(&clkp->children);
238
 
        }
239
 
}
240
 
 
241
 
/* returns current programmed clocks clock info structure */
242
 
static struct pclk_info *pclk_info_get(struct clk *clk)
243
 
{
244
 
        unsigned int mask, i;
245
 
        unsigned long flags;
246
 
        struct pclk_info *info = NULL;
247
 
 
248
 
        spin_lock_irqsave(&clocks_lock, flags);
249
 
        mask = (readl(clk->pclk_sel->pclk_sel_reg) >> clk->pclk_sel_shift)
250
 
                        & clk->pclk_sel->pclk_sel_mask;
251
 
 
252
 
        for (i = 0; i < clk->pclk_sel->pclk_count; i++) {
253
 
                if (clk->pclk_sel->pclk_info[i].pclk_mask == mask)
254
 
                        info = &clk->pclk_sel->pclk_info[i];
255
 
        }
256
 
        spin_unlock_irqrestore(&clocks_lock, flags);
257
 
 
258
 
        return info;
259
 
}
 
361
 * propagate_rate - recalculate and propagate all clocks to children
 
362
 * @pclk: parent clock required to be propogated
 
363
 * @on_init: flag for enabling clocks which are ENABLED_ON_INIT.
 
364
 *
 
365
 * Recalculates all children clocks
 
366
 */
 
367
void propagate_rate(struct clk *pclk, int on_init)
 
368
{
 
369
        struct clk *clk, *_temp;
 
370
        int ret = 0;
 
371
 
 
372
        list_for_each_entry_safe(clk, _temp, &pclk->children, sibling) {
 
373
                if (clk->recalc) {
 
374
                        ret = clk->recalc(clk);
 
375
                        /*
 
376
                         * recalc will return error if clk out is not programmed
 
377
                         * In this case configure default rate.
 
378
                         */
 
379
                        if (ret && clk->set_rate)
 
380
                                clk->set_rate(clk, 0);
 
381
                }
 
382
                propagate_rate(clk, on_init);
 
383
 
 
384
                if (!on_init)
 
385
                        continue;
 
386
 
 
387
                /* Enable clks enabled on init, in software view */
 
388
                if (clk->flags & ENABLED_ON_INIT)
 
389
                        do_clk_enable(clk);
 
390
        }
 
391
}
 
392
 
 
393
/**
 
394
 * round_rate_index - return closest programmable rate index in rate_config tbl
 
395
 * @clk: ptr to clock structure
 
396
 * @drate: desired rate
 
397
 * @rate: final rate will be returned in this variable only.
 
398
 *
 
399
 * Finds index in rate_config for highest clk rate which is less than
 
400
 * requested rate. If there is no clk rate lesser than requested rate then
 
401
 * -EINVAL is returned. This routine assumes that rate_config is written
 
402
 * in incrementing order of clk rates.
 
403
 * If drate passed is zero then default rate is programmed.
 
404
 */
 
405
static int
 
406
round_rate_index(struct clk *clk, unsigned long drate, unsigned long *rate)
 
407
{
 
408
        unsigned long tmp = 0, prev_rate = 0;
 
409
        int index;
 
410
 
 
411
        if (!clk->calc_rate)
 
412
                return -EFAULT;
 
413
 
 
414
        if (!drate)
 
415
                return -EINVAL;
 
416
 
 
417
        /*
 
418
         * This loops ends on two conditions:
 
419
         * - as soon as clk is found with rate greater than requested rate.
 
420
         * - if all clks in rate_config are smaller than requested rate.
 
421
         */
 
422
        for (index = 0; index < clk->rate_config.count; index++) {
 
423
                prev_rate = tmp;
 
424
                tmp = clk->calc_rate(clk, index);
 
425
                if (drate < tmp) {
 
426
                        index--;
 
427
                        break;
 
428
                }
 
429
        }
 
430
        /* return if can't find suitable clock */
 
431
        if (index < 0) {
 
432
                index = -EINVAL;
 
433
                *rate = 0;
 
434
        } else if (index == clk->rate_config.count) {
 
435
                /* program with highest clk rate possible */
 
436
                index = clk->rate_config.count - 1;
 
437
                *rate = tmp;
 
438
        } else
 
439
                *rate = prev_rate;
 
440
 
 
441
        return index;
 
442
}
 
443
 
 
444
/**
 
445
 * clk_round_rate - adjust a rate to the exact rate a clock can provide
 
446
 * @clk: clock source
 
447
 * @rate: desired clock rate in Hz
 
448
 *
 
449
 * Returns rounded clock rate in Hz, or negative errno.
 
450
 */
 
451
long clk_round_rate(struct clk *clk, unsigned long drate)
 
452
{
 
453
        long rate = 0;
 
454
        int index;
 
455
 
 
456
        /*
 
457
         * propagate call to parent who supports calc_rate. Similar approach is
 
458
         * used in clk_set_rate.
 
459
         */
 
460
        if (!clk->calc_rate) {
 
461
                u32 mult;
 
462
                if (!clk->pclk)
 
463
                        return clk->rate;
 
464
 
 
465
                mult = clk->div_factor ? clk->div_factor : 1;
 
466
                return clk_round_rate(clk->pclk, mult * drate) / mult;
 
467
        }
 
468
 
 
469
        index = round_rate_index(clk, drate, &rate);
 
470
        if (index >= 0)
 
471
                return rate;
 
472
        else
 
473
                return index;
 
474
}
 
475
EXPORT_SYMBOL(clk_round_rate);
 
476
 
 
477
/*All below functions are called with lock held */
260
478
 
261
479
/*
262
 
 * Set pclk as cclk's parent and add clock sibling node to current parents
263
 
 * children list
 
480
 * Calculates pll clk rate for specific value of mode, m, n and p
 
481
 *
 
482
 * In normal mode
 
483
 * rate = (2 * M[15:8] * Fin)/(N * 2^P)
 
484
 *
 
485
 * In Dithered mode
 
486
 * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P)
264
487
 */
265
 
static void change_parent(struct clk *cclk, struct clk *pclk)
 
488
unsigned long pll_calc_rate(struct clk *clk, int index)
266
489
{
267
 
        unsigned long flags;
268
 
 
269
 
        spin_lock_irqsave(&clocks_lock, flags);
270
 
        list_del(&cclk->sibling);
271
 
        list_add(&cclk->sibling, &pclk->children);
272
 
 
273
 
        cclk->pclk = pclk;
274
 
        spin_unlock_irqrestore(&clocks_lock, flags);
 
490
        unsigned long rate = clk->pclk->rate;
 
491
        struct pll_rate_tbl *tbls = clk->rate_config.tbls;
 
492
        unsigned int mode;
 
493
 
 
494
        mode = tbls[index].mode ? 256 : 1;
 
495
        return (((2 * rate / 10000) * tbls[index].m) /
 
496
                        (mode * tbls[index].n * (1 << tbls[index].p))) * 10000;
275
497
}
276
498
 
277
499
/*
283
505
 * In Dithered mode
284
506
 * rate = (2 * M[15:0] * Fin)/(256 * N * 2^P)
285
507
 */
286
 
void pll1_clk_recalc(struct clk *clk)
 
508
int pll_clk_recalc(struct clk *clk)
287
509
{
288
510
        struct pll_clk_config *config = clk->private_data;
289
511
        unsigned int num = 2, den = 0, val, mode = 0;
290
 
        unsigned long flags;
291
512
 
292
 
        spin_lock_irqsave(&clocks_lock, flags);
293
 
        mode = (readl(config->mode_reg) >> PLL_MODE_SHIFT) &
294
 
                PLL_MODE_MASK;
 
513
        mode = (readl(config->mode_reg) >> config->masks->mode_shift) &
 
514
                config->masks->mode_mask;
295
515
 
296
516
        val = readl(config->cfg_reg);
297
517
        /* calculate denominator */
298
 
        den = (val >> PLL_DIV_P_SHIFT) & PLL_DIV_P_MASK;
 
518
        den = (val >> config->masks->div_p_shift) & config->masks->div_p_mask;
299
519
        den = 1 << den;
300
 
        den *= (val >> PLL_DIV_N_SHIFT) & PLL_DIV_N_MASK;
 
520
        den *= (val >> config->masks->div_n_shift) & config->masks->div_n_mask;
301
521
 
302
522
        /* calculate numerator & denominator */
303
523
        if (!mode) {
304
524
                /* Normal mode */
305
 
                num *= (val >> PLL_NORM_FDBK_M_SHIFT) & PLL_NORM_FDBK_M_MASK;
 
525
                num *= (val >> config->masks->norm_fdbk_m_shift) &
 
526
                        config->masks->norm_fdbk_m_mask;
306
527
        } else {
307
528
                /* Dithered mode */
308
 
                num *= (val >> PLL_DITH_FDBK_M_SHIFT) & PLL_DITH_FDBK_M_MASK;
 
529
                num *= (val >> config->masks->dith_fdbk_m_shift) &
 
530
                        config->masks->dith_fdbk_m_mask;
309
531
                den *= 256;
310
532
        }
311
533
 
 
534
        if (!den)
 
535
                return -EINVAL;
 
536
 
312
537
        clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000;
313
 
        spin_unlock_irqrestore(&clocks_lock, flags);
 
538
        return 0;
 
539
}
 
540
 
 
541
/*
 
542
 * Configures new clock rate of pll
 
543
 */
 
544
int pll_clk_set_rate(struct clk *clk, unsigned long desired_rate)
 
545
{
 
546
        struct pll_rate_tbl *tbls = clk->rate_config.tbls;
 
547
        struct pll_clk_config *config = clk->private_data;
 
548
        unsigned long val, rate;
 
549
        int i;
 
550
 
 
551
        i = round_rate_index(clk, desired_rate, &rate);
 
552
        if (i < 0)
 
553
                return i;
 
554
 
 
555
        val = readl(config->mode_reg) &
 
556
                ~(config->masks->mode_mask << config->masks->mode_shift);
 
557
        val |= (tbls[i].mode & config->masks->mode_mask) <<
 
558
                config->masks->mode_shift;
 
559
        writel(val, config->mode_reg);
 
560
 
 
561
        val = readl(config->cfg_reg) &
 
562
                ~(config->masks->div_p_mask << config->masks->div_p_shift);
 
563
        val |= (tbls[i].p & config->masks->div_p_mask) <<
 
564
                config->masks->div_p_shift;
 
565
        val &= ~(config->masks->div_n_mask << config->masks->div_n_shift);
 
566
        val |= (tbls[i].n & config->masks->div_n_mask) <<
 
567
                config->masks->div_n_shift;
 
568
        val &= ~(config->masks->dith_fdbk_m_mask <<
 
569
                        config->masks->dith_fdbk_m_shift);
 
570
        if (tbls[i].mode)
 
571
                val |= (tbls[i].m & config->masks->dith_fdbk_m_mask) <<
 
572
                        config->masks->dith_fdbk_m_shift;
 
573
        else
 
574
                val |= (tbls[i].m & config->masks->norm_fdbk_m_mask) <<
 
575
                        config->masks->norm_fdbk_m_shift;
 
576
 
 
577
        writel(val, config->cfg_reg);
 
578
 
 
579
        clk->rate = rate;
 
580
 
 
581
        return 0;
 
582
}
 
583
 
 
584
/*
 
585
 * Calculates ahb, apb clk rate for specific value of div
 
586
 */
 
587
unsigned long bus_calc_rate(struct clk *clk, int index)
 
588
{
 
589
        unsigned long rate = clk->pclk->rate;
 
590
        struct bus_rate_tbl *tbls = clk->rate_config.tbls;
 
591
 
 
592
        return rate / (tbls[index].div + 1);
314
593
}
315
594
 
316
595
/* calculates current programmed rate of ahb or apb bus */
317
 
void bus_clk_recalc(struct clk *clk)
 
596
int bus_clk_recalc(struct clk *clk)
318
597
{
319
598
        struct bus_clk_config *config = clk->private_data;
320
599
        unsigned int div;
321
 
        unsigned long flags;
322
 
 
323
 
        spin_lock_irqsave(&clocks_lock, flags);
324
 
        div = ((readl(config->reg) >> config->shift) & config->mask) + 1;
 
600
 
 
601
        div = ((readl(config->reg) >> config->masks->shift) &
 
602
                        config->masks->mask) + 1;
 
603
 
 
604
        if (!div)
 
605
                return -EINVAL;
 
606
 
325
607
        clk->rate = (unsigned long)clk->pclk->rate / div;
326
 
        spin_unlock_irqrestore(&clocks_lock, flags);
 
608
        return 0;
 
609
}
 
610
 
 
611
/* Configures new clock rate of AHB OR APB bus */
 
612
int bus_clk_set_rate(struct clk *clk, unsigned long desired_rate)
 
613
{
 
614
        struct bus_rate_tbl *tbls = clk->rate_config.tbls;
 
615
        struct bus_clk_config *config = clk->private_data;
 
616
        unsigned long val, rate;
 
617
        int i;
 
618
 
 
619
        i = round_rate_index(clk, desired_rate, &rate);
 
620
        if (i < 0)
 
621
                return i;
 
622
 
 
623
        val = readl(config->reg) &
 
624
                ~(config->masks->mask << config->masks->shift);
 
625
        val |= (tbls[i].div & config->masks->mask) << config->masks->shift;
 
626
        writel(val, config->reg);
 
627
 
 
628
        clk->rate = rate;
 
629
 
 
630
        return 0;
 
631
}
 
632
 
 
633
/*
 
634
 * gives rate for different values of eq, x and y
 
635
 *
 
636
 * Fout from synthesizer can be given from two equations:
 
637
 * Fout1 = (Fin * X/Y)/2                EQ1
 
638
 * Fout2 = Fin * X/Y                    EQ2
 
639
 */
 
640
unsigned long aux_calc_rate(struct clk *clk, int index)
 
641
{
 
642
        unsigned long rate = clk->pclk->rate;
 
643
        struct aux_rate_tbl *tbls = clk->rate_config.tbls;
 
644
        u8 eq = tbls[index].eq ? 1 : 2;
 
645
 
 
646
        return (((rate/10000) * tbls[index].xscale) /
 
647
                        (tbls[index].yscale * eq)) * 10000;
327
648
}
328
649
 
329
650
/*
336
657
 *
337
658
 * Selection of eqn 1 or 2 is programmed in register
338
659
 */
339
 
void aux_clk_recalc(struct clk *clk)
 
660
int aux_clk_recalc(struct clk *clk)
340
661
{
341
662
        struct aux_clk_config *config = clk->private_data;
342
 
        struct pclk_info *pclk_info = NULL;
343
663
        unsigned int num = 1, den = 1, val, eqn;
344
 
        unsigned long flags;
345
 
 
346
 
        /* get current programmed parent */
347
 
        pclk_info = pclk_info_get(clk);
348
 
        if (!pclk_info) {
349
 
                spin_lock_irqsave(&clocks_lock, flags);
350
 
                clk->pclk = NULL;
351
 
                clk->rate = 0;
352
 
                spin_unlock_irqrestore(&clocks_lock, flags);
353
 
                return;
354
 
        }
355
 
 
356
 
        change_parent(clk, pclk_info->pclk);
357
 
 
358
 
        spin_lock_irqsave(&clocks_lock, flags);
359
 
        if (pclk_info->scalable) {
360
 
                val = readl(config->synth_reg);
361
 
 
362
 
                eqn = (val >> AUX_EQ_SEL_SHIFT) & AUX_EQ_SEL_MASK;
363
 
                if (eqn == AUX_EQ1_SEL)
364
 
                        den *= 2;
365
 
 
366
 
                /* calculate numerator */
367
 
                num = (val >> AUX_XSCALE_SHIFT) & AUX_XSCALE_MASK;
368
 
 
369
 
                /* calculate denominator */
370
 
                den *= (val >> AUX_YSCALE_SHIFT) & AUX_YSCALE_MASK;
371
 
                val = (((clk->pclk->rate/10000) * num) / den) * 10000;
372
 
        } else
373
 
                val = clk->pclk->rate;
374
 
 
375
 
        clk->rate = val;
376
 
        spin_unlock_irqrestore(&clocks_lock, flags);
 
664
 
 
665
        val = readl(config->synth_reg);
 
666
 
 
667
        eqn = (val >> config->masks->eq_sel_shift) &
 
668
                config->masks->eq_sel_mask;
 
669
        if (eqn == config->masks->eq1_mask)
 
670
                den *= 2;
 
671
 
 
672
        /* calculate numerator */
 
673
        num = (val >> config->masks->xscale_sel_shift) &
 
674
                config->masks->xscale_sel_mask;
 
675
 
 
676
        /* calculate denominator */
 
677
        den *= (val >> config->masks->yscale_sel_shift) &
 
678
                config->masks->yscale_sel_mask;
 
679
 
 
680
        if (!den)
 
681
                return -EINVAL;
 
682
 
 
683
        clk->rate = (((clk->pclk->rate/10000) * num) / den) * 10000;
 
684
        return 0;
 
685
}
 
686
 
 
687
/* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/
 
688
int aux_clk_set_rate(struct clk *clk, unsigned long desired_rate)
 
689
{
 
690
        struct aux_rate_tbl *tbls = clk->rate_config.tbls;
 
691
        struct aux_clk_config *config = clk->private_data;
 
692
        unsigned long val, rate;
 
693
        int i;
 
694
 
 
695
        i = round_rate_index(clk, desired_rate, &rate);
 
696
        if (i < 0)
 
697
                return i;
 
698
 
 
699
        val = readl(config->synth_reg) &
 
700
                ~(config->masks->eq_sel_mask << config->masks->eq_sel_shift);
 
701
        val |= (tbls[i].eq & config->masks->eq_sel_mask) <<
 
702
                config->masks->eq_sel_shift;
 
703
        val &= ~(config->masks->xscale_sel_mask <<
 
704
                        config->masks->xscale_sel_shift);
 
705
        val |= (tbls[i].xscale & config->masks->xscale_sel_mask) <<
 
706
                config->masks->xscale_sel_shift;
 
707
        val &= ~(config->masks->yscale_sel_mask <<
 
708
                        config->masks->yscale_sel_shift);
 
709
        val |= (tbls[i].yscale & config->masks->yscale_sel_mask) <<
 
710
                config->masks->yscale_sel_shift;
 
711
        writel(val, config->synth_reg);
 
712
 
 
713
        clk->rate = rate;
 
714
 
 
715
        return 0;
 
716
}
 
717
 
 
718
/*
 
719
 * Calculates gpt clk rate for different values of mscale and nscale
 
720
 *
 
721
 * Fout= Fin/((2 ^ (N+1)) * (M+1))
 
722
 */
 
723
unsigned long gpt_calc_rate(struct clk *clk, int index)
 
724
{
 
725
        unsigned long rate = clk->pclk->rate;
 
726
        struct gpt_rate_tbl *tbls = clk->rate_config.tbls;
 
727
 
 
728
        return rate / ((1 << (tbls[index].nscale + 1)) *
 
729
                        (tbls[index].mscale + 1));
377
730
}
378
731
 
379
732
/*
381
734
 * Fout from synthesizer can be given from below equations:
382
735
 * Fout= Fin/((2 ^ (N+1)) * (M+1))
383
736
 */
384
 
void gpt_clk_recalc(struct clk *clk)
 
737
int gpt_clk_recalc(struct clk *clk)
385
738
{
386
 
        struct aux_clk_config *config = clk->private_data;
387
 
        struct pclk_info *pclk_info = NULL;
 
739
        struct gpt_clk_config *config = clk->private_data;
388
740
        unsigned int div = 1, val;
389
 
        unsigned long flags;
390
 
 
391
 
        pclk_info = pclk_info_get(clk);
392
 
        if (!pclk_info) {
393
 
                spin_lock_irqsave(&clocks_lock, flags);
394
 
                clk->pclk = NULL;
395
 
                clk->rate = 0;
396
 
                spin_unlock_irqrestore(&clocks_lock, flags);
397
 
                return;
398
 
        }
399
 
 
400
 
        change_parent(clk, pclk_info->pclk);
401
 
 
402
 
        spin_lock_irqsave(&clocks_lock, flags);
403
 
        if (pclk_info->scalable) {
404
 
                val = readl(config->synth_reg);
405
 
                div += (val >> GPT_MSCALE_SHIFT) & GPT_MSCALE_MASK;
406
 
                div *= 1 << (((val >> GPT_NSCALE_SHIFT) & GPT_NSCALE_MASK) + 1);
407
 
        }
 
741
 
 
742
        val = readl(config->synth_reg);
 
743
        div += (val >> config->masks->mscale_sel_shift) &
 
744
                config->masks->mscale_sel_mask;
 
745
        div *= 1 << (((val >> config->masks->nscale_sel_shift) &
 
746
                                config->masks->nscale_sel_mask) + 1);
 
747
 
 
748
        if (!div)
 
749
                return -EINVAL;
408
750
 
409
751
        clk->rate = (unsigned long)clk->pclk->rate / div;
410
 
        spin_unlock_irqrestore(&clocks_lock, flags);
411
 
}
412
 
 
413
 
/*
414
 
 * Used for clocks that always have same value as the parent clock divided by a
 
752
        return 0;
 
753
}
 
754
 
 
755
/* Configures new clock rate of gptiliary synthesizers used by: UART, FIRDA*/
 
756
int gpt_clk_set_rate(struct clk *clk, unsigned long desired_rate)
 
757
{
 
758
        struct gpt_rate_tbl *tbls = clk->rate_config.tbls;
 
759
        struct gpt_clk_config *config = clk->private_data;
 
760
        unsigned long val, rate;
 
761
        int i;
 
762
 
 
763
        i = round_rate_index(clk, desired_rate, &rate);
 
764
        if (i < 0)
 
765
                return i;
 
766
 
 
767
        val = readl(config->synth_reg) & ~(config->masks->mscale_sel_mask <<
 
768
                        config->masks->mscale_sel_shift);
 
769
        val |= (tbls[i].mscale & config->masks->mscale_sel_mask) <<
 
770
                config->masks->mscale_sel_shift;
 
771
        val &= ~(config->masks->nscale_sel_mask <<
 
772
                        config->masks->nscale_sel_shift);
 
773
        val |= (tbls[i].nscale & config->masks->nscale_sel_mask) <<
 
774
                config->masks->nscale_sel_shift;
 
775
        writel(val, config->synth_reg);
 
776
 
 
777
        clk->rate = rate;
 
778
 
 
779
        return 0;
 
780
}
 
781
 
 
782
/*
 
783
 * Calculates clcd clk rate for different values of div
 
784
 *
 
785
 * Fout from synthesizer can be given from below equation:
 
786
 * Fout= Fin/2*div (division factor)
 
787
 * div is 17 bits:-
 
788
 *      0-13 (fractional part)
 
789
 *      14-16 (integer part)
 
790
 * To calculate Fout we left shift val by 14 bits and divide Fin by
 
791
 * complete div (including fractional part) and then right shift the
 
792
 * result by 14 places.
 
793
 */
 
794
unsigned long clcd_calc_rate(struct clk *clk, int index)
 
795
{
 
796
        unsigned long rate = clk->pclk->rate;
 
797
        struct clcd_rate_tbl *tbls = clk->rate_config.tbls;
 
798
 
 
799
        rate /= 1000;
 
800
        rate <<= 12;
 
801
        rate /= (2 * tbls[index].div);
 
802
        rate >>= 12;
 
803
        rate *= 1000;
 
804
 
 
805
        return rate;
 
806
}
 
807
 
 
808
/*
 
809
 * calculates current programmed rate of clcd synthesizer
 
810
 * Fout from synthesizer can be given from below equation:
 
811
 * Fout= Fin/2*div (division factor)
 
812
 * div is 17 bits:-
 
813
 *      0-13 (fractional part)
 
814
 *      14-16 (integer part)
 
815
 * To calculate Fout we left shift val by 14 bits and divide Fin by
 
816
 * complete div (including fractional part) and then right shift the
 
817
 * result by 14 places.
 
818
 */
 
819
int clcd_clk_recalc(struct clk *clk)
 
820
{
 
821
        struct clcd_clk_config *config = clk->private_data;
 
822
        unsigned int div = 1;
 
823
        unsigned long prate;
 
824
        unsigned int val;
 
825
 
 
826
        val = readl(config->synth_reg);
 
827
        div = (val >> config->masks->div_factor_shift) &
 
828
                config->masks->div_factor_mask;
 
829
 
 
830
        if (!div)
 
831
                return -EINVAL;
 
832
 
 
833
        prate = clk->pclk->rate / 1000; /* first level division, make it KHz */
 
834
 
 
835
        clk->rate = (((unsigned long)prate << 12) / (2 * div)) >> 12;
 
836
        clk->rate *= 1000;
 
837
        return 0;
 
838
}
 
839
 
 
840
/* Configures new clock rate of auxiliary synthesizers used by: UART, FIRDA*/
 
841
int clcd_clk_set_rate(struct clk *clk, unsigned long desired_rate)
 
842
{
 
843
        struct clcd_rate_tbl *tbls = clk->rate_config.tbls;
 
844
        struct clcd_clk_config *config = clk->private_data;
 
845
        unsigned long val, rate;
 
846
        int i;
 
847
 
 
848
        i = round_rate_index(clk, desired_rate, &rate);
 
849
        if (i < 0)
 
850
                return i;
 
851
 
 
852
        val = readl(config->synth_reg) & ~(config->masks->div_factor_mask <<
 
853
                        config->masks->div_factor_shift);
 
854
        val |= (tbls[i].div & config->masks->div_factor_mask) <<
 
855
                config->masks->div_factor_shift;
 
856
        writel(val, config->synth_reg);
 
857
 
 
858
        clk->rate = rate;
 
859
 
 
860
        return 0;
 
861
}
 
862
 
 
863
/*
 
864
 * Used for clocks that always have value as the parent clock divided by a
415
865
 * fixed divisor
416
866
 */
417
 
void follow_parent(struct clk *clk)
 
867
int follow_parent(struct clk *clk)
418
868
{
419
 
        unsigned long flags;
 
869
        unsigned int div_factor = (clk->div_factor < 1) ? 1 : clk->div_factor;
420
870
 
421
 
        spin_lock_irqsave(&clocks_lock, flags);
422
 
        clk->rate = clk->pclk->rate;
423
 
        spin_unlock_irqrestore(&clocks_lock, flags);
 
871
        clk->rate = clk->pclk->rate/div_factor;
 
872
        return 0;
424
873
}
425
874
 
426
875
/**
431
880
 */
432
881
void recalc_root_clocks(void)
433
882
{
434
 
        propagate_rate(&root_clks);
435
 
}
 
883
        struct clk *pclk;
 
884
        unsigned long flags;
 
885
        int ret = 0;
 
886
 
 
887
        spin_lock_irqsave(&clocks_lock, flags);
 
888
        list_for_each_entry(pclk, &root_clks, sibling) {
 
889
                if (pclk->recalc) {
 
890
                        ret = pclk->recalc(pclk);
 
891
                        /*
 
892
                         * recalc will return error if clk out is not programmed
 
893
                         * In this case configure default clock.
 
894
                         */
 
895
                        if (ret && pclk->set_rate)
 
896
                                pclk->set_rate(pclk, 0);
 
897
                }
 
898
                propagate_rate(pclk, 1);
 
899
                /* Enable clks enabled on init, in software view */
 
900
                if (pclk->flags & ENABLED_ON_INIT)
 
901
                        do_clk_enable(pclk);
 
902
        }
 
903
        spin_unlock_irqrestore(&clocks_lock, flags);
 
904
}
 
905
 
 
906
#ifdef CONFIG_DEBUG_FS
 
907
/*
 
908
 *      debugfs support to trace clock tree hierarchy and attributes
 
909
 */
 
910
static struct dentry *clk_debugfs_root;
 
911
static int clk_debugfs_register_one(struct clk *c)
 
912
{
 
913
        int err;
 
914
        struct dentry *d, *child;
 
915
        struct clk *pa = c->pclk;
 
916
        char s[255];
 
917
        char *p = s;
 
918
 
 
919
        if (c) {
 
920
                if (c->cl->con_id)
 
921
                        p += sprintf(p, "%s", c->cl->con_id);
 
922
                if (c->cl->dev_id)
 
923
                        p += sprintf(p, "%s", c->cl->dev_id);
 
924
        }
 
925
        d = debugfs_create_dir(s, pa ? pa->dent : clk_debugfs_root);
 
926
        if (!d)
 
927
                return -ENOMEM;
 
928
        c->dent = d;
 
929
 
 
930
        d = debugfs_create_u32("usage_count", S_IRUGO, c->dent,
 
931
                        (u32 *)&c->usage_count);
 
932
        if (!d) {
 
933
                err = -ENOMEM;
 
934
                goto err_out;
 
935
        }
 
936
        d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate);
 
937
        if (!d) {
 
938
                err = -ENOMEM;
 
939
                goto err_out;
 
940
        }
 
941
        d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags);
 
942
        if (!d) {
 
943
                err = -ENOMEM;
 
944
                goto err_out;
 
945
        }
 
946
        return 0;
 
947
 
 
948
err_out:
 
949
        d = c->dent;
 
950
        list_for_each_entry(child, &d->d_subdirs, d_u.d_child)
 
951
                debugfs_remove(child);
 
952
        debugfs_remove(c->dent);
 
953
        return err;
 
954
}
 
955
 
 
956
static int clk_debugfs_register(struct clk *c)
 
957
{
 
958
        int err;
 
959
        struct clk *pa = c->pclk;
 
960
 
 
961
        if (pa && !pa->dent) {
 
962
                err = clk_debugfs_register(pa);
 
963
                if (err)
 
964
                        return err;
 
965
        }
 
966
 
 
967
        if (!c->dent) {
 
968
                err = clk_debugfs_register_one(c);
 
969
                if (err)
 
970
                        return err;
 
971
        }
 
972
        return 0;
 
973
}
 
974
 
 
975
static int __init clk_debugfs_init(void)
 
976
{
 
977
        struct clk *c;
 
978
        struct dentry *d;
 
979
        int err;
 
980
 
 
981
        d = debugfs_create_dir("clock", NULL);
 
982
        if (!d)
 
983
                return -ENOMEM;
 
984
        clk_debugfs_root = d;
 
985
 
 
986
        list_for_each_entry(c, &clocks, node) {
 
987
                err = clk_debugfs_register(c);
 
988
                if (err)
 
989
                        goto err_out;
 
990
        }
 
991
        return 0;
 
992
err_out:
 
993
        debugfs_remove_recursive(clk_debugfs_root);
 
994
        return err;
 
995
}
 
996
late_initcall(clk_debugfs_init);
 
997
 
 
998
static int clk_debugfs_reparent(struct clk *c)
 
999
{
 
1000
        debugfs_remove(c->dent);
 
1001
        return clk_debugfs_register_one(c);
 
1002
}
 
1003
#endif /* CONFIG_DEBUG_FS */