linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Vitaly Bordug <vitb@kernel.crashing.org>
To: Scott Wood <scottwood@freescale.com>
Cc: linuxppc-dev@ozlabs.org
Subject: Re: [PATCH 3/9] 8xx: Add pin and clock setting functions.
Date: Thu, 30 Aug 2007 01:38:33 +0400	[thread overview]
Message-ID: <20070830013833.4c4d5d0b@localhost.localdomain> (raw)
In-Reply-To: <20070828201719.GC24260@ld0162-tx32.am.freescale.net>

On Tue, 28 Aug 2007 15:17:19 -0500
Scott Wood wrote:

> These let board code set up pins and clocks without having to
> put magic numbers directly into the registers.
> 
I personally is not fond of such idea, but it would make this more understandable eases transfer to feature_call
or qe pin setting stuff (though the latter should be reworked at some point too imho).

> Signed-off-by: Scott Wood <scottwood@freescale.com>
> ---
>  arch/powerpc/sysdev/commproc.c |  201
> ++++++++++++++++++++++++++++++++++++++++
> include/asm-powerpc/commproc.h |   41 ++++++++ 2 files changed, 242
> insertions(+), 0 deletions(-)
> 
> diff --git a/arch/powerpc/sysdev/commproc.c
> b/arch/powerpc/sysdev/commproc.c index af26659..a21a292 100644
> --- a/arch/powerpc/sysdev/commproc.c
> +++ b/arch/powerpc/sysdev/commproc.c
> @@ -405,3 +405,204 @@ uint cpm_dpram_phys(u8 *addr)
>  	return (dpram_pbase + (uint)(addr - (u8 __force
> *)dpram_vbase)); }
>  EXPORT_SYMBOL(cpm_dpram_addr);
> +
> +struct cpm_ioport16 {
> +	__be16 dir, par, sor, dat, intr;
> +	__be16 res[3];
> +};
> +
Hmm. If we are using such a non-standard types, it worths at least explanation why...


