diff options
author | Hauke Mehrtens <hauke@hauke-m.de> | 2012-01-31 18:13:56 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-02-06 14:55:36 -0500 |
commit | d486a5b4996d2fffd10098725781f2c5690774bc (patch) | |
tree | 4b57776194a09f2164494dfd3cde2121dfd9f791 /drivers/ssb | |
parent | bedb2a18af0a4e7565182c07fadd854e3ae8c9bc (diff) |
ssb: add support for bcm5354
This patch adds support the the BCM5354 SoC.
It has a PMU and a constant not configurable clock.
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/ssb')
-rw-r--r-- | drivers/ssb/driver_chipcommon_pmu.c | 48 | ||||
-rw-r--r-- | drivers/ssb/driver_mipscore.c | 3 | ||||
-rw-r--r-- | drivers/ssb/main.c | 3 | ||||
-rw-r--r-- | drivers/ssb/ssb_private.h | 4 |
4 files changed, 53 insertions, 5 deletions
diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c index e5a2e0e9bc19..b58fef780ea0 100644 --- a/drivers/ssb/driver_chipcommon_pmu.c +++ b/drivers/ssb/driver_chipcommon_pmu.c | |||
@@ -13,6 +13,9 @@ | |||
13 | #include <linux/ssb/ssb_driver_chipcommon.h> | 13 | #include <linux/ssb/ssb_driver_chipcommon.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/export.h> | 15 | #include <linux/export.h> |
16 | #ifdef CONFIG_BCM47XX | ||
17 | #include <asm/mach-bcm47xx/nvram.h> | ||
18 | #endif | ||
16 | 19 | ||
17 | #include "ssb_private.h" | 20 | #include "ssb_private.h" |
18 | 21 | ||
@@ -92,10 +95,6 @@ static void ssb_pmu0_pllinit_r0(struct ssb_chipcommon *cc, | |||
92 | u32 pmuctl, tmp, pllctl; | 95 | u32 pmuctl, tmp, pllctl; |
93 | unsigned int i; | 96 | unsigned int i; |
94 | 97 | ||
95 | if ((bus->chip_id == 0x5354) && !crystalfreq) { | ||
96 | /* The 5354 crystal freq is 25MHz */ | ||
97 | crystalfreq = 25000; | ||
98 | } | ||
99 | if (crystalfreq) | 98 | if (crystalfreq) |
100 | e = pmu0_plltab_find_entry(crystalfreq); | 99 | e = pmu0_plltab_find_entry(crystalfreq); |
101 | if (!e) | 100 | if (!e) |
@@ -321,7 +320,11 @@ static void ssb_pmu_pll_init(struct ssb_chipcommon *cc) | |||
321 | u32 crystalfreq = 0; /* in kHz. 0 = keep default freq. */ | 320 | u32 crystalfreq = 0; /* in kHz. 0 = keep default freq. */ |
322 | 321 | ||
323 | if (bus->bustype == SSB_BUSTYPE_SSB) { | 322 | if (bus->bustype == SSB_BUSTYPE_SSB) { |
324 | /* TODO: The user may override the crystal frequency. */ | 323 | #ifdef CONFIG_BCM47XX |
324 | char buf[20]; | ||
325 | if (nvram_getenv("xtalfreq", buf, sizeof(buf)) >= 0) | ||
326 | crystalfreq = simple_strtoul(buf, NULL, 0); | ||
327 | #endif | ||
325 | } | 328 | } |
326 | 329 | ||
327 | switch (bus->chip_id) { | 330 | switch (bus->chip_id) { |
@@ -330,7 +333,11 @@ static void ssb_pmu_pll_init(struct ssb_chipcommon *cc) | |||
330 | ssb_pmu1_pllinit_r0(cc, crystalfreq); | 333 | ssb_pmu1_pllinit_r0(cc, crystalfreq); |
331 | break; | 334 | break; |
332 | case 0x4328: | 335 | case 0x4328: |
336 | ssb_pmu0_pllinit_r0(cc, crystalfreq); | ||
337 | break; | ||
333 | case 0x5354: | 338 | case 0x5354: |
339 | if (crystalfreq == 0) | ||
340 | crystalfreq = 25000; | ||
334 | ssb_pmu0_pllinit_r0(cc, crystalfreq); | 341 | ssb_pmu0_pllinit_r0(cc, crystalfreq); |
335 | break; | 342 | break; |
336 | case 0x4322: | 343 | case 0x4322: |
@@ -607,3 +614,34 @@ void ssb_pmu_set_ldo_paref(struct ssb_chipcommon *cc, bool on) | |||
607 | 614 | ||
608 | EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage); | 615 | EXPORT_SYMBOL(ssb_pmu_set_ldo_voltage); |
609 | EXPORT_SYMBOL(ssb_pmu_set_ldo_paref); | 616 | EXPORT_SYMBOL(ssb_pmu_set_ldo_paref); |
617 | |||
618 | u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc) | ||
619 | { | ||
620 | struct ssb_bus *bus = cc->dev->bus; | ||
621 | |||
622 | switch (bus->chip_id) { | ||
623 | case 0x5354: | ||
624 | /* 5354 chip uses a non programmable PLL of frequency 240MHz */ | ||
625 | return 240000000; | ||
626 | default: | ||
627 | ssb_printk(KERN_ERR PFX | ||
628 | "ERROR: PMU cpu clock unknown for device %04X\n", | ||
629 | bus->chip_id); | ||
630 | return 0; | ||
631 | } | ||
632 | } | ||
633 | |||
634 | u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc) | ||
635 | { | ||
636 | struct ssb_bus *bus = cc->dev->bus; | ||
637 | |||
638 | switch (bus->chip_id) { | ||
639 | case 0x5354: | ||
640 | return 120000000; | ||
641 | default: | ||
642 | ssb_printk(KERN_ERR PFX | ||
643 | "ERROR: PMU controlclock unknown for device %04X\n", | ||
644 | bus->chip_id); | ||
645 | return 0; | ||
646 | } | ||
647 | } | ||
diff --git a/drivers/ssb/driver_mipscore.c b/drivers/ssb/driver_mipscore.c index ced501568594..7e2ddc042f5b 100644 --- a/drivers/ssb/driver_mipscore.c +++ b/drivers/ssb/driver_mipscore.c | |||
@@ -208,6 +208,9 @@ u32 ssb_cpu_clock(struct ssb_mipscore *mcore) | |||
208 | struct ssb_bus *bus = mcore->dev->bus; | 208 | struct ssb_bus *bus = mcore->dev->bus; |
209 | u32 pll_type, n, m, rate = 0; | 209 | u32 pll_type, n, m, rate = 0; |
210 | 210 | ||
211 | if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU) | ||
212 | return ssb_pmu_get_cpu_clock(&bus->chipco); | ||
213 | |||
211 | if (bus->extif.dev) { | 214 | if (bus->extif.dev) { |
212 | ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m); | 215 | ssb_extif_get_clockcontrol(&bus->extif, &pll_type, &n, &m); |
213 | } else if (bus->chipco.dev) { | 216 | } else if (bus->chipco.dev) { |
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index bb6317fb925c..2a0a1b99e0e4 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c | |||
@@ -1094,6 +1094,9 @@ u32 ssb_clockspeed(struct ssb_bus *bus) | |||
1094 | u32 plltype; | 1094 | u32 plltype; |
1095 | u32 clkctl_n, clkctl_m; | 1095 | u32 clkctl_n, clkctl_m; |
1096 | 1096 | ||
1097 | if (bus->chipco.capabilities & SSB_CHIPCO_CAP_PMU) | ||
1098 | return ssb_pmu_get_controlclock(&bus->chipco); | ||
1099 | |||
1097 | if (ssb_extif_available(&bus->extif)) | 1100 | if (ssb_extif_available(&bus->extif)) |
1098 | ssb_extif_get_clockcontrol(&bus->extif, &plltype, | 1101 | ssb_extif_get_clockcontrol(&bus->extif, &plltype, |
1099 | &clkctl_n, &clkctl_m); | 1102 | &clkctl_n, &clkctl_m); |
diff --git a/drivers/ssb/ssb_private.h b/drivers/ssb/ssb_private.h index 77653014db0b..a305550b4b65 100644 --- a/drivers/ssb/ssb_private.h +++ b/drivers/ssb/ssb_private.h | |||
@@ -207,4 +207,8 @@ static inline void b43_pci_ssb_bridge_exit(void) | |||
207 | } | 207 | } |
208 | #endif /* CONFIG_SSB_B43_PCI_BRIDGE */ | 208 | #endif /* CONFIG_SSB_B43_PCI_BRIDGE */ |
209 | 209 | ||
210 | /* driver_chipcommon_pmu.c */ | ||
211 | extern u32 ssb_pmu_get_cpu_clock(struct ssb_chipcommon *cc); | ||
212 | extern u32 ssb_pmu_get_controlclock(struct ssb_chipcommon *cc); | ||
213 | |||
210 | #endif /* LINUX_SSB_PRIVATE_H_ */ | 214 | #endif /* LINUX_SSB_PRIVATE_H_ */ |