Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/amlogic clk helpers for sdhc and rng



details:   https://anonhg.NetBSD.org/src/rev/974843201f46
branches:  trunk
changeset: 336614:974843201f46
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Sat Mar 07 21:32:47 2015 +0000

description:
clk helpers for sdhc and rng

diffstat:

 sys/arch/arm/amlogic/amlogic_board.c  |  72 ++++++++++++++++++++++++++++++++++-
 sys/arch/arm/amlogic/amlogic_crureg.h |  26 ++++++++++++-
 sys/arch/arm/amlogic/amlogic_reg.h    |  33 ++++++++++-----
 sys/arch/arm/amlogic/amlogic_var.h    |  16 +++++++-
 4 files changed, 132 insertions(+), 15 deletions(-)

diffs (253 lines):

diff -r 9cbf04375712 -r 974843201f46 sys/arch/arm/amlogic/amlogic_board.c
--- a/sys/arch/arm/amlogic/amlogic_board.c      Sat Mar 07 20:40:00 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_board.c      Sat Mar 07 21:32:47 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_board.c,v 1.7 2015/03/04 12:36:12 jmcneill Exp $ */
+/* $NetBSD: amlogic_board.c,v 1.8 2015/03/07 21:32:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -29,7 +29,7 @@
 #include "opt_amlogic.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.7 2015/03/04 12:36:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amlogic_board.c,v 1.8 2015/03/07 21:32:47 jmcneill Exp $");
 
 #define        _ARM32_BUS_DMA_PRIVATE
 #include <sys/param.h>
@@ -61,6 +61,10 @@
        bus_space_write_4(&amlogic_bs_tag, amlogic_core_bsh, \
                          AMLOGIC_CBUS_OFFSET + (x), (v))
 
+#define CBUS_SET_CLEAR(x, s, c)        \
+       amlogic_reg_set_clear(&amlogic_bs_tag, amlogic_core_bsh, \
+                             AMLOGIC_CBUS_OFFSET + (x), (s), (c))
+
 void
 amlogic_bootstrap(void)
 {
@@ -105,6 +109,26 @@
 }
 
 uint32_t
+amlogic_get_rate_fixed(void)
+{
+       uint32_t cntl;
+       uint64_t clk;
+       u_int mul, div, od;
+
+       clk = amlogic_get_rate_xtal();
+       cntl = CBUS_READ(HHI_MPLL_CNTL_REG);
+       mul = __SHIFTOUT(cntl, HHI_MPLL_CNTL_MUL);
+       div = __SHIFTOUT(cntl, HHI_MPLL_CNTL_DIV);
+       od = __SHIFTOUT(cntl, HHI_MPLL_CNTL_OD);
+
+       clk *= mul;
+       clk /= div;
+       clk >>= od;
+
+       return (uint32_t)clk;
+}
+
+uint32_t
 amlogic_get_rate_a9(void)
 {
        uint32_t cntl0, cntl1;
@@ -164,6 +188,50 @@
            CBUS_READ(EE_CLK_GATING1_REG) | EE_CLK_GATING1_ETHERNET);
 }
 
+void
+amlogic_rng_init(void)
+{
+       printf("%s: GATING0 = %#x, GATING3 = %#x\n", __func__,
+           CBUS_READ(EE_CLK_GATING0_REG), CBUS_READ(EE_CLK_GATING3_REG));
+
+       CBUS_WRITE(EE_CLK_GATING0_REG,
+           CBUS_READ(EE_CLK_GATING0_REG) | EE_CLK_GATING0_RNG);
+       CBUS_WRITE(EE_CLK_GATING3_REG,
+           CBUS_READ(EE_CLK_GATING3_REG) | EE_CLK_GATING3_RNG);
+
+       printf("%s: GATING0 = %#x, GATING3 = %#x\n", __func__,
+           CBUS_READ(EE_CLK_GATING0_REG), CBUS_READ(EE_CLK_GATING3_REG));
+}
+
+void
+amlogic_sdhc_init(void)
+{
+       /* CARD -> SDHC pin mux settings */
+       CBUS_SET_CLEAR(PERIPHS_PIN_MUX_5_REG, 0, 0x00007c00);
+       CBUS_SET_CLEAR(PERIPHS_PIN_MUX_4_REG, 0, 0x7c000000);
+       CBUS_SET_CLEAR(PERIPHS_PIN_MUX_2_REG, 0, 0x0000fc00);
+       CBUS_SET_CLEAR(PERIPHS_PIN_MUX_8_REG, 0, 0x00000600);
+       CBUS_SET_CLEAR(PERIPHS_PIN_MUX_2_REG, 0x000000f0, 0);
+
+       const uint32_t pupd_mask = __BITS(25,20);       /* CARD_0-CARD_5 */
+       CBUS_SET_CLEAR(CBUS_REG(0x203c), pupd_mask, 0); /* PU/PD */
+       CBUS_SET_CLEAR(CBUS_REG(0x204a), pupd_mask, 0); /* PU/PD-EN */
+
+       const uint32_t io_mask = __BITS(27,22);         /* CARD_0-CARD_5 */
+       CBUS_SET_CLEAR(CBUS_REG(0x200c), io_mask, 0);   /* OEN */
+
+       /* XXX ODROID-C1 specific */
+       const uint32_t pwr_mask = __BIT(31);            /* CARD_8 */
+       CBUS_SET_CLEAR(CBUS_REG(0x201c), 0, pwr_mask);  /* O */
+       CBUS_SET_CLEAR(CBUS_REG(0x201b), 0, pwr_mask);  /* OEN */
+       const uint32_t cd_mask = __BIT(29);
+       CBUS_SET_CLEAR(CBUS_REG(0x201b), cd_mask, 0);   /* OEN */
+
+       /* enable SDHC clk */
+       CBUS_WRITE(EE_CLK_GATING0_REG,
+           CBUS_READ(EE_CLK_GATING0_REG) | EE_CLK_GATING0_SDHC);
+}
+
 static void
 amlogic_usbphy_clkgate_enable(int port)
 {
diff -r 9cbf04375712 -r 974843201f46 sys/arch/arm/amlogic/amlogic_crureg.h
--- a/sys/arch/arm/amlogic/amlogic_crureg.h     Sat Mar 07 20:40:00 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_crureg.h     Sat Mar 07 21:32:47 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_crureg.h,v 1.5 2015/03/04 12:36:12 jmcneill Exp $ */
+/* $NetBSD: amlogic_crureg.h,v 1.6 2015/03/07 21:32:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -36,6 +36,10 @@
 #define EE_CLK_GATING2_REG             CBUS_REG(0x1052)
 #define EE_CLK_GATING3_REG             CBUS_REG(0x1054)
 
+#define EE_CLK_GATING0_SDIO            __BIT(17)
+#define EE_CLK_GATING0_SDHC            __BIT(14)
+#define EE_CLK_GATING0_RNG             __BIT(12)
+
 #define EE_CLK_GATING1_USB_GENERAL     __BIT(26)
 #define EE_CLK_GATING1_USB1            __BIT(22)
 #define EE_CLK_GATING1_USB0            __BIT(21)
@@ -44,6 +48,7 @@
 #define EE_CLK_GATING2_USB0_TO_DDR     __BIT(9)
 #define EE_CLK_GATING2_USB1_TO_DDR     __BIT(8)
 
+#define EE_CLK_GATING3_RNG             __BIT(21)
 
 #define HHI_SYS_CPU_CLK_CNTL1_REG      CBUS_REG(0x1057)
 #define HHI_SYS_CPU_CLK_CNTL1_SDIV     __BITS(29,20)
@@ -59,12 +64,31 @@
 #define HHI_SYS_PLL_CNTL_DIV           __BITS(14,9)
 #define HHI_SYS_PLL_CNTL_OD            __BITS(17,16)
 
+#define HHI_MPLL_CNTL_REG              CBUS_REG(0x10a0)
+#define HHI_MPLL_CNTL_MUL              __BITS(8,0)
+#define HHI_MPLL_CNTL_DIV              __BITS(13,9)
+#define HHI_MPLL_CNTL_OD               __BITS(17,16)
+
 #define RESET1_REG                     CBUS_REG(0x1102)
 #define RESET1_USB                     __BIT(2)
 
 #define PREG_CTLREG0_ADDR_REG          CBUS_REG(0x2000)
 #define PREG_CTLREG0_ADDR_CLKRATE      __BITS(9,4)
 
+#define PERIPHS_PIN_MUX_0_REG          CBUS_REG(0x202c)
+#define PERIPHS_PIN_MUX_1_REG          CBUS_REG(0x202d)
+#define PERIPHS_PIN_MUX_2_REG          CBUS_REG(0x202e)
+#define PERIPHS_PIN_MUX_3_REG          CBUS_REG(0x202f)
+#define PERIPHS_PIN_MUX_4_REG          CBUS_REG(0x2030)
+#define PERIPHS_PIN_MUX_5_REG          CBUS_REG(0x2031)
+#define PERIPHS_PIN_MUX_6_REG          CBUS_REG(0x2032)
+#define PERIPHS_PIN_MUX_7_REG          CBUS_REG(0x2033)
+#define PERIPHS_PIN_MUX_8_REG          CBUS_REG(0x2034)
+#define PERIPHS_PIN_MUX_9_REG          CBUS_REG(0x2035)
+
+#define RAND64_ADDR0_REG               CBUS_REG(0x2040)
+#define RAND64_ADDR1_REG               CBUS_REG(0x2041)
+
 #define PREI_USB_PHY_A_CFG_REG         CBUS_REG(0x2200)
 #define PREI_USB_PHY_A_CTRL_REG                CBUS_REG(0x2201)
 #define PREI_USB_PHY_A_ADP_BC_REG      CBUS_REG(0x2203)
diff -r 9cbf04375712 -r 974843201f46 sys/arch/arm/amlogic/amlogic_reg.h
--- a/sys/arch/arm/amlogic/amlogic_reg.h        Sat Mar 07 20:40:00 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_reg.h        Sat Mar 07 21:32:47 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_reg.h,v 1.6 2015/03/04 12:36:12 jmcneill Exp $ */
+/* $NetBSD: amlogic_reg.h,v 1.7 2015/03/07 21:32:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -35,21 +35,32 @@
 #define AMLOGIC_CORE_SIZE      0x1b000000
 #define AMLOGIC_CORE_VBASE     0xe0000000
 
+#define AMLOGIC_REF_FREQ       24000000
+
 #define AMLOGIC_CBUS_OFFSET    0x01100000
 
+#define AMLOGIC_RAND_OFFSET    0x01108100
+#define AMLOGIC_RAND_SIZE      0x8
+
+#define AMLOGIC_SDIO_OFFSET    0x01108c20
+#define AMLOGIC_SDIO_SIZE      0x20
+
+#define AMLOGIC_SDHC_OFFSET    0x01108e00
+#define AMLOGIC_SDHC_SIZE      0x30
+
+#define AMLOGIC_PL310_OFFSET   0x04200000
+
+#define AMLOGIC_DMC_OFFSET     0x08006000
+#define AMLOGIC_DMC_SIZE       0x400
+
+#define AMLOGIC_AOBUS_OFFSET   0x08100000
+
+#define AMLOGIC_GPIOAO_OFFSET  0x08100024
+
 #define AMLOGIC_UART0AO_OFFSET 0x081004c0
 #define AMLOGIC_UART2AO_OFFSET 0x081004e0
 #define AMLOGIC_UART_SIZE      0x20
-#define AMLOGIC_UART_FREQ      24000000
-
-#define AMLOGIC_MMC_OFFSET     0x01108e00
-#define AMLOGIC_MMC_SIZE       0x30
-
-#define AMLOGIC_PL310_OFFSET   0x04200000
-
-#define AMLOGIC_AOBUS_OFFSET   0x08100000
-
-#define AMLOGIC_GPIOAO_OFFSET  0x08100024
+#define AMLOGIC_UART_FREQ      AMLOGIC_REF_FREQ
 
 #define AMLOGIC_USB0_OFFSET    0x09040000
 #define AMLOGIC_USB1_OFFSET    0x090c0000
diff -r 9cbf04375712 -r 974843201f46 sys/arch/arm/amlogic/amlogic_var.h
--- a/sys/arch/arm/amlogic/amlogic_var.h        Sat Mar 07 20:40:00 2015 +0000
+++ b/sys/arch/arm/amlogic/amlogic_var.h        Sat Mar 07 21:32:47 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amlogic_var.h,v 1.4 2015/03/05 23:43:53 jmcneill Exp $ */
+/* $NetBSD: amlogic_var.h,v 1.5 2015/03/07 21:32:47 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -60,10 +60,24 @@
 
 void   amlogic_usbphy_init(int);
 void   amlogic_eth_init(void);
+void   amlogic_sdhc_init(void);
+void   amlogic_rng_init(void);
 
 uint32_t amlogic_get_rate_xtal(void);
 uint32_t amlogic_get_rate_sys(void);
+uint32_t amlogic_get_rate_fixed(void);
 uint32_t amlogic_get_rate_a9(void);
 uint32_t amlogic_get_rate_a9periph(void);
 
+static void inline
+amlogic_reg_set_clear(bus_space_tag_t bst, bus_space_handle_t bsh,
+    bus_size_t o, uint32_t set_mask, uint32_t clr_mask)
+{
+       const uint32_t old = bus_space_read_4(bst, bsh, o);
+       const uint32_t new = set_mask | (old & ~clr_mask);
+       if (old != new) {
+               bus_space_write_4(bst, bsh, o, new);
+       }
+}
+
 #endif /* _ARM_AMLOGIC_VAR_H */



Home | Main Index | Thread Index | Old Index