~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-davinci/serial.c

Version: ~ [ linux-5.5-rc7 ] ~ [ linux-5.4.13 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.97 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.166 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.210 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.210 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.81 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * TI DaVinci serial driver
  3  *
  4  * Copyright (C) 2006 Texas Instruments.
  5  *
  6  * This program is free software; you can redistribute it and/or modify
  7  * it under the terms of the GNU General Public License as published by
  8  * the Free Software Foundation; either version 2 of the License, or
  9  * (at your option) any later version.
 10  *
 11  * This program is distributed in the hope that it will be useful,
 12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 14  * GNU General Public License for more details.
 15  *
 16  *  You should have received a copy of the GNU General Public License
 17  *  along with this program; if not, write to the Free Software
 18  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 19  *
 20  */
 21 
 22 #include <linux/kernel.h>
 23 #include <linux/init.h>
 24 #include <linux/serial_8250.h>
 25 #include <linux/serial_reg.h>
 26 #include <linux/platform_device.h>
 27 #include <linux/delay.h>
 28 #include <linux/clk.h>
 29 #include <linux/io.h>
 30 
 31 #include <mach/serial.h>
 32 #include <mach/cputype.h>
 33 
 34 static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
 35                                            int offset)
 36 {
 37         offset <<= up->regshift;
 38 
 39         WARN_ONCE(!up->membase, "unmapped read: uart[%d]\n", offset);
 40 
 41         return (unsigned int)__raw_readl(up->membase + offset);
 42 }
 43 
 44 static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
 45                                     int value)
 46 {
 47         offset <<= p->regshift;
 48 
 49         WARN_ONCE(!p->membase, "unmapped write: uart[%d]\n", offset);
 50 
 51         __raw_writel(value, p->membase + offset);
 52 }
 53 
 54 static void __init davinci_serial_reset(struct plat_serial8250_port *p)
 55 {
 56         unsigned int pwremu = 0;
 57 
 58         serial_write_reg(p, UART_IER, 0);  /* disable all interrupts */
 59 
 60         /* reset both transmitter and receiver: bits 14,13 = UTRST, URRST */
 61         serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
 62         mdelay(10);
 63 
 64         pwremu |= (0x3 << 13);
 65         pwremu |= 0x1;
 66         serial_write_reg(p, UART_DAVINCI_PWREMU, pwremu);
 67 
 68         if (cpu_is_davinci_dm646x())
 69                 serial_write_reg(p, UART_DM646X_SCR,
 70                                  UART_DM646X_SCR_TX_WATERMARK);
 71 }
 72 
 73 int __init davinci_serial_init(struct davinci_uart_config *info)
 74 {
 75         int i;
 76         char name[16];
 77         struct clk *uart_clk;
 78         struct davinci_soc_info *soc_info = &davinci_soc_info;
 79         struct device *dev = &soc_info->serial_dev->dev;
 80         struct plat_serial8250_port *p = dev->platform_data;
 81 
 82         /*
 83          * Make sure the serial ports are muxed on at this point.
 84          * You have to mux them off in device drivers later on if not needed.
 85          */
 86         for (i = 0; p->flags; i++, p++) {
 87                 if (!(info->enabled_uarts & (1 << i)))
 88                         continue;
 89 
 90                 sprintf(name, "uart%d", i);
 91                 uart_clk = clk_get(dev, name);
 92                 if (IS_ERR(uart_clk)) {
 93                         printk(KERN_ERR "%s:%d: failed to get UART%d clock\n",
 94                                         __func__, __LINE__, i);
 95                         continue;
 96                 }
 97 
 98                 clk_enable(uart_clk);
 99                 p->uartclk = clk_get_rate(uart_clk);
100 
101                 if (!p->membase && p->mapbase) {
102                         p->membase = ioremap(p->mapbase, SZ_4K);
103 
104                         if (p->membase)
105                                 p->flags &= ~UPF_IOREMAP;
106                         else
107                                 pr_err("uart regs ioremap failed\n");
108                 }
109 
110                 if (p->membase && p->type != PORT_AR7)
111                         davinci_serial_reset(p);
112         }
113 
114         return platform_device_register(soc_info->serial_dev);
115 }
116 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp