Blame view

drivers/bcma/driver_chipcommon_pmu.c 19.3 KB
8369ae33b   Rafał Miłecki   bcma: add Broadco...
1
2
3
4
  /*
   * Broadcom specific AMBA
   * ChipCommon Power Management Unit driver
   *
eb032b983   Michael Buesch   Update my e-mail ...
5
   * Copyright 2009, Michael Buesch <m@bues.ch>
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
6
7
   * Copyright 2007, 2011, Broadcom Corporation
   * Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
8369ae33b   Rafał Miłecki   bcma: add Broadco...
8
9
10
11
12
   *
   * Licensed under the GNU/GPL. See COPYING for details.
   */
  
  #include "bcma_private.h"
44a8e3772   Paul Gortmaker   bcma: fix implici...
13
  #include <linux/export.h>
8369ae33b   Rafał Miłecki   bcma: add Broadco...
14
  #include <linux/bcma/bcma.h>
8d4b9e318   Rafał Miłecki   bcma: export PLL ...
15
  u32 bcma_chipco_pll_read(struct bcma_drv_cc *cc, u32 offset)
908debc8d   Hauke Mehrtens   bcma: get CPU clock
16
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
17
18
19
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
  	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
  	return bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
20
  }
8d4b9e318   Rafał Miłecki   bcma: export PLL ...
21
  EXPORT_SYMBOL_GPL(bcma_chipco_pll_read);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
22

3861b2c5d   Rafał Miłecki   bcma: cc: export ...
23
  void bcma_chipco_pll_write(struct bcma_drv_cc *cc, u32 offset, u32 value)
8369ae33b   Rafał Miłecki   bcma: add Broadco...
24
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
25
26
27
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
  	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, value);
3861b2c5d   Rafał Miłecki   bcma: cc: export ...
28
29
  }
  EXPORT_SYMBOL_GPL(bcma_chipco_pll_write);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
30

3861b2c5d   Rafał Miłecki   bcma: cc: export ...
31
32
33
  void bcma_chipco_pll_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask,
  			     u32 set)
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
34
35
36
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
  	bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_ADDR);
  	bcma_pmu_maskset32(cc, BCMA_CC_PMU_PLLCTL_DATA, mask, set);
3861b2c5d   Rafał Miłecki   bcma: cc: export ...
37
38
39
40
41
42
  }
  EXPORT_SYMBOL_GPL(bcma_chipco_pll_maskset);
  
  void bcma_chipco_chipctl_maskset(struct bcma_drv_cc *cc,
  				 u32 offset, u32 mask, u32 set)
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
43
44
45
  	bcma_pmu_write32(cc, BCMA_CC_PMU_CHIPCTL_ADDR, offset);
  	bcma_pmu_read32(cc, BCMA_CC_PMU_CHIPCTL_ADDR);
  	bcma_pmu_maskset32(cc, BCMA_CC_PMU_CHIPCTL_DATA, mask, set);
3861b2c5d   Rafał Miłecki   bcma: cc: export ...
46
47
48
49
50
51
  }
  EXPORT_SYMBOL_GPL(bcma_chipco_chipctl_maskset);
  
  void bcma_chipco_regctl_maskset(struct bcma_drv_cc *cc, u32 offset, u32 mask,
  				u32 set)
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
52
53
54
  	bcma_pmu_write32(cc, BCMA_CC_PMU_REGCTL_ADDR, offset);
  	bcma_pmu_read32(cc, BCMA_CC_PMU_REGCTL_ADDR);
  	bcma_pmu_maskset32(cc, BCMA_CC_PMU_REGCTL_DATA, mask, set);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
55
  }
3861b2c5d   Rafał Miłecki   bcma: cc: export ...
56
  EXPORT_SYMBOL_GPL(bcma_chipco_regctl_maskset);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
57

