2005-01-22 09:23:38 -08:00
/*
* Interface for smsc fdc48m81x Super IO chip
*
* Author : MontaVista Software , Inc . source @ mvista . com
*
* 2001 - 2003 ( c ) MontaVista Software , Inc . This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed " as is " without any warranty of any kind , whether express
* or implied .
*
* Copyright 2004 ( c ) MontaVista Software , Inc .
*/
# include <linux/init.h>
# include <linux/types.h>
# include <asm/io.h>
2008-07-11 00:31:36 +09:00
# include <asm/txx9/smsc_fdc37m81x.h>
2005-01-22 09:23:38 -08:00
/* Common Registers */
# define SMSC_FDC37M81X_CONFIG_INDEX 0x00
# define SMSC_FDC37M81X_CONFIG_DATA 0x01
2013-01-22 12:59:30 +01:00
# define SMSC_FDC37M81X_CONF 0x02
# define SMSC_FDC37M81X_INDEX 0x03
# define SMSC_FDC37M81X_DNUM 0x07
# define SMSC_FDC37M81X_DID 0x20
# define SMSC_FDC37M81X_DREV 0x21
# define SMSC_FDC37M81X_PCNT 0x22
# define SMSC_FDC37M81X_PMGT 0x23
# define SMSC_FDC37M81X_OSC 0x24
# define SMSC_FDC37M81X_CONFPA0 0x26
# define SMSC_FDC37M81X_CONFPA1 0x27
# define SMSC_FDC37M81X_TEST4 0x2B
# define SMSC_FDC37M81X_TEST5 0x2C
# define SMSC_FDC37M81X_TEST1 0x2D
# define SMSC_FDC37M81X_TEST2 0x2E
# define SMSC_FDC37M81X_TEST3 0x2F
2005-01-22 09:23:38 -08:00
/* Logical device numbers */
2013-01-22 12:59:30 +01:00
# define SMSC_FDC37M81X_FDD 0x00
# define SMSC_FDC37M81X_SERIAL1 0x04
# define SMSC_FDC37M81X_SERIAL2 0x05
# define SMSC_FDC37M81X_KBD 0x07
2005-01-22 09:23:38 -08:00
/* Logical device Config Registers */
2013-01-22 12:59:30 +01:00
# define SMSC_FDC37M81X_ACTIVE 0x30
2005-01-22 09:23:38 -08:00
# define SMSC_FDC37M81X_BASEADDR0 0x60
# define SMSC_FDC37M81X_BASEADDR1 0x61
2013-01-22 12:59:30 +01:00
# define SMSC_FDC37M81X_INT 0x70
# define SMSC_FDC37M81X_INT2 0x72
# define SMSC_FDC37M81X_MODE 0xF0
2005-01-22 09:23:38 -08:00
/* Chip Config Values */
# define SMSC_FDC37M81X_CONFIG_ENTER 0x55
# define SMSC_FDC37M81X_CONFIG_EXIT 0xaa
2013-01-22 12:59:30 +01:00
# define SMSC_FDC37M81X_CHIP_ID 0x4d
2005-01-22 09:23:38 -08:00
2008-07-24 00:25:21 +09:00
static unsigned long g_smsc_fdc37m81x_base ;
2005-01-22 09:23:38 -08:00
static inline unsigned char smsc_fdc37m81x_rd ( unsigned char index )
{
outb ( index , g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX ) ;
return inb ( g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_DATA ) ;
}
static inline void smsc_dc37m81x_wr ( unsigned char index , unsigned char data )
{
outb ( index , g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX ) ;
outb ( data , g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_DATA ) ;
}
void smsc_fdc37m81x_config_beg ( void )
{
if ( g_smsc_fdc37m81x_base ) {
outb ( SMSC_FDC37M81X_CONFIG_ENTER ,
g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX ) ;
}
}
void smsc_fdc37m81x_config_end ( void )
{
if ( g_smsc_fdc37m81x_base )
outb ( SMSC_FDC37M81X_CONFIG_EXIT ,
g_smsc_fdc37m81x_base + SMSC_FDC37M81X_CONFIG_INDEX ) ;
}
u8 smsc_fdc37m81x_config_get ( u8 reg )
{
u8 val = 0 ;
if ( g_smsc_fdc37m81x_base )
val = smsc_fdc37m81x_rd ( reg ) ;
return val ;
}
void smsc_fdc37m81x_config_set ( u8 reg , u8 val )
{
if ( g_smsc_fdc37m81x_base )
smsc_dc37m81x_wr ( reg , val ) ;
}
unsigned long __init smsc_fdc37m81x_init ( unsigned long port )
{
const int field = sizeof ( unsigned long ) * 2 ;
u8 chip_id ;
if ( g_smsc_fdc37m81x_base )
2008-07-24 00:25:21 +09:00
printk ( KERN_WARNING " %s: stepping on old base=0x%0*lx \n " ,
__func__ ,
2005-01-22 09:23:38 -08:00
field , g_smsc_fdc37m81x_base ) ;
g_smsc_fdc37m81x_base = port ;
smsc_fdc37m81x_config_beg ( ) ;
chip_id = smsc_fdc37m81x_rd ( SMSC_FDC37M81X_DID ) ;
if ( chip_id = = SMSC_FDC37M81X_CHIP_ID )
smsc_fdc37m81x_config_end ( ) ;
else {
tree-wide: fix assorted typos all over the place
That is "success", "unknown", "through", "performance", "[re|un]mapping"
, "access", "default", "reasonable", "[con]currently", "temperature"
, "channel", "[un]used", "application", "example","hierarchy", "therefore"
, "[over|under]flow", "contiguous", "threshold", "enough" and others.
Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2009-11-14 13:09:05 -02:00
printk ( KERN_WARNING " %s: unknown chip id 0x%02x \n " , __func__ ,
2005-01-22 09:23:38 -08:00
chip_id ) ;
g_smsc_fdc37m81x_base = 0 ;
}
return g_smsc_fdc37m81x_base ;
}
# ifdef DEBUG
2008-07-24 00:25:21 +09:00
static void smsc_fdc37m81x_config_dump_one ( const char * key , u8 dev , u8 reg )
2005-01-22 09:23:38 -08:00
{
2008-07-24 00:25:21 +09:00
printk ( KERN_INFO " %s: dev=0x%02x reg=0x%02x val=0x%02x \n " ,
key , dev , reg ,
2005-01-22 09:23:38 -08:00
smsc_fdc37m81x_rd ( reg ) ) ;
}
void smsc_fdc37m81x_config_dump ( void )
{
u8 orig ;
2008-07-24 00:25:21 +09:00
const char * fname = __func__ ;
2005-01-22 09:23:38 -08:00
smsc_fdc37m81x_config_beg ( ) ;
orig = smsc_fdc37m81x_rd ( SMSC_FDC37M81X_DNUM ) ;
2008-07-24 00:25:21 +09:00
printk ( KERN_INFO " %s: common \n " , fname ) ;
2005-01-22 09:23:38 -08:00
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_NONE ,
SMSC_FDC37M81X_DNUM ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_NONE ,
SMSC_FDC37M81X_DID ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_NONE ,
SMSC_FDC37M81X_DREV ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_NONE ,
SMSC_FDC37M81X_PCNT ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_NONE ,
SMSC_FDC37M81X_PMGT ) ;
2008-07-24 00:25:21 +09:00
printk ( KERN_INFO " %s: keyboard \n " , fname ) ;
2005-01-22 09:23:38 -08:00
smsc_dc37m81x_wr ( SMSC_FDC37M81X_DNUM , SMSC_FDC37M81X_KBD ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_KBD ,
SMSC_FDC37M81X_ACTIVE ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_KBD ,
SMSC_FDC37M81X_INT ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_KBD ,
SMSC_FDC37M81X_INT2 ) ;
smsc_fdc37m81x_config_dump_one ( fname , SMSC_FDC37M81X_KBD ,
SMSC_FDC37M81X_LDCR_F0 ) ;
smsc_dc37m81x_wr ( SMSC_FDC37M81X_DNUM , orig ) ;
smsc_fdc37m81x_config_end ( ) ;
}
# endif