0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include "ssb_private.h"
0013
0014 #include <linux/ssb/ssb.h>
0015 #include <linux/ssb/ssb_regs.h>
0016 #include <linux/export.h>
0017 #include <linux/pci.h>
0018 #include <linux/bcm47xx_wdt.h>
0019
0020
0021
0022 enum ssb_clksrc {
0023
0024 SSB_CHIPCO_CLKSRC_PCI,
0025
0026 SSB_CHIPCO_CLKSRC_XTALOS,
0027
0028 SSB_CHIPCO_CLKSRC_LOPWROS,
0029 };
0030
0031
0032 static inline u32 chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
0033 u32 mask, u32 value)
0034 {
0035 value &= mask;
0036 value |= chipco_read32(cc, offset) & ~mask;
0037 chipco_write32(cc, offset, value);
0038
0039 return value;
0040 }
0041
0042 void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
0043 enum ssb_clkmode mode)
0044 {
0045 struct ssb_device *ccdev = cc->dev;
0046 struct ssb_bus *bus;
0047 u32 tmp;
0048
0049 if (!ccdev)
0050 return;
0051 bus = ccdev->bus;
0052
0053
0054 if (ccdev->id.revision >= 10 && mode == SSB_CLKMODE_SLOW)
0055 mode = SSB_CLKMODE_DYNAMIC;
0056
0057 if (cc->capabilities & SSB_CHIPCO_CAP_PMU)
0058 return;
0059 WARN_ON(ccdev->id.revision >= 20);
0060
0061
0062 if (ccdev->id.revision < 6)
0063 return;
0064
0065
0066 if (ccdev->id.revision >= 10)
0067 return;
0068
0069 if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
0070 return;
0071
0072 switch (mode) {
0073 case SSB_CLKMODE_SLOW:
0074 tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
0075 tmp |= SSB_CHIPCO_SLOWCLKCTL_FSLOW;
0076 chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
0077 break;
0078 case SSB_CLKMODE_FAST:
0079 if (ccdev->id.revision < 10) {
0080 ssb_pci_xtal(bus, SSB_GPIO_XTAL, 1);
0081 tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
0082 tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
0083 tmp |= SSB_CHIPCO_SLOWCLKCTL_IPLL;
0084 chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
0085 } else {
0086 chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
0087 (chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) |
0088 SSB_CHIPCO_SYSCLKCTL_FORCEHT));
0089
0090 }
0091 break;
0092 case SSB_CLKMODE_DYNAMIC:
0093 if (ccdev->id.revision < 10) {
0094 tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
0095 tmp &= ~SSB_CHIPCO_SLOWCLKCTL_FSLOW;
0096 tmp &= ~SSB_CHIPCO_SLOWCLKCTL_IPLL;
0097 tmp &= ~SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
0098 if ((tmp & SSB_CHIPCO_SLOWCLKCTL_SRC) !=
0099 SSB_CHIPCO_SLOWCLKCTL_SRC_XTAL)
0100 tmp |= SSB_CHIPCO_SLOWCLKCTL_ENXTAL;
0101 chipco_write32(cc, SSB_CHIPCO_SLOWCLKCTL, tmp);
0102
0103
0104
0105 if (tmp & SSB_CHIPCO_SLOWCLKCTL_ENXTAL)
0106 ssb_pci_xtal(bus, SSB_GPIO_XTAL, 0);
0107 } else {
0108 chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
0109 (chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) &
0110 ~SSB_CHIPCO_SYSCLKCTL_FORCEHT));
0111 }
0112 break;
0113 default:
0114 WARN_ON(1);
0115 }
0116 }
0117
0118
0119 static enum ssb_clksrc chipco_pctl_get_slowclksrc(struct ssb_chipcommon *cc)
0120 {
0121 struct ssb_bus *bus = cc->dev->bus;
0122 u32 tmp;
0123
0124 if (cc->dev->id.revision < 6) {
0125 if (bus->bustype == SSB_BUSTYPE_SSB ||
0126 bus->bustype == SSB_BUSTYPE_PCMCIA)
0127 return SSB_CHIPCO_CLKSRC_XTALOS;
0128 if (bus->bustype == SSB_BUSTYPE_PCI) {
0129 pci_read_config_dword(bus->host_pci, SSB_GPIO_OUT, &tmp);
0130 if (tmp & 0x10)
0131 return SSB_CHIPCO_CLKSRC_PCI;
0132 return SSB_CHIPCO_CLKSRC_XTALOS;
0133 }
0134 }
0135 if (cc->dev->id.revision < 10) {
0136 tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
0137 tmp &= 0x7;
0138 if (tmp == 0)
0139 return SSB_CHIPCO_CLKSRC_LOPWROS;
0140 if (tmp == 1)
0141 return SSB_CHIPCO_CLKSRC_XTALOS;
0142 if (tmp == 2)
0143 return SSB_CHIPCO_CLKSRC_PCI;
0144 }
0145
0146 return SSB_CHIPCO_CLKSRC_XTALOS;
0147 }
0148
0149
0150 static int chipco_pctl_clockfreqlimit(struct ssb_chipcommon *cc, int get_max)
0151 {
0152 int limit;
0153 enum ssb_clksrc clocksrc;
0154 int divisor = 1;
0155 u32 tmp;
0156
0157 clocksrc = chipco_pctl_get_slowclksrc(cc);
0158 if (cc->dev->id.revision < 6) {
0159 switch (clocksrc) {
0160 case SSB_CHIPCO_CLKSRC_PCI:
0161 divisor = 64;
0162 break;
0163 case SSB_CHIPCO_CLKSRC_XTALOS:
0164 divisor = 32;
0165 break;
0166 default:
0167 WARN_ON(1);
0168 }
0169 } else if (cc->dev->id.revision < 10) {
0170 switch (clocksrc) {
0171 case SSB_CHIPCO_CLKSRC_LOPWROS:
0172 break;
0173 case SSB_CHIPCO_CLKSRC_XTALOS:
0174 case SSB_CHIPCO_CLKSRC_PCI:
0175 tmp = chipco_read32(cc, SSB_CHIPCO_SLOWCLKCTL);
0176 divisor = (tmp >> 16) + 1;
0177 divisor *= 4;
0178 break;
0179 }
0180 } else {
0181 tmp = chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL);
0182 divisor = (tmp >> 16) + 1;
0183 divisor *= 4;
0184 }
0185
0186 switch (clocksrc) {
0187 case SSB_CHIPCO_CLKSRC_LOPWROS:
0188 if (get_max)
0189 limit = 43000;
0190 else
0191 limit = 25000;
0192 break;
0193 case SSB_CHIPCO_CLKSRC_XTALOS:
0194 if (get_max)
0195 limit = 20200000;
0196 else
0197 limit = 19800000;
0198 break;
0199 case SSB_CHIPCO_CLKSRC_PCI:
0200 if (get_max)
0201 limit = 34000000;
0202 else
0203 limit = 25000000;
0204 break;
0205 }
0206 limit /= divisor;
0207
0208 return limit;
0209 }
0210
0211 static void chipco_powercontrol_init(struct ssb_chipcommon *cc)
0212 {
0213 struct ssb_bus *bus = cc->dev->bus;
0214
0215 if (bus->chip_id == 0x4321) {
0216 if (bus->chip_rev == 0)
0217 chipco_write32(cc, SSB_CHIPCO_CHIPCTL, 0x3A4);
0218 else if (bus->chip_rev == 1)
0219 chipco_write32(cc, SSB_CHIPCO_CHIPCTL, 0xA4);
0220 }
0221
0222 if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
0223 return;
0224
0225 if (cc->dev->id.revision >= 10) {
0226
0227 chipco_write32(cc, SSB_CHIPCO_SYSCLKCTL,
0228 (chipco_read32(cc, SSB_CHIPCO_SYSCLKCTL) &
0229 0x0000FFFF) | 0x00040000);
0230 } else {
0231 int maxfreq;
0232
0233 maxfreq = chipco_pctl_clockfreqlimit(cc, 1);
0234 chipco_write32(cc, SSB_CHIPCO_PLLONDELAY,
0235 (maxfreq * 150 + 999999) / 1000000);
0236 chipco_write32(cc, SSB_CHIPCO_FREFSELDELAY,
0237 (maxfreq * 15 + 999999) / 1000000);
0238 }
0239 }
0240
0241
0242 static u16 pmu_fast_powerup_delay(struct ssb_chipcommon *cc)
0243 {
0244 struct ssb_bus *bus = cc->dev->bus;
0245
0246 switch (bus->chip_id) {
0247 case 0x4312:
0248 case 0x4322:
0249 case 0x4328:
0250 return 7000;
0251 case 0x4325:
0252
0253 default:
0254 return 15000;
0255 }
0256 }
0257
0258
0259 static void calc_fast_powerup_delay(struct ssb_chipcommon *cc)
0260 {
0261 struct ssb_bus *bus = cc->dev->bus;
0262 int minfreq;
0263 unsigned int tmp;
0264 u32 pll_on_delay;
0265
0266 if (bus->bustype != SSB_BUSTYPE_PCI)
0267 return;
0268
0269 if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
0270 cc->fast_pwrup_delay = pmu_fast_powerup_delay(cc);
0271 return;
0272 }
0273
0274 if (!(cc->capabilities & SSB_CHIPCO_CAP_PCTL))
0275 return;
0276
0277 minfreq = chipco_pctl_clockfreqlimit(cc, 0);
0278 pll_on_delay = chipco_read32(cc, SSB_CHIPCO_PLLONDELAY);
0279 tmp = (((pll_on_delay + 2) * 1000000) + (minfreq - 1)) / minfreq;
0280 WARN_ON(tmp & ~0xFFFF);
0281
0282 cc->fast_pwrup_delay = tmp;
0283 }
0284
0285 static u32 ssb_chipco_alp_clock(struct ssb_chipcommon *cc)
0286 {
0287 if (cc->capabilities & SSB_CHIPCO_CAP_PMU)
0288 return ssb_pmu_get_alp_clock(cc);
0289
0290 return 20000000;
0291 }
0292
0293 static u32 ssb_chipco_watchdog_get_max_timer(struct ssb_chipcommon *cc)
0294 {
0295 u32 nb;
0296
0297 if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
0298 if (cc->dev->id.revision < 26)
0299 nb = 16;
0300 else
0301 nb = (cc->dev->id.revision >= 37) ? 32 : 24;
0302 } else {
0303 nb = 28;
0304 }
0305 if (nb == 32)
0306 return 0xffffffff;
0307 else
0308 return (1 << nb) - 1;
0309 }
0310
0311 u32 ssb_chipco_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks)
0312 {
0313 struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt);
0314
0315 if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB)
0316 return 0;
0317
0318 return ssb_chipco_watchdog_timer_set(cc, ticks);
0319 }
0320
0321 u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms)
0322 {
0323 struct ssb_chipcommon *cc = bcm47xx_wdt_get_drvdata(wdt);
0324 u32 ticks;
0325
0326 if (cc->dev->bus->bustype != SSB_BUSTYPE_SSB)
0327 return 0;
0328
0329 ticks = ssb_chipco_watchdog_timer_set(cc, cc->ticks_per_ms * ms);
0330 return ticks / cc->ticks_per_ms;
0331 }
0332
0333 static int ssb_chipco_watchdog_ticks_per_ms(struct ssb_chipcommon *cc)
0334 {
0335 struct ssb_bus *bus = cc->dev->bus;
0336
0337 if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
0338
0339 return 32;
0340 } else {
0341 if (cc->dev->id.revision < 18)
0342 return ssb_clockspeed(bus) / 1000;
0343 else
0344 return ssb_chipco_alp_clock(cc) / 1000;
0345 }
0346 }
0347
0348 void ssb_chipcommon_init(struct ssb_chipcommon *cc)
0349 {
0350 if (!cc->dev)
0351 return;
0352
0353 spin_lock_init(&cc->gpio_lock);
0354
0355 if (cc->dev->id.revision >= 11)
0356 cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT);
0357 dev_dbg(cc->dev->dev, "chipcommon status is 0x%x\n", cc->status);
0358
0359 if (cc->dev->id.revision >= 20) {
0360 chipco_write32(cc, SSB_CHIPCO_GPIOPULLUP, 0);
0361 chipco_write32(cc, SSB_CHIPCO_GPIOPULLDOWN, 0);
0362 }
0363
0364 ssb_pmu_init(cc);
0365 chipco_powercontrol_init(cc);
0366 ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
0367 calc_fast_powerup_delay(cc);
0368
0369 if (cc->dev->bus->bustype == SSB_BUSTYPE_SSB) {
0370 cc->ticks_per_ms = ssb_chipco_watchdog_ticks_per_ms(cc);
0371 cc->max_timer_ms = ssb_chipco_watchdog_get_max_timer(cc) / cc->ticks_per_ms;
0372 }
0373 }
0374
0375 void ssb_chipco_suspend(struct ssb_chipcommon *cc)
0376 {
0377 if (!cc->dev)
0378 return;
0379 ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW);
0380 }
0381
0382 void ssb_chipco_resume(struct ssb_chipcommon *cc)
0383 {
0384 if (!cc->dev)
0385 return;
0386 chipco_powercontrol_init(cc);
0387 ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST);
0388 }
0389
0390
0391 void ssb_chipco_get_clockcpu(struct ssb_chipcommon *cc,
0392 u32 *plltype, u32 *n, u32 *m)
0393 {
0394 *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
0395 *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
0396 switch (*plltype) {
0397 case SSB_PLLTYPE_2:
0398 case SSB_PLLTYPE_4:
0399 case SSB_PLLTYPE_6:
0400 case SSB_PLLTYPE_7:
0401 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_MIPS);
0402 break;
0403 case SSB_PLLTYPE_3:
0404
0405 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_M2);
0406 break;
0407 default:
0408 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_SB);
0409 break;
0410 }
0411 }
0412
0413
0414 void ssb_chipco_get_clockcontrol(struct ssb_chipcommon *cc,
0415 u32 *plltype, u32 *n, u32 *m)
0416 {
0417 *n = chipco_read32(cc, SSB_CHIPCO_CLOCK_N);
0418 *plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
0419 switch (*plltype) {
0420 case SSB_PLLTYPE_6:
0421 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_MIPS);
0422 break;
0423 case SSB_PLLTYPE_3:
0424 if (cc->dev->bus->chip_id != 0x5365) {
0425 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_M2);
0426 break;
0427 }
0428 fallthrough;
0429 default:
0430 *m = chipco_read32(cc, SSB_CHIPCO_CLOCK_SB);
0431 }
0432 }
0433
0434 void ssb_chipco_timing_init(struct ssb_chipcommon *cc,
0435 unsigned long ns)
0436 {
0437 struct ssb_device *dev = cc->dev;
0438 struct ssb_bus *bus = dev->bus;
0439 u32 tmp;
0440
0441
0442 chipco_write32(cc, SSB_CHIPCO_PROG_CFG, 0x11);
0443 tmp = DIV_ROUND_UP(10, ns) << SSB_PROG_WCNT_3_SHIFT;
0444 tmp |= DIV_ROUND_UP(40, ns) << SSB_PROG_WCNT_1_SHIFT;
0445 tmp |= DIV_ROUND_UP(240, ns);
0446 chipco_write32(cc, SSB_CHIPCO_PROG_WAITCNT, tmp);
0447
0448
0449 tmp = DIV_ROUND_UP(10, ns) << SSB_FLASH_WCNT_3_SHIFT;
0450 tmp |= DIV_ROUND_UP(10, ns) << SSB_FLASH_WCNT_1_SHIFT;
0451 tmp |= DIV_ROUND_UP(120, ns);
0452 if ((bus->chip_id == 0x5365) ||
0453 (dev->id.revision < 9))
0454 chipco_write32(cc, SSB_CHIPCO_FLASH_WAITCNT, tmp);
0455 if ((bus->chip_id == 0x5365) ||
0456 (dev->id.revision < 9) ||
0457 ((bus->chip_id == 0x5350) && (bus->chip_rev == 0)))
0458 chipco_write32(cc, SSB_CHIPCO_PCMCIA_MEMWAIT, tmp);
0459
0460 if (bus->chip_id == 0x5350) {
0461
0462 tmp = DIV_ROUND_UP(10, ns) << SSB_PROG_WCNT_3_SHIFT;
0463 tmp |= DIV_ROUND_UP(20, ns) << SSB_PROG_WCNT_2_SHIFT;
0464 tmp |= DIV_ROUND_UP(100, ns) << SSB_PROG_WCNT_1_SHIFT;
0465 tmp |= DIV_ROUND_UP(120, ns);
0466 chipco_write32(cc, SSB_CHIPCO_PROG_WAITCNT, tmp);
0467 }
0468 }
0469
0470
0471 u32 ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
0472 {
0473 u32 maxt;
0474 enum ssb_clkmode clkmode;
0475
0476 maxt = ssb_chipco_watchdog_get_max_timer(cc);
0477 if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
0478 if (ticks == 1)
0479 ticks = 2;
0480 else if (ticks > maxt)
0481 ticks = maxt;
0482 chipco_write32(cc, SSB_CHIPCO_PMU_WATCHDOG, ticks);
0483 } else {
0484 clkmode = ticks ? SSB_CLKMODE_FAST : SSB_CLKMODE_DYNAMIC;
0485 ssb_chipco_set_clockmode(cc, clkmode);
0486 if (ticks > maxt)
0487 ticks = maxt;
0488
0489 chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
0490 }
0491 return ticks;
0492 }
0493
0494 void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value)
0495 {
0496 chipco_write32_masked(cc, SSB_CHIPCO_IRQMASK, mask, value);
0497 }
0498
0499 u32 ssb_chipco_irq_status(struct ssb_chipcommon *cc, u32 mask)
0500 {
0501 return chipco_read32(cc, SSB_CHIPCO_IRQSTAT) & mask;
0502 }
0503
0504 u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask)
0505 {
0506 return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask;
0507 }
0508
0509 u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
0510 {
0511 unsigned long flags;
0512 u32 res = 0;
0513
0514 spin_lock_irqsave(&cc->gpio_lock, flags);
0515 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
0516 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0517
0518 return res;
0519 }
0520
0521 u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
0522 {
0523 unsigned long flags;
0524 u32 res = 0;
0525
0526 spin_lock_irqsave(&cc->gpio_lock, flags);
0527 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
0528 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0529
0530 return res;
0531 }
0532
0533 u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value)
0534 {
0535 unsigned long flags;
0536 u32 res = 0;
0537
0538 spin_lock_irqsave(&cc->gpio_lock, flags);
0539 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value);
0540 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0541
0542 return res;
0543 }
0544 EXPORT_SYMBOL(ssb_chipco_gpio_control);
0545
0546 u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value)
0547 {
0548 unsigned long flags;
0549 u32 res = 0;
0550
0551 spin_lock_irqsave(&cc->gpio_lock, flags);
0552 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value);
0553 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0554
0555 return res;
0556 }
0557
0558 u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value)
0559 {
0560 unsigned long flags;
0561 u32 res = 0;
0562
0563 spin_lock_irqsave(&cc->gpio_lock, flags);
0564 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value);
0565 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0566
0567 return res;
0568 }
0569
0570 u32 ssb_chipco_gpio_pullup(struct ssb_chipcommon *cc, u32 mask, u32 value)
0571 {
0572 unsigned long flags;
0573 u32 res = 0;
0574
0575 if (cc->dev->id.revision < 20)
0576 return 0xffffffff;
0577
0578 spin_lock_irqsave(&cc->gpio_lock, flags);
0579 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPULLUP, mask, value);
0580 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0581
0582 return res;
0583 }
0584
0585 u32 ssb_chipco_gpio_pulldown(struct ssb_chipcommon *cc, u32 mask, u32 value)
0586 {
0587 unsigned long flags;
0588 u32 res = 0;
0589
0590 if (cc->dev->id.revision < 20)
0591 return 0xffffffff;
0592
0593 spin_lock_irqsave(&cc->gpio_lock, flags);
0594 res = chipco_write32_masked(cc, SSB_CHIPCO_GPIOPULLDOWN, mask, value);
0595 spin_unlock_irqrestore(&cc->gpio_lock, flags);
0596
0597 return res;
0598 }
0599
0600 #ifdef CONFIG_SSB_SERIAL
0601 int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
0602 struct ssb_serial_port *ports)
0603 {
0604 struct ssb_bus *bus = cc->dev->bus;
0605 int nr_ports = 0;
0606 u32 plltype;
0607 unsigned int irq;
0608 u32 baud_base, div;
0609 u32 i, n;
0610 unsigned int ccrev = cc->dev->id.revision;
0611
0612 plltype = (cc->capabilities & SSB_CHIPCO_CAP_PLLT);
0613 irq = ssb_mips_irq(cc->dev);
0614
0615 if (plltype == SSB_PLLTYPE_1) {
0616
0617 baud_base = ssb_calc_clock_rate(plltype,
0618 chipco_read32(cc, SSB_CHIPCO_CLOCK_N),
0619 chipco_read32(cc, SSB_CHIPCO_CLOCK_M2));
0620 div = 1;
0621 } else {
0622 if (ccrev == 20) {
0623
0624 baud_base = 25000000;
0625 div = 48;
0626
0627 chipco_write32(cc, SSB_CHIPCO_CORECTL,
0628 chipco_read32(cc, SSB_CHIPCO_CORECTL)
0629 | SSB_CHIPCO_CORECTL_UARTCLK0);
0630 } else if ((ccrev >= 11) && (ccrev != 15)) {
0631 baud_base = ssb_chipco_alp_clock(cc);
0632 div = 1;
0633 if (ccrev >= 21) {
0634
0635 chipco_write32(cc, SSB_CHIPCO_CORECTL,
0636 chipco_read32(cc, SSB_CHIPCO_CORECTL)
0637 & ~SSB_CHIPCO_CORECTL_UARTCLKEN);
0638 }
0639
0640 chipco_write32(cc, SSB_CHIPCO_CORECTL,
0641 chipco_read32(cc, SSB_CHIPCO_CORECTL)
0642 | SSB_CHIPCO_CORECTL_UARTCLK0);
0643 if (ccrev >= 21) {
0644
0645 chipco_write32(cc, SSB_CHIPCO_CORECTL,
0646 chipco_read32(cc, SSB_CHIPCO_CORECTL)
0647 | SSB_CHIPCO_CORECTL_UARTCLKEN);
0648 }
0649 } else if (ccrev >= 3) {
0650
0651 baud_base = ssb_clockspeed(bus);
0652 div = chipco_read32(cc, SSB_CHIPCO_CLKDIV)
0653 & SSB_CHIPCO_CLKDIV_UART;
0654 } else {
0655
0656 baud_base = 88000000;
0657 div = 48;
0658 }
0659
0660
0661 if ((ccrev > 0) &&
0662 !(chipco_read32(cc, SSB_CHIPCO_CORECTL) & SSB_CHIPCO_CORECTL_UARTCLK0)) {
0663 if ((cc->capabilities & SSB_CHIPCO_CAP_UARTCLK) ==
0664 SSB_CHIPCO_CAP_UARTCLK_INT) {
0665
0666 baud_base /= div;
0667 } else {
0668
0669 baud_base = 1843200;
0670 }
0671 }
0672 }
0673
0674
0675 n = (cc->capabilities & SSB_CHIPCO_CAP_NRUART);
0676 for (i = 0; i < n; i++) {
0677 void __iomem *cc_mmio;
0678 void __iomem *uart_regs;
0679
0680 cc_mmio = cc->dev->bus->mmio + (cc->dev->core_index * SSB_CORE_SIZE);
0681 uart_regs = cc_mmio + SSB_CHIPCO_UART0_DATA;
0682
0683 if (ccrev == 0)
0684 uart_regs += (i * 8);
0685 else
0686 uart_regs += (i * 256);
0687
0688 nr_ports++;
0689 ports[i].regs = uart_regs;
0690 ports[i].irq = irq;
0691 ports[i].baud_base = baud_base;
0692 ports[i].reg_shift = 0;
0693 }
0694
0695 return nr_ports;
0696 }
0697 #endif