svn commit: r294675 - head/sys/arm/allwinner

Andrew Turner andrew at FreeBSD.org
Sun Jan 24 19:10:31 UTC 2016


Author: andrew
Date: Sun Jan 24 19:10:30 2016
New Revision: 294675
URL: https://svnweb.freebsd.org/changeset/base/294675

Log:
  Add support for controlling the clocks for the audio codec and DMA engines.
  
  Submitted by:	Jared McNeill <jmcneill at invisible.ca>
  Differential Revision:	https://reviews.freebsd.org/D5052

Modified:
  head/sys/arm/allwinner/a10_clk.c
  head/sys/arm/allwinner/a10_clk.h

Modified: head/sys/arm/allwinner/a10_clk.c
==============================================================================
--- head/sys/arm/allwinner/a10_clk.c	Sun Jan 24 18:54:55 2016	(r294674)
+++ head/sys/arm/allwinner/a10_clk.c	Sun Jan 24 19:10:30 2016	(r294675)
@@ -255,6 +255,58 @@ a10_clk_pll6_get_rate(void)
 	return ((CCM_CLK_REF_FREQ * n * k) / 2);
 }
 
+static int
+a10_clk_pll2_set_rate(unsigned int freq)
+{
+	struct a10_ccm_softc *sc;
+	uint32_t reg_value;
+	unsigned int prediv, postdiv, n;
+
+	sc = a10_ccm_sc;
+	if (sc == NULL)
+		return (ENXIO);
+
+
+	reg_value = ccm_read_4(sc, CCM_PLL2_CFG);
+	reg_value &= ~(CCM_PLL2_CFG_PREDIV | CCM_PLL2_CFG_POSTDIV |
+	    CCM_PLL_CFG_FACTOR_N);
+
+	/*
+	 * Audio Codec needs PLL2 to be either 24576000 Hz or 22579200 Hz
+	 *
+	 * PLL2 output frequency is 24MHz * n / prediv / postdiv.
+	 * To get as close as possible to the desired rate, we use a
+	 * pre-divider of 21 and a post-divider of 4. With these values,
+	 * a multiplier of 86 or 79 gets us close to the target rates.
+	 */
+	prediv = 21;
+	postdiv = 4;
+
+	switch (freq) {
+	case 24576000:
+		n = 86;
+		reg_value |= CCM_PLL_CFG_ENABLE;
+		break;
+	case 22579200:
+		n = 79;
+		reg_value |= CCM_PLL_CFG_ENABLE;
+		break;
+	case 0:
+		n = 1;
+		reg_value &= ~CCM_PLL_CFG_ENABLE;
+		break;
+	default:
+		return (EINVAL);
+	}
+
+	reg_value |= (prediv << CCM_PLL2_CFG_PREDIV_SHIFT);
+	reg_value |= (postdiv << CCM_PLL2_CFG_POSTDIV_SHIFT);
+	reg_value |= (n << CCM_PLL_CFG_FACTOR_N_SHIFT);
+	ccm_write_4(sc, CCM_PLL2_CFG, reg_value);
+
+	return (0);
+}
+
 int
 a10_clk_ahci_activate(void)
 {
@@ -347,3 +399,46 @@ a10_clk_mmc_cfg(int devid, int freq)
 
 	return (0);
 }
+
+int
+a10_clk_dmac_activate(void)
+{
+	struct a10_ccm_softc *sc;
+	uint32_t reg_value;
+
+	sc = a10_ccm_sc;
+	if (sc == NULL)
+		return (ENXIO);
+
+	/* Gating AHB clock for DMA controller */
+	reg_value = ccm_read_4(sc, CCM_AHB_GATING0);
+	reg_value |= CCM_AHB_GATING_DMA;
+	ccm_write_4(sc, CCM_AHB_GATING0, reg_value);
+
+	return (0);
+}
+
+int
+a10_clk_codec_activate(unsigned int freq)
+{
+	struct a10_ccm_softc *sc;
+	uint32_t reg_value;
+
+	sc = a10_ccm_sc;
+	if (sc == NULL)
+		return (ENXIO);
+
+	a10_clk_pll2_set_rate(freq);
+
+	/* Gating APB clock for ADDA */
+	reg_value = ccm_read_4(sc, CCM_APB0_GATING);
+	reg_value |= CCM_APB0_GATING_ADDA;
+	ccm_write_4(sc, CCM_APB0_GATING, reg_value);
+
+	/* Enable audio codec clock */
+	reg_value = ccm_read_4(sc, CCM_AUDIO_CODEC_CLK);
+	reg_value |= CCM_AUDIO_CODEC_ENABLE;
+	ccm_write_4(sc, CCM_AUDIO_CODEC_CLK, reg_value);
+
+	return (0);
+}

Modified: head/sys/arm/allwinner/a10_clk.h
==============================================================================
--- head/sys/arm/allwinner/a10_clk.h	Sun Jan 24 18:54:55 2016	(r294674)
+++ head/sys/arm/allwinner/a10_clk.h	Sun Jan 24 19:10:30 2016	(r294675)
@@ -106,10 +106,14 @@
 #define	CCM_GMAC_CLK_EXT_RGMII	0x1
 #define	CCM_GMAC_CLK_RGMII	0x2
 
+/* APB0_GATING */
+#define	CCM_APB0_GATING_ADDA	(1 << 0)
+
 /* AHB_GATING_REG0 */
 #define	CCM_AHB_GATING_USB0	(1 << 0)
 #define	CCM_AHB_GATING_EHCI0	(1 << 1)
 #define	CCM_AHB_GATING_EHCI1	(1 << 3)
+#define	CCM_AHB_GATING_DMA	(1 << 6)
 #define	CCM_AHB_GATING_SDMMC0	(1 << 8)
 #define	CCM_AHB_GATING_EMAC	(1 << 17)
 #define	CCM_AHB_GATING_SATA	(1 << 25)
@@ -132,6 +136,11 @@
 #define	CCM_PLL_CFG_FACTOR_K_SHIFT	4
 #define	CCM_PLL_CFG_FACTOR_M		0x3
 
+#define	CCM_PLL2_CFG_POSTDIV		0x3c000000
+#define	CCM_PLL2_CFG_POSTDIV_SHIFT	26
+#define	CCM_PLL2_CFG_PREDIV		0x1f
+#define	CCM_PLL2_CFG_PREDIV_SHIFT	0
+
 #define	CCM_PLL6_CFG_SATA_CLKEN	(1U << 14)
 
 #define	CCM_SD_CLK_SRC_SEL		0x3000000
@@ -146,6 +155,8 @@
 #define	CCM_SD_CLK_OPHASE_CTR_SHIFT	8
 #define	CCM_SD_CLK_DIV_RATIO_M		0xf
 
+#define	CCM_AUDIO_CODEC_ENABLE	(1U << 31)
+
 #define	CCM_CLK_REF_FREQ	24000000U
 
 int a10_clk_usb_activate(void);
@@ -155,5 +166,7 @@ int a10_clk_gmac_activate(phandle_t);
 int a10_clk_ahci_activate(void);
 int a10_clk_mmc_activate(int);
 int a10_clk_mmc_cfg(int, int);
+int a10_clk_dmac_activate(void);
+int a10_clk_codec_activate(unsigned int);
 
 #endif /* _A10_CLK_H_ */


More information about the svn-src-all mailing list