cpm2: Rework baud rate generators configuration to support external clocks.
The CPM2 BRG setup functions cpm_setbrg and cpm2_fastbrg don't support external clocks. This patch adds a new exported __cpm2_setbrg function that takes the clock rate and clock source as extra parameters, and moves cpm_setbrg and cpm2_fastbrg to include/asm-powerpc/cpm2.h where they become inline wrappers around __cpm2_setbrg. Signed-off-by: Laurent Pinchart <laurentp@cse-semaphore.com> Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
This commit is contained in:
committed by
Kumar Gala
parent
e517881e42
commit
dddb8d3111
@@ -115,16 +115,10 @@ EXPORT_SYMBOL(cpm_command);
|
|||||||
* Baud rate clocks are zero-based in the driver code (as that maps
|
* Baud rate clocks are zero-based in the driver code (as that maps
|
||||||
* to port numbers). Documentation uses 1-based numbering.
|
* to port numbers). Documentation uses 1-based numbering.
|
||||||
*/
|
*/
|
||||||
#define BRG_INT_CLK (get_brgfreq())
|
void __cpm2_setbrg(uint brg, uint rate, uint clk, int div16, int src)
|
||||||
#define BRG_UART_CLK (BRG_INT_CLK/16)
|
|
||||||
|
|
||||||
/* This function is used by UARTS, or anything else that uses a 16x
|
|
||||||
* oversampled clock.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cpm_setbrg(uint brg, uint rate)
|
|
||||||
{
|
{
|
||||||
u32 __iomem *bp;
|
u32 __iomem *bp;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
/* This is good enough to get SMCs running.....
|
/* This is good enough to get SMCs running.....
|
||||||
*/
|
*/
|
||||||
@@ -135,34 +129,14 @@ cpm_setbrg(uint brg, uint rate)
|
|||||||
brg -= 4;
|
brg -= 4;
|
||||||
}
|
}
|
||||||
bp += brg;
|
bp += brg;
|
||||||
out_be32(bp, (((BRG_UART_CLK / rate) - 1) << 1) | CPM_BRG_EN);
|
val = (((clk / rate) - 1) << 1) | CPM_BRG_EN | src;
|
||||||
|
|
||||||
cpm2_unmap(bp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is used to set high speed synchronous baud rate
|
|
||||||
* clocks.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
cpm2_fastbrg(uint brg, uint rate, int div16)
|
|
||||||
{
|
|
||||||
u32 __iomem *bp;
|
|
||||||
u32 val;
|
|
||||||
|
|
||||||
if (brg < 4) {
|
|
||||||
bp = cpm2_map_size(im_brgc1, 16);
|
|
||||||
} else {
|
|
||||||
bp = cpm2_map_size(im_brgc5, 16);
|
|
||||||
brg -= 4;
|
|
||||||
}
|
|
||||||
bp += brg;
|
|
||||||
val = ((BRG_INT_CLK / rate) << 1) | CPM_BRG_EN;
|
|
||||||
if (div16)
|
if (div16)
|
||||||
val |= CPM_BRG_DIV16;
|
val |= CPM_BRG_DIV16;
|
||||||
|
|
||||||
out_be32(bp, val);
|
out_be32(bp, val);
|
||||||
cpm2_unmap(bp);
|
cpm2_unmap(bp);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(__cpm2_setbrg);
|
||||||
|
|
||||||
int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
|
int cpm2_clk_setup(enum cpm_clk_target target, int clock, int mode)
|
||||||
{
|
{
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include <asm/immap_cpm2.h>
|
#include <asm/immap_cpm2.h>
|
||||||
#include <asm/cpm.h>
|
#include <asm/cpm.h>
|
||||||
|
#include <sysdev/fsl_soc.h>
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_85xx
|
#ifdef CONFIG_PPC_85xx
|
||||||
#define CPM_MAP_ADDR (get_immrbase() + 0x80000)
|
#define CPM_MAP_ADDR (get_immrbase() + 0x80000)
|
||||||
@@ -93,10 +94,40 @@ extern cpm_cpm2_t __iomem *cpmp; /* Pointer to comm processor */
|
|||||||
#define cpm_dpfree cpm_muram_free
|
#define cpm_dpfree cpm_muram_free
|
||||||
#define cpm_dpram_addr cpm_muram_addr
|
#define cpm_dpram_addr cpm_muram_addr
|
||||||
|
|
||||||
extern void cpm_setbrg(uint brg, uint rate);
|
|
||||||
extern void cpm2_fastbrg(uint brg, uint rate, int div16);
|
|
||||||
extern void cpm2_reset(void);
|
extern void cpm2_reset(void);
|
||||||
|
|
||||||
|
/* Baud rate generators.
|
||||||
|
*/
|
||||||
|
#define CPM_BRG_RST ((uint)0x00020000)
|
||||||
|
#define CPM_BRG_EN ((uint)0x00010000)
|
||||||
|
#define CPM_BRG_EXTC_INT ((uint)0x00000000)
|
||||||
|
#define CPM_BRG_EXTC_CLK3_9 ((uint)0x00004000)
|
||||||
|
#define CPM_BRG_EXTC_CLK5_15 ((uint)0x00008000)
|
||||||
|
#define CPM_BRG_ATB ((uint)0x00002000)
|
||||||
|
#define CPM_BRG_CD_MASK ((uint)0x00001ffe)
|
||||||
|
#define CPM_BRG_DIV16 ((uint)0x00000001)
|
||||||
|
|
||||||
|
#define CPM2_BRG_INT_CLK (get_brgfreq())
|
||||||
|
#define CPM2_BRG_UART_CLK (CPM2_BRG_INT_CLK/16)
|
||||||
|
|
||||||
|
extern void __cpm2_setbrg(uint brg, uint rate, uint clk, int div16, int src);
|
||||||
|
|
||||||
|
/* This function is used by UARTS, or anything else that uses a 16x
|
||||||
|
* oversampled clock.
|
||||||
|
*/
|
||||||
|
static inline void cpm_setbrg(uint brg, uint rate)
|
||||||
|
{
|
||||||
|
__cpm2_setbrg(brg, rate, CPM2_BRG_UART_CLK, 0, CPM_BRG_EXTC_INT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function is used to set high speed synchronous baud rate
|
||||||
|
* clocks.
|
||||||
|
*/
|
||||||
|
static inline void cpm2_fastbrg(uint brg, uint rate, int div16)
|
||||||
|
{
|
||||||
|
__cpm2_setbrg(brg, rate, CPM2_BRG_INT_CLK, div16, CPM_BRG_EXTC_INT);
|
||||||
|
}
|
||||||
|
|
||||||
/* Function code bits, usually generic to devices.
|
/* Function code bits, usually generic to devices.
|
||||||
*/
|
*/
|
||||||
#define CPMFCR_GBL ((u_char)0x20) /* Set memory snooping */
|
#define CPMFCR_GBL ((u_char)0x20) /* Set memory snooping */
|
||||||
@@ -195,17 +226,6 @@ typedef struct smc_uart {
|
|||||||
#define SMCM_TX ((unsigned char)0x02)
|
#define SMCM_TX ((unsigned char)0x02)
|
||||||
#define SMCM_RX ((unsigned char)0x01)
|
#define SMCM_RX ((unsigned char)0x01)
|
||||||
|
|
||||||
/* Baud rate generators.
|
|
||||||
*/
|
|
||||||
#define CPM_BRG_RST ((uint)0x00020000)
|
|
||||||
#define CPM_BRG_EN ((uint)0x00010000)
|
|
||||||
#define CPM_BRG_EXTC_INT ((uint)0x00000000)
|
|
||||||
#define CPM_BRG_EXTC_CLK3_9 ((uint)0x00004000)
|
|
||||||
#define CPM_BRG_EXTC_CLK5_15 ((uint)0x00008000)
|
|
||||||
#define CPM_BRG_ATB ((uint)0x00002000)
|
|
||||||
#define CPM_BRG_CD_MASK ((uint)0x00001ffe)
|
|
||||||
#define CPM_BRG_DIV16 ((uint)0x00000001)
|
|
||||||
|
|
||||||
/* SCCs.
|
/* SCCs.
|
||||||
*/
|
*/
|
||||||
#define SCC_GSMRH_IRP ((uint)0x00040000)
|
#define SCC_GSMRH_IRP ((uint)0x00040000)
|
||||||
|
Reference in New Issue
Block a user