From ec60f6cd9d9ad723210cb21af93ccb92ddee37bd Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Sun, 30 Mar 2014 08:00:59 -0600 Subject: [PATCH] SAMA5: Remove HSCMI-related functions that did not belong in sam_pmc.c and give them their own file --- ChangeLog | 4 + arch/arm/src/sama5/Make.defs | 6 +- arch/arm/src/sama5/sam_hsmci.c | 2 +- arch/arm/src/sama5/sam_hsmci.h | 36 ++++++- arch/arm/src/sama5/sam_hsmci_clkdiv.c | 141 ++++++++++++++++++++++++++ arch/arm/src/sama5/sam_pmc.c | 54 ---------- arch/arm/src/sama5/sam_pmc.h | 24 ----- 7 files changed, 184 insertions(+), 83 deletions(-) create mode 100755 arch/arm/src/sama5/sam_hsmci_clkdiv.c diff --git a/ChangeLog b/ChangeLog index c7fafef79f..b96246d196 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7079,3 +7079,7 @@ * configs/nuttx/compiler.h: Add macro UNUSED() that can be used to eliminate warnings about variables that are set to values that are not used (2014-3-30). + * arch/arm/src/sama5/sam_hsmci_clkciv.c: Remove HSCMI-related + functions that did not belong in sam_pmc.c and give them their + own file (2014-3-30). + diff --git a/arch/arm/src/sama5/Make.defs b/arch/arm/src/sama5/Make.defs index 0d35b2e69e..ced54cb325 100644 --- a/arch/arm/src/sama5/Make.defs +++ b/arch/arm/src/sama5/Make.defs @@ -167,13 +167,13 @@ endif endif ifeq ($(CONFIG_SAMA5_HSMCI0),y) -CHIP_CSRCS += sam_hsmci.c +CHIP_CSRCS += sam_hsmci.c sam_hsmci_clkdiv.c else ifeq ($(CONFIG_SAMA5_HSMCI1),y) -CHIP_CSRCS += sam_hsmci.c +CHIP_CSRCS += sam_hsmci.c sam_hsmci_clkdiv.c else ifeq ($(CONFIG_SAMA5_HSMCI2),y) -CHIP_CSRCS += sam_hsmci.c +CHIP_CSRCS += sam_hsmci.c sam_hsmci_clkdiv.c endif endif endif diff --git a/arch/arm/src/sama5/sam_hsmci.c b/arch/arm/src/sama5/sam_hsmci.c index 1028dd12fe..949bd2dd56 100644 --- a/arch/arm/src/sama5/sam_hsmci.c +++ b/arch/arm/src/sama5/sam_hsmci.c @@ -3029,7 +3029,7 @@ FAR struct sdio_dev_s *sdio_initialize(int slotno) * Name: sdio_mediachange * * Description: - * Called by board-specific logic -- posssible from an interrupt handler -- + * Called by board-specific logic -- possibly from an interrupt handler -- * in order to signal to the driver that a card has been inserted or * removed from the slot * diff --git a/arch/arm/src/sama5/sam_hsmci.h b/arch/arm/src/sama5/sam_hsmci.h index 01e990ba86..d40eb06389 100644 --- a/arch/arm/src/sama5/sam_hsmci.h +++ b/arch/arm/src/sama5/sam_hsmci.h @@ -95,11 +95,45 @@ extern "C" struct sdio_dev_s; /* See include/nuttx/sdio.h */ FAR struct sdio_dev_s *sdio_initialize(int slotno); +/**************************************************************************** + * Name: sam_hsmci_clkdiv + * + * Description: + * Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK) + * divided by (2*(CLKDIV) + CLOCKODD + 2). + * + * CLKFULLDIV = 2*CLKDIV + CLOCKODD; + * MCI_SPEED = MCK / (CLKFULLDIV + 2) + * CLKFULLDIV = MCK / MCI_SPEED - 2 + * + * CLKDIV = CLKFULLDIV >> 1 + * CLOCKODD = CLKFULLDIV & 1 + * + * Where CLKDIV has a range of 0-255. + * + * NOTE: The primary use of this function is for cases where the clock + * frequencies are not known a priori and so HSMCI clock dividers must + * be determined dynamically. This is the case, for example, when we + * execute out of SDRAM. In that case, the clocking was set up by the + * bootloader that brought us into SDRAM and it is that bootloader that + * has configured the clocking. + * + * Input parameters: + * target - The target SD frequency + * + * Returned Value: + * A bitset containing the CLKDIV and CLKODD bits as needed to configure + * the HSMCI clock output. + * + ****************************************************************************/ + +uint32_t sam_hsmci_clkdiv(uint32_t target); + /**************************************************************************** * Name: sdio_mediachange * * Description: - * Called by board-specific logic -- posssible from an interrupt handler -- + * Called by board-specific logic -- possibly from an interrupt handler -- * in order to signal to the driver that a card has been inserted or * removed from the slot * diff --git a/arch/arm/src/sama5/sam_hsmci_clkdiv.c b/arch/arm/src/sama5/sam_hsmci_clkdiv.c new file mode 100755 index 0000000000..4ddba13e82 --- /dev/null +++ b/arch/arm/src/sama5/sam_hsmci_clkdiv.c @@ -0,0 +1,141 @@ +/**************************************************************************** + * arch/arm/src/sama5/sam_pmc.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * References: + * + * SAMA5D3 Series Data Sheet + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#include "chip.h" +#include "chip/sam_hsmci.h" +#include "sam_hsmci.h" + +#if defined(CONFIG_SAMA5_HSMCI0) || defined(CONFIG_SAMA5_HSMCI1) || \ + defined(CONFIG_SAMA5_HSMCI2) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: sam_hsmci_clkdiv + * + * Description: + * Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK) + * divided by (2*(CLKDIV) + CLOCKODD + 2). + * + * CLKFULLDIV = 2*CLKDIV + CLOCKODD; + * MCI_SPEED = MCK / (CLKFULLDIV + 2) + * CLKFULLDIV = MCK / MCI_SPEED - 2 + * + * CLKDIV = CLKFULLDIV >> 1 + * CLOCKODD = CLKFULLDIV & 1 + * + * Where CLKDIV has a range of 0-255. + * + * NOTE: The primary use of this function is for cases where the clock + * frequencies are not known a priori and so HSMCI clock dividers must + * be determined dynamically. This is the case, for example, when we + * execute out of SDRAM. In that case, the clocking was set up by the + * bootloader that brought us into SDRAM and it is that bootloader that + * has configured the clocking. + * + * Input parameters: + * target - The target SD frequency + * + * Returned Value: + * A bitset containing the CLKDIV and CLKODD bits as needed to configure + * the HSMCI clock output. + * + ****************************************************************************/ + +uint32_t sam_hsmci_clkdiv(uint32_t target) +{ + uint32_t clkfulldiv; + uint32_t ret; + + /* Get the largest divisor does not exceed the target value */ + + clkfulldiv = (BOARD_MCK_FREQUENCY + target - 1) / target; + + if (clkfulldiv > 2) + { + clkfulldiv -= 2; + } + else + { + clkfulldiv = 0; + } + + if (clkfulldiv > 511) + { + clkfulldiv = 511; + } + + ret = (clkfulldiv >> 1) << HSMCI_MR_CLKDIV_SHIFT; + if ((clkfulldiv & 1) != 0) + { + ret |= HSMCI_MR_CLKODD; + } + + return ret; +} + +#endif /* CONFIG_SAMA5_HSMCI0 || CONFIG_SAMA5_HSMCI1 || CONFIG_SAMA5_HSMCI2 */ diff --git a/arch/arm/src/sama5/sam_pmc.c b/arch/arm/src/sama5/sam_pmc.c index f9983ced0e..a6fcb7d454 100755 --- a/arch/arm/src/sama5/sam_pmc.c +++ b/arch/arm/src/sama5/sam_pmc.c @@ -286,57 +286,3 @@ uint32_t sam_mck_frequency(uint32_t mainclk) return mck / mdiv; } - -/************************************************************************************ - * Name: sam_hsmci_clkdiv - * - * Description: - * Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK) - * divided by (2*(CLKDIV) + CLOCKODD + 2). - * - * CLKFULLDIV = 2*CLKDIV + CLOCKODD; - * MCI_SPEED = MCK / (CLKFULLDIV + 2) - * CLKFULLDIV = MCK / MCI_SPEED - 2 - * - * CLKDIV = CLKFULLDIV >> 1 - * CLOCKODD = CLKFULLDIV & 1 - * - * Where CLKDIV has a range of 0-255. - * - * TODO: This belongs elsewhere - * - ************************************************************************************/ - -#ifdef CONFIG_ARCH_HAVE_SDIO -uint32_t sam_hsmci_clkdiv(uint32_t target) -{ - uint32_t clkfulldiv; - uint32_t ret; - - /* Get the largest divisor does not exceed the target value */ - - clkfulldiv = (BOARD_MCK_FREQUENCY + target - 1) / target; - - if (clkfulldiv > 2) - { - clkfulldiv -= 2; - } - else - { - clkfulldiv = 0; - } - - if (clkfulldiv > 511) - { - clkfulldiv = 511; - } - - ret = (clkfulldiv >> 1) << HSMCI_MR_CLKDIV_SHIFT; - if ((clkfulldiv & 1) != 0) - { - ret |= HSMCI_MR_CLKODD; - } - - return ret; -} -#endif diff --git a/arch/arm/src/sama5/sam_pmc.h b/arch/arm/src/sama5/sam_pmc.h index a562db754b..2ad35c3321 100644 --- a/arch/arm/src/sama5/sam_pmc.h +++ b/arch/arm/src/sama5/sam_pmc.h @@ -121,30 +121,6 @@ uint32_t sam_pck_frequency(uint32_t mainclk); uint32_t sam_mck_frequency(uint32_t mainclk); -/************************************************************************************ - * Name: sam_hsmci_clkdiv - * - * Description: - * Multimedia Card Interface clock (MCCK or MCI_CK) is Master Clock (MCK) - * divided by (2*(CLKDIV) + CLOCKODD + 2). - * - * CLKFULLDIV = 2*CLKDIV + CLOCKODD; - * MCI_SPEED = MCK / (CLKFULLDIV + 2) - * CLKFULLDIV = MCK / MCI_SPEED - 2 - * - * CLKDIV = CLKFULLDIV >> 1 - * CLOCKODD = CLKFULLDIV & 1 - * - * Where CLKDIV has a range of 0-255. - * - * TODO: This belongs elsewhere - * - ************************************************************************************/ - -#ifdef CONFIG_ARCH_HAVE_SDIO -uint32_t sam_hsmci_clkdiv(uint32_t target); -#endif - #undef EXTERN #if defined(__cplusplus) }