88f9b65d4   Rafał Miłecki   bcma: add support...
58
59
60
  static u32 bcma_pmu_xtalfreq(struct bcma_drv_cc *cc)
  {
  	u32 ilp_ctl, alp_hz;
b3c47afbf   Rafał Miłecki   bcma: support PMU...
61
  	if (!(bcma_pmu_read32(cc, BCMA_CC_PMU_STAT) &
88f9b65d4   Rafał Miłecki   bcma: add support...
62
63
  	      BCMA_CC_PMU_STAT_EXT_LPO_AVAIL))
  		return 0;
b3c47afbf   Rafał Miłecki   bcma: support PMU...
64
65
  	bcma_pmu_write32(cc, BCMA_CC_PMU_XTAL_FREQ,
  			 BIT(BCMA_CC_PMU_XTAL_FREQ_MEASURE_SHIFT));
88f9b65d4   Rafał Miłecki   bcma: add support...
66
  	usleep_range(1000, 2000);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
67
  	ilp_ctl = bcma_pmu_read32(cc, BCMA_CC_PMU_XTAL_FREQ);
88f9b65d4   Rafał Miłecki   bcma: add support...
68
  	ilp_ctl &= BCMA_CC_PMU_XTAL_FREQ_ILPCTL_MASK;
b3c47afbf   Rafał Miłecki   bcma: support PMU...
69
  	bcma_pmu_write32(cc, BCMA_CC_PMU_XTAL_FREQ, 0);
88f9b65d4   Rafał Miłecki   bcma: add support...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  
  	alp_hz = ilp_ctl * 32768 / 4;
  	return (alp_hz + 50000) / 100000 * 100;
  }
  
  static void bcma_pmu2_pll_init0(struct bcma_drv_cc *cc, u32 xtalfreq)
  {
  	struct bcma_bus *bus = cc->core->bus;
  	u32 freq_tgt_target = 0, freq_tgt_current;
  	u32 pll0, mask;
  
  	switch (bus->chipinfo.id) {
  	case BCMA_CHIP_ID_BCM43142:
  		/* pmu2_xtaltab0_adfll_485 */
  		switch (xtalfreq) {
  		case 12000:
  			freq_tgt_target = 0x50D52;
  			break;
  		case 20000:
  			freq_tgt_target = 0x307FE;
  			break;
  		case 26000:
  			freq_tgt_target = 0x254EA;
  			break;
  		case 37400:
  			freq_tgt_target = 0x19EF8;
  			break;
  		case 52000:
  			freq_tgt_target = 0x12A75;
  			break;
  		}
  		break;
  	}
  
  	if (!freq_tgt_target) {
  		bcma_err(bus, "Unknown TGT frequency for xtalfreq %d
  ",
  			 xtalfreq);
  		return;
  	}
  
  	pll0 = bcma_chipco_pll_read(cc, BCMA_CC_PMU15_PLL_PLLCTL0);
  	freq_tgt_current = (pll0 & BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK) >>
  		BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT;
  
  	if (freq_tgt_current == freq_tgt_target) {
  		bcma_debug(bus, "Target TGT frequency already set
  ");
  		return;
  	}
  
  	/* Turn off PLL */
  	switch (bus->chipinfo.id) {
  	case BCMA_CHIP_ID_BCM43142:
  		mask = (u32)~(BCMA_RES_4314_HT_AVAIL |
  			      BCMA_RES_4314_MACPHY_CLK_AVAIL);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
126
127
  		bcma_pmu_mask32(cc, BCMA_CC_PMU_MINRES_MSK, mask);
  		bcma_pmu_mask32(cc, BCMA_CC_PMU_MAXRES_MSK, mask);
88f9b65d4   Rafał Miłecki   bcma: add support...
128
129
130
131
132
133
134
135
136
137
138
  		bcma_wait_value(cc->core, BCMA_CLKCTLST,
  				BCMA_CLKCTLST_HAVEHT, 0, 20000);
  		break;
  	}
  
  	pll0 &= ~BCMA_CC_PMU15_PLL_PC0_FREQTGT_MASK;
  	pll0 |= freq_tgt_target << BCMA_CC_PMU15_PLL_PC0_FREQTGT_SHIFT;
  	bcma_chipco_pll_write(cc, BCMA_CC_PMU15_PLL_PLLCTL0, pll0);
  
  	/* Flush */
  	if (cc->pmu.rev >= 2)
b3c47afbf   Rafał Miłecki   bcma: support PMU...
139
  		bcma_pmu_set32(cc, BCMA_CC_PMU_CTL, BCMA_CC_PMU_CTL_PLL_UPD);
88f9b65d4   Rafał Miłecki   bcma: add support...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  
  	/* TODO: Do we need to update OTP? */
  }
  
  static void bcma_pmu_pll_init(struct bcma_drv_cc *cc)
  {
  	struct bcma_bus *bus = cc->core->bus;
  	u32 xtalfreq = bcma_pmu_xtalfreq(cc);
  
  	switch (bus->chipinfo.id) {
  	case BCMA_CHIP_ID_BCM43142:
  		if (xtalfreq == 0)
  			xtalfreq = 20000;
  		bcma_pmu2_pll_init0(cc, xtalfreq);
  		break;
  	}
  }
8369ae33b   Rafał Miłecki   bcma: add Broadco...
157
158
159
160
161
162
  static void bcma_pmu_resources_init(struct bcma_drv_cc *cc)
  {
  	struct bcma_bus *bus = cc->core->bus;
  	u32 min_msk = 0, max_msk = 0;
  
  	switch (bus->chipinfo.id) {
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
163
  	case BCMA_CHIP_ID_BCM4313:
8369ae33b   Rafał Miłecki   bcma: add Broadco...
164
165
166
  		min_msk = 0x200D;
  		max_msk = 0xFFFF;
  		break;
88f9b65d4   Rafał Miłecki   bcma: add support...
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  	case BCMA_CHIP_ID_BCM43142:
  		min_msk = BCMA_RES_4314_LPLDO_PU |
  			  BCMA_RES_4314_PMU_SLEEP_DIS |
  			  BCMA_RES_4314_PMU_BG_PU |
  			  BCMA_RES_4314_CBUCK_LPOM_PU |
  			  BCMA_RES_4314_CBUCK_PFM_PU |
  			  BCMA_RES_4314_CLDO_PU |
  			  BCMA_RES_4314_LPLDO2_LVM |
  			  BCMA_RES_4314_WL_PMU_PU |
  			  BCMA_RES_4314_LDO3P3_PU |
  			  BCMA_RES_4314_OTP_PU |
  			  BCMA_RES_4314_WL_PWRSW_PU |
  			  BCMA_RES_4314_LQ_AVAIL |
  			  BCMA_RES_4314_LOGIC_RET |
  			  BCMA_RES_4314_MEM_SLEEP |
  			  BCMA_RES_4314_MACPHY_RET |
  			  BCMA_RES_4314_WL_CORE_READY;
  		max_msk = 0x3FFFFFFF;
  		break;
8369ae33b   Rafał Miłecki   bcma: add Broadco...
186
  	default:
3d9d8af33   Rafał Miłecki   bcma: use custom ...
187
188
189
  		bcma_debug(bus, "PMU resource config unknown or not needed for device 0x%04X
  ",
  			   bus->chipinfo.id);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
190
191
192
193
  	}
  
  	/* Set the resource masks. */
  	if (min_msk)
b3c47afbf   Rafał Miłecki   bcma: support PMU...
194
  		bcma_pmu_write32(cc, BCMA_CC_PMU_MINRES_MSK, min_msk);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
195
  	if (max_msk)
b3c47afbf   Rafał Miłecki   bcma: support PMU...
196
  		bcma_pmu_write32(cc, BCMA_CC_PMU_MAXRES_MSK, max_msk);
4795f0960   Hauke Mehrtens   bcma: add mdelay ...
197

1fd41a65f   Rafał Miłecki   bcma: change dela...
198
199
200
201
  	/*
  	 * Add some delay; allow resources to come up and settle.
  	 * Delay is required for SoC (early init).
  	 */
4795f0960   Hauke Mehrtens   bcma: add mdelay ...
202
  	mdelay(2);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
203
  }
984e5befb   Rafał Miłecki   bcma: implement B...
204
205
206
207
208
209
210
211
212
213
214
  /* Disable to allow reading SPROM. Don't know the adventages of enabling it. */
  void bcma_chipco_bcm4331_ext_pa_lines_ctl(struct bcma_drv_cc *cc, bool enable)
  {
  	struct bcma_bus *bus = cc->core->bus;
  	u32 val;
  
  	val = bcma_cc_read32(cc, BCMA_CC_CHIPCTL);
  	if (enable) {
  		val |= BCMA_CHIPCTL_4331_EXTPA_EN;
  		if (bus->chipinfo.pkg == 9 || bus->chipinfo.pkg == 11)
  			val |= BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5;
00eeedcf0   Hauke Mehrtens   bcma: extend work...
215
216
  		else if (bus->chipinfo.rev > 0)
  			val |= BCMA_CHIPCTL_4331_EXTPA_EN2;
984e5befb   Rafał Miłecki   bcma: implement B...
217
218
  	} else {
  		val &= ~BCMA_CHIPCTL_4331_EXTPA_EN;
00eeedcf0   Hauke Mehrtens   bcma: extend work...
219
  		val &= ~BCMA_CHIPCTL_4331_EXTPA_EN2;
984e5befb   Rafał Miłecki   bcma: implement B...
220
221
222
223
  		val &= ~BCMA_CHIPCTL_4331_EXTPA_ON_GPIO2_5;
  	}
  	bcma_cc_write32(cc, BCMA_CC_CHIPCTL, val);
  }
94f3457f4   Hauke Mehrtens   bcma: make some f...
224
  static void bcma_pmu_workarounds(struct bcma_drv_cc *cc)
8369ae33b   Rafał Miłecki   bcma: add Broadco...
225
226
227
228
  {
  	struct bcma_bus *bus = cc->core->bus;
  
  	switch (bus->chipinfo.id) {
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
229
  	case BCMA_CHIP_ID_BCM4313:
b9562545e   Hauke Mehrtens   bcma: complete wo...
230
231
232
  		/* enable 12 mA drive strenth for 4313 and set chipControl
  		   register bit 1 */
  		bcma_chipco_chipctl_maskset(cc, 0,
1f03bf06e   Hauke Mehrtens   bcma: fix invalid...
233
  					    ~BCMA_CCTRL_4313_12MA_LED_DRIVE,
b9562545e   Hauke Mehrtens   bcma: complete wo...
234
  					    BCMA_CCTRL_4313_12MA_LED_DRIVE);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
235
  		break;
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
236
237
  	case BCMA_CHIP_ID_BCM4331:
  	case BCMA_CHIP_ID_BCM43431:
69aaedd3c   Seth Forshee   bcma: add ext PA ...
238
239
  		/* Ext PA lines must be enabled for tx on BCM4331 */
  		bcma_chipco_bcm4331_ext_pa_lines_ctl(cc, true);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
240
  		break;
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
241
  	case BCMA_CHIP_ID_BCM43224:
b9562545e   Hauke Mehrtens   bcma: complete wo...
242
243
244
  	case BCMA_CHIP_ID_BCM43421:
  		/* enable 12 mA drive strenth for 43224 and set chipControl
  		   register bit 15 */
8369ae33b   Rafał Miłecki   bcma: add Broadco...
245
  		if (bus->chipinfo.rev == 0) {
b9562545e   Hauke Mehrtens   bcma: complete wo...
246
  			bcma_cc_maskset32(cc, BCMA_CC_CHIPCTL,
1f03bf06e   Hauke Mehrtens   bcma: fix invalid...
247
  					  ~BCMA_CCTRL_43224_GPIO_TOGGLE,
b9562545e   Hauke Mehrtens   bcma: complete wo...
248
249
  					  BCMA_CCTRL_43224_GPIO_TOGGLE);
  			bcma_chipco_chipctl_maskset(cc, 0,
1f03bf06e   Hauke Mehrtens   bcma: fix invalid...
250
  						    ~BCMA_CCTRL_43224A0_12MA_LED_DRIVE,
b9562545e   Hauke Mehrtens   bcma: complete wo...
251
  						    BCMA_CCTRL_43224A0_12MA_LED_DRIVE);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
252
  		} else {
b9562545e   Hauke Mehrtens   bcma: complete wo...
253
  			bcma_chipco_chipctl_maskset(cc, 0,
1f03bf06e   Hauke Mehrtens   bcma: fix invalid...
254
  						    ~BCMA_CCTRL_43224B0_12MA_LED_DRIVE,
b9562545e   Hauke Mehrtens   bcma: complete wo...
255
  						    BCMA_CCTRL_43224B0_12MA_LED_DRIVE);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
256
257
258
  		}
  		break;
  	default:
3d9d8af33   Rafał Miłecki   bcma: use custom ...
259
260
261
  		bcma_debug(bus, "Workarounds unknown or not needed for device 0x%04X
  ",
  			   bus->chipinfo.id);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
262
263
  	}
  }
49655bb8a   Hauke Mehrtens   bcma: just do the...
264
  void bcma_pmu_early_init(struct bcma_drv_cc *cc)
8369ae33b   Rafał Miłecki   bcma: add Broadco...
265
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
266
  	struct bcma_bus *bus = cc->core->bus;
8369ae33b   Rafał Miłecki   bcma: add Broadco...
267
  	u32 pmucap;
b3c47afbf   Rafał Miłecki   bcma: support PMU...
268
269
270
271
272
273
274
275
276
277
  	if (cc->core->id.rev >= 35 &&
  	    cc->capabilities_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) {
  		cc->pmu.core = bcma_find_core(bus, BCMA_CORE_PMU);
  		if (!cc->pmu.core)
  			bcma_warn(bus, "Couldn't find expected PMU core");
  	}
  	if (!cc->pmu.core)
  		cc->pmu.core = cc->core;
  
  	pmucap = bcma_pmu_read32(cc, BCMA_CC_PMU_CAP);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
278
  	cc->pmu.rev = (pmucap & BCMA_CC_PMU_CAP_REVISION);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
279
280
281
  	bcma_debug(bus, "Found rev %u PMU (capabilities 0x%08X)
  ", cc->pmu.rev,
  		   pmucap);
49655bb8a   Hauke Mehrtens   bcma: just do the...
282
  }
