.. | .. |
---|
590 | 590 | } |
---|
591 | 591 | #endif /* CONFIG_DEBUG_FS */ |
---|
592 | 592 | |
---|
593 | | -static inline int sunxi_get_ic_version(struct device *dev, char *version) |
---|
594 | | -{ |
---|
595 | | -#define SYS_CFG_BASE 0x03000000 |
---|
596 | | -#define VER_REG_OFFS 0x00000024 |
---|
597 | | - void __iomem *io = NULL; |
---|
598 | | - static char ver = 0xff; |
---|
599 | | - /* IC version: |
---|
600 | | - * A/B/C: 0 |
---|
601 | | - * D: 3 |
---|
602 | | - * E: 4 |
---|
603 | | - * F: 5 |
---|
604 | | - * 6/7/1/2 to be used in future. |
---|
605 | | - */ |
---|
606 | | - *version = 0; |
---|
607 | | - if (ver == 0xff) { |
---|
608 | | - io = ioremap(SYS_CFG_BASE, 0x100); |
---|
609 | | - if (io == NULL) { |
---|
610 | | - dev_err(dev, "ioremap of sys_cfg register failed!\n"); |
---|
611 | | - return -1; |
---|
612 | | - } |
---|
613 | | - *version = (char)(readl(io + VER_REG_OFFS) & 0x7); |
---|
614 | | - iounmap(io); |
---|
615 | | - ver = *version; |
---|
616 | | - } else { |
---|
617 | | - *version = ver; |
---|
618 | | - } |
---|
619 | | - return 0; |
---|
620 | | -} |
---|
621 | | - |
---|
622 | | -bool sunxi_ic_version_ctrl(struct device *dev) |
---|
623 | | -{ |
---|
624 | | - char ic_version = 0; |
---|
625 | | - sunxi_get_ic_version(dev, &ic_version); |
---|
626 | | - /* |
---|
627 | | - * The flow of jtag reset before gpu reset will cause MIPS crash, so we |
---|
628 | | - * will put the domainA, domainB and gpu reset operations to boot0 stage. |
---|
629 | | - * And in kernel stage, we will always keep domainA poweron. |
---|
630 | | - */ |
---|
631 | | - if (ic_version == 0 || ic_version == 3 || ic_version == 4 || ic_version == 5) |
---|
632 | | - return false; |
---|
633 | | - return true; |
---|
634 | | -} |
---|
635 | | - |
---|
636 | | - |
---|
637 | 593 | int sunxi_platform_init(struct device *dev) |
---|
638 | 594 | { |
---|
639 | 595 | #if defined(CONFIG_OF) |
---|
.. | .. |
---|
641 | 597 | struct platform_device *pdev = to_platform_device(dev); |
---|
642 | 598 | #endif /* defined(CONFIG_OF) */ |
---|
643 | 599 | unsigned int val, volt_val = 0; |
---|
644 | | - char ic_version = 0; |
---|
| 600 | + |
---|
645 | 601 | sunxi_data = (struct sunxi_platform *)kzalloc(sizeof(struct sunxi_platform), GFP_KERNEL); |
---|
646 | 602 | if (!sunxi_data) { |
---|
647 | 603 | dev_err(dev, "failed to get kzalloc sunxi_platform"); |
---|
.. | .. |
---|
678 | 634 | sunxi_data->power_idle = 1; |
---|
679 | 635 | sunxi_data->dvfs = 1; |
---|
680 | 636 | sunxi_data->independent_power = 0; |
---|
681 | | - sunxi_data->soft_mode = 0; |
---|
| 637 | + sunxi_data->soft_mode = 1; |
---|
682 | 638 | |
---|
683 | 639 | parse_dts(dev, sunxi_data); |
---|
684 | 640 | if (!sunxi_data->independent_power) |
---|
685 | 641 | sunxi_data->dvfs = 0; |
---|
686 | | - sunxi_get_ic_version(dev, &ic_version); |
---|
687 | | - dev_info(dev, "IC version: 0x%08x \n", ic_version); |
---|
688 | | - |
---|
689 | | - if (!sunxi_ic_version_ctrl(dev)) { |
---|
690 | | - sunxi_data->power_idle = 0; |
---|
691 | | - sunxi_data->soft_mode = 1; |
---|
692 | | - } else { |
---|
693 | | - sunxi_data->soft_mode = 0; |
---|
694 | | - } |
---|
695 | 642 | |
---|
696 | 643 | sunxi_decide_pll(sunxi_data); |
---|
697 | 644 | spin_lock_init(&sunxi_data->lock); |
---|
.. | .. |
---|
720 | 667 | sunxi_data->power_idle = 0; |
---|
721 | 668 | regulator_set_voltage(sunxi_data->regula, 900000, 900000); |
---|
722 | 669 | #endif |
---|
723 | | - |
---|
724 | 670 | init_waitqueue_head(&dvfs_wq); |
---|
725 | 671 | |
---|
726 | 672 | dev_info(dev, "idle:%d dvfs:%d power:%d %s mode:%d volt:%u core:%lu\n", |
---|