blob: 0b0bb26825d6e810428382deaedea6445bba2852 [file] [log] [blame]
Ed Swierk62eee3f2008-03-16 23:31:04 +00001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2008 Arastra, Inc.
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.
Ed Swierk62eee3f2008-03-16 23:31:04 +000015 */
16
Stefan Reinauer24d1d4b2013-03-21 11:51:41 -070017#include <arch/io.h>
Edward O'Callaghane64f5b12015-01-04 04:25:38 +110018#include <device/pnp.h>
19#include <stdint.h>
Ed Swierk62eee3f2008-03-16 23:31:04 +000020#include "i3100.h"
21
Edward O'Callaghan85836c22014-07-09 20:26:25 +100022static void pnp_enter_ext_func_mode(pnp_devfn_t dev)
Ed Swierk62eee3f2008-03-16 23:31:04 +000023{
Uwe Hermannd1a1d572010-11-10 18:22:11 +000024 u16 port = dev >> 8;
Ed Swierk62eee3f2008-03-16 23:31:04 +000025
Ed Swierk62eee3f2008-03-16 23:31:04 +000026 outb(0x80, port);
27 outb(0x86, port);
Uwe Hermannd1a1d572010-11-10 18:22:11 +000028}
Ed Swierk62eee3f2008-03-16 23:31:04 +000029
Edward O'Callaghan85836c22014-07-09 20:26:25 +100030static void pnp_exit_ext_func_mode(pnp_devfn_t dev)
Uwe Hermannd1a1d572010-11-10 18:22:11 +000031{
32 u16 port = dev >> 8;
Ed Swierk62eee3f2008-03-16 23:31:04 +000033
Ed Swierk62eee3f2008-03-16 23:31:04 +000034 outb(0x68, port);
35 outb(0x08, port);
36}
Uwe Hermannd1a1d572010-11-10 18:22:11 +000037
38/* Enable device interrupts, set UART_CLK predivide. */
Edward O'Callaghane64f5b12015-01-04 04:25:38 +110039void i3100_configure_uart_clk(pnp_devfn_t dev, u8 predivide)
Uwe Hermannd1a1d572010-11-10 18:22:11 +000040{
41 pnp_enter_ext_func_mode(dev);
42 pnp_write_config(dev, I3100_SIW_CONFIGURATION, (predivide << 2) | 1);
43 pnp_exit_ext_func_mode(dev);
44}
45
Edward O'Callaghane64f5b12015-01-04 04:25:38 +110046void i3100_enable_serial(pnp_devfn_t dev, u16 iobase)
Uwe Hermannd1a1d572010-11-10 18:22:11 +000047{
48 pnp_enter_ext_func_mode(dev);
49 pnp_set_logical_device(dev);
50 pnp_set_enable(dev, 0);
51 pnp_set_iobase(dev, PNP_IDX_IO0, iobase);
52 pnp_set_enable(dev, 1);
53 pnp_exit_ext_func_mode(dev);
54}