diff options
| author | Manuel Lauss <manuel.lauss@gmail.com> | 2014-07-23 10:36:52 -0400 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2014-07-30 08:10:00 -0400 |
| commit | 415e0fec7a388dbe224057c1134737e23710aa9b (patch) | |
| tree | 64ba643ffd45da5c4503ce32d553060c52e51f39 /arch/mips/alchemy | |
| parent | 8e21170581d99038c41c803af289e1a6491cb145 (diff) | |
MIPS: Alchemy: db1x00: use clk framework
Make use of the clk framework to set up and enable all PSC clocks.
Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
Cc: Linux-MIPS <linux-mips@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/7469/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/alchemy')
| -rw-r--r-- | arch/mips/alchemy/devboards/db1200.c | 50 | ||||
| -rw-r--r-- | arch/mips/alchemy/devboards/db1300.c | 7 | ||||
| -rw-r--r-- | arch/mips/alchemy/devboards/db1550.c | 13 |
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 | ||
| 130 | int __init db1200_board_setup(void) | 131 | int __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 = { | |||
| 731 | int __init db1300_dev_setup(void) | 732 | int __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) | |||
| 574 | int __init db1550_dev_setup(void) | 575 | int __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); |
