diff options
Diffstat (limited to 'drivers/mfd/db8500-prcmu.c')
-rw-r--r-- | drivers/mfd/db8500-prcmu.c | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 90e0f21bc49c..0e019cc5da42 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c | |||
@@ -1695,21 +1695,41 @@ static long round_clock_rate(u8 clock, unsigned long rate) | |||
1695 | return rounded_rate; | 1695 | return rounded_rate; |
1696 | } | 1696 | } |
1697 | 1697 | ||
1698 | static const unsigned long armss_freqs[] = { | 1698 | static const unsigned long db8500_armss_freqs[] = { |
1699 | 200000000, | 1699 | 200000000, |
1700 | 400000000, | 1700 | 400000000, |
1701 | 800000000, | 1701 | 800000000, |
1702 | 998400000 | 1702 | 998400000 |
1703 | }; | 1703 | }; |
1704 | 1704 | ||
1705 | /* The DB8520 has slightly higher ARMSS max frequency */ | ||
1706 | static const unsigned long db8520_armss_freqs[] = { | ||
1707 | 200000000, | ||
1708 | 400000000, | ||
1709 | 800000000, | ||
1710 | 1152000000 | ||
1711 | }; | ||
1712 | |||
1713 | |||
1714 | |||
1705 | static long round_armss_rate(unsigned long rate) | 1715 | static long round_armss_rate(unsigned long rate) |
1706 | { | 1716 | { |
1707 | unsigned long freq = 0; | 1717 | unsigned long freq = 0; |
1718 | const unsigned long *freqs; | ||
1719 | int nfreqs; | ||
1708 | int i; | 1720 | int i; |
1709 | 1721 | ||
1722 | if (fw_info.version.project == PRCMU_FW_PROJECT_U8520) { | ||
1723 | freqs = db8520_armss_freqs; | ||
1724 | nfreqs = ARRAY_SIZE(db8520_armss_freqs); | ||
1725 | } else { | ||
1726 | freqs = db8500_armss_freqs; | ||
1727 | nfreqs = ARRAY_SIZE(db8500_armss_freqs); | ||
1728 | } | ||
1729 | |||
1710 | /* Find the corresponding arm opp from the cpufreq table. */ | 1730 | /* Find the corresponding arm opp from the cpufreq table. */ |
1711 | for (i = 0; i < ARRAY_SIZE(armss_freqs); i++) { | 1731 | for (i = 0; i < nfreqs; i++) { |
1712 | freq = armss_freqs[i]; | 1732 | freq = freqs[i]; |
1713 | if (rate <= freq) | 1733 | if (rate <= freq) |
1714 | break; | 1734 | break; |
1715 | } | 1735 | } |
@@ -1854,11 +1874,21 @@ static int set_armss_rate(unsigned long rate) | |||
1854 | { | 1874 | { |
1855 | unsigned long freq; | 1875 | unsigned long freq; |
1856 | u8 opps[] = { ARM_EXTCLK, ARM_50_OPP, ARM_100_OPP, ARM_MAX_OPP }; | 1876 | u8 opps[] = { ARM_EXTCLK, ARM_50_OPP, ARM_100_OPP, ARM_MAX_OPP }; |
1877 | const unsigned long *freqs; | ||
1878 | int nfreqs; | ||
1857 | int i; | 1879 | int i; |
1858 | 1880 | ||
1881 | if (fw_info.version.project == PRCMU_FW_PROJECT_U8520) { | ||
1882 | freqs = db8520_armss_freqs; | ||
1883 | nfreqs = ARRAY_SIZE(db8520_armss_freqs); | ||
1884 | } else { | ||
1885 | freqs = db8500_armss_freqs; | ||
1886 | nfreqs = ARRAY_SIZE(db8500_armss_freqs); | ||
1887 | } | ||
1888 | |||
1859 | /* Find the corresponding arm opp from the cpufreq table. */ | 1889 | /* Find the corresponding arm opp from the cpufreq table. */ |
1860 | for (i = 0; i < ARRAY_SIZE(armss_freqs); i++) { | 1890 | for (i = 0; i < nfreqs; i++) { |
1861 | freq = armss_freqs[i]; | 1891 | freq = freqs[i]; |
1862 | if (rate == freq) | 1892 | if (rate == freq) |
1863 | break; | 1893 | break; |
1864 | } | 1894 | } |
@@ -3130,10 +3160,8 @@ static int db8500_prcmu_probe(struct platform_device *pdev) | |||
3130 | writel(ALL_MBOX_BITS, PRCM_ARM_IT1_CLR); | 3160 | writel(ALL_MBOX_BITS, PRCM_ARM_IT1_CLR); |
3131 | 3161 | ||
3132 | irq = platform_get_irq(pdev, 0); | 3162 | irq = platform_get_irq(pdev, 0); |
3133 | if (irq <= 0) { | 3163 | if (irq <= 0) |
3134 | dev_err(&pdev->dev, "no prcmu irq provided\n"); | ||
3135 | return irq; | 3164 | return irq; |
3136 | } | ||
3137 | 3165 | ||
3138 | err = request_threaded_irq(irq, prcmu_irq_handler, | 3166 | err = request_threaded_irq(irq, prcmu_irq_handler, |
3139 | prcmu_irq_thread_fn, IRQF_NO_SUSPEND, "prcmu", NULL); | 3167 | prcmu_irq_thread_fn, IRQF_NO_SUSPEND, "prcmu", NULL); |