aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips')
-rw-r--r--arch/mips/alchemy/devboards/db1200.c50
-rw-r--r--arch/mips/alchemy/devboards/db1300.c7
-rw-r--r--arch/mips/alchemy/devboards/db1550.c13
3 files changed, 45 insertions, 25 deletions
diff --git a/arch/mips/alchemy/devboards/db1200.c b/arch/mips/alchemy/devboards/db1200.c
index 5ccfd8393cd5..776188908dfc 100644
--- a/arch/mips/alchemy/devboards/db1200.c
+++ b/arch/mips/alchemy/devboards/db1200.c
@@ -18,6 +18,7 @@
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */ 19 */
20 20
21#include <linux/clk.h>
21#include <linux/dma-mapping.h> 22#include <linux/dma-mapping.h>
22#include <linux/gpio.h> 23#include <linux/gpio.h>
23#include <linux/i2c.h> 24#include <linux/i2c.h>
@@ -129,7 +130,6 @@ static int __init db1200_detect_board(void)
129 130
130int __init db1200_board_setup(void) 131int __init db1200_board_setup(void)
131{ 132{
132 unsigned long freq0, clksrc, div, pfc;
133 unsigned short whoami; 133 unsigned short whoami;
134 134
135 if (db1200_detect_board()) 135 if (db1200_detect_board())
@@ -149,30 +149,6 @@ int __init db1200_board_setup(void)
149 " Board-ID %d Daughtercard ID %d\n", get_system_type(), 149 " Board-ID %d Daughtercard ID %d\n", get_system_type(),
150 (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf); 150 (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
151 151
152 /* SMBus/SPI on PSC0, Audio on PSC1 */
153 pfc = alchemy_rdsys(AU1000_SYS_PINFUNC);
154 pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
155 pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);
156 pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
157 alchemy_wrsys(pfc, AU1000_SYS_PINFUNC);
158
159 /* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from
160 * CPU clock; all other clock generators off/unused.
161 */
162 div = (get_au1x00_speed() + 25000000) / 50000000;
163 if (div & 1)
164 div++;
165 div = ((div >> 1) - 1) & 0xff;
166
167 freq0 = div << SYS_FC_FRDIV0_BIT;
168 alchemy_wrsys(freq0, AU1000_SYS_FREQCTRL0);
169 freq0 |= SYS_FC_FE0; /* enable F0 */
170 alchemy_wrsys(freq0, AU1000_SYS_FREQCTRL0);
171
172 /* psc0_intclk comes 1:1 from F0 */
173 clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT;
174 alchemy_wrsys(clksrc, AU1000_SYS_CLKSRC);
175
176 return 0; 152 return 0;
177} 153}
178 154
@@ -843,6 +819,7 @@ int __init db1200_dev_setup(void)
843 unsigned long pfc; 819 unsigned long pfc;
844 unsigned short sw; 820 unsigned short sw;
845 int swapped, bid; 821 int swapped, bid;
822 struct clk *c;
846 823
847 bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)); 824 bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
848 if ((bid == BCSR_WHOAMI_PB1200_DDR1) || 825 if ((bid == BCSR_WHOAMI_PB1200_DDR1) ||
@@ -855,6 +832,24 @@ int __init db1200_dev_setup(void)
855 irq_set_irq_type(AU1200_GPIO7_INT, IRQ_TYPE_LEVEL_LOW); 832 irq_set_irq_type(AU1200_GPIO7_INT, IRQ_TYPE_LEVEL_LOW);
856 bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT); 833 bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);
857 834
835 /* SMBus/SPI on PSC0, Audio on PSC1 */
836 pfc = alchemy_rdsys(AU1000_SYS_PINFUNC);
837 pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
838 pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);
839 pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
840 alchemy_wrsys(pfc, AU1000_SYS_PINFUNC);
841
842 /* get 50MHz for I2C driver on PSC0 */
843 c = clk_get(NULL, "psc0_intclk");
844 if (!IS_ERR(c)) {
845 pfc = clk_round_rate(c, 50000000);
846 if ((pfc < 1) || (abs(50000000 - pfc) > 2500000))
847 pr_warn("DB1200: cant get I2C close to 50MHz\n");
848 else
849 clk_set_rate(c, pfc);
850 clk_put(c);
851 }
852
858 /* insert/eject pairs: one of both is always screaming. To avoid 853 /* insert/eject pairs: one of both is always screaming. To avoid
859 * issues they must not be automatically enabled when initially 854 * issues they must not be automatically enabled when initially
860 * requested. 855 * requested.
@@ -927,6 +922,11 @@ int __init db1200_dev_setup(void)
927 } 922 }
928 923
929 /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */ 924 /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */
925 c = clk_get(NULL, "psc1_intclk");
926 if (!IS_ERR(c)) {
927 clk_prepare_enable(c);
928 clk_put(c);
929 }
930 __raw_writel(PSC_SEL_CLK_SERCLK, 930 __raw_writel(PSC_SEL_CLK_SERCLK,
931 (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET); 931 (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);
932 wmb(); 932 wmb();
diff --git a/arch/mips/alchemy/devboards/db1300.c b/arch/mips/alchemy/devboards/db1300.c
index c80e5b94064e..ef93ee3f6a2c 100644
--- a/arch/mips/alchemy/devboards/db1300.c
+++ b/arch/mips/alchemy/devboards/db1300.c
@@ -4,6 +4,7 @@
4 * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com> 4 * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com>
5 */ 5 */
6 6
7#include <linux/clk.h>
7#include <linux/dma-mapping.h> 8#include <linux/dma-mapping.h>
8#include <linux/gpio.h> 9#include <linux/gpio.h>
9#include <linux/gpio_keys.h> 10#include <linux/gpio_keys.h>
@@ -731,6 +732,7 @@ static struct platform_device *db1300_dev[] __initdata = {
731int __init db1300_dev_setup(void) 732int __init db1300_dev_setup(void)
732{ 733{
733 int swapped, cpldirq; 734 int swapped, cpldirq;
735 struct clk *c;
734 736
735 /* setup CPLD IRQ muxer */ 737 /* setup CPLD IRQ muxer */
736 cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1); 738 cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1);
@@ -761,6 +763,11 @@ int __init db1300_dev_setup(void)
761 (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET); 763 (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET);
762 wmb(); 764 wmb();
763 /* I2C uses internal 48MHz EXTCLK1 */ 765 /* I2C uses internal 48MHz EXTCLK1 */
766 c = clk_get(NULL, "psc3_intclk");
767 if (!IS_ERR(c)) {
768 clk_prepare_enable(c);
769 clk_put(c);
770 }
764 __raw_writel(PSC_SEL_CLK_INTCLK, 771 __raw_writel(PSC_SEL_CLK_INTCLK,
765 (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET); 772 (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET);
766 wmb(); 773 wmb();
diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c
index d1320665e7e3..7e89936f763e 100644
--- a/arch/mips/alchemy/devboards/db1550.c
+++ b/arch/mips/alchemy/devboards/db1550.c
@@ -4,6 +4,7 @@
4 * (c) 2011 Manuel Lauss <manuel.lauss@googlemail.com> 4 * (c) 2011 Manuel Lauss <manuel.lauss@googlemail.com>
5 */ 5 */
6 6
7#include <linux/clk.h>
7#include <linux/dma-mapping.h> 8#include <linux/dma-mapping.h>
8#include <linux/gpio.h> 9#include <linux/gpio.h>
9#include <linux/i2c.h> 10#include <linux/i2c.h>
@@ -574,6 +575,7 @@ static void __init pb1550_devices(void)
574int __init db1550_dev_setup(void) 575int __init db1550_dev_setup(void)
575{ 576{
576 int swapped, id; 577 int swapped, id;
578 struct clk *c;
577 579
578 id = (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)) != BCSR_WHOAMI_DB1550); 580 id = (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)) != BCSR_WHOAMI_DB1550);
579 581
@@ -582,6 +584,17 @@ int __init db1550_dev_setup(void)
582 spi_register_board_info(db1550_spi_devs, 584 spi_register_board_info(db1550_spi_devs,
583 ARRAY_SIZE(db1550_i2c_devs)); 585 ARRAY_SIZE(db1550_i2c_devs));
584 586
587 c = clk_get(NULL, "psc0_intclk");
588 if (!IS_ERR(c)) {
589 clk_prepare_enable(c);
590 clk_put(c);
591 }
592 c = clk_get(NULL, "psc2_intclk");
593 if (!IS_ERR(c)) {
594 clk_prepare_enable(c);
595 clk_put(c);
596 }
597
585 /* Audio PSC clock is supplied by codecs (PSC1, 3) FIXME: platdata!! */ 598 /* Audio PSC clock is supplied by codecs (PSC1, 3) FIXME: platdata!! */
586 __raw_writel(PSC_SEL_CLK_SERCLK, 599 __raw_writel(PSC_SEL_CLK_SERCLK,
587 (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET); 600 (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET);