From: Alexey Galakhov <agalakhov@gmail.com>
To: barebox@lists.infradead.org
Cc: Alexey Galakhov <agalakhov@gmail.com>
Subject: [PATCH 1/9] Support most Samsung SoCs in S3C serial driver
Date: Sun, 13 May 2012 18:39:58 +0600 [thread overview]
Message-ID: <1336912806-4163-2-git-send-email-agalakhov@gmail.com> (raw)
In-Reply-To: <1336912806-4163-1-git-send-email-agalakhov@gmail.com>
Signed-off-by: Alexey Galakhov <agalakhov@gmail.com>
---
arch/arm/mach-samsung/include/mach/s3c-generic.h | 4 ++
arch/arm/mach-samsung/s3c24xx-clocks.c | 17 +++++++
drivers/serial/serial_s3c.c | 55 +++++++++++++++-------
3 files changed, 59 insertions(+), 17 deletions(-)
diff --git a/arch/arm/mach-samsung/include/mach/s3c-generic.h b/arch/arm/mach-samsung/include/mach/s3c-generic.h
index 4ea3dd7..5d3808e 100644
--- a/arch/arm/mach-samsung/include/mach/s3c-generic.h
+++ b/arch/arm/mach-samsung/include/mach/s3c-generic.h
@@ -30,5 +30,9 @@ uint32_t s3c_get_fclk(void);
uint32_t s3c_get_hclk(void);
uint32_t s3c_get_pclk(void);
uint32_t s3c_get_uclk(void);
+
+unsigned s3c_get_uart_clk(unsigned src);
+
uint32_t s3c24xx_get_memory_size(void);
+
void s3c24xx_disable_second_sdram_bank(void);
diff --git a/arch/arm/mach-samsung/s3c24xx-clocks.c b/arch/arm/mach-samsung/s3c24xx-clocks.c
index a99d1b9..38d8b75 100644
--- a/arch/arm/mach-samsung/s3c24xx-clocks.c
+++ b/arch/arm/mach-samsung/s3c24xx-clocks.c
@@ -117,6 +117,23 @@ uint32_t s3c24_get_uclk(void)
return s3c_get_upllclk();
}
+/**
+ * Return correct UART frequency based on the UCON register
+ */
+unsigned s3c_get_uart_clk(unsigned src)
+{
+ switch (src & 3) {
+ case 0:
+ case 2:
+ return s3c_get_pclk();
+ case 1:
+ return 0; /* TODO UEXTCLK */
+ case 3:
+ return 0; /* TODO FCLK/n */
+ }
+ return 0; /* not reached, to make compiler happy */
+}
+
/**
* Show the user the current clock settings
*/
diff --git a/drivers/serial/serial_s3c.c b/drivers/serial/serial_s3c.c
index 2bdc1df..7a9b355 100644
--- a/drivers/serial/serial_s3c.c
+++ b/drivers/serial/serial_s3c.c
@@ -40,6 +40,17 @@
#define UTXH 0x20 /* transmitt */
#define URXH 0x24 /* receive */
#define UBRDIV 0x28 /* baudrate generator */
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+# define UBRDIVSLOT 0x2c /* baudrate slot generator */
+#endif
+#ifdef S3C_UART_HAS_UINTM
+# define UINTM 0x38 /* interrupt mask register */
+#endif
+
+#ifndef S3C_UART_CLKSEL
+/* Use pclk */
+# define S3C_UART_CLKSEL 0
+#endif
struct s3c_uart {
void __iomem *regs;
@@ -51,26 +62,32 @@ struct s3c_uart {
static unsigned s3c_get_arch_uart_input_clock(void __iomem *base)
{
unsigned reg = readw(base + UCON);
-
- switch (reg & 0xc00) {
- case 0x000:
- case 0x800:
- return s3c_get_pclk();
- case 0x400:
- break; /* TODO UEXTCLK */
- case 0xc00:
- break; /* TODO FCLK/n */
- }
-
- return 0; /* not nice, but we can't emit an error message! */
+ reg = (reg >> 10) & 0x3;
+ return s3c_get_uart_clk(reg);
}
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+/*
+ * This table takes the fractional value of the baud divisor and gives
+ * the recommended setting for the UDIVSLOT register. Refer the datasheet
+ * for further details
+ */
+static const uint16_t udivslot_table[] __maybe_unused = {
+ 0x0000, 0x0080, 0x0808, 0x0888, 0x2222, 0x4924, 0x4A52, 0x54AA,
+ 0x5555, 0xD555, 0xD5D5, 0xDDD5, 0xDDDD, 0xDFDD, 0xDFDF, 0xFFDF,
+};
+#endif
+
static int s3c_serial_setbaudrate(struct console_device *cdev, int baudrate)
{
struct s3c_uart *priv = to_s3c_uart(cdev);
void __iomem *base = priv->regs;
unsigned val;
+#ifdef S3C_UART_HAS_UBRDIVSLOT
+ val = s3c_get_arch_uart_input_clock(base) / baudrate;
+ writew(udivslot_table[val & 15], base + UBRDIVSLOT);
+#endif
val = s3c_get_arch_uart_input_clock(base) / (16 * baudrate) - 1;
writew(val, base + UBRDIV);
@@ -88,11 +105,15 @@ static int s3c_serial_init_port(struct console_device *cdev)
/* Normal,No parity,1 stop,8 bit */
writeb(0x03, base + ULCON);
- /*
- * tx=level,rx=edge,disable timeout int.,enable rx error int.,
- * normal,interrupt or polling
- */
- writew(0x0245, base + UCON);
+
+ /* tx=level,rx=edge,disable timeout int.,enable rx error int.,
+ * normal, interrupt or polling, no pre-divider */
+ writew(0x0245 | ((S3C_UART_CLKSEL) << 10), base + UCON);
+
+#ifdef S3C_UART_HAS_UINTM
+ /* 'interrupt or polling mode' for both directions */
+ writeb(0xf, base + UINTM);
+#endif
#ifdef CONFIG_DRIVER_SERIAL_S3C_AUTOSYNC
writeb(0x10, base + UMCON); /* enable auto flow control */
--
1.7.10
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2012-05-13 12:40 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-12 16:23 [Pull request] Minimal S5PV210 support Alexey Galakhov
2012-05-13 9:09 ` Sascha Hauer
2012-05-13 12:39 ` [PATCH 0/9] " Alexey Galakhov
2012-05-13 12:39 ` Alexey Galakhov [this message]
2012-05-13 12:39 ` [PATCH 2/9] Fine split S3C arch dependencies from generic code Alexey Galakhov
2012-05-14 8:03 ` Juergen Beisert
2012-05-14 8:54 ` Alexey Galakhov
2012-05-14 8:57 ` Sascha Hauer
2012-05-14 8:59 ` Alexey Galakhov
2012-05-14 9:00 ` Juergen Beisert
2012-05-14 9:30 ` Alexey Galakhov
2012-05-14 8:12 ` Sascha Hauer
2012-05-13 12:40 ` [PATCH 3/9] Minimal S5PV210 + Tiny210 support (2nd stage only) Alexey Galakhov
2012-05-14 8:13 ` Juergen Beisert
2012-05-14 8:57 ` Alexey Galakhov
2012-05-14 9:04 ` Juergen Beisert
[not found] ` <4FB0D058.3070206@gmail.com>
2012-05-14 9:57 ` Juergen Beisert
2012-05-14 11:07 ` Alexey Galakhov
2012-05-14 13:07 ` Juergen Beisert
2012-05-14 13:38 ` Alexey Galakhov
2012-05-13 12:40 ` [PATCH 4/9] S5PV210 iROM magic boot code Alexey Galakhov
2012-05-14 7:51 ` Sascha Hauer
2012-05-14 8:55 ` Alexey Galakhov
2012-05-13 12:40 ` [PATCH 5/9] S5P DRAM support Alexey Galakhov
2012-05-13 12:40 ` [PATCH 6/9] S5P lowlevel clock init Alexey Galakhov
2012-05-13 12:40 ` [PATCH 7/9] Revert "S5PV210 iROM magic boot code" Alexey Galakhov
2012-05-13 12:40 ` [PATCH 8/9] S5P iROM boot support - improved Alexey Galakhov
2012-05-13 12:40 ` [PATCH 9/9] S5P boot header and image generator Alexey Galakhov
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=1336912806-4163-2-git-send-email-agalakhov@gmail.com \
--to=agalakhov@gmail.com \
--cc=barebox@lists.infradead.org \
/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