Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Manuel Lauss and committed by
Ralf Baechle
415e0fec 8e211705

+45 -25
+25 -25
arch/mips/alchemy/devboards/db1200.c
··· 18 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 19 */ 20 20 21 + #include <linux/clk.h> 21 22 #include <linux/dma-mapping.h> 22 23 #include <linux/gpio.h> 23 24 #include <linux/i2c.h> ··· 130 129 131 130 int __init db1200_board_setup(void) 132 131 { 133 - unsigned long freq0, clksrc, div, pfc; 134 132 unsigned short whoami; 135 133 136 134 if (db1200_detect_board()) ··· 148 148 printk(KERN_INFO "Alchemy/AMD/RMI %s Board, CPLD Rev %d" 149 149 " Board-ID %d Daughtercard ID %d\n", get_system_type(), 150 150 (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf); 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 151 176 152 return 0; 177 153 } ··· 819 843 unsigned long pfc; 820 844 unsigned short sw; 821 845 int swapped, bid; 846 + struct clk *c; 822 847 823 848 bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)); 824 849 if ((bid == BCSR_WHOAMI_PB1200_DDR1) || ··· 831 854 /* GPIO7 is low-level triggered CPLD cascade */ 832 855 irq_set_irq_type(AU1200_GPIO7_INT, IRQ_TYPE_LEVEL_LOW); 833 856 bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT); 857 + 858 + /* SMBus/SPI on PSC0, Audio on PSC1 */ 859 + pfc = alchemy_rdsys(AU1000_SYS_PINFUNC); 860 + pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B); 861 + pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3); 862 + pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */ 863 + alchemy_wrsys(pfc, AU1000_SYS_PINFUNC); 864 + 865 + /* get 50MHz for I2C driver on PSC0 */ 866 + c = clk_get(NULL, "psc0_intclk"); 867 + if (!IS_ERR(c)) { 868 + pfc = clk_round_rate(c, 50000000); 869 + if ((pfc < 1) || (abs(50000000 - pfc) > 2500000)) 870 + pr_warn("DB1200: cant get I2C close to 50MHz\n"); 871 + else 872 + clk_set_rate(c, pfc); 873 + clk_put(c); 874 + } 834 875 835 876 /* insert/eject pairs: one of both is always screaming. To avoid 836 877 * issues they must not be automatically enabled when initially ··· 922 927 } 923 928 924 929 /* Audio PSC clock is supplied externally. (FIXME: platdata!!) */ 930 + c = clk_get(NULL, "psc1_intclk"); 931 + if (!IS_ERR(c)) { 932 + clk_prepare_enable(c); 933 + clk_put(c); 934 + } 925 935 __raw_writel(PSC_SEL_CLK_SERCLK, 926 936 (void __iomem *)KSEG1ADDR(AU1550_PSC1_PHYS_ADDR) + PSC_SEL_OFFSET); 927 937 wmb();
+7
arch/mips/alchemy/devboards/db1300.c
··· 4 4 * (c) 2009 Manuel Lauss <manuel.lauss@googlemail.com> 5 5 */ 6 6 7 + #include <linux/clk.h> 7 8 #include <linux/dma-mapping.h> 8 9 #include <linux/gpio.h> 9 10 #include <linux/gpio_keys.h> ··· 732 731 int __init db1300_dev_setup(void) 733 732 { 734 733 int swapped, cpldirq; 734 + struct clk *c; 735 735 736 736 /* setup CPLD IRQ muxer */ 737 737 cpldirq = au1300_gpio_to_irq(AU1300_PIN_EXTCLK1); ··· 763 761 (void __iomem *)KSEG1ADDR(AU1300_PSC2_PHYS_ADDR) + PSC_SEL_OFFSET); 764 762 wmb(); 765 763 /* I2C uses internal 48MHz EXTCLK1 */ 764 + c = clk_get(NULL, "psc3_intclk"); 765 + if (!IS_ERR(c)) { 766 + clk_prepare_enable(c); 767 + clk_put(c); 768 + } 766 769 __raw_writel(PSC_SEL_CLK_INTCLK, 767 770 (void __iomem *)KSEG1ADDR(AU1300_PSC3_PHYS_ADDR) + PSC_SEL_OFFSET); 768 771 wmb();
+13
arch/mips/alchemy/devboards/db1550.c
··· 4 4 * (c) 2011 Manuel Lauss <manuel.lauss@googlemail.com> 5 5 */ 6 6 7 + #include <linux/clk.h> 7 8 #include <linux/dma-mapping.h> 8 9 #include <linux/gpio.h> 9 10 #include <linux/i2c.h> ··· 575 574 int __init db1550_dev_setup(void) 576 575 { 577 576 int swapped, id; 577 + struct clk *c; 578 578 579 579 id = (BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)) != BCSR_WHOAMI_DB1550); 580 580 ··· 583 581 ARRAY_SIZE(db1550_i2c_devs)); 584 582 spi_register_board_info(db1550_spi_devs, 585 583 ARRAY_SIZE(db1550_i2c_devs)); 584 + 585 + c = clk_get(NULL, "psc0_intclk"); 586 + if (!IS_ERR(c)) { 587 + clk_prepare_enable(c); 588 + clk_put(c); 589 + } 590 + c = clk_get(NULL, "psc2_intclk"); 591 + if (!IS_ERR(c)) { 592 + clk_prepare_enable(c); 593 + clk_put(c); 594 + } 586 595 587 596 /* Audio PSC clock is supplied by codecs (PSC1, 3) FIXME: platdata!! */ 588 597 __raw_writel(PSC_SEL_CLK_SERCLK,