All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.