8369ae33b   Rafał Miłecki   bcma: add Broadco...
283

49655bb8a   Hauke Mehrtens   bcma: just do the...
284
285
  void bcma_pmu_init(struct bcma_drv_cc *cc)
  {
8369ae33b   Rafał Miłecki   bcma: add Broadco...
286
  	if (cc->pmu.rev == 1)
b3c47afbf   Rafał Miłecki   bcma: support PMU...
287
288
  		bcma_pmu_mask32(cc, BCMA_CC_PMU_CTL,
  				~BCMA_CC_PMU_CTL_NOILPONW);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
289
  	else
b3c47afbf   Rafał Miłecki   bcma: support PMU...
290
291
  		bcma_pmu_set32(cc, BCMA_CC_PMU_CTL,
  			       BCMA_CC_PMU_CTL_NOILPONW);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
292

88f9b65d4   Rafał Miłecki   bcma: add support...
293
  	bcma_pmu_pll_init(cc);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
294
  	bcma_pmu_resources_init(cc);
8369ae33b   Rafał Miłecki   bcma: add Broadco...
295
296
  	bcma_pmu_workarounds(cc);
  }
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
297

5b5ac4144   Rafał Miłecki   bcma: unify namin...
298
  u32 bcma_pmu_get_alp_clock(struct bcma_drv_cc *cc)
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
299
300
301
302
  {
  	struct bcma_bus *bus = cc->core->bus;
  
  	switch (bus->chipinfo.id) {
d6b688cf2   Hauke Mehrtens   bcma: handle more...
303
304
305
306
307
308
309
310
311
  	case BCMA_CHIP_ID_BCM4313:
  	case BCMA_CHIP_ID_BCM43224:
  	case BCMA_CHIP_ID_BCM43225:
  	case BCMA_CHIP_ID_BCM43227:
  	case BCMA_CHIP_ID_BCM43228:
  	case BCMA_CHIP_ID_BCM4331:
  	case BCMA_CHIP_ID_BCM43421:
  	case BCMA_CHIP_ID_BCM43428:
  	case BCMA_CHIP_ID_BCM43431:
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
312
  	case BCMA_CHIP_ID_BCM4716:
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
313
  	case BCMA_CHIP_ID_BCM47162:
d6b688cf2   Hauke Mehrtens   bcma: handle more...
314
  	case BCMA_CHIP_ID_BCM4748:
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
315
  	case BCMA_CHIP_ID_BCM4749:
d6b688cf2   Hauke Mehrtens   bcma: handle more...
316
  	case BCMA_CHIP_ID_BCM5357:
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
317
  	case BCMA_CHIP_ID_BCM53572:
d6b688cf2   Hauke Mehrtens   bcma: handle more...
318
  	case BCMA_CHIP_ID_BCM6362:
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
319
320
  		/* always 20Mhz */
  		return 20000 * 1000;
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
321
  	case BCMA_CHIP_ID_BCM4706:
d6b688cf2   Hauke Mehrtens   bcma: handle more...
322
  	case BCMA_CHIP_ID_BCM5356:
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
323
324
  		/* always 25Mhz */
  		return 25000 * 1000;
d6b688cf2   Hauke Mehrtens   bcma: handle more...
325
326
327
328
329
330
331
  	case BCMA_CHIP_ID_BCM43460:
  	case BCMA_CHIP_ID_BCM4352:
  	case BCMA_CHIP_ID_BCM4360:
  		if (cc->status & BCMA_CC_CHIPST_4360_XTAL_40MZ)
  			return 40000 * 1000;
  		else
  			return 20000 * 1000;
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
332
  	default:
3d9d8af33   Rafał Miłecki   bcma: use custom ...
333
334
335
  		bcma_warn(bus, "No ALP clock specified for %04X device, pmu rev. %d, using default %d Hz
  ",
  			  bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_ALP_CLOCK);
e3afe0e5b   Hauke Mehrtens   bcma: add serial ...
336
337
338
  	}
  	return BCMA_CC_PMU_ALP_CLOCK;
  }
908debc8d   Hauke Mehrtens   bcma: get CPU clock
339
340
341
342
  
  /* Find the output of the "m" pll divider given pll controls that start with
   * pllreg "pll0" i.e. 12 for main 6 for phy, 0 for misc.
   */
5b5ac4144   Rafał Miłecki   bcma: unify namin...
343
  static u32 bcma_pmu_pll_clock(struct bcma_drv_cc *cc, u32 pll0, u32 m)
908debc8d   Hauke Mehrtens   bcma: get CPU clock
344
345
346
347
348
349
350
  {
  	u32 tmp, div, ndiv, p1, p2, fc;
  	struct bcma_bus *bus = cc->core->bus;
  
  	BUG_ON((pll0 & 3) || (pll0 > BCMA_CC_PMU4716_MAINPLL_PLL0));
  
  	BUG_ON(!m || m > 4);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
351
352
  	if (bus->chipinfo.id == BCMA_CHIP_ID_BCM5357 ||
  	    bus->chipinfo.id == BCMA_CHIP_ID_BCM4749) {
908debc8d   Hauke Mehrtens   bcma: get CPU clock
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  		/* Detect failure in clock setting */
  		tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT);
  		if (tmp & 0x40000)
  			return 133 * 1000000;
  	}
  
  	tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_P1P2_OFF);
  	p1 = (tmp & BCMA_CC_PPL_P1_MASK) >> BCMA_CC_PPL_P1_SHIFT;
  	p2 = (tmp & BCMA_CC_PPL_P2_MASK) >> BCMA_CC_PPL_P2_SHIFT;
  
  	tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_M14_OFF);
  	div = (tmp >> ((m - 1) * BCMA_CC_PPL_MDIV_WIDTH)) &
  		BCMA_CC_PPL_MDIV_MASK;
  
  	tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PPL_NM5_OFF);
  	ndiv = (tmp & BCMA_CC_PPL_NDIV_MASK) >> BCMA_CC_PPL_NDIV_SHIFT;
  
  	/* Do calculation in Mhz */
