public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Nick Thompson <nick.thompson@gefanuc.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] Davinci: add a pin multiplexer configuration API
Date: Thu, 29 Oct 2009 15:38:18 +0000	[thread overview]
Message-ID: <4AE9B6EA.9080206@gefanuc.com> (raw)

Davinci: add a pin multiplexer configuration API.

Creates a method allowing pin settings to be logically grouped into data
structure arrays and provids an API to configure the PINMUX settings to
enable the relevant pin functions.

Signed-off-by: Nick Thompson <nick.thompson@gefanuc.com>
---
Applies to: u-boot-ti

The PINMUXn definitions are already present in hardware.h.

The number of PINMUX fields per register and the width of the fields
needs to be set per SoC. The initial settings are appropriate for at least
DA8xx devices. These should be modified in misc.h to support other devices
as required.

 board/davinci/common/misc.c |   46 ++++++++++++++++++++++++++++++++++++++++++-
 board/davinci/common/misc.h |   12 +++++++++++
 2 files changed, 57 insertions(+), 1 deletions(-)

diff --git a/board/davinci/common/misc.c b/board/davinci/common/misc.c
index ffdc20b..d462d65 100644
--- a/board/davinci/common/misc.c
+++ b/board/davinci/common/misc.c
@@ -1,6 +1,7 @@
 /*
  * Miscelaneous DaVinci functions.
  *
+ * Copyright (C) 2009 Nick Thompson, GE Fanuc Ltd, <nick.thompson@gefanuc.com>
  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
  * Copyright (C) 2008 Lyrtech <www.lyrtech.com>
  * Copyright (C) 2004 Texas Instruments.
@@ -27,7 +28,8 @@
 #include <i2c.h>
 #include <net.h>
 #include <asm/arch/hardware.h>
-
+#include <asm/io.h>
+#include "misc.h"

 DECLARE_GLOBAL_DATA_PTR;

@@ -109,3 +111,45 @@ void dv_configure_mac_address(uint8_t *rom_enetaddr)
 }

 #endif	/* DAVINCI_EMAC */
+
+/*
+ * Change the setting of a pin multiplexer field.
+ *
+ * Takes an array of pinmux settings similar to:
+ *
+ * struct pinmux_config uart_pins[] = {
+ *	{ PINMUX8, 2, 7 },
+ *	{ PINMUX9, 2, 0 }
+ * };
+ *
+ * Stepping through the array, each PINMUXn register has the given value
+ * set in the pin mux field specified.
+ *
+ * The number of pins in the array must be passed (ARRAY_SIZE can provide
+ * this value conveniently).
+ *
+ * Returns 0 if all field numbers and values are in the correct range,
+ * else returns -1.
+ */
+int davinci_configure_pin_mux(const struct pinmux_config *pins, int n_pins)
+{
+	int i;
+
+	for (i = 0; i < n_pins; i++) {
+		int value = pins[i].value;
+		int field = pins[i].field;
+
+		if (field < PIN_MUX_NUM_FIELDS &&
+			(value & ~PIN_MUX_FIELD_MASK) == 0) {
+			int offset = field * PIN_MUX_FIELD_SIZE;
+			unsigned int mux = pins[i].mux;
+			unsigned int mask = PIN_MUX_FIELD_MASK << offset;
+			value <<= offset;
+			writel(value | (readl(mux) & (~mask)), mux);
+		} else {
+			return -1;
+		}
+	}
+
+	return 0;
+}
diff --git a/board/davinci/common/misc.h b/board/davinci/common/misc.h
index dc3cc41..f6d8b1b 100644
--- a/board/davinci/common/misc.h
+++ b/board/davinci/common/misc.h
@@ -22,8 +22,20 @@
 #ifndef __MISC_H
 #define __MISC_H

+/* pin muxer definitions */
+#define PIN_MUX_NUM_FIELDS	8	/* Per register */
+#define PIN_MUX_FIELD_SIZE	4	/* n in bits */
+#define PIN_MUX_FIELD_MASK	((1 << PIN_MUX_FIELD_SIZE) - 1)
+
+/* pin definition */
+struct pinmux_config {
+	dv_reg		*mux;		/* Address of mux register */
+	unsigned char	value;		/* Value to set in field */
+	unsigned char	field;		/* field number */
+};

 int dvevm_read_mac_address(uint8_t *buf);
 void dv_configure_mac_address(uint8_t *rom_enetaddr);
+int davinci_configure_pin_mux(const struct pinmux_config *pins, int n_pins);

 #endif /* __MISC_H */

             reply	other threads:[~2009-10-29 15:38 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-29 15:38 Nick Thompson [this message]
2009-10-29 23:23 ` [U-Boot] [PATCH] Davinci: add a pin multiplexer configuration API Kim Phillips
2009-10-30  8:26   ` Wolfgang Denk
2009-10-30 14:56     ` Kim Phillips
2009-10-30 15:17       ` Thompson, Nick (GE EntSol, Intelligent Platforms)
2009-10-30 16:30         ` Kim Phillips

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=4AE9B6EA.9080206@gefanuc.com \
    --to=nick.thompson@gefanuc.com \
    --cc=u-boot@lists.denx.de \
    /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