Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dddb8d31 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Kumar Gala
Browse files

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: default avatarLaurent Pinchart <laurentp@cse-semaphore.com>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
parent e517881e
Loading
Loading
Loading
Loading
+4 −30
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+33 −13
Original line number Original line Diff line number Diff line
@@ -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)