5b5ac4144   Rafał Miłecki   bcma: unify namin...
371
  	fc = bcma_pmu_get_alp_clock(cc) / 1000000;
908debc8d   Hauke Mehrtens   bcma: get CPU clock
372
373
374
375
376
  	fc = (p1 * ndiv * fc) / p2;
  
  	/* Return clock in Hertz */
  	return (fc / div) * 1000000;
  }
5b5ac4144   Rafał Miłecki   bcma: unify namin...
377
  static u32 bcma_pmu_pll_clock_bcm4706(struct bcma_drv_cc *cc, u32 pll0, u32 m)
650cef382   Hauke Mehrtens   bcma: add PMU clo...
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  {
  	u32 tmp, ndiv, p1div, p2div;
  	u32 clock;
  
  	BUG_ON(!m || m > 4);
  
  	/* Get N, P1 and P2 dividers to determine CPU clock */
  	tmp = bcma_chipco_pll_read(cc, pll0 + BCMA_CC_PMU6_4706_PROCPLL_OFF);
  	ndiv = (tmp & BCMA_CC_PMU6_4706_PROC_NDIV_INT_MASK)
  		>> BCMA_CC_PMU6_4706_PROC_NDIV_INT_SHIFT;
  	p1div = (tmp & BCMA_CC_PMU6_4706_PROC_P1DIV_MASK)
  		>> BCMA_CC_PMU6_4706_PROC_P1DIV_SHIFT;
  	p2div = (tmp & BCMA_CC_PMU6_4706_PROC_P2DIV_MASK)
  		>> BCMA_CC_PMU6_4706_PROC_P2DIV_SHIFT;
  
  	tmp = bcma_cc_read32(cc, BCMA_CC_CHIPSTAT);
  	if (tmp & BCMA_CC_CHIPST_4706_PKG_OPTION)
  		/* Low cost bonding: Fixed reference clock 25MHz and m = 4 */
  		clock = (25000000 / 4) * ndiv * p2div / p1div;
  	else
  		/* Fixed reference clock 25MHz and m = 2 */
  		clock = (25000000 / 2) * ndiv * p2div / p1div;
  
  	if (m == BCMA_CC_PMU5_MAINPLL_SSB)
  		clock = clock / 4;
  
  	return clock;
  }
