0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #include <linux/clk.h>
0014 #include <linux/export.h>
0015 #include <linux/init.h>
0016 #include <linux/io.h>
0017 #include <linux/spinlock.h>
0018 #include <linux/syscore_ops.h>
0019 #include <asm/cpu.h>
0020 #include <asm/mach-au1x00/au1000.h>
0021
0022
0023 #define AU1000_OHCICFG 0x7fffc
0024 #define AU1550_OHCICFG 0x07ffc
0025 #define AU1200_USBCFG 0x04
0026
0027
0028 #define USBHEN_RD (1 << 4)
0029 #define USBHEN_CE (1 << 3)
0030 #define USBHEN_E (1 << 2)
0031 #define USBHEN_C (1 << 1)
0032 #define USBHEN_BE (1 << 0)
0033
0034
0035 #define USBCFG_PFEN (1 << 31)
0036 #define USBCFG_RDCOMB (1 << 30)
0037 #define USBCFG_UNKNOWN (5 << 20)
0038 #define USBCFG_SSD (1 << 23)
0039 #define USBCFG_PPE (1 << 19)
0040 #define USBCFG_UCE (1 << 18)
0041 #define USBCFG_ECE (1 << 17)
0042 #define USBCFG_OCE (1 << 16)
0043 #define USBCFG_FLA(x) (((x) & 0x3f) << 8)
0044 #define USBCFG_UCAM (1 << 7)
0045 #define USBCFG_GME (1 << 6)
0046 #define USBCFG_DBE (1 << 5)
0047 #define USBCFG_DME (1 << 4)
0048 #define USBCFG_EBE (1 << 3)
0049 #define USBCFG_EME (1 << 2)
0050 #define USBCFG_OBE (1 << 1)
0051 #define USBCFG_OME (1 << 0)
0052 #define USBCFG_INIT_AU1200 (USBCFG_PFEN | USBCFG_RDCOMB | USBCFG_UNKNOWN |\
0053 USBCFG_SSD | USBCFG_FLA(0x20) | USBCFG_UCAM | \
0054 USBCFG_GME | USBCFG_DBE | USBCFG_DME | \
0055 USBCFG_EBE | USBCFG_EME | USBCFG_OBE | \
0056 USBCFG_OME)
0057
0058
0059 #define USB_DWC_CTRL1 0x00
0060 #define USB_DWC_CTRL2 0x04
0061 #define USB_VBUS_TIMER 0x10
0062 #define USB_SBUS_CTRL 0x14
0063 #define USB_MSR_ERR 0x18
0064 #define USB_DWC_CTRL3 0x1C
0065 #define USB_DWC_CTRL4 0x20
0066 #define USB_OTG_STATUS 0x28
0067 #define USB_DWC_CTRL5 0x2C
0068 #define USB_DWC_CTRL6 0x30
0069 #define USB_DWC_CTRL7 0x34
0070 #define USB_PHY_STATUS 0xC0
0071 #define USB_INT_STATUS 0xC4
0072 #define USB_INT_ENABLE 0xC8
0073
0074 #define USB_DWC_CTRL1_OTGD 0x04
0075 #define USB_DWC_CTRL1_HSTRS 0x02
0076 #define USB_DWC_CTRL1_DCRS 0x01
0077
0078 #define USB_DWC_CTRL2_PHY1RS 0x04
0079 #define USB_DWC_CTRL2_PHY0RS 0x02
0080 #define USB_DWC_CTRL2_PHYRS 0x01
0081
0082 #define USB_DWC_CTRL3_OHCI1_CKEN (1 << 19)
0083 #define USB_DWC_CTRL3_OHCI0_CKEN (1 << 18)
0084 #define USB_DWC_CTRL3_EHCI0_CKEN (1 << 17)
0085 #define USB_DWC_CTRL3_OTG0_CKEN (1 << 16)
0086
0087 #define USB_SBUS_CTRL_SBCA 0x04
0088
0089 #define USB_INTEN_FORCE 0x20
0090 #define USB_INTEN_PHY 0x10
0091 #define USB_INTEN_UDC 0x08
0092 #define USB_INTEN_EHCI 0x04
0093 #define USB_INTEN_OHCI1 0x02
0094 #define USB_INTEN_OHCI0 0x01
0095
0096 static DEFINE_SPINLOCK(alchemy_usb_lock);
0097
0098 static inline void __au1300_usb_phyctl(void __iomem *base, int enable)
0099 {
0100 unsigned long r, s;
0101
0102 r = __raw_readl(base + USB_DWC_CTRL2);
0103 s = __raw_readl(base + USB_DWC_CTRL3);
0104
0105 s &= USB_DWC_CTRL3_OHCI1_CKEN | USB_DWC_CTRL3_OHCI0_CKEN |
0106 USB_DWC_CTRL3_EHCI0_CKEN | USB_DWC_CTRL3_OTG0_CKEN;
0107
0108 if (enable) {
0109
0110 r |= USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
0111 USB_DWC_CTRL2_PHYRS;
0112 __raw_writel(r, base + USB_DWC_CTRL2);
0113 wmb();
0114 } else if (!s) {
0115
0116 r &= ~(USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
0117 USB_DWC_CTRL2_PHYRS);
0118 __raw_writel(r, base + USB_DWC_CTRL2);
0119 wmb();
0120 }
0121 }
0122
0123 static inline void __au1300_ohci_control(void __iomem *base, int enable, int id)
0124 {
0125 unsigned long r;
0126
0127 if (enable) {
0128 __raw_writel(1, base + USB_DWC_CTRL7);
0129 wmb();
0130
0131 r = __raw_readl(base + USB_DWC_CTRL3);
0132 r |= (id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
0133 : USB_DWC_CTRL3_OHCI1_CKEN;
0134 __raw_writel(r, base + USB_DWC_CTRL3);
0135 wmb();
0136
0137 __au1300_usb_phyctl(base, enable);
0138
0139 r = __raw_readl(base + USB_INT_ENABLE);
0140 r |= (id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1;
0141 __raw_writel(r, base + USB_INT_ENABLE);
0142 wmb();
0143
0144
0145 __raw_writel(0, base + USB_DWC_CTRL7);
0146 wmb();
0147 } else {
0148 r = __raw_readl(base + USB_INT_ENABLE);
0149 r &= ~((id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1);
0150 __raw_writel(r, base + USB_INT_ENABLE);
0151 wmb();
0152
0153 r = __raw_readl(base + USB_DWC_CTRL3);
0154 r &= ~((id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
0155 : USB_DWC_CTRL3_OHCI1_CKEN);
0156 __raw_writel(r, base + USB_DWC_CTRL3);
0157 wmb();
0158
0159 __au1300_usb_phyctl(base, enable);
0160 }
0161 }
0162
0163 static inline void __au1300_ehci_control(void __iomem *base, int enable)
0164 {
0165 unsigned long r;
0166
0167 if (enable) {
0168 r = __raw_readl(base + USB_DWC_CTRL3);
0169 r |= USB_DWC_CTRL3_EHCI0_CKEN;
0170 __raw_writel(r, base + USB_DWC_CTRL3);
0171 wmb();
0172
0173 r = __raw_readl(base + USB_DWC_CTRL1);
0174 r |= USB_DWC_CTRL1_HSTRS;
0175 __raw_writel(r, base + USB_DWC_CTRL1);
0176 wmb();
0177
0178 __au1300_usb_phyctl(base, enable);
0179
0180 r = __raw_readl(base + USB_INT_ENABLE);
0181 r |= USB_INTEN_EHCI;
0182 __raw_writel(r, base + USB_INT_ENABLE);
0183 wmb();
0184 } else {
0185 r = __raw_readl(base + USB_INT_ENABLE);
0186 r &= ~USB_INTEN_EHCI;
0187 __raw_writel(r, base + USB_INT_ENABLE);
0188 wmb();
0189
0190 r = __raw_readl(base + USB_DWC_CTRL1);
0191 r &= ~USB_DWC_CTRL1_HSTRS;
0192 __raw_writel(r, base + USB_DWC_CTRL1);
0193 wmb();
0194
0195 r = __raw_readl(base + USB_DWC_CTRL3);
0196 r &= ~USB_DWC_CTRL3_EHCI0_CKEN;
0197 __raw_writel(r, base + USB_DWC_CTRL3);
0198 wmb();
0199
0200 __au1300_usb_phyctl(base, enable);
0201 }
0202 }
0203
0204 static inline void __au1300_udc_control(void __iomem *base, int enable)
0205 {
0206 unsigned long r;
0207
0208 if (enable) {
0209 r = __raw_readl(base + USB_DWC_CTRL1);
0210 r |= USB_DWC_CTRL1_DCRS;
0211 __raw_writel(r, base + USB_DWC_CTRL1);
0212 wmb();
0213
0214 __au1300_usb_phyctl(base, enable);
0215
0216 r = __raw_readl(base + USB_INT_ENABLE);
0217 r |= USB_INTEN_UDC;
0218 __raw_writel(r, base + USB_INT_ENABLE);
0219 wmb();
0220 } else {
0221 r = __raw_readl(base + USB_INT_ENABLE);
0222 r &= ~USB_INTEN_UDC;
0223 __raw_writel(r, base + USB_INT_ENABLE);
0224 wmb();
0225
0226 r = __raw_readl(base + USB_DWC_CTRL1);
0227 r &= ~USB_DWC_CTRL1_DCRS;
0228 __raw_writel(r, base + USB_DWC_CTRL1);
0229 wmb();
0230
0231 __au1300_usb_phyctl(base, enable);
0232 }
0233 }
0234
0235 static inline void __au1300_otg_control(void __iomem *base, int enable)
0236 {
0237 unsigned long r;
0238 if (enable) {
0239 r = __raw_readl(base + USB_DWC_CTRL3);
0240 r |= USB_DWC_CTRL3_OTG0_CKEN;
0241 __raw_writel(r, base + USB_DWC_CTRL3);
0242 wmb();
0243
0244 r = __raw_readl(base + USB_DWC_CTRL1);
0245 r &= ~USB_DWC_CTRL1_OTGD;
0246 __raw_writel(r, base + USB_DWC_CTRL1);
0247 wmb();
0248
0249 __au1300_usb_phyctl(base, enable);
0250 } else {
0251 r = __raw_readl(base + USB_DWC_CTRL1);
0252 r |= USB_DWC_CTRL1_OTGD;
0253 __raw_writel(r, base + USB_DWC_CTRL1);
0254 wmb();
0255
0256 r = __raw_readl(base + USB_DWC_CTRL3);
0257 r &= ~USB_DWC_CTRL3_OTG0_CKEN;
0258 __raw_writel(r, base + USB_DWC_CTRL3);
0259 wmb();
0260
0261 __au1300_usb_phyctl(base, enable);
0262 }
0263 }
0264
0265 static inline int au1300_usb_control(int block, int enable)
0266 {
0267 void __iomem *base =
0268 (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
0269 int ret = 0;
0270
0271 switch (block) {
0272 case ALCHEMY_USB_OHCI0:
0273 __au1300_ohci_control(base, enable, 0);
0274 break;
0275 case ALCHEMY_USB_OHCI1:
0276 __au1300_ohci_control(base, enable, 1);
0277 break;
0278 case ALCHEMY_USB_EHCI0:
0279 __au1300_ehci_control(base, enable);
0280 break;
0281 case ALCHEMY_USB_UDC0:
0282 __au1300_udc_control(base, enable);
0283 break;
0284 case ALCHEMY_USB_OTG0:
0285 __au1300_otg_control(base, enable);
0286 break;
0287 default:
0288 ret = -ENODEV;
0289 }
0290 return ret;
0291 }
0292
0293 static inline void au1300_usb_init(void)
0294 {
0295 void __iomem *base =
0296 (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
0297
0298
0299
0300
0301
0302
0303 __raw_writel(0, base + USB_INT_ENABLE);
0304 wmb();
0305 __raw_writel(0, base + USB_DWC_CTRL3);
0306 wmb();
0307 __raw_writel(~0, base + USB_MSR_ERR);
0308 wmb();
0309 __raw_writel(~0, base + USB_INT_STATUS);
0310 wmb();
0311
0312 __raw_writel(USB_SBUS_CTRL_SBCA, base + USB_SBUS_CTRL);
0313 wmb();
0314 }
0315
0316 static inline void __au1200_ohci_control(void __iomem *base, int enable)
0317 {
0318 unsigned long r = __raw_readl(base + AU1200_USBCFG);
0319 if (enable) {
0320 __raw_writel(r | USBCFG_OCE, base + AU1200_USBCFG);
0321 wmb();
0322 udelay(2000);
0323 } else {
0324 __raw_writel(r & ~USBCFG_OCE, base + AU1200_USBCFG);
0325 wmb();
0326 udelay(1000);
0327 }
0328 }
0329
0330 static inline void __au1200_ehci_control(void __iomem *base, int enable)
0331 {
0332 unsigned long r = __raw_readl(base + AU1200_USBCFG);
0333 if (enable) {
0334 __raw_writel(r | USBCFG_ECE | USBCFG_PPE, base + AU1200_USBCFG);
0335 wmb();
0336 udelay(1000);
0337 } else {
0338 if (!(r & USBCFG_UCE))
0339 r &= ~USBCFG_PPE;
0340 __raw_writel(r & ~USBCFG_ECE, base + AU1200_USBCFG);
0341 wmb();
0342 udelay(1000);
0343 }
0344 }
0345
0346 static inline void __au1200_udc_control(void __iomem *base, int enable)
0347 {
0348 unsigned long r = __raw_readl(base + AU1200_USBCFG);
0349 if (enable) {
0350 __raw_writel(r | USBCFG_UCE | USBCFG_PPE, base + AU1200_USBCFG);
0351 wmb();
0352 } else {
0353 if (!(r & USBCFG_ECE))
0354 r &= ~USBCFG_PPE;
0355 __raw_writel(r & ~USBCFG_UCE, base + AU1200_USBCFG);
0356 wmb();
0357 }
0358 }
0359
0360 static inline int au1200_usb_control(int block, int enable)
0361 {
0362 void __iomem *base =
0363 (void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR);
0364
0365 switch (block) {
0366 case ALCHEMY_USB_OHCI0:
0367 __au1200_ohci_control(base, enable);
0368 break;
0369 case ALCHEMY_USB_UDC0:
0370 __au1200_udc_control(base, enable);
0371 break;
0372 case ALCHEMY_USB_EHCI0:
0373 __au1200_ehci_control(base, enable);
0374 break;
0375 default:
0376 return -ENODEV;
0377 }
0378 return 0;
0379 }
0380
0381
0382
0383 static inline void au1200_usb_init(void)
0384 {
0385 void __iomem *base =
0386 (void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR);
0387 __raw_writel(USBCFG_INIT_AU1200, base + AU1200_USBCFG);
0388 wmb();
0389 udelay(1000);
0390 }
0391
0392 static inline int au1000_usb_init(unsigned long rb, int reg)
0393 {
0394 void __iomem *base = (void __iomem *)KSEG1ADDR(rb + reg);
0395 unsigned long r = __raw_readl(base);
0396 struct clk *c;
0397
0398
0399 c = clk_get(NULL, "usbh_clk");
0400 if (IS_ERR(c))
0401 return -ENODEV;
0402 if (clk_round_rate(c, 48000000) != 48000000) {
0403 clk_put(c);
0404 return -ENODEV;
0405 }
0406 if (clk_set_rate(c, 48000000)) {
0407 clk_put(c);
0408 return -ENODEV;
0409 }
0410 clk_put(c);
0411
0412 #if defined(__BIG_ENDIAN)
0413 r |= USBHEN_BE;
0414 #endif
0415 r |= USBHEN_C;
0416
0417 __raw_writel(r, base);
0418 wmb();
0419 udelay(1000);
0420
0421 return 0;
0422 }
0423
0424
0425 static inline void __au1xx0_ohci_control(int enable, unsigned long rb, int creg)
0426 {
0427 void __iomem *base = (void __iomem *)KSEG1ADDR(rb);
0428 unsigned long r = __raw_readl(base + creg);
0429 struct clk *c = clk_get(NULL, "usbh_clk");
0430
0431 if (IS_ERR(c))
0432 return;
0433
0434 if (enable) {
0435 if (clk_prepare_enable(c))
0436 goto out;
0437
0438 __raw_writel(r | USBHEN_CE, base + creg);
0439 wmb();
0440 udelay(1000);
0441 __raw_writel(r | USBHEN_CE | USBHEN_E, base + creg);
0442 wmb();
0443 udelay(1000);
0444
0445
0446 while (__raw_readl(base + creg),
0447 !(__raw_readl(base + creg) & USBHEN_RD))
0448 udelay(1000);
0449 } else {
0450 __raw_writel(r & ~(USBHEN_CE | USBHEN_E), base + creg);
0451 wmb();
0452 clk_disable_unprepare(c);
0453 }
0454 out:
0455 clk_put(c);
0456 }
0457
0458 static inline int au1000_usb_control(int block, int enable, unsigned long rb,
0459 int creg)
0460 {
0461 int ret = 0;
0462
0463 switch (block) {
0464 case ALCHEMY_USB_OHCI0:
0465 __au1xx0_ohci_control(enable, rb, creg);
0466 break;
0467 default:
0468 ret = -ENODEV;
0469 }
0470 return ret;
0471 }
0472
0473
0474
0475
0476
0477
0478 int alchemy_usb_control(int block, int enable)
0479 {
0480 unsigned long flags;
0481 int ret;
0482
0483 spin_lock_irqsave(&alchemy_usb_lock, flags);
0484 switch (alchemy_get_cputype()) {
0485 case ALCHEMY_CPU_AU1000:
0486 case ALCHEMY_CPU_AU1500:
0487 case ALCHEMY_CPU_AU1100:
0488 ret = au1000_usb_control(block, enable,
0489 AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG);
0490 break;
0491 case ALCHEMY_CPU_AU1550:
0492 ret = au1000_usb_control(block, enable,
0493 AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG);
0494 break;
0495 case ALCHEMY_CPU_AU1200:
0496 ret = au1200_usb_control(block, enable);
0497 break;
0498 case ALCHEMY_CPU_AU1300:
0499 ret = au1300_usb_control(block, enable);
0500 break;
0501 default:
0502 ret = -ENODEV;
0503 }
0504 spin_unlock_irqrestore(&alchemy_usb_lock, flags);
0505 return ret;
0506 }
0507 EXPORT_SYMBOL_GPL(alchemy_usb_control);
0508
0509
0510 static unsigned long alchemy_usb_pmdata[2];
0511
0512 static void au1000_usb_pm(unsigned long br, int creg, int susp)
0513 {
0514 void __iomem *base = (void __iomem *)KSEG1ADDR(br);
0515
0516 if (susp) {
0517 alchemy_usb_pmdata[0] = __raw_readl(base + creg);
0518
0519 __raw_writel(0, base + 0x04);
0520 wmb();
0521 __raw_writel(0, base + creg);
0522 wmb();
0523 } else {
0524 __raw_writel(alchemy_usb_pmdata[0], base + creg);
0525 wmb();
0526 }
0527 }
0528
0529 static void au1200_usb_pm(int susp)
0530 {
0531 void __iomem *base =
0532 (void __iomem *)KSEG1ADDR(AU1200_USB_OTG_PHYS_ADDR);
0533 if (susp) {
0534
0535
0536 alchemy_usb_pmdata[0] = __raw_readl(base + 0x00);
0537 alchemy_usb_pmdata[1] = __raw_readl(base + 0x04);
0538 } else {
0539
0540 au1200_usb_init();
0541
0542
0543 __raw_writel(alchemy_usb_pmdata[0], base + 0x00);
0544 __raw_writel(alchemy_usb_pmdata[1], base + 0x04);
0545 wmb();
0546 }
0547 }
0548
0549 static void au1300_usb_pm(int susp)
0550 {
0551 void __iomem *base =
0552 (void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
0553
0554 if (susp) {
0555 alchemy_usb_pmdata[0] = __raw_readl(base + USB_DWC_CTRL4);
0556 } else {
0557 au1300_usb_init();
0558 __raw_writel(alchemy_usb_pmdata[0], base + USB_DWC_CTRL4);
0559 wmb();
0560 }
0561 }
0562
0563 static void alchemy_usb_pm(int susp)
0564 {
0565 switch (alchemy_get_cputype()) {
0566 case ALCHEMY_CPU_AU1000:
0567 case ALCHEMY_CPU_AU1500:
0568 case ALCHEMY_CPU_AU1100:
0569 au1000_usb_pm(AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG, susp);
0570 break;
0571 case ALCHEMY_CPU_AU1550:
0572 au1000_usb_pm(AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG, susp);
0573 break;
0574 case ALCHEMY_CPU_AU1200:
0575 au1200_usb_pm(susp);
0576 break;
0577 case ALCHEMY_CPU_AU1300:
0578 au1300_usb_pm(susp);
0579 break;
0580 }
0581 }
0582
0583 static int alchemy_usb_suspend(void)
0584 {
0585 alchemy_usb_pm(1);
0586 return 0;
0587 }
0588
0589 static void alchemy_usb_resume(void)
0590 {
0591 alchemy_usb_pm(0);
0592 }
0593
0594 static struct syscore_ops alchemy_usb_pm_ops = {
0595 .suspend = alchemy_usb_suspend,
0596 .resume = alchemy_usb_resume,
0597 };
0598
0599 static int __init alchemy_usb_init(void)
0600 {
0601 int ret = 0;
0602
0603 switch (alchemy_get_cputype()) {
0604 case ALCHEMY_CPU_AU1000:
0605 case ALCHEMY_CPU_AU1500:
0606 case ALCHEMY_CPU_AU1100:
0607 ret = au1000_usb_init(AU1000_USB_OHCI_PHYS_ADDR,
0608 AU1000_OHCICFG);
0609 break;
0610 case ALCHEMY_CPU_AU1550:
0611 ret = au1000_usb_init(AU1550_USB_OHCI_PHYS_ADDR,
0612 AU1550_OHCICFG);
0613 break;
0614 case ALCHEMY_CPU_AU1200:
0615 au1200_usb_init();
0616 break;
0617 case ALCHEMY_CPU_AU1300:
0618 au1300_usb_init();
0619 break;
0620 }
0621
0622 if (!ret)
0623 register_syscore_ops(&alchemy_usb_pm_ops);
0624
0625 return ret;
0626 }
0627 arch_initcall(alchemy_usb_init);