> +struct cpm_ioport32 {
> +	__be32 dir, par, sor;
> +};
> +
> +static void cpm1_set_pin32(int port, int pin, int flags)
> +{
> +	struct cpm_ioport32 __iomem *iop;
> +	pin = 1 << (31 - pin);
> +
> +	if (port == 1)
Probably put here define or alike so that we wouldn't have confusion what 1/whatever port number does mean.
Or some comment explaining for PQ newcomer what's going on here. ditto below.

> +		iop = (struct cpm_ioport32 __iomem *)
> +		      &mpc8xx_immr->im_cpm.cp_pbdir;
> +	else
> +		iop = (struct cpm_ioport32 __iomem *)
> +		      &mpc8xx_immr->im_cpm.cp_pedir;
> +
> +	if (flags & CPM_PIN_OUTPUT)
> +		setbits32(&iop->dir, pin);
> +	else
> +		clrbits32(&iop->dir, pin);
> +
> +	if (!(flags & CPM_PIN_GPIO))
> +		setbits32(&iop->par, pin);
> +	else
> +		clrbits32(&iop->par, pin);
> +
> +	if (port == 4) {
> +		if (flags & CPM_PIN_SECONDARY)
> +			setbits32(&iop->sor, pin);
> +		else
> +			clrbits32(&iop->sor, pin);
> +
> +		if (flags & CPM_PIN_OPENDRAIN)
> +			setbits32(&mpc8xx_immr->im_cpm.cp_peodr,
> pin);
> +		else
> +			clrbits32(&mpc8xx_immr->im_cpm.cp_peodr,
> pin);
> +	}
> +}
> +
> +static void cpm1_set_pin16(int port, int pin, int flags)
> +{
> +	struct cpm_ioport16 __iomem *iop =
> +		(struct cpm_ioport16 __iomem
> *)&mpc8xx_immr->im_ioport; +
> +	pin = 1 << (15 - pin);
> +
> +	if (port != 0)
> +		iop += port - 1;
> +
> +	if (flags & CPM_PIN_OUTPUT)
> +		setbits16(&iop->dir, pin);
> +	else
> +		clrbits16(&iop->dir, pin);
> +
> +	if (!(flags & CPM_PIN_GPIO))
> +		setbits16(&iop->par, pin);
> +	else
> +		clrbits16(&iop->par, pin);
> +
> +	if (port == 2) {
> +		if (flags & CPM_PIN_SECONDARY)
> +			setbits16(&iop->sor, pin);
> +		else
> +			clrbits16(&iop->sor, pin);
> +	}
> +}
> +
> +void cpm1_set_pin(int port, int pin, int flags)
> +{
> +	if (port == 1 || port == 4)
> +		cpm1_set_pin32(port, pin, flags);
> +	else
> +		cpm1_set_pin16(port, pin, flags);
> +}
> +
> +int cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode)
> +{
> +	int shift;
> +	int i, bits = 0;
> +	u32 __iomem *reg;
> +	u32 mask = 7;
> +
gotta at least briefly explain the clue here, too. We're adding helper functions and should be ready that something somewhere
won't work as expected.

> +	u8 clk_map[][3] = {
> +		{CPM_CLK_SCC1, CPM_BRG1, 0},
> +		{CPM_CLK_SCC1, CPM_BRG2, 1},
> +		{CPM_CLK_SCC1, CPM_BRG3, 2},
> +		{CPM_CLK_SCC1, CPM_BRG4, 3},
> +		{CPM_CLK_SCC1, CPM_CLK1, 4},
> +		{CPM_CLK_SCC1, CPM_CLK2, 5},
> +		{CPM_CLK_SCC1, CPM_CLK3, 6},
> +		{CPM_CLK_SCC1, CPM_CLK4, 7},
> +
> +		{CPM_CLK_SCC2, CPM_BRG1, 0},
> +		{CPM_CLK_SCC2, CPM_BRG2, 1},
> +		{CPM_CLK_SCC2, CPM_BRG3, 2},
> +		{CPM_CLK_SCC2, CPM_BRG4, 3},
> +		{CPM_CLK_SCC2, CPM_CLK1, 4},
> +		{CPM_CLK_SCC2, CPM_CLK2, 5},
> +		{CPM_CLK_SCC2, CPM_CLK3, 6},
> +		{CPM_CLK_SCC2, CPM_CLK4, 7},
> +
> +		{CPM_CLK_SCC3, CPM_BRG1, 0},
> +		{CPM_CLK_SCC3, CPM_BRG2, 1},
> +		{CPM_CLK_SCC3, CPM_BRG3, 2},
> +		{CPM_CLK_SCC3, CPM_BRG4, 3},
> +		{CPM_CLK_SCC3, CPM_CLK5, 4},
> +		{CPM_CLK_SCC3, CPM_CLK6, 5},
> +		{CPM_CLK_SCC3, CPM_CLK7, 6},
> +		{CPM_CLK_SCC3, CPM_CLK8, 7},
> +
> +		{CPM_CLK_SCC4, CPM_BRG1, 0},
> +		{CPM_CLK_SCC4, CPM_BRG2, 1},
> +		{CPM_CLK_SCC4, CPM_BRG3, 2},
> +		{CPM_CLK_SCC4, CPM_BRG4, 3},
> +		{CPM_CLK_SCC4, CPM_CLK5, 4},
> +		{CPM_CLK_SCC4, CPM_CLK6, 5},
> +		{CPM_CLK_SCC4, CPM_CLK7, 6},
> +		{CPM_CLK_SCC4, CPM_CLK8, 7},
> +
> +		{CPM_CLK_SMC1, CPM_BRG1, 0},
> +		{CPM_CLK_SMC1, CPM_BRG2, 1},
> +		{CPM_CLK_SMC1, CPM_BRG3, 2},
> +		{CPM_CLK_SMC1, CPM_BRG4, 3},
> +		{CPM_CLK_SMC1, CPM_CLK1, 4},
> +		{CPM_CLK_SMC1, CPM_CLK2, 5},
> +		{CPM_CLK_SMC1, CPM_CLK3, 6},
> +		{CPM_CLK_SMC1, CPM_CLK4, 7},
> +
> +		{CPM_CLK_SMC2, CPM_BRG1, 0},
> +		{CPM_CLK_SMC2, CPM_BRG2, 1},
> +		{CPM_CLK_SMC2, CPM_BRG3, 2},
> +		{CPM_CLK_SMC2, CPM_BRG4, 3},
> +		{CPM_CLK_SMC2, CPM_CLK5, 4},
> +		{CPM_CLK_SMC2, CPM_CLK6, 5},
> +		{CPM_CLK_SMC2, CPM_CLK7, 6},
> +		{CPM_CLK_SMC2, CPM_CLK8, 7},
> +	};
> +
> +	switch (target) {
> +	case CPM_CLK_SCC1:
> +		reg = &mpc8xx_immr->im_cpm.cp_sicr;
> +		shift = 0;
> +		break;
> +
> +	case CPM_CLK_SCC2:
> +		reg = &mpc8xx_immr->im_cpm.cp_sicr;
> +		shift = 8;
> +		break;
> +
> +	case CPM_CLK_SCC3:
> +		reg = &mpc8xx_immr->im_cpm.cp_sicr;
> +		shift = 16;
> +		break;
> +
> +	case CPM_CLK_SCC4:
> +		reg = &mpc8xx_immr->im_cpm.cp_sicr;
> +		shift = 24;
> +		break;
> +
> +	case CPM_CLK_SMC1:
> +		reg = &mpc8xx_immr->im_cpm.cp_simode;
> +		shift = 12;
> +		break;
> +
> +	case CPM_CLK_SMC2:
> +		reg = &mpc8xx_immr->im_cpm.cp_simode;
> +		shift = 28;
> +		break;
> +
> +	default:
> +		printk(KERN_ERR "cpm1_clock_setup: invalid clock
> target\n");
> +		return -EINVAL;
> +	}
> +
> +	if (reg == &mpc8xx_immr->im_cpm.cp_sicr && mode ==
> CPM_CLK_RX)
> +		shift += 3;
> +
> +	for (i = 0; i < ARRAY_SIZE(clk_map); i++) {
> +		if (clk_map[i][0] == target && clk_map[i][1] ==
> clock) {
> +			bits = clk_map[i][2];
> +			break;
> +		}
> +	}
> +
> +	if (i == ARRAY_SIZE(clk_map)) {
> +		printk(KERN_ERR "cpm1_clock_setup: invalid clock
> combination\n");
> +		return -EINVAL;
> +	}
> +
> +	bits <<= shift;
> +	mask <<= shift;
> +	out_be32(reg, (in_be32(reg) & ~mask) | bits);
> +
> +	return 0;
> +}
> diff --git a/include/asm-powerpc/commproc.h
> b/include/asm-powerpc/commproc.h index ccb32cd..a95a434 100644
> --- a/include/asm-powerpc/commproc.h
> +++ b/include/asm-powerpc/commproc.h
> @@ -692,4 +692,45 @@ extern void cpm_free_handler(int vec);
>  #define IMAP_ADDR		(get_immrbase())
>  #define IMAP_SIZE		((uint)(64 * 1024))
>  
Pull from the dts?

> +#define CPM_PIN_INPUT     0
> +#define CPM_PIN_OUTPUT    1
> +#define CPM_PIN_PRIMARY   0
> +#define CPM_PIN_SECONDARY 2
> +#define CPM_PIN_GPIO      4
> +#define CPM_PIN_OPENDRAIN 8
> +
> +void cpm1_set_pin(int port, int pin, int flags);
> +
> +enum cpm_clk_dir {
> +	CPM_CLK_RX,
> +	CPM_CLK_TX,
> +	CPM_CLK_RTX
> +};
> +
> +enum cpm_clk_target {
> +	CPM_CLK_SCC1,
> +	CPM_CLK_SCC2,
> +	CPM_CLK_SCC3,
> +	CPM_CLK_SCC4,
> +	CPM_CLK_SMC1,
> +	CPM_CLK_SMC2,
> +};
> +
> +enum cpm_clk {
> +	CPM_BRG1,	/* Baud Rate Generator  1 */
> +	CPM_BRG2,	/* Baud Rate Generator  2 */
> +	CPM_BRG3,	/* Baud Rate Generator  3 */
> +	CPM_BRG4,	/* Baud Rate Generator  4 */
> +	CPM_CLK1,	/* Clock  1 */
> +	CPM_CLK2,	/* Clock  2 */
> +	CPM_CLK3,	/* Clock  3 */
> +	CPM_CLK4,	/* Clock  4 */
> +	CPM_CLK5,	/* Clock  5 */
> +	CPM_CLK6,	/* Clock  6 */
> +	CPM_CLK7,	/* Clock  7 */
> +	CPM_CLK8,	/* Clock  8 */
> +};
> +
> +int cpm1_clk_setup(enum cpm_clk_target target, int clock, int mode);
> +
>  #endif /* __CPM_8XX__ */


-- 
Sincerely, Vitaly

  reply	other threads:[~2007-08-30 20:08 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-28 20:11 [PATCH v3 1/8] Generic bitbanged MDIO library Scott Wood
2007-08-28 20:14 ` [PATCH v3 2/8] fs_enet: Whitespace cleanup Scott Wood
2007-08-28 20:14 ` [PATCH v3 3/8] fs_enet: Include linux/string.h from linux/fs_enet_pd.h Scott Wood
2007-08-28 20:14 ` [PATCH v3 4/8] fs_enet: Don't share the interrupt Scott Wood
2007-08-28 20:14 ` [PATCH v3 5/8] fs_enet: mac-fcc: Eliminate __fcc-* macros Scott Wood
2007-08-28 20:14 ` [PATCH v3 6/8] fs_enet: Align receive buffers Scott Wood
2007-08-28 20:14 ` [PATCH v3 7/8] fs_enet: Be an of_platform device when CONFIG_PPC_CPM_NEW_BINDING is set Scott Wood
2007-08-28 20:14 ` [PATCH v3 8/8] fs_enet: sparse fixes Scott Wood
2007-08-28 20:16 ` [PATCH 1/3] fsl_soc.c cleanup Scott Wood
2007-08-29  5:30   ` David Gibson
2007-09-11  5:35   ` Kumar Gala
2007-09-11 13:57     ` Scott Wood
2007-09-11 15:48       ` Kumar Gala
2007-09-11 15:51         ` Scott Wood
2007-09-11 16:22           ` Kumar Gala
2007-09-11 16:24             ` Scott Wood
2007-09-11 16:45               ` SOC registers/immr determination from device tree (was Re: [PATCH 1/3] fsl_soc.c cleanup) Kumar Gala
2007-09-11 17:03                 ` Scott Wood
2007-09-11 17:08                   ` Josh Boyer
2007-09-11 17:54                   ` Kumar Gala
2007-08-28 20:16 ` [PATCH 2/3] Introduce new CPM device bindings Scott Wood
2007-08-29  5:39   ` David Gibson
2007-08-29 13:58     ` Scott Wood
2007-08-30  0:55       ` David Gibson
2007-08-30  5:48         ` Scott Wood
2007-08-30  5:58           ` David Gibson
2007-08-30 14:10             ` Scott Wood
2007-08-31  2:48               ` David Gibson
2007-08-28 20:16 ` [PATCH 3/3] Add early debug console for CPM serial ports Scott Wood
2007-08-29  5:45   ` David Gibson
2007-08-29 14:02     ` Scott Wood
2007-08-29 19:58       ` Scott Wood
2007-08-30  0:58         ` David Gibson
2007-08-30  0:57       ` David Gibson
2007-08-28 20:16 ` [PATCH 1/4] ppc: Add clrbits8 and setbits8 Scott Wood
2007-08-28 20:16 ` [PATCH 2/4] cpm_uart: Be an of_platform device when CONFIG_PPC_CPM_NEW_BINDING is set Scott Wood
2007-08-28 20:16 ` [PATCH 3/4] cpm_uart: sparse fixes Scott Wood
2007-08-28 20:16 ` [PATCH 4/4] cpm_uart: Issue STOP_TX command before initializing console Scott Wood
2007-08-28 20:17 ` [PATCH 1/9] 8xx: Fix CONFIG_PIN_TLB Scott Wood
2007-08-29 21:09   ` Vitaly Bordug
2007-08-28 20:17 ` [PATCH 2/9] 8xx: Infrastructure code cleanup Scott Wood
2007-09-13  7:11   ` David Gibson
2007-09-13  8:16     ` Vitaly Bordug
2007-09-14  4:09       ` David Gibson
2007-09-14  8:21         ` Vitaly Bordug
2007-09-15  2:25           ` David Gibson
2007-09-13 14:40     ` Scott Wood
2007-08-28 20:17 ` [PATCH 3/9] 8xx: Add pin and clock setting functions Scott Wood
2007-08-29 21:38   ` Vitaly Bordug [this message]
2007-08-31 20:44     ` Scott Wood
2007-09-05  7:39       ` Vitaly Bordug
2007-09-05 17:37         ` Scott Wood
2007-08-28 20:17 ` [PATCH 4/9] 8xx: Work around CPU15 erratum Scott Wood
2007-08-28 20:17 ` [PATCH 5/9] 8xx: Don't call non-existent Soft_emulate_8xx from SoftwareEmulation Scott Wood
2007-08-28 20:17 ` [PATCH 6/9] 8xx: Set initial memory limit John Traill
2007-08-28 20:19 ` Scott Wood
2007-08-28 20:19 ` [PATCH 7/9] 8xx: mpc885ads cleanup Scott Wood
2007-08-29 22:03   ` Vitaly Bordug
2007-08-28 20:19 ` [PATCH 8/9] 8xx: Embedded Planet EP88xC support Scott Wood
2007-08-28 20:19 ` [PATCH 9/9] 8xx: Adder 875 support Scott Wood
2007-08-28 20:19 ` [PATCH 1/9] cpm2: Infrastructure code cleanup Scott Wood
2007-08-28 20:19 ` [PATCH 2/9] cpm2: Fix off-by-one error in setbrg() Scott Wood
2007-08-29 22:09   ` Vitaly Bordug
2007-08-30 20:13     ` Scott Wood
2007-08-30 21:52       ` Vitaly Bordug
2007-08-28 20:19 ` [PATCH 3/9] cpm2: Add SCCs to cpm2_clk_setup(), and cpm2_smc_clk_setup() Scott Wood
2007-08-29 22:25   ` Vitaly Bordug
2007-08-30 20:15     ` Scott Wood
2007-09-04 20:43       ` Vitaly Bordug
2007-08-28 20:19 ` [PATCH 4/9] cpm2: Add cpm2_set_pin() Scott Wood
2007-09-04 20:51   ` Vitaly Bordug
2007-08-28 20:19 ` [PATCH 5/9] mpc82xx: Remove a bunch of cruft that duplicates generic functionality Scott Wood
2007-08-28 20:19 ` [PATCH 6/9] mpc82xx: Rename mpc82xx_ads to mpc8272_ads Scott Wood
2007-08-29  5:55   ` David Gibson
2007-08-28 20:19 ` [PATCH 7/9] mpc8272ads: Change references from 82xx_ADS to 8272_ADS Scott Wood
2007-08-28 20:19 ` [PATCH 8/9] mpc82xx: Update mpc8272ads, and factor out PCI and reset Scott Wood
2007-08-29 22:41   ` Kumar Gala
2007-08-30  5:56     ` Scott Wood
2007-08-30 14:56       ` Kumar Gala
2007-08-30 15:17         ` Scott Wood
2007-08-28 20:19 ` [PATCH 9/9] mpc82xx: Add pq2fads board support Scott Wood
  -- strict thread matches above, loose matches on Subject: below --
2007-09-05 19:27 [PATCH 1/9] 8xx: Fix CONFIG_PIN_TLB Scott Wood
2007-09-05 19:27 ` [PATCH 3/9] 8xx: Add pin and clock setting functions Scott Wood

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070830013833.4c4d5d0b@localhost.localdomain \
    --to=vitb@kernel.crashing.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=scottwood@freescale.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).