908debc8d   Hauke Mehrtens   bcma: get CPU clock
406
  /* query bus clock frequency for PMU-enabled chipcommon */
dd4544f05   Rafał Miłecki   bgmac: driver for...
407
  u32 bcma_pmu_get_bus_clock(struct bcma_drv_cc *cc)
908debc8d   Hauke Mehrtens   bcma: get CPU clock
408
409
410
411
  {
  	struct bcma_bus *bus = cc->core->bus;
  
  	switch (bus->chipinfo.id) {
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
412
413
414
  	case BCMA_CHIP_ID_BCM4716:
  	case BCMA_CHIP_ID_BCM4748:
  	case BCMA_CHIP_ID_BCM47162:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
415
416
  		return bcma_pmu_pll_clock(cc, BCMA_CC_PMU4716_MAINPLL_PLL0,
  					  BCMA_CC_PMU5_MAINPLL_SSB);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
417
  	case BCMA_CHIP_ID_BCM5356:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
418
419
  		return bcma_pmu_pll_clock(cc, BCMA_CC_PMU5356_MAINPLL_PLL0,
  					  BCMA_CC_PMU5_MAINPLL_SSB);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
420
421
  	case BCMA_CHIP_ID_BCM5357:
  	case BCMA_CHIP_ID_BCM4749:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
422
423
  		return bcma_pmu_pll_clock(cc, BCMA_CC_PMU5357_MAINPLL_PLL0,
  					  BCMA_CC_PMU5_MAINPLL_SSB);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
424
  	case BCMA_CHIP_ID_BCM4706:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
425
426
427
  		return bcma_pmu_pll_clock_bcm4706(cc,
  						  BCMA_CC_PMU4706_MAINPLL_PLL0,
  						  BCMA_CC_PMU5_MAINPLL_SSB);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
428
  	case BCMA_CHIP_ID_BCM53572:
908debc8d   Hauke Mehrtens   bcma: get CPU clock
429
430
  		return 75000000;
  	default:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
431
432
  		bcma_warn(bus, "No bus clock specified for %04X device, pmu rev. %d, using default %d Hz
  ",
3d9d8af33   Rafał Miłecki   bcma: use custom ...
433
  			  bus->chipinfo.id, cc->pmu.rev, BCMA_CC_PMU_HT_CLOCK);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
434
435
436
  	}
  	return BCMA_CC_PMU_HT_CLOCK;
  }
