~ubuntu-branches/ubuntu/precise/linux-ti-omap4/precise

« back to all changes in this revision

Viewing changes to drivers/bcma/driver_chipcommon_pmu.c

  • Committer: Bazaar Package Importer
  • Author(s): Paolo Pisati
  • Date: 2011-06-29 15:23:51 UTC
  • mfrom: (26.1.1 natty-proposed)
  • Revision ID: james.westby@ubuntu.com-20110629152351-xs96tm303d95rpbk
Tags: 3.0.0-1200.2
* Rebased against 3.0.0-6.7
* BSP from TI based on 3.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Broadcom specific AMBA
 
3
 * ChipCommon Power Management Unit driver
 
4
 *
 
5
 * Copyright 2009, Michael Buesch <mb@bu3sch.de>
 
6
 * Copyright 2007, Broadcom Corporation
 
7
 *
 
8
 * Licensed under the GNU/GPL. See COPYING for details.
 
9
 */
 
10
 
 
11
#include "bcma_private.h"
 
12
#include <linux/bcma/bcma.h>
 
13
 
 
14
static void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc,
 
15
                                        u32 offset, u32 mask, u32 set)
 
16
{
 
17
        u32 value;
 
18
 
 
19
        bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR);
 
20
        bcma_cc_write32(cc, BCMA_CC_CHIPCTL_ADDR, offset);
 
21
        bcma_cc_read32(cc, BCMA_CC_CHIPCTL_ADDR);
 
22
        value = bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA);
 
23
        value &= mask;
 
24
        value |= set;
 
25
        bcma_cc_write32(cc, BCMA_CC_CHIPCTL_DATA, value);
 
26
        bcma_cc_read32(cc, BCMA_CC_CHIPCTL_DATA);
 
27
}
 
28
 
 
29
static void bcma_pmu_pll_init(struct bcma_drv_cc *cc)
 
30
{
 
31
        struct bcma_bus *bus = cc->core->bus;
 
32
 
 
33
        switch (bus->chipinfo.id) {
 
34
        case 0x4313:
 
35
        case 0x4331:
 
36
        case 43224:
 
37
        case 43225:
 
38
                break;
 
39
        default:
 
40
                pr_err("PLL init unknown for device 0x%04X\n",
 
41
                        bus->chipinfo.id);
 
42
        }
 
43
}
 
44
 
 
45
static void bcma_pmu_resources_init(struct bcma_drv_cc *cc)
 
46
{
 
47
        struct bcma_bus *bus = cc->core->bus;
 
48
        u32 min_msk = 0, max_msk = 0;
 
49
 
 
50
        switch (bus->chipinfo.id) {
 
51
        case 0x4313:
 
52
                min_msk = 0x200D;
 
53
                max_msk = 0xFFFF;
 
54
                break;
 
55
        case 43224:
 
56
                break;
 
57
        default:
 
58
                pr_err("PMU resource config unknown for device 0x%04X\n",
 
59
                        bus->chipinfo.id);
 
60
        }
 
61
 
 
62
        /* Set the resource masks. */
 
63
        if (min_msk)
 
64
                bcma_cc_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk);
 
65
        if (max_msk)
 
66
                bcma_cc_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk);
 
67
}
 
68
 
 
69
void bcma_pmu_swreg_init(struct bcma_drv_cc *cc)
 
70
{
 
71
        struct bcma_bus *bus = cc->core->bus;
 
72
 
 
73
        switch (bus->chipinfo.id) {
 
74
        case 0x4313:
 
75
        case 0x4331:
 
76
        case 43224:
 
77
                break;
 
78
        default:
 
79
                pr_err("PMU switch/regulators init unknown for device "
 
80
                        "0x%04X\n", bus->chipinfo.id);
 
81
        }
 
82
}
 
83
 
 
84
void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
 
85
{
 
86
        struct bcma_bus *bus = cc->core->bus;
 
87
 
 
88
        switch (bus->chipinfo.id) {
 
89
        case 0x4313:
 
90
                bcma_chipco_chipctl_maskset(cc, 0, ~0, 0x7);
 
91
                break;
 
92
        case 0x4331:
 
93
                pr_err("Enabling Ext PA lines not implemented\n");
 
94
                break;
 
95
        case 43224:
 
96
                if (bus->chipinfo.rev == 0) {
 
97
                        pr_err("Workarounds for 43224 rev 0 not fully "
 
98
                                "implemented\n");
 
99
                        bcma_chipco_chipctl_maskset(cc, 0, ~0, 0xF0);
 
100
                } else {
 
101
                        bcma_chipco_chipctl_maskset(cc, 0, ~0, 0xF0);
 
102
                }
 
103
                break;
 
104
        default:
 
105
                pr_err("Workarounds unknown for device 0x%04X\n",
 
106
                        bus->chipinfo.id);
 
107
        }
 
108
}
 
109
 
 
110
void bcma_pmu_init(struct bcma_drv_cc *cc)
 
111
{
 
112
        u32 pmucap;
 
113
 
 
114
        pmucap = bcma_cc_read32(cc, BCMA_CC_PMU_CAP);
 
115
        cc->pmu.rev = (pmucap & BCMA_CC_PMU_CAP_REVISION);
 
116
 
 
117
        pr_debug("Found rev %u PMU (capabilities 0x%08X)\n", cc->pmu.rev,
 
118
                 pmucap);
 
119
 
 
120
        if (cc->pmu.rev == 1)
 
121
                bcma_cc_mask32(cc, BCMA_CC_PMU_CTL,
 
122
                              ~BCMA_CC_PMU_CTL_NOILPONW);
 
123
        else
 
124
                bcma_cc_set32(cc, BCMA_CC_PMU_CTL,
 
125
                             BCMA_CC_PMU_CTL_NOILPONW);
 
126
 
 
127
        if (cc->core->id.id == 0x4329 && cc->core->id.rev == 2)
 
128
                pr_err("Fix for 4329b0 bad LPOM state not implemented!\n");
 
129
 
 
130
        bcma_pmu_pll_init(cc);
 
131
        bcma_pmu_resources_init(cc);
 
132
        bcma_pmu_swreg_init(cc);
 
133
        bcma_pmu_workarounds(cc);
 
134
}