You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6: [SPARC64]: fix section mismatch warning in mdesc.c [SPARC64]: fix section mismatch warning in pci_sunv4 [SPARC64]: Stop using drivers/char/rtc.c [SPARC64]: Convert parport to of_platform_driver. [SPARC]: Implement fb_is_primary_device(). [SPARC64]: Fix virq decomposition. [SPARC64]: Use KERN_ERR in IRQ manipulation error printks. [SPARC64]: Do not flood log with failed DS messages. [SPARC64]: Add proper multicast support to VNET driver. [SPARC64]: Handle multiple domain-services-port nodes properly. [SPARC64]: Improve VIO device naming further. [SPARC]: Make sure dev_archdata is filled in for all devices. [SPARC]: Define minimal struct dev_archdata, similarly to sparc64. [SPARC]: Fix serial console device detection.
This commit is contained in:
@@ -148,6 +148,7 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d
|
||||
{
|
||||
const struct linux_prom_registers *regs;
|
||||
struct linux_ebus_child *child;
|
||||
struct dev_archdata *sd;
|
||||
const int *irqs;
|
||||
int i, n, len;
|
||||
unsigned long baseaddr;
|
||||
@@ -234,6 +235,10 @@ void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *d
|
||||
}
|
||||
}
|
||||
|
||||
sd = &dev->ofdev.dev.archdata;
|
||||
sd->prom_node = dp;
|
||||
sd->op = &dev->ofdev;
|
||||
|
||||
dev->ofdev.node = dp;
|
||||
dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
|
||||
dev->ofdev.dev.bus = &ebus_bus_type;
|
||||
|
||||
@@ -420,11 +420,16 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
|
||||
{
|
||||
struct of_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
|
||||
const struct linux_prom_irqs *intr;
|
||||
struct dev_archdata *sd;
|
||||
int len, i;
|
||||
|
||||
if (!op)
|
||||
return NULL;
|
||||
|
||||
sd = &op->dev.archdata;
|
||||
sd->prom_node = dp;
|
||||
sd->op = op;
|
||||
|
||||
op->node = dp;
|
||||
|
||||
op->clock_freq = of_getintprop_default(dp, "clock-frequency",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <asm/processor.h>
|
||||
#include <asm/psr.h>
|
||||
#include <asm/elf.h>
|
||||
#include <asm/prom.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/*
|
||||
@@ -150,7 +151,7 @@ void machine_halt(void)
|
||||
local_irq_enable();
|
||||
mdelay(8);
|
||||
local_irq_disable();
|
||||
if (!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (1);
|
||||
prom_halt();
|
||||
panic("Halt failed!");
|
||||
@@ -166,7 +167,7 @@ void machine_restart(char * cmd)
|
||||
|
||||
p = strchr (reboot_command, '\n');
|
||||
if (p) *p = 0;
|
||||
if (!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (1);
|
||||
if (cmd)
|
||||
prom_reboot(cmd);
|
||||
@@ -179,7 +180,8 @@ void machine_restart(char * cmd)
|
||||
void machine_power_off(void)
|
||||
{
|
||||
#ifdef CONFIG_SUN_AUXIO
|
||||
if (auxio_power_register && (!serial_console || scons_pwroff))
|
||||
if (auxio_power_register &&
|
||||
(strcmp(of_console_device->type, "serial") || scons_pwroff))
|
||||
*auxio_power_register |= AUXIO_POWER_OFF;
|
||||
#endif
|
||||
machine_halt();
|
||||
|
||||
@@ -397,6 +397,135 @@ static struct device_node * __init build_tree(struct device_node *parent, phandl
|
||||
return dp;
|
||||
}
|
||||
|
||||
struct device_node *of_console_device;
|
||||
EXPORT_SYMBOL(of_console_device);
|
||||
|
||||
char *of_console_path;
|
||||
EXPORT_SYMBOL(of_console_path);
|
||||
|
||||
char *of_console_options;
|
||||
EXPORT_SYMBOL(of_console_options);
|
||||
|
||||
extern void restore_current(void);
|
||||
|
||||
static void __init of_console_init(void)
|
||||
{
|
||||
char *msg = "OF stdout device is: %s\n";
|
||||
struct device_node *dp;
|
||||
unsigned long flags;
|
||||
const char *type;
|
||||
phandle node;
|
||||
int skip, fd;
|
||||
|
||||
of_console_path = prom_early_alloc(256);
|
||||
|
||||
switch (prom_vers) {
|
||||
case PROM_V0:
|
||||
case PROM_SUN4:
|
||||
skip = 0;
|
||||
switch (*romvec->pv_stdout) {
|
||||
case PROMDEV_SCREEN:
|
||||
type = "display";
|
||||
break;
|
||||
|
||||
case PROMDEV_TTYB:
|
||||
skip = 1;
|
||||
/* FALLTHRU */
|
||||
|
||||
case PROMDEV_TTYA:
|
||||
type = "serial";
|
||||
break;
|
||||
|
||||
default:
|
||||
prom_printf("Invalid PROM_V0 stdout value %u\n",
|
||||
*romvec->pv_stdout);
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
for_each_node_by_type(dp, type) {
|
||||
if (!skip--)
|
||||
break;
|
||||
}
|
||||
if (!dp) {
|
||||
prom_printf("Cannot find PROM_V0 console node.\n");
|
||||
prom_halt();
|
||||
}
|
||||
of_console_device = dp;
|
||||
|
||||
strcpy(of_console_path, dp->full_name);
|
||||
if (!strcmp(type, "serial")) {
|
||||
strcat(of_console_path,
|
||||
(skip ? ":b" : ":a"));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
fd = *romvec->pv_v2bootargs.fd_stdout;
|
||||
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
node = (*romvec->pv_v2devops.v2_inst2pkg)(fd);
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
|
||||
if (!node) {
|
||||
prom_printf("Cannot resolve stdout node from "
|
||||
"instance %08x.\n", fd);
|
||||
prom_halt();
|
||||
}
|
||||
dp = of_find_node_by_phandle(node);
|
||||
type = of_get_property(dp, "device_type", NULL);
|
||||
|
||||
if (!type) {
|
||||
prom_printf("Console stdout lacks "
|
||||
"device_type property.\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
if (strcmp(type, "display") && strcmp(type, "serial")) {
|
||||
prom_printf("Console device_type is neither display "
|
||||
"nor serial.\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
of_console_device = dp;
|
||||
|
||||
if (prom_vers == PROM_V2) {
|
||||
strcpy(of_console_path, dp->full_name);
|
||||
switch (*romvec->pv_stdout) {
|
||||
case PROMDEV_TTYA:
|
||||
strcat(of_console_path, ":a");
|
||||
break;
|
||||
case PROMDEV_TTYB:
|
||||
strcat(of_console_path, ":b");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
const char *path;
|
||||
|
||||
dp = of_find_node_by_path("/");
|
||||
path = of_get_property(dp, "stdout-path", NULL);
|
||||
if (!path) {
|
||||
prom_printf("No stdout-path in root node.\n");
|
||||
prom_halt();
|
||||
}
|
||||
strcpy(of_console_path, path);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
of_console_options = strrchr(of_console_path, ':');
|
||||
if (of_console_options) {
|
||||
of_console_options++;
|
||||
if (*of_console_options == '\0')
|
||||
of_console_options = NULL;
|
||||
}
|
||||
|
||||
prom_printf(msg, of_console_path);
|
||||
printk(msg, of_console_path);
|
||||
}
|
||||
|
||||
void __init prom_build_devicetree(void)
|
||||
{
|
||||
struct device_node **nextp;
|
||||
@@ -409,6 +538,8 @@ void __init prom_build_devicetree(void)
|
||||
allnodes->child = build_tree(allnodes,
|
||||
prom_getchild(allnodes->node),
|
||||
&nextp);
|
||||
of_console_init();
|
||||
|
||||
printk("PROM: Built device tree with %u bytes of memory.\n",
|
||||
prom_early_allocated);
|
||||
}
|
||||
|
||||
@@ -146,31 +146,6 @@ static void __init process_switch(char c)
|
||||
}
|
||||
}
|
||||
|
||||
static void __init process_console(char *commands)
|
||||
{
|
||||
serial_console = 0;
|
||||
commands += 8;
|
||||
/* Linux-style serial */
|
||||
if (!strncmp(commands, "ttyS", 4))
|
||||
serial_console = simple_strtoul(commands + 4, NULL, 10) + 1;
|
||||
else if (!strncmp(commands, "tty", 3)) {
|
||||
char c = *(commands + 3);
|
||||
/* Solaris-style serial */
|
||||
if (c == 'a' || c == 'b')
|
||||
serial_console = c - 'a' + 1;
|
||||
/* else Linux-style fbcon, not serial */
|
||||
}
|
||||
#if defined(CONFIG_PROM_CONSOLE)
|
||||
if (!strncmp(commands, "prom", 4)) {
|
||||
char *p;
|
||||
|
||||
for (p = commands - 8; *p && *p != ' '; p++)
|
||||
*p = ' ';
|
||||
conswitchp = &prom_con;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init boot_flags_init(char *commands)
|
||||
{
|
||||
while (*commands) {
|
||||
@@ -187,9 +162,7 @@ static void __init boot_flags_init(char *commands)
|
||||
process_switch(*commands++);
|
||||
continue;
|
||||
}
|
||||
if (!strncmp(commands, "console=", 8)) {
|
||||
process_console(commands);
|
||||
} else if (!strncmp(commands, "mem=", 4)) {
|
||||
if (!strncmp(commands, "mem=", 4)) {
|
||||
/*
|
||||
* "mem=XXX[kKmM] overrides the PROM-reported
|
||||
* memory size.
|
||||
@@ -341,41 +314,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
smp_setup_cpu_possible_map();
|
||||
}
|
||||
|
||||
static int __init set_preferred_console(void)
|
||||
{
|
||||
int idev, odev;
|
||||
|
||||
/* The user has requested a console so this is already set up. */
|
||||
if (serial_console >= 0)
|
||||
return -EBUSY;
|
||||
|
||||
idev = prom_query_input_device();
|
||||
odev = prom_query_output_device();
|
||||
if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
|
||||
serial_console = 0;
|
||||
} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
|
||||
serial_console = 1;
|
||||
} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
|
||||
serial_console = 2;
|
||||
} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OTTYA) {
|
||||
prom_printf("MrCoffee ttya\n");
|
||||
serial_console = 1;
|
||||
} else if (idev == PROMDEV_I_UNK && odev == PROMDEV_OSCREEN) {
|
||||
serial_console = 0;
|
||||
prom_printf("MrCoffee keyboard\n");
|
||||
} else {
|
||||
prom_printf("Confusing console (idev %d, odev %d)\n",
|
||||
idev, odev);
|
||||
serial_console = 1;
|
||||
}
|
||||
|
||||
if (serial_console)
|
||||
return add_preferred_console("ttyS", serial_console - 1, NULL);
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
console_initcall(set_preferred_console);
|
||||
|
||||
extern char *sparc_cpu_type;
|
||||
extern char *sparc_fpu_type;
|
||||
|
||||
@@ -461,7 +399,6 @@ void sun_do_break(void)
|
||||
prom_cmdline();
|
||||
}
|
||||
|
||||
int serial_console = -1;
|
||||
int stop_a_enabled = 1;
|
||||
|
||||
static int __init topology_init(void)
|
||||
|
||||
@@ -102,119 +102,3 @@ prom_putchar(char c)
|
||||
while(prom_nbputchar(c) == -1) ;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Query for input device type */
|
||||
enum prom_input_device
|
||||
prom_query_input_device(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int st_p;
|
||||
char propb[64];
|
||||
char *p;
|
||||
int propl;
|
||||
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
case PROM_V2:
|
||||
case PROM_SUN4:
|
||||
default:
|
||||
switch(*romvec->pv_stdin) {
|
||||
case PROMDEV_KBD: return PROMDEV_IKBD;
|
||||
case PROMDEV_TTYA: return PROMDEV_ITTYA;
|
||||
case PROMDEV_TTYB: return PROMDEV_ITTYB;
|
||||
default:
|
||||
return PROMDEV_I_UNK;
|
||||
};
|
||||
case PROM_V3:
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdin);
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
if(prom_node_has_property(st_p, "keyboard"))
|
||||
return PROMDEV_IKBD;
|
||||
if (prom_getproperty(st_p, "name", propb, sizeof(propb)) != -1) {
|
||||
if(strncmp(propb, "keyboard", sizeof("serial")) == 0)
|
||||
return PROMDEV_IKBD;
|
||||
}
|
||||
if (prom_getproperty(st_p, "device_type", propb, sizeof(propb)) != -1) {
|
||||
if(strncmp(propb, "serial", sizeof("serial")))
|
||||
return PROMDEV_I_UNK;
|
||||
}
|
||||
propl = prom_getproperty(prom_root_node, "stdin-path", propb, sizeof(propb));
|
||||
if(propl > 2) {
|
||||
p = propb;
|
||||
while(*p) p++; p -= 2;
|
||||
if(p[0] == ':') {
|
||||
if(p[1] == 'a')
|
||||
return PROMDEV_ITTYA;
|
||||
else if(p[1] == 'b')
|
||||
return PROMDEV_ITTYB;
|
||||
}
|
||||
}
|
||||
return PROMDEV_I_UNK;
|
||||
}
|
||||
}
|
||||
|
||||
/* Query for output device type */
|
||||
|
||||
enum prom_output_device
|
||||
prom_query_output_device(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
int st_p;
|
||||
char propb[64];
|
||||
char *p;
|
||||
int propl;
|
||||
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
case PROM_SUN4:
|
||||
switch(*romvec->pv_stdin) {
|
||||
case PROMDEV_SCREEN: return PROMDEV_OSCREEN;
|
||||
case PROMDEV_TTYA: return PROMDEV_OTTYA;
|
||||
case PROMDEV_TTYB: return PROMDEV_OTTYB;
|
||||
};
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
st_p = (*romvec->pv_v2devops.v2_inst2pkg)(*romvec->pv_v2bootargs.fd_stdout);
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
propl = prom_getproperty(st_p, "device_type", propb, sizeof(propb));
|
||||
if (propl == sizeof("display") &&
|
||||
strncmp("display", propb, sizeof("display")) == 0)
|
||||
{
|
||||
return PROMDEV_OSCREEN;
|
||||
}
|
||||
if(prom_vers == PROM_V3) {
|
||||
if(propl >= 0 &&
|
||||
strncmp("serial", propb, sizeof("serial")) != 0)
|
||||
return PROMDEV_O_UNK;
|
||||
propl = prom_getproperty(prom_root_node, "stdout-path",
|
||||
propb, sizeof(propb));
|
||||
if(propl == CON_SIZE_JMC &&
|
||||
strncmp(propb, con_name_jmc, CON_SIZE_JMC) == 0)
|
||||
return PROMDEV_OTTYA;
|
||||
if(propl > 2) {
|
||||
p = propb;
|
||||
while(*p) p++; p-= 2;
|
||||
if(p[0]==':') {
|
||||
if(p[1] == 'a')
|
||||
return PROMDEV_OTTYA;
|
||||
else if(p[1] == 'b')
|
||||
return PROMDEV_OTTYB;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch(*romvec->pv_stdin) {
|
||||
case PROMDEV_TTYA: return PROMDEV_OTTYA;
|
||||
case PROMDEV_TTYB: return PROMDEV_OTTYB;
|
||||
};
|
||||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
};
|
||||
return PROMDEV_O_UNK;
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ prom_cmdline(void)
|
||||
extern void install_linux_ticker(void);
|
||||
unsigned long flags;
|
||||
|
||||
if(!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (1);
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
install_obp_ticker();
|
||||
@@ -69,7 +69,7 @@ prom_cmdline(void)
|
||||
#ifdef CONFIG_SUN_AUXIO
|
||||
set_auxio(AUXIO_LED, 0);
|
||||
#endif
|
||||
if(!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (0);
|
||||
}
|
||||
|
||||
|
||||
+155
-94
File diff suppressed because it is too large
Load Diff
@@ -362,6 +362,7 @@ static int __init child_regs_nonstandard(struct linux_ebus_device *dev)
|
||||
static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_device *dev)
|
||||
{
|
||||
struct linux_ebus_child *child;
|
||||
struct dev_archdata *sd;
|
||||
struct of_device *op;
|
||||
int i, len;
|
||||
|
||||
@@ -387,6 +388,10 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de
|
||||
dev->irqs[i] = op->irqs[i];
|
||||
}
|
||||
|
||||
sd = &dev->ofdev.dev.archdata;
|
||||
sd->prom_node = dp;
|
||||
sd->op = &dev->ofdev;
|
||||
|
||||
dev->ofdev.node = dp;
|
||||
dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
|
||||
dev->ofdev.dev.bus = &ebus_bus_type;
|
||||
|
||||
+39
-33
@@ -87,7 +87,11 @@ struct ino_bucket ivector_table[NUM_IVECS] __attribute__ ((aligned (SMP_CACHE_BY
|
||||
*/
|
||||
#define irq_work(__cpu) &(trap_block[(__cpu)].irq_worklist)
|
||||
|
||||
static unsigned int virt_to_real_irq_table[NR_IRQS];
|
||||
static struct {
|
||||
unsigned int irq;
|
||||
unsigned int dev_handle;
|
||||
unsigned int dev_ino;
|
||||
} virt_to_real_irq_table[NR_IRQS];
|
||||
|
||||
static unsigned char virt_irq_alloc(unsigned int real_irq)
|
||||
{
|
||||
@@ -96,7 +100,7 @@ static unsigned char virt_irq_alloc(unsigned int real_irq)
|
||||
BUILD_BUG_ON(NR_IRQS >= 256);
|
||||
|
||||
for (ent = 1; ent < NR_IRQS; ent++) {
|
||||
if (!virt_to_real_irq_table[ent])
|
||||
if (!virt_to_real_irq_table[ent].irq)
|
||||
break;
|
||||
}
|
||||
if (ent >= NR_IRQS) {
|
||||
@@ -104,7 +108,7 @@ static unsigned char virt_irq_alloc(unsigned int real_irq)
|
||||
return 0;
|
||||
}
|
||||
|
||||
virt_to_real_irq_table[ent] = real_irq;
|
||||
virt_to_real_irq_table[ent].irq = real_irq;
|
||||
|
||||
return ent;
|
||||
}
|
||||
@@ -117,8 +121,8 @@ static void virt_irq_free(unsigned int virt_irq)
|
||||
if (virt_irq >= NR_IRQS)
|
||||
return;
|
||||
|
||||
real_irq = virt_to_real_irq_table[virt_irq];
|
||||
virt_to_real_irq_table[virt_irq] = 0;
|
||||
real_irq = virt_to_real_irq_table[virt_irq].irq;
|
||||
virt_to_real_irq_table[virt_irq].irq = 0;
|
||||
|
||||
__bucket(real_irq)->virt_irq = 0;
|
||||
}
|
||||
@@ -126,7 +130,7 @@ static void virt_irq_free(unsigned int virt_irq)
|
||||
|
||||
static unsigned int virt_to_real_irq(unsigned char virt_irq)
|
||||
{
|
||||
return virt_to_real_irq_table[virt_irq];
|
||||
return virt_to_real_irq_table[virt_irq].irq;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -336,15 +340,15 @@ static void sun4v_irq_enable(unsigned int virt_irq)
|
||||
|
||||
err = sun4v_intr_settarget(ino, cpuid);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_settarget(%x,%lu): err(%d)\n",
|
||||
ino, cpuid, err);
|
||||
printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): "
|
||||
"err(%d)\n", ino, cpuid, err);
|
||||
err = sun4v_intr_setstate(ino, HV_INTR_STATE_IDLE);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_setstate(%x): "
|
||||
printk(KERN_ERR "sun4v_intr_setstate(%x): "
|
||||
"err(%d)\n", ino, err);
|
||||
err = sun4v_intr_setenabled(ino, HV_INTR_ENABLED);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_setenabled(%x): err(%d)\n",
|
||||
printk(KERN_ERR "sun4v_intr_setenabled(%x): err(%d)\n",
|
||||
ino, err);
|
||||
}
|
||||
}
|
||||
@@ -362,8 +366,8 @@ static void sun4v_set_affinity(unsigned int virt_irq, cpumask_t mask)
|
||||
|
||||
err = sun4v_intr_settarget(ino, cpuid);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_settarget(%x,%lu): err(%d)\n",
|
||||
ino, cpuid, err);
|
||||
printk(KERN_ERR "sun4v_intr_settarget(%x,%lu): "
|
||||
"err(%d)\n", ino, cpuid, err);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,7 +381,7 @@ static void sun4v_irq_disable(unsigned int virt_irq)
|
||||
|
||||
err = sun4v_intr_setenabled(ino, HV_INTR_DISABLED);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_setenabled(%x): "
|
||||
printk(KERN_ERR "sun4v_intr_setenabled(%x): "
|
||||
"err(%d)\n", ino, err);
|
||||
}
|
||||
}
|
||||
@@ -410,7 +414,7 @@ static void sun4v_irq_end(unsigned int virt_irq)
|
||||
|
||||
err = sun4v_intr_setstate(ino, HV_INTR_STATE_IDLE);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_intr_setstate(%x): "
|
||||
printk(KERN_ERR "sun4v_intr_setstate(%x): "
|
||||
"err(%d)\n", ino, err);
|
||||
}
|
||||
}
|
||||
@@ -418,7 +422,6 @@ static void sun4v_irq_end(unsigned int virt_irq)
|
||||
static void sun4v_virq_enable(unsigned int virt_irq)
|
||||
{
|
||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
||||
unsigned int ino = bucket - &ivector_table[0];
|
||||
|
||||
if (likely(bucket)) {
|
||||
unsigned long cpuid, dev_handle, dev_ino;
|
||||
@@ -426,24 +429,24 @@ static void sun4v_virq_enable(unsigned int virt_irq)
|
||||
|
||||
cpuid = irq_choose_cpu(virt_irq);
|
||||
|
||||
dev_handle = ino & IMAP_IGN;
|
||||
dev_ino = ino & IMAP_INO;
|
||||
dev_handle = virt_to_real_irq_table[virt_irq].dev_handle;
|
||||
dev_ino = virt_to_real_irq_table[virt_irq].dev_ino;
|
||||
|
||||
err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_target(%lx,%lx,%lu): "
|
||||
printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): "
|
||||
"err(%d)\n",
|
||||
dev_handle, dev_ino, cpuid, err);
|
||||
err = sun4v_vintr_set_state(dev_handle, dev_ino,
|
||||
HV_INTR_STATE_IDLE);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_state(%lx,%lx,"
|
||||
printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
|
||||
"HV_INTR_STATE_IDLE): err(%d)\n",
|
||||
dev_handle, dev_ino, err);
|
||||
err = sun4v_vintr_set_valid(dev_handle, dev_ino,
|
||||
HV_INTR_ENABLED);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_state(%lx,%lx,"
|
||||
printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
|
||||
"HV_INTR_ENABLED): err(%d)\n",
|
||||
dev_handle, dev_ino, err);
|
||||
}
|
||||
@@ -452,7 +455,6 @@ static void sun4v_virq_enable(unsigned int virt_irq)
|
||||
static void sun4v_virt_set_affinity(unsigned int virt_irq, cpumask_t mask)
|
||||
{
|
||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
||||
unsigned int ino = bucket - &ivector_table[0];
|
||||
|
||||
if (likely(bucket)) {
|
||||
unsigned long cpuid, dev_handle, dev_ino;
|
||||
@@ -460,12 +462,12 @@ static void sun4v_virt_set_affinity(unsigned int virt_irq, cpumask_t mask)
|
||||
|
||||
cpuid = irq_choose_cpu(virt_irq);
|
||||
|
||||
dev_handle = ino & IMAP_IGN;
|
||||
dev_ino = ino & IMAP_INO;
|
||||
dev_handle = virt_to_real_irq_table[virt_irq].dev_handle;
|
||||
dev_ino = virt_to_real_irq_table[virt_irq].dev_ino;
|
||||
|
||||
err = sun4v_vintr_set_target(dev_handle, dev_ino, cpuid);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_target(%lx,%lx,%lu): "
|
||||
printk(KERN_ERR "sun4v_vintr_set_target(%lx,%lx,%lu): "
|
||||
"err(%d)\n",
|
||||
dev_handle, dev_ino, cpuid, err);
|
||||
}
|
||||
@@ -474,19 +476,18 @@ static void sun4v_virt_set_affinity(unsigned int virt_irq, cpumask_t mask)
|
||||
static void sun4v_virq_disable(unsigned int virt_irq)
|
||||
{
|
||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
||||
unsigned int ino = bucket - &ivector_table[0];
|
||||
|
||||
if (likely(bucket)) {
|
||||
unsigned long dev_handle, dev_ino;
|
||||
int err;
|
||||
|
||||
dev_handle = ino & IMAP_IGN;
|
||||
dev_ino = ino & IMAP_INO;
|
||||
dev_handle = virt_to_real_irq_table[virt_irq].dev_handle;
|
||||
dev_ino = virt_to_real_irq_table[virt_irq].dev_ino;
|
||||
|
||||
err = sun4v_vintr_set_valid(dev_handle, dev_ino,
|
||||
HV_INTR_DISABLED);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_state(%lx,%lx,"
|
||||
printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
|
||||
"HV_INTR_DISABLED): err(%d)\n",
|
||||
dev_handle, dev_ino, err);
|
||||
}
|
||||
@@ -495,7 +496,6 @@ static void sun4v_virq_disable(unsigned int virt_irq)
|
||||
static void sun4v_virq_end(unsigned int virt_irq)
|
||||
{
|
||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
||||
unsigned int ino = bucket - &ivector_table[0];
|
||||
struct irq_desc *desc = irq_desc + virt_irq;
|
||||
|
||||
if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
|
||||
@@ -505,13 +505,13 @@ static void sun4v_virq_end(unsigned int virt_irq)
|
||||
unsigned long dev_handle, dev_ino;
|
||||
int err;
|
||||
|
||||
dev_handle = ino & IMAP_IGN;
|
||||
dev_ino = ino & IMAP_INO;
|
||||
dev_handle = virt_to_real_irq_table[virt_irq].dev_handle;
|
||||
dev_ino = virt_to_real_irq_table[virt_irq].dev_ino;
|
||||
|
||||
err = sun4v_vintr_set_state(dev_handle, dev_ino,
|
||||
HV_INTR_STATE_IDLE);
|
||||
if (err != HV_EOK)
|
||||
printk("sun4v_vintr_set_state(%lx,%lx,"
|
||||
printk(KERN_ERR "sun4v_vintr_set_state(%lx,%lx,"
|
||||
"HV_INTR_STATE_IDLE): err(%d)\n",
|
||||
dev_handle, dev_ino, err);
|
||||
}
|
||||
@@ -700,6 +700,7 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
|
||||
unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
|
||||
{
|
||||
unsigned long sysino, hv_err;
|
||||
unsigned int virq;
|
||||
|
||||
BUG_ON(devhandle & devino);
|
||||
|
||||
@@ -713,7 +714,12 @@ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
return sun4v_build_common(sysino, &sun4v_virq);
|
||||
virq = sun4v_build_common(sysino, &sun4v_virq);
|
||||
|
||||
virt_to_real_irq_table[virq].dev_handle = devhandle;
|
||||
virt_to_real_irq_table[virq].dev_ino = devino;
|
||||
|
||||
return virq;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
|
||||
@@ -79,6 +79,7 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
|
||||
|
||||
while (dp) {
|
||||
struct sparc_isa_device *isa_dev;
|
||||
struct dev_archdata *sd;
|
||||
|
||||
isa_dev = kzalloc(sizeof(*isa_dev), GFP_KERNEL);
|
||||
if (!isa_dev) {
|
||||
@@ -86,6 +87,10 @@ static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
|
||||
return;
|
||||
}
|
||||
|
||||
sd = &isa_dev->ofdev.dev.archdata;
|
||||
sd->prom_node = dp;
|
||||
sd->op = &isa_dev->ofdev;
|
||||
|
||||
isa_dev->ofdev.node = dp;
|
||||
isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev;
|
||||
isa_dev->ofdev.dev.bus = &isa_bus_type;
|
||||
|
||||
@@ -83,7 +83,7 @@ static void mdesc_handle_init(struct mdesc_handle *hp,
|
||||
hp->handle_size = handle_size;
|
||||
}
|
||||
|
||||
static struct mdesc_handle *mdesc_bootmem_alloc(unsigned int mdesc_size)
|
||||
static struct mdesc_handle * __init mdesc_bootmem_alloc(unsigned int mdesc_size)
|
||||
{
|
||||
struct mdesc_handle *hp;
|
||||
unsigned int handle_size, alloc_size;
|
||||
@@ -123,7 +123,7 @@ static void mdesc_bootmem_free(struct mdesc_handle *hp)
|
||||
}
|
||||
}
|
||||
|
||||
static struct mdesc_mem_ops bootmem_mdesc_memops = {
|
||||
static struct mdesc_mem_ops bootmem_mdesc_ops = {
|
||||
.alloc = mdesc_bootmem_alloc,
|
||||
.free = mdesc_bootmem_free,
|
||||
};
|
||||
@@ -860,7 +860,7 @@ void __init sun4v_mdesc_init(void)
|
||||
|
||||
printk("MDESC: Size is %lu bytes.\n", len);
|
||||
|
||||
hp = mdesc_alloc(len, &bootmem_mdesc_memops);
|
||||
hp = mdesc_alloc(len, &bootmem_mdesc_ops);
|
||||
if (hp == NULL) {
|
||||
prom_printf("MDESC: alloc of %lu bytes failed.\n", len);
|
||||
prom_halt();
|
||||
|
||||
@@ -752,11 +752,16 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
|
||||
{
|
||||
struct of_device *op = kzalloc(sizeof(*op), GFP_KERNEL);
|
||||
const unsigned int *irq;
|
||||
struct dev_archdata *sd;
|
||||
int len, i;
|
||||
|
||||
if (!op)
|
||||
return NULL;
|
||||
|
||||
sd = &op->dev.archdata;
|
||||
sd->prom_node = dp;
|
||||
sd->op = op;
|
||||
|
||||
op->node = dp;
|
||||
|
||||
op->clock_freq = of_getintprop_default(dp, "clock-frequency",
|
||||
|
||||
@@ -1129,7 +1129,7 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)
|
||||
}
|
||||
#endif /* !(CONFIG_PCI_MSI) */
|
||||
|
||||
static void pci_sun4v_pbm_init(struct pci_controller_info *p, struct device_node *dp, u32 devhandle)
|
||||
static void __init pci_sun4v_pbm_init(struct pci_controller_info *p, struct device_node *dp, u32 devhandle)
|
||||
{
|
||||
struct pci_pbm_info *pbm;
|
||||
|
||||
@@ -1163,7 +1163,7 @@ static void pci_sun4v_pbm_init(struct pci_controller_info *p, struct device_node
|
||||
pci_sun4v_msi_init(pbm);
|
||||
}
|
||||
|
||||
void sun4v_pci_init(struct device_node *dp, char *model_name)
|
||||
void __init sun4v_pci_init(struct device_node *dp, char *model_name)
|
||||
{
|
||||
static int hvapi_negotiated = 0;
|
||||
struct pci_controller_info *p;
|
||||
|
||||
@@ -46,7 +46,7 @@ static void (*poweroff_method)(void) = machine_alt_power_off;
|
||||
void machine_power_off(void)
|
||||
{
|
||||
sstate_poweroff();
|
||||
if (!serial_console || scons_pwroff) {
|
||||
if (strcmp(of_console_device->type, "serial") || scons_pwroff) {
|
||||
if (power_reg) {
|
||||
/* Both register bits seem to have the
|
||||
* same effect, so until I figure out
|
||||
|
||||
@@ -119,7 +119,7 @@ extern void (*prom_keyboard)(void);
|
||||
void machine_halt(void)
|
||||
{
|
||||
sstate_halt();
|
||||
if (!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (1);
|
||||
if (prom_keyboard)
|
||||
prom_keyboard();
|
||||
@@ -130,7 +130,7 @@ void machine_halt(void)
|
||||
void machine_alt_power_off(void)
|
||||
{
|
||||
sstate_poweroff();
|
||||
if (!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette(1);
|
||||
if (prom_keyboard)
|
||||
prom_keyboard();
|
||||
@@ -145,7 +145,7 @@ void machine_restart(char * cmd)
|
||||
sstate_reboot();
|
||||
p = strchr (reboot_command, '\n');
|
||||
if (p) *p = 0;
|
||||
if (!serial_console && prom_palette)
|
||||
if (prom_palette)
|
||||
prom_palette (1);
|
||||
if (prom_keyboard)
|
||||
prom_keyboard();
|
||||
|
||||
@@ -1646,6 +1646,60 @@ static void __init of_fill_in_cpu_data(void)
|
||||
smp_fill_in_sib_core_maps();
|
||||
}
|
||||
|
||||
struct device_node *of_console_device;
|
||||
EXPORT_SYMBOL(of_console_device);
|
||||
|
||||
char *of_console_path;
|
||||
EXPORT_SYMBOL(of_console_path);
|
||||
|
||||
char *of_console_options;
|
||||
EXPORT_SYMBOL(of_console_options);
|
||||
|
||||
static void __init of_console_init(void)
|
||||
{
|
||||
char *msg = "OF stdout device is: %s\n";
|
||||
struct device_node *dp;
|
||||
const char *type;
|
||||
phandle node;
|
||||
|
||||
of_console_path = prom_early_alloc(256);
|
||||
if (prom_ihandle2path(prom_stdout, of_console_path, 256) < 0) {
|
||||
prom_printf("Cannot obtain path of stdout.\n");
|
||||
prom_halt();
|
||||
}
|
||||
of_console_options = strrchr(of_console_path, ':');
|
||||
if (of_console_options) {
|
||||
of_console_options++;
|
||||
if (*of_console_options == '\0')
|
||||
of_console_options = NULL;
|
||||
}
|
||||
|
||||
node = prom_inst2pkg(prom_stdout);
|
||||
if (!node) {
|
||||
prom_printf("Cannot resolve stdout node from "
|
||||
"instance %08x.\n", prom_stdout);
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
dp = of_find_node_by_phandle(node);
|
||||
type = of_get_property(dp, "device_type", NULL);
|
||||
if (!type) {
|
||||
prom_printf("Console stdout lacks device_type property.\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
if (strcmp(type, "display") && strcmp(type, "serial")) {
|
||||
prom_printf("Console device_type is neither display "
|
||||
"nor serial.\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
of_console_device = dp;
|
||||
|
||||
prom_printf(msg, of_console_path);
|
||||
printk(msg, of_console_path);
|
||||
}
|
||||
|
||||
void __init prom_build_devicetree(void)
|
||||
{
|
||||
struct device_node **nextp;
|
||||
@@ -1658,6 +1712,8 @@ void __init prom_build_devicetree(void)
|
||||
allnodes->child = build_tree(allnodes,
|
||||
prom_getchild(allnodes->node),
|
||||
&nextp);
|
||||
of_console_init();
|
||||
|
||||
printk("PROM: Built device tree with %u bytes of memory.\n",
|
||||
prom_early_allocated);
|
||||
|
||||
|
||||
@@ -133,33 +133,6 @@ static void __init process_switch(char c)
|
||||
}
|
||||
}
|
||||
|
||||
static void __init process_console(char *commands)
|
||||
{
|
||||
serial_console = 0;
|
||||
commands += 8;
|
||||
/* Linux-style serial */
|
||||
if (!strncmp(commands, "ttyS", 4))
|
||||
serial_console = simple_strtoul(commands + 4, NULL, 10) + 1;
|
||||
else if (!strncmp(commands, "tty", 3)) {
|
||||
char c = *(commands + 3);
|
||||
/* Solaris-style serial */
|
||||
if (c == 'a' || c == 'b') {
|
||||
serial_console = c - 'a' + 1;
|
||||
prom_printf ("Using /dev/tty%c as console.\n", c);
|
||||
}
|
||||
/* else Linux-style fbcon, not serial */
|
||||
}
|
||||
#if defined(CONFIG_PROM_CONSOLE)
|
||||
if (!strncmp(commands, "prom", 4)) {
|
||||
char *p;
|
||||
|
||||
for (p = commands - 8; *p && *p != ' '; p++)
|
||||
*p = ' ';
|
||||
conswitchp = &prom_con;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init boot_flags_init(char *commands)
|
||||
{
|
||||
while (*commands) {
|
||||
@@ -176,9 +149,7 @@ static void __init boot_flags_init(char *commands)
|
||||
process_switch(*commands++);
|
||||
continue;
|
||||
}
|
||||
if (!strncmp(commands, "console=", 8)) {
|
||||
process_console(commands);
|
||||
} else if (!strncmp(commands, "mem=", 4)) {
|
||||
if (!strncmp(commands, "mem=", 4)) {
|
||||
/*
|
||||
* "mem=XXX[kKmM]" overrides the PROM-reported
|
||||
* memory size.
|
||||
@@ -378,44 +349,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
paging_init();
|
||||
}
|
||||
|
||||
static int __init set_preferred_console(void)
|
||||
{
|
||||
int idev, odev;
|
||||
|
||||
/* The user has requested a console so this is already set up. */
|
||||
if (serial_console >= 0)
|
||||
return -EBUSY;
|
||||
|
||||
idev = prom_query_input_device();
|
||||
odev = prom_query_output_device();
|
||||
if (idev == PROMDEV_IKBD && odev == PROMDEV_OSCREEN) {
|
||||
serial_console = 0;
|
||||
} else if (idev == PROMDEV_ITTYA && odev == PROMDEV_OTTYA) {
|
||||
serial_console = 1;
|
||||
} else if (idev == PROMDEV_ITTYB && odev == PROMDEV_OTTYB) {
|
||||
serial_console = 2;
|
||||
} else if (idev == PROMDEV_IRSC && odev == PROMDEV_ORSC) {
|
||||
serial_console = 3;
|
||||
} else if (idev == PROMDEV_IVCONS && odev == PROMDEV_OVCONS) {
|
||||
/* sunhv_console_init() doesn't check the serial_console
|
||||
* value anyways...
|
||||
*/
|
||||
serial_console = 4;
|
||||
return add_preferred_console("ttyHV", 0, NULL);
|
||||
} else {
|
||||
prom_printf("Inconsistent console: "
|
||||
"input %d, output %d\n",
|
||||
idev, odev);
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
if (serial_console)
|
||||
return add_preferred_console("ttyS", serial_console - 1, NULL);
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
console_initcall(set_preferred_console);
|
||||
|
||||
/* BUFFER is PAGE_SIZE bytes long. */
|
||||
|
||||
extern char *sparc_cpu_type;
|
||||
@@ -508,5 +441,4 @@ void sun_do_break(void)
|
||||
prom_cmdline();
|
||||
}
|
||||
|
||||
int serial_console = -1;
|
||||
int stop_a_enabled = 1;
|
||||
|
||||
@@ -330,7 +330,6 @@ EXPORT_SYMBOL(VISenter);
|
||||
|
||||
/* for input/keybdev */
|
||||
EXPORT_SYMBOL(sun_do_break);
|
||||
EXPORT_SYMBOL(serial_console);
|
||||
EXPORT_SYMBOL(stop_a_enabled);
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
|
||||
@@ -1434,6 +1434,78 @@ static int bq4802_set_rtc_time(struct rtc_time *time)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cmos_get_rtc_time(struct rtc_time *rtc_tm)
|
||||
{
|
||||
unsigned char ctrl;
|
||||
|
||||
rtc_tm->tm_sec = CMOS_READ(RTC_SECONDS);
|
||||
rtc_tm->tm_min = CMOS_READ(RTC_MINUTES);
|
||||
rtc_tm->tm_hour = CMOS_READ(RTC_HOURS);
|
||||
rtc_tm->tm_mday = CMOS_READ(RTC_DAY_OF_MONTH);
|
||||
rtc_tm->tm_mon = CMOS_READ(RTC_MONTH);
|
||||
rtc_tm->tm_year = CMOS_READ(RTC_YEAR);
|
||||
rtc_tm->tm_wday = CMOS_READ(RTC_DAY_OF_WEEK);
|
||||
|
||||
ctrl = CMOS_READ(RTC_CONTROL);
|
||||
if (!(ctrl & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||
BCD_TO_BIN(rtc_tm->tm_sec);
|
||||
BCD_TO_BIN(rtc_tm->tm_min);
|
||||
BCD_TO_BIN(rtc_tm->tm_hour);
|
||||
BCD_TO_BIN(rtc_tm->tm_mday);
|
||||
BCD_TO_BIN(rtc_tm->tm_mon);
|
||||
BCD_TO_BIN(rtc_tm->tm_year);
|
||||
BCD_TO_BIN(rtc_tm->tm_wday);
|
||||
}
|
||||
|
||||
if (rtc_tm->tm_year <= 69)
|
||||
rtc_tm->tm_year += 100;
|
||||
|
||||
rtc_tm->tm_mon--;
|
||||
}
|
||||
|
||||
static int cmos_set_rtc_time(struct rtc_time *rtc_tm)
|
||||
{
|
||||
unsigned char mon, day, hrs, min, sec;
|
||||
unsigned char save_control, save_freq_select;
|
||||
unsigned int yrs;
|
||||
|
||||
yrs = rtc_tm->tm_year;
|
||||
mon = rtc_tm->tm_mon + 1;
|
||||
day = rtc_tm->tm_mday;
|
||||
hrs = rtc_tm->tm_hour;
|
||||
min = rtc_tm->tm_min;
|
||||
sec = rtc_tm->tm_sec;
|
||||
|
||||
if (yrs >= 100)
|
||||
yrs -= 100;
|
||||
|
||||
if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
|
||||
BIN_TO_BCD(sec);
|
||||
BIN_TO_BCD(min);
|
||||
BIN_TO_BCD(hrs);
|
||||
BIN_TO_BCD(day);
|
||||
BIN_TO_BCD(mon);
|
||||
BIN_TO_BCD(yrs);
|
||||
}
|
||||
|
||||
save_control = CMOS_READ(RTC_CONTROL);
|
||||
CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
|
||||
save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
|
||||
CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
|
||||
|
||||
CMOS_WRITE(yrs, RTC_YEAR);
|
||||
CMOS_WRITE(mon, RTC_MONTH);
|
||||
CMOS_WRITE(day, RTC_DAY_OF_MONTH);
|
||||
CMOS_WRITE(hrs, RTC_HOURS);
|
||||
CMOS_WRITE(min, RTC_MINUTES);
|
||||
CMOS_WRITE(sec, RTC_SECONDS);
|
||||
|
||||
CMOS_WRITE(save_control, RTC_CONTROL);
|
||||
CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
struct mini_rtc_ops {
|
||||
@@ -1456,6 +1528,11 @@ static struct mini_rtc_ops bq4802_rtc_ops = {
|
||||
.get_rtc_time = bq4802_get_rtc_time,
|
||||
.set_rtc_time = bq4802_set_rtc_time,
|
||||
};
|
||||
|
||||
static struct mini_rtc_ops cmos_rtc_ops = {
|
||||
.get_rtc_time = cmos_get_rtc_time,
|
||||
.set_rtc_time = cmos_set_rtc_time,
|
||||
};
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static struct mini_rtc_ops *mini_rtc_ops;
|
||||
@@ -1583,6 +1660,8 @@ static int __init rtc_mini_init(void)
|
||||
#ifdef CONFIG_PCI
|
||||
else if (bq4802_regs)
|
||||
mini_rtc_ops = &bq4802_rtc_ops;
|
||||
else if (ds1287_regs)
|
||||
mini_rtc_ops = &cmos_rtc_ops;
|
||||
#endif /* CONFIG_PCI */
|
||||
else
|
||||
return -ENODEV;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user