dd4544f05   Rafał Miłecki   bgmac: driver for...
437
  EXPORT_SYMBOL_GPL(bcma_pmu_get_bus_clock);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
438
439
  
  /* query cpu clock frequency for PMU-enabled chipcommon */
5b5ac4144   Rafał Miłecki   bcma: unify namin...
440
  u32 bcma_pmu_get_cpu_clock(struct bcma_drv_cc *cc)
908debc8d   Hauke Mehrtens   bcma: get CPU clock
441
442
  {
  	struct bcma_bus *bus = cc->core->bus;
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
443
  	if (bus->chipinfo.id == BCMA_CHIP_ID_BCM53572)
908debc8d   Hauke Mehrtens   bcma: get CPU clock
444
  		return 300000000;
5b5ac4144   Rafał Miłecki   bcma: unify namin...
445
  	/* New PMUs can have different clock for bus and CPU */
908debc8d   Hauke Mehrtens   bcma: get CPU clock
446
447
448
  	if (cc->pmu.rev >= 5) {
  		u32 pll;
  		switch (bus->chipinfo.id) {
650cef382   Hauke Mehrtens   bcma: add PMU clo...
449
  		case BCMA_CHIP_ID_BCM4706:
5b5ac4144   Rafał Miłecki   bcma: unify namin...
450
  			return bcma_pmu_pll_clock_bcm4706(cc,
650cef382   Hauke Mehrtens   bcma: add PMU clo...
451
452
  						BCMA_CC_PMU4706_MAINPLL_PLL0,
  						BCMA_CC_PMU5_MAINPLL_CPU);
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
453
  		case BCMA_CHIP_ID_BCM5356:
908debc8d   Hauke Mehrtens   bcma: get CPU clock
454
455
  			pll = BCMA_CC_PMU5356_MAINPLL_PLL0;
  			break;
4b4f5be2e   Hauke Mehrtens   bcma: add constan...
456
457
  		case BCMA_CHIP_ID_BCM5357:
  		case BCMA_CHIP_ID_BCM4749:
908debc8d   Hauke Mehrtens   bcma: get CPU clock
458
459
460
461
462
463
  			pll = BCMA_CC_PMU5357_MAINPLL_PLL0;
  			break;
  		default:
  			pll = BCMA_CC_PMU4716_MAINPLL_PLL0;
  			break;
  		}
5b5ac4144   Rafał Miłecki   bcma: unify namin...
464
  		return bcma_pmu_pll_clock(cc, pll, BCMA_CC_PMU5_MAINPLL_CPU);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
465
  	}
5b5ac4144   Rafał Miłecki   bcma: unify namin...
466
467
  	/* On old PMUs CPU has the same clock as the bus */
  	return bcma_pmu_get_bus_clock(cc);
908debc8d   Hauke Mehrtens   bcma: get CPU clock
468
  }
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
469
470
471
472
  
  static void bcma_pmu_spuravoid_pll_write(struct bcma_drv_cc *cc, u32 offset,
  					 u32 value)
  {
b3c47afbf   Rafał Miłecki   bcma: support PMU...
473
474
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR, offset);
  	bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, value);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
  }
  
  void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid)
  {
  	u32 tmp = 0;
  	u8 phypll_offset = 0;
  	u8 bcm5357_bcm43236_p1div[] = {0x1, 0x5, 0x5};
  	u8 bcm5357_bcm43236_ndiv[] = {0x30, 0xf6, 0xfc};
  	struct bcma_bus *bus = cc->core->bus;
  
  	switch (bus->chipinfo.id) {
  	case BCMA_CHIP_ID_BCM5357:
  	case BCMA_CHIP_ID_BCM4749:
  	case BCMA_CHIP_ID_BCM53572:
  		/* 5357[ab]0, 43236[ab]0, and 6362b0 */
  
  		/* BCM5357 needs to touch PLL1_PLLCTL[02],
  		   so offset PLL0_PLLCTL[02] by 6 */
  		phypll_offset = (bus->chipinfo.id == BCMA_CHIP_ID_BCM5357 ||
  		       bus->chipinfo.id == BCMA_CHIP_ID_BCM4749 ||
  		       bus->chipinfo.id == BCMA_CHIP_ID_BCM53572) ? 6 : 0;
  
  		/* RMW only the P1 divider */
b3c47afbf   Rafał Miłecki   bcma: support PMU...
498
  		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR,
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
499
  				BCMA_CC_PMU_PLL_CTL0 + phypll_offset);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
500
  		tmp = bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
501
502
  		tmp &= (~(BCMA_CC_PMU1_PLL0_PC0_P1DIV_MASK));
  		tmp |= (bcm5357_bcm43236_p1div[spuravoid] << BCMA_CC_PMU1_PLL0_PC0_P1DIV_SHIFT);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
503
  		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, tmp);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
