forked from luck/tmp_suning_uos_patched
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mattst88/alpha-2.6: alpha: Fix de2104x driver failing to readout MAC address correctly alpha: Detect Super IO chip, no IDE on Avanti, enable EPP19 alpha: fix pci_mmap_resource API breakage alpha: fix __arch_hweight32 typo
This commit is contained in:
commit
ddc39f90a9
|
@ -410,7 +410,7 @@ static inline unsigned long __arch_hweight64(unsigned long w)
|
|||
return __kernel_ctpop(w);
|
||||
}
|
||||
|
||||
static inline unsigned int __arch_weight32(unsigned int w)
|
||||
static inline unsigned int __arch_hweight32(unsigned int w)
|
||||
{
|
||||
return __arch_hweight64(w);
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ endif
|
|||
|
||||
obj-y += irq_pyxis.o irq_i8259.o irq_srm.o
|
||||
obj-y += err_ev6.o
|
||||
obj-y += es1888.o smc37c669.o smc37c93x.o ns87312.o gct.o
|
||||
obj-y += es1888.o smc37c669.o smc37c93x.o pc873xx.o gct.o
|
||||
obj-y += srmcons.o
|
||||
|
||||
else
|
||||
|
@ -63,11 +63,11 @@ obj-$(CONFIG_ALPHA_WILDFIRE) += core_wildfire.o
|
|||
# Board support
|
||||
obj-$(CONFIG_ALPHA_ALCOR) += sys_alcor.o irq_i8259.o irq_srm.o
|
||||
obj-$(CONFIG_ALPHA_CABRIOLET) += sys_cabriolet.o irq_i8259.o irq_srm.o \
|
||||
ns87312.o
|
||||
pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_EB164) += sys_cabriolet.o irq_i8259.o irq_srm.o \
|
||||
ns87312.o
|
||||
pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_EB66P) += sys_cabriolet.o irq_i8259.o irq_srm.o \
|
||||
ns87312.o
|
||||
pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_LX164) += sys_cabriolet.o irq_i8259.o irq_srm.o \
|
||||
smc37c93x.o
|
||||
obj-$(CONFIG_ALPHA_PC164) += sys_cabriolet.o irq_i8259.o irq_srm.o \
|
||||
|
@ -90,14 +90,14 @@ obj-$(CONFIG_ALPHA_RUFFIAN) += sys_ruffian.o irq_pyxis.o irq_i8259.o
|
|||
obj-$(CONFIG_ALPHA_RX164) += sys_rx164.o irq_i8259.o
|
||||
obj-$(CONFIG_ALPHA_SABLE) += sys_sable.o
|
||||
obj-$(CONFIG_ALPHA_LYNX) += sys_sable.o
|
||||
obj-$(CONFIG_ALPHA_BOOK1) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_AVANTI) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_NONAME) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_P2K) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_XL) += sys_sio.o irq_i8259.o irq_srm.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_BOOK1) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_AVANTI) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_NONAME) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_P2K) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_XL) += sys_sio.o irq_i8259.o irq_srm.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_SX164) += sys_sx164.o irq_pyxis.o irq_i8259.o \
|
||||
irq_srm.o smc37c669.o
|
||||
obj-$(CONFIG_ALPHA_TAKARA) += sys_takara.o irq_i8259.o ns87312.o
|
||||
obj-$(CONFIG_ALPHA_TAKARA) += sys_takara.o irq_i8259.o pc873xx.o
|
||||
obj-$(CONFIG_ALPHA_WILDFIRE) += sys_wildfire.o irq_i8259.o
|
||||
|
||||
# Error support
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* linux/arch/alpha/kernel/ns87312.c
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <asm/io.h>
|
||||
#include "proto.h"
|
||||
|
||||
|
||||
/*
|
||||
* The SRM console *disables* the IDE interface, this code ensures it's
|
||||
* enabled.
|
||||
*
|
||||
* This code bangs on a control register of the 87312 Super I/O chip
|
||||
* that implements parallel port/serial ports/IDE/FDI. Depending on
|
||||
* the motherboard, the Super I/O chip can be configured through a
|
||||
* pair of registers that are located either at I/O ports 0x26e/0x26f
|
||||
* or 0x398/0x399. Unfortunately, autodetecting which base address is
|
||||
* in use works only once (right after a reset). The Super I/O chip
|
||||
* has the additional quirk that configuration register data must be
|
||||
* written twice (I believe this is a safety feature to prevent
|
||||
* accidental modification---fun, isn't it?).
|
||||
*/
|
||||
|
||||
void __init
|
||||
ns87312_enable_ide(long ide_base)
|
||||
{
|
||||
int data;
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
outb(0, ide_base); /* set the index register for reg #0 */
|
||||
data = inb(ide_base+1); /* read the current contents */
|
||||
outb(0, ide_base); /* set the index register for reg #0 */
|
||||
outb(data | 0x40, ide_base+1); /* turn on IDE */
|
||||
outb(data | 0x40, ide_base+1); /* turn on IDE, really! */
|
||||
local_irq_restore(flags);
|
||||
}
|
88
arch/alpha/kernel/pc873xx.c
Normal file
88
arch/alpha/kernel/pc873xx.c
Normal file
|
@ -0,0 +1,88 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "pc873xx.h"
|
||||
|
||||
static unsigned pc873xx_probelist[] = {0x398, 0x26e, 0};
|
||||
|
||||
static char *pc873xx_names[] = {
|
||||
"PC87303", "PC87306", "PC87312", "PC87332", "PC87334"
|
||||
};
|
||||
|
||||
static unsigned int base, model;
|
||||
|
||||
|
||||
unsigned int __init pc873xx_get_base()
|
||||
{
|
||||
return base;
|
||||
}
|
||||
|
||||
char *__init pc873xx_get_model()
|
||||
{
|
||||
return pc873xx_names[model];
|
||||
}
|
||||
|
||||
static unsigned char __init pc873xx_read(unsigned int base, int reg)
|
||||
{
|
||||
outb(reg, base);
|
||||
return inb(base + 1);
|
||||
}
|
||||
|
||||
static void __init pc873xx_write(unsigned int base, int reg, unsigned char data)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
outb(reg, base);
|
||||
outb(data, base + 1);
|
||||
outb(data, base + 1); /* Must be written twice */
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
int __init pc873xx_probe(void)
|
||||
{
|
||||
int val, index = 0;
|
||||
|
||||
while ((base = pc873xx_probelist[index++])) {
|
||||
|
||||
if (request_region(base, 2, "Super IO PC873xx") == NULL)
|
||||
continue;
|
||||
|
||||
val = pc873xx_read(base, REG_SID);
|
||||
if ((val & 0xf0) == 0x10) {
|
||||
model = PC87332;
|
||||
break;
|
||||
} else if ((val & 0xf8) == 0x70) {
|
||||
model = PC87306;
|
||||
break;
|
||||
} else if ((val & 0xf8) == 0x50) {
|
||||
model = PC87334;
|
||||
break;
|
||||
} else if ((val & 0xf8) == 0x40) {
|
||||
model = PC87303;
|
||||
break;
|
||||
}
|
||||
|
||||
release_region(base, 2);
|
||||
}
|
||||
|
||||
return (base == 0) ? -1 : 1;
|
||||
}
|
||||
|
||||
void __init pc873xx_enable_epp19(void)
|
||||
{
|
||||
unsigned char data;
|
||||
|
||||
printk(KERN_INFO "PC873xx enabling EPP v1.9\n");
|
||||
data = pc873xx_read(base, REG_PCR);
|
||||
pc873xx_write(base, REG_PCR, (data & 0xFC) | 0x02);
|
||||
}
|
||||
|
||||
void __init pc873xx_enable_ide(void)
|
||||
{
|
||||
unsigned char data;
|
||||
|
||||
printk(KERN_INFO "PC873xx enabling IDE interrupt\n");
|
||||
data = pc873xx_read(base, REG_FER);
|
||||
pc873xx_write(base, REG_FER, data | 0x40);
|
||||
}
|
35
arch/alpha/kernel/pc873xx.h
Normal file
35
arch/alpha/kernel/pc873xx.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
|
||||
#ifndef _PC873xx_H_
|
||||
#define _PC873xx_H_
|
||||
|
||||
/*
|
||||
* Control Register Values
|
||||
*/
|
||||
#define REG_FER 0x00
|
||||
#define REG_FAR 0x01
|
||||
#define REG_PTR 0x02
|
||||
#define REG_FCR 0x03
|
||||
#define REG_PCR 0x04
|
||||
#define REG_KRR 0x05
|
||||
#define REG_PMC 0x06
|
||||
#define REG_TUP 0x07
|
||||
#define REG_SID 0x08
|
||||
#define REG_ASC 0x09
|
||||
#define REG_IRC 0x0e
|
||||
|
||||
/*
|
||||
* Model numbers
|
||||
*/
|
||||
#define PC87303 0
|
||||
#define PC87306 1
|
||||
#define PC87312 2
|
||||
#define PC87332 3
|
||||
#define PC87334 4
|
||||
|
||||
int pc873xx_probe(void);
|
||||
unsigned int pc873xx_get_base(void);
|
||||
char *pc873xx_get_model(void);
|
||||
void pc873xx_enable_epp19(void);
|
||||
void pc873xx_enable_ide(void);
|
||||
|
||||
#endif
|
|
@ -53,7 +53,6 @@ static int __pci_mmap_fits(struct pci_dev *pdev, int num,
|
|||
|
||||
/**
|
||||
* pci_mmap_resource - map a PCI resource into user memory space
|
||||
* @filp: open sysfs file
|
||||
* @kobj: kobject for mapping
|
||||
* @attr: struct bin_attribute for the file being mapped
|
||||
* @vma: struct vm_area_struct passed into the mmap
|
||||
|
@ -61,7 +60,7 @@ static int __pci_mmap_fits(struct pci_dev *pdev, int num,
|
|||
*
|
||||
* Use the bus mapping routines to map a PCI resource into userspace.
|
||||
*/
|
||||
static int pci_mmap_resource(struct file *filp, struct kobject *kobj,
|
||||
static int pci_mmap_resource(struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
struct vm_area_struct *vma, int sparse)
|
||||
{
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "irq_impl.h"
|
||||
#include "pci_impl.h"
|
||||
#include "machvec_impl.h"
|
||||
#include "pc873xx.h"
|
||||
|
||||
#if defined(ALPHA_RESTORE_SRM_SETUP)
|
||||
/* Save LCA configuration data as the console had it set up. */
|
||||
|
@ -208,7 +209,27 @@ noname_init_pci(void)
|
|||
common_init_pci();
|
||||
sio_pci_route();
|
||||
sio_fixup_irq_levels(sio_collect_irq_levels());
|
||||
ns87312_enable_ide(0x26e);
|
||||
|
||||
if (pc873xx_probe() == -1) {
|
||||
printk(KERN_ERR "Probing for PC873xx Super IO chip failed.\n");
|
||||
} else {
|
||||
printk(KERN_INFO "Found %s Super IO chip at 0x%x\n",
|
||||
pc873xx_get_model(), pc873xx_get_base());
|
||||
|
||||
/* Enabling things in the Super IO chip doesn't actually
|
||||
* configure and enable things, the legacy drivers still
|
||||
* need to do the actual configuration and enabling.
|
||||
* This only unblocks them.
|
||||
*/
|
||||
|
||||
#if !defined(CONFIG_ALPHA_AVANTI)
|
||||
/* Don't bother on the Avanti family.
|
||||
* None of them had on-board IDE.
|
||||
*/
|
||||
pc873xx_enable_ide();
|
||||
#endif
|
||||
pc873xx_enable_epp19();
|
||||
}
|
||||
}
|
||||
|
||||
static inline void __init
|
||||
|
|
|
@ -367,8 +367,8 @@ static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
|
|||
static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
|
||||
|
||||
|
||||
#define dr32(reg) readl(de->regs + (reg))
|
||||
#define dw32(reg,val) writel((val), de->regs + (reg))
|
||||
#define dr32(reg) ioread32(de->regs + (reg))
|
||||
#define dw32(reg, val) iowrite32((val), de->regs + (reg))
|
||||
|
||||
|
||||
static void de_rx_err_acct (struct de_private *de, unsigned rx_tail,
|
||||
|
@ -1706,6 +1706,7 @@ static void __devinit de21040_get_mac_address (struct de_private *de)
|
|||
int value, boguscnt = 100000;
|
||||
do {
|
||||
value = dr32(ROMCmd);
|
||||
rmb();
|
||||
} while (value < 0 && --boguscnt > 0);
|
||||
de->dev->dev_addr[i] = value;
|
||||
udelay(1);
|
||||
|
|
Loading…
Reference in New Issue
Block a user