504
505
  
  		/* RMW only the int feedback divider */
b3c47afbf   Rafał Miłecki   bcma: support PMU...
506
  		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_ADDR,
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
507
  				BCMA_CC_PMU_PLL_CTL2 + phypll_offset);
b3c47afbf   Rafał Miłecki   bcma: support PMU...
508
  		tmp = bcma_pmu_read32(cc, BCMA_CC_PMU_PLLCTL_DATA);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
509
510
  		tmp &= ~(BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_MASK);
  		tmp |= (bcm5357_bcm43236_ndiv[spuravoid]) << BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_SHIFT;
b3c47afbf   Rafał Miłecki   bcma: support PMU...
511
  		bcma_pmu_write32(cc, BCMA_CC_PMU_PLLCTL_DATA, tmp);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
512

e3f2ae179   Hauke Mehrtens   bcma: use BCMA_CC...
513
  		tmp = BCMA_CC_PMU_CTL_PLL_UPD;
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
  		break;
  
  	case BCMA_CHIP_ID_BCM4331:
  	case BCMA_CHIP_ID_BCM43431:
  		if (spuravoid == 2) {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11500014);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x0FC00a08);
  		} else if (spuravoid == 1) {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11500014);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x0F600a08);
  		} else {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11100014);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x03000a08);
  		}
e3f2ae179   Hauke Mehrtens   bcma: use BCMA_CC...
534
  		tmp = BCMA_CC_PMU_CTL_PLL_UPD;
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
  		break;
  
  	case BCMA_CHIP_ID_BCM43224:
  	case BCMA_CHIP_ID_BCM43225:
  	case BCMA_CHIP_ID_BCM43421:
  		if (spuravoid == 1) {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11500010);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x000C0C06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x0F600a08);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x2001E920);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		} else {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11100010);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x000c0c06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x03000a08);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x200005c0);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		}
e3f2ae179   Hauke Mehrtens   bcma: use BCMA_CC...
567
  		tmp = BCMA_CC_PMU_CTL_PLL_UPD;
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
  		break;
  
  	case BCMA_CHIP_ID_BCM4716:
  	case BCMA_CHIP_ID_BCM4748:
  	case BCMA_CHIP_ID_BCM47162:
  		if (spuravoid == 1) {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11500060);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x080C0C06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x0F600000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x2001E924);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		} else {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11100060);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x080c0c06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x03000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x200005c0);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		}
e3f2ae179   Hauke Mehrtens   bcma: use BCMA_CC...
600
  		tmp = BCMA_CC_PMU_CTL_PLL_UPD | BCMA_CC_PMU_CTL_NOILPONW;
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
601
  		break;
27cfdb050   Rafał Miłecki   bcma: add support...
602
  	case BCMA_CHIP_ID_BCM43131:
d1d3799fc   Rafał Miłecki   bcma: add support...
603
  	case BCMA_CHIP_ID_BCM43217:
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
  	case BCMA_CHIP_ID_BCM43227:
  	case BCMA_CHIP_ID_BCM43228:
  	case BCMA_CHIP_ID_BCM43428:
  		/* LCNXN */
  		/* PLL Settings for spur avoidance on/off mode,
  		   no on2 support for 43228A0 */
  		if (spuravoid == 1) {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x01100014);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x040C0C06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x03140A08);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00333333);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x202C2820);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		} else {
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL0,
  						     0x11100014);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL1,
  						     0x040c0c06);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL2,
  						     0x03000a08);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL3,
  						     0x00000000);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL4,
  						     0x200005c0);
  			bcma_pmu_spuravoid_pll_write(cc, BCMA_CC_PMU_PLL_CTL5,
  						     0x88888815);
  		}
e3f2ae179   Hauke Mehrtens   bcma: use BCMA_CC...
637
  		tmp = BCMA_CC_PMU_CTL_PLL_UPD;
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
638
639
  		break;
  	default:
3d9d8af33   Rafał Miłecki   bcma: use custom ...
640
641
642
  		bcma_err(bus, "Unknown spuravoidance settings for chip 0x%04X, not changing PLL
  ",
  			 bus->chipinfo.id);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
643
644
  		break;
  	}
b3c47afbf   Rafał Miłecki   bcma: support PMU...
645
646
  	tmp |= bcma_pmu_read32(cc, BCMA_CC_PMU_CTL);
  	bcma_pmu_write32(cc, BCMA_CC_PMU_CTL, tmp);
c586e1099   Hauke Mehrtens   bcma: add bcma_pm...
647
648
  }
  EXPORT_SYMBOL_GPL(bcma_pmu_spuravoid_pllupdate);