void __pmac register_backlight_controller(struct backlight_controller *ctrler, void *data, char *type) { struct device_node* bk_node; char *prop; int valid = 0; /* There's already a matching controller, bail out */ if (backlighter != NULL) return; bk_node = find_devices("backlight"); #ifdef CONFIG_ADB_PMU /* Special case for the old PowerBook since I can't test on it */ backlight_autosave = machine_is_compatible("AAPL,3400/2400") || machine_is_compatible("AAPL,3500"); if ((backlight_autosave || machine_is_compatible("AAPL,PowerBook1998") || machine_is_compatible("PowerBook1,1")) && !strcmp(type, "pmu")) valid = 1; #endif if (bk_node) { prop = get_property(bk_node, "backlight-control", NULL); if (prop && !strncmp(prop, type, strlen(type))) valid = 1; } if (!valid) return; backlighter = ctrler; backlighter_data = data; if (bk_node && !backlight_autosave) prop = get_property(bk_node, "bklt", NULL); else prop = NULL; if (prop) { backlight_level = ((*prop)+1) >> 1; if (backlight_level > BACKLIGHT_MAX) backlight_level = BACKLIGHT_MAX; } #ifdef CONFIG_ADB_PMU if (backlight_autosave) { struct adb_request req; pmu_request(&req, NULL, 2, 0xd9, 0); while (!req.complete) pmu_poll(); backlight_level = req.reply[0] >> 4; } #endif acquire_console_sem(); if (!backlighter->set_enable(1, backlight_level, data)) backlight_enabled = 1; release_console_sem(); printk(KERN_INFO "Registered \"%s\" backlight controller," "level: %d/15\n", type, backlight_level); }
void __init pmu_backlight_init() { struct backlight_device *bd; char name[10]; int level, autosave; /* Special case for the old PowerBook since I can't test on it */ autosave = machine_is_compatible("AAPL,3400/2400") || machine_is_compatible("AAPL,3500"); if (!autosave && !pmac_has_backlight_type("pmu") && !machine_is_compatible("AAPL,PowerBook1998") && !machine_is_compatible("PowerBook1,1")) return; snprintf(name, sizeof(name), "pmubl"); bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data); if (IS_ERR(bd)) { printk("pmubl: Backlight registration failed\n"); goto error; } pmu_backlight_init_curve(0x7F, 0x46, 0x0E); level = pmu_backlight_data.max_brightness; if (autosave) { /* read autosaved value if available */ struct adb_request req; pmu_request(&req, NULL, 2, 0xd9, 0); pmu_wait_complete(&req); level = pmu_backlight_curve_lookup( (req.reply[0] >> 4) * pmu_backlight_data.max_brightness / 15); } down(&bd->sem); bd->props->brightness = level; bd->props->power = FB_BLANK_UNBLANK; bd->props->update_status(bd); up(&bd->sem); mutex_lock(&pmac_backlight_mutex); if (!pmac_backlight) pmac_backlight = bd; mutex_unlock(&pmac_backlight_mutex); printk("pmubl: Backlight initialized (%s)\n", name); return; error: return; }
static int __init wf_lm75_sensor_init(void) { /* Don't register on old machines that use therm_pm72 for now */ if (machine_is_compatible("PowerMac7,2") || machine_is_compatible("PowerMac7,3") || machine_is_compatible("RackMac3,1")) return -ENODEV; return i2c_add_driver(&wf_lm75_driver); }
void __init setup_grackle(struct pci_controller *hose) { setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0); if (machine_is_compatible("PowerMac1,1")) ppc_pci_add_flags(PPC_PCI_REASSIGN_ALL_BUS); if (machine_is_compatible("AAPL,PowerBook1998")) grackle_set_loop_snoop(hose, 1); #if 0 /* Disabled for now, HW problems ??? */ grackle_set_stg(hose, 1); #endif }
/* * Setup the serial console */ static int __init pmz_console_setup(struct console *co, char *options) { struct uart_pmac_port *uap; struct uart_port *port; int baud = 38400; int bits = 8; int parity = 'n'; int flow = 'n'; unsigned long pwr_delay; /* * XServe's default to 57600 bps */ if (machine_is_compatible("RackMac1,1") || machine_is_compatible("RackMac1,2") || machine_is_compatible("MacRISC4")) baud = 57600; /* * Check whether an invalid uart number has been specified, and * if so, search for the first available port that does have * console support. */ if (co->index >= pmz_ports_count) co->index = 0; uap = &pmz_ports[co->index]; if (uap->node == NULL) return -ENODEV; port = &uap->port; /* * Mark port as beeing a console */ uap->flags |= PMACZILOG_FLAG_IS_CONS; /* * Temporary fix for uart layer who didn't setup the spinlock yet */ spin_lock_init(&port->lock); /* * Enable the hardware */ pwr_delay = __pmz_startup(uap); if (pwr_delay) mdelay(pwr_delay); if (options) uart_parse_options(options, &baud, &parity, &bits, &flow); return uart_set_options(port, co, baud, parity, bits, flow); }
static __init int pcm030_fabric_init(void) { struct platform_device *pdev; int rc; if (!machine_is_compatible("phytec,pcm030")) return -ENODEV; card.platform = &mpc5200_audio_dma_platform; card.name = "pcm030"; card.dai_link = pcm030_fabric_dai; card.num_links = ARRAY_SIZE(pcm030_fabric_dai); device.card = &card; device.codec_dev = &soc_codec_dev_wm9712; pdev = platform_device_alloc("soc-audio", 1); if (!pdev) { pr_err("pcm030_fabric_init: platform_device_alloc() failed\n"); return -ENODEV; } platform_set_drvdata(pdev, &device); device.dev = &pdev->dev; rc = platform_device_add(pdev); if (rc) { pr_err("pcm030_fabric_init: platform_device_add() failed\n"); return -ENODEV; } return 0; }
void __init cbe_pervasive_init(void) { int cpu; if (!cpu_has_feature(CPU_FTR_PAUSE_ZERO)) return; sysreset_hack = machine_is_compatible("IBM,CBPLUS-1.0"); for_each_possible_cpu(cpu) { struct cbe_pmd_regs __iomem *regs = cbe_get_cpu_pmd_regs(cpu); if (!regs) continue; /* Enable Pause(0) control bit */ out_be64(®s->pmcr, in_be64(®s->pmcr) | CBE_PMD_PAUSE_ZERO_CONTROL); /* Enable JTAG system-reset hack */ if (sysreset_hack) out_be32(®s->fir_mode_reg, in_be32(®s->fir_mode_reg) | CBE_PMD_FIR_MODE_M8); } ppc_md.power_save = cbe_power_save; ppc_md.system_reset_exception = cbe_system_reset_exception; }
static int __init hvc_beat_console_init(void) { if (hvc_beat_useit && machine_is_compatible("Beat")) { hvc_instantiate(0, 0, &hvc_beat_get_put_ops); } return 0; }
static int __init wf_pm112_init(void) { struct device_node *cpu; if (!machine_is_compatible("PowerMac11,2")) return -ENODEV; /* Count the number of CPU cores */ nr_cores = 0; for (cpu = NULL; (cpu = of_find_node_by_type(cpu, "cpu")) != NULL; ) ++nr_cores; printk(KERN_INFO "windfarm: initializing for dual-core desktop G5\n"); #ifdef MODULE request_module("windfarm_smu_controls"); request_module("windfarm_smu_sensors"); request_module("windfarm_smu_sat"); request_module("windfarm_lm75_sensor"); request_module("windfarm_max6690_sensor"); request_module("windfarm_cpufreq_clamp"); #endif /* MODULE */ platform_driver_register(&wf_pm112_driver); return 0; }
void __init pmu_backlight_init() { struct backlight_device *bd; char name[10]; int level, autosave; /* Special case for the old PowerBook since I can't test on it */ autosave = machine_is_compatible("AAPL,3400/2400") || machine_is_compatible("AAPL,3500"); if (!autosave && !pmac_has_backlight_type("pmu") && !machine_is_compatible("AAPL,PowerBook1998") && !machine_is_compatible("PowerBook1,1")) return; snprintf(name, sizeof(name), "pmubl"); bd = backlight_device_register(name, NULL, NULL, &pmu_backlight_data); if (IS_ERR(bd)) { printk(KERN_ERR "PMU Backlight registration failed\n"); return; } uses_pmu_bl = 1; bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; pmu_backlight_init_curve(0x7F, 0x46, 0x0E); level = bd->props.max_brightness; if (autosave) { /* read autosaved value if available */ struct adb_request req; pmu_request(&req, NULL, 2, 0xd9, 0); pmu_wait_complete(&req); level = pmu_backlight_curve_lookup( (req.reply[0] >> 4) * bd->props.max_brightness / 15); } bd->props.brightness = level; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); printk(KERN_INFO "PMU Backlight initialized (%s)\n", name); }
static int __init cbe_powerbutton_init(void) { int ret = 0; struct input_dev *dev; if (!machine_is_compatible("IBM,CBPLUS-1.0")) { printk(KERN_ERR "%s: Not a cell blade.\n", __func__); ret = -ENODEV; goto out; } dev = input_allocate_device(); if (!dev) { ret = -ENOMEM; printk(KERN_ERR "%s: Not enough memory.\n", __func__); goto out; } set_bit(EV_KEY, dev->evbit); set_bit(KEY_POWER, dev->keybit); dev->name = "Power Button"; dev->id.bustype = BUS_HOST; /* this makes the button look like an acpi power button * no clue whether anyone relies on that though */ dev->id.product = 0x02; dev->phys = "LNXPWRBN/button/input0"; button_pdev = platform_device_register_simple("power_button", 0, NULL, 0); if (IS_ERR(button_pdev)) { ret = PTR_ERR(button_pdev); goto out_free_input; } dev->dev.parent = &button_pdev->dev; ret = input_register_device(dev); if (ret) { printk(KERN_ERR "%s: Failed to register device\n", __func__); goto out_free_pdev; } button_dev = dev; ret = pmi_register_handler(&cbe_pmi_handler); if (ret) { printk(KERN_ERR "%s: Failed to register with pmi.\n", __func__); goto out_free_pdev; } goto out; out_free_pdev: platform_device_unregister(button_pdev); out_free_input: input_free_device(dev); out: return ret; }
int __init adb_init(void) { struct adb_driver *driver; int i; #ifdef CONFIG_PPC32 if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) ) return 0; #endif #ifdef CONFIG_MAC if (!MACH_IS_MAC) return 0; #endif /* xmon may do early-init */ if (adb_inited) return 0; adb_inited = 1; adb_controller = NULL; i = 0; while ((driver = adb_driver_list[i++]) != NULL) { if (!driver->probe()) { adb_controller = driver; break; } } if ((adb_controller == NULL) || adb_controller->init()) { printk(KERN_WARNING "Warning: no ADB interface detected\n"); adb_controller = NULL; } else { #ifdef CONFIG_PM pmu_register_sleep_notifier(&adb_sleep_notifier); #endif /* CONFIG_PM */ #ifdef CONFIG_PPC if (machine_is_compatible("AAPL,PowerBook1998") || machine_is_compatible("PowerBook1,1")) sleepy_trackpad = 1; #endif /* CONFIG_PPC */ init_completion(&adb_probe_task_comp); adbdev_init(); adb_reset_bus(); } return 0; }
void __init setup_grackle(struct pci_controller *hose) { setup_indirect_pci(hose, 0xfec00000, 0xfee00000); if (machine_is_compatible("AAPL,PowerBook1998")) grackle_set_loop_snoop(hose, 1); #if 0 /* Disabled for now, HW problems ??? */ grackle_set_stg(hose, 1); #endif }
static int __init wf_cpufreq_clamp_init(void) { struct wf_control *clamp; /* Don't register on old machines that use therm_pm72 for now */ if (machine_is_compatible("PowerMac7,2") || machine_is_compatible("PowerMac7,3") || machine_is_compatible("RackMac3,1")) return -ENODEV; clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL); if (clamp == NULL) return -ENOMEM; cpufreq_register_notifier(&clamp_notifier, CPUFREQ_POLICY_NOTIFIER); clamp->ops = &clamp_ops; clamp->name = "cpufreq-clamp"; if (wf_register_control(clamp)) goto fail; clamp_control = clamp; return 0; fail: kfree(clamp); return -ENODEV; }
static int __init wf_smu_init(void) { int rc = -ENODEV; if (machine_is_compatible("PowerMac9,1")) rc = wf_init_pm(); if (rc == 0) { #ifdef MODULE request_module("windfarm_smu_controls"); request_module("windfarm_smu_sensors"); request_module("windfarm_lm75_sensor"); #endif /* MODULE */ platform_driver_register(&wf_smu_driver); } return rc; }
__initfunc(void pmac_pic_init(void)) { int i; struct device_node *irqctrler; volatile struct pmac_irq_hw *addr; int second_irq; /* We first try to detect Apple's new Core99 chipset, since mac-io * is quite different on those machines and contains an IBM MPIC2. */ irqctrler = find_type_devices("open-pic"); if (irqctrler != NULL) { printk("PowerMac using OpenPIC irq controller\n"); if (irqctrler->n_addrs > 0) { #ifdef CONFIG_XMON struct device_node* pswitch; #endif /* CONFIG_XMON */ OpenPIC = (volatile struct OpenPIC *) ioremap(irqctrler->addrs[0].address, irqctrler->addrs[0].size); for ( i = 0 ; i < NR_IRQS ; i++ ) { irq_desc[i].ctl = &pmac_open_pic; irq_desc[i].level = 0; } openpic_init(1); has_openpic = 1; #ifdef CONFIG_XMON pswitch = find_devices("programmer-switch"); if (pswitch && pswitch->n_intrs) request_irq(pswitch->intrs[0].line, xmon_irq, 0, "NMI - XMON", 0); #endif /* CONFIG_XMON */ return; } irqctrler = NULL; } /* * G3 powermacs and 1999 G3 PowerBooks have 64 interrupts, * 1998 G3 Series PowerBooks have 128, * other powermacs have 32. * The combo ethernet/modem card for the Powerstar powerbooks * (2400/3400/3500, ohare based) has a second ohare chip * effectively making a total of 64. */ max_irqs = max_real_irqs = 32; irqctrler = find_devices("mac-io"); if (irqctrler) { max_real_irqs = 64; if (irqctrler->next) max_irqs = 128; else max_irqs = 64; } for ( i = 0; i < max_real_irqs ; i++ ) irq_desc[i].ctl = &pmac_pic; /* get addresses of first controller */ if (irqctrler) { if (irqctrler->n_addrs > 0) { addr = ioremap(irqctrler->addrs[0].address, 0x40); addr += 2; for (i = 0; i < 2; ++i, --addr) pmac_irq_hw[i] = addr; } /* get addresses of second controller */ irqctrler = irqctrler->next; if (irqctrler && irqctrler->n_addrs > 0) { addr = ioremap(irqctrler->addrs[0].address, 0x40); addr += 2; for (i = 2; i < 4; ++i, --addr) pmac_irq_hw[i] = addr; } } /* PowerBooks 3400 and 3500 can have a second controller in a second ohare chip, on the combo ethernet/modem card */ if (machine_is_compatible("AAPL,3400/2400") || machine_is_compatible("AAPL,3500")) enable_second_ohare(); /* disable all interrupts in all controllers */ for (i = 0; i * 32 < max_irqs; ++i) out_le32(&pmac_irq_hw[i]->enable, 0); /* get interrupt line of secondary interrupt controller */ if (irqctrler) { second_irq = irqctrler->intrs[0].line; printk(KERN_INFO "irq: secondary controller on irq %d\n", (int)second_irq); if (device_is_compatible(irqctrler, "gatwick")) pmac_fix_gatwick_interrupts(irqctrler, max_real_irqs); request_irq( second_irq, gatwick_action, SA_INTERRUPT, "interrupt cascade", 0 ); } for (i = max_real_irqs; i < max_irqs; i++) irq_desc[i].ctl = &gatwick_pic; printk("System has %d possible interrupts\n", max_irqs); if (max_irqs != max_real_irqs) printk(KERN_DEBUG "%d interrupts on main controller\n", max_real_irqs); #ifdef CONFIG_XMON request_irq(20, xmon_irq, 0, "NMI - XMON", 0); #endif /* CONFIG_XMON */ }
void radeonfb_bl_init(struct radeonfb_info *rinfo) { struct backlight_device *bd; struct radeon_bl_privdata *pdata; char name[12]; if (rinfo->mon1_type != MT_LCD) return; #ifdef CONFIG_PMAC_BACKLIGHT if (!pmac_has_backlight_type("ati") && !pmac_has_backlight_type("mnca")) return; #endif pdata = kmalloc(sizeof(struct radeon_bl_privdata), GFP_KERNEL); if (!pdata) { printk("radeonfb: Memory allocation failed\n"); goto error; } snprintf(name, sizeof(name), "radeonbl%d", rinfo->info->node); bd = backlight_device_register(name, rinfo->info->dev, pdata, &radeon_bl_data); if (IS_ERR(bd)) { rinfo->info->bl_dev = NULL; printk("radeonfb: Backlight registration failed\n"); goto error; } pdata->rinfo = rinfo; /* Pardon me for that hack... maybe some day we can figure out in what * direction backlight should work on a given panel? */ pdata->negative = (rinfo->family != CHIP_FAMILY_RV200 && rinfo->family != CHIP_FAMILY_RV250 && rinfo->family != CHIP_FAMILY_RV280 && rinfo->family != CHIP_FAMILY_RV350); #ifdef CONFIG_PMAC_BACKLIGHT pdata->negative = pdata->negative || machine_is_compatible("PowerBook4,3") || machine_is_compatible("PowerBook6,3") || machine_is_compatible("PowerBook6,5"); #endif rinfo->info->bl_dev = bd; fb_bl_default_curve(rinfo->info, 0, 63 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL, 217 * FB_BACKLIGHT_MAX / MAX_RADEON_LEVEL); bd->props.max_brightness = FB_BACKLIGHT_LEVELS - 1; bd->props.brightness = bd->props.max_brightness; bd->props.power = FB_BLANK_UNBLANK; backlight_update_status(bd); printk("radeonfb: Backlight initialized (%s)\n", name); return; error: kfree(pdata); return; }
void udbg_scc_init(int force_scc) { const u32 *reg; unsigned long addr; struct device_node *stdout = NULL, *escc = NULL, *macio = NULL; struct device_node *ch, *ch_def = NULL, *ch_a = NULL; const char *path; int i, x; escc = of_find_node_by_name(NULL, "escc"); if (escc == NULL) goto bail; macio = of_get_parent(escc); if (macio == NULL) goto bail; path = of_get_property(of_chosen, "linux,stdout-path", NULL); if (path != NULL) stdout = of_find_node_by_path(path); for (ch = NULL; (ch = of_get_next_child(escc, ch)) != NULL;) { if (ch == stdout) ch_def = of_node_get(ch); if (strcmp(ch->name, "ch-a") == 0) ch_a = of_node_get(ch); } if (ch_def == NULL && !force_scc) goto bail; ch = ch_def ? ch_def : ch_a; /* Get address within mac-io ASIC */ reg = of_get_property(escc, "reg", NULL); if (reg == NULL) goto bail; addr = reg[0]; /* Get address of mac-io PCI itself */ reg = of_get_property(macio, "assigned-addresses", NULL); if (reg == NULL) goto bail; addr += reg[2]; /* Lock the serial port */ pmac_call_feature(PMAC_FTR_SCC_ENABLE, ch, PMAC_SCC_ASYNC | PMAC_SCC_FLAG_XMON, 1); if (ch == ch_a) addr += 0x20; sccc = ioremap(addr & PAGE_MASK, PAGE_SIZE) ; sccc += addr & ~PAGE_MASK; sccd = sccc + 0x10; mb(); for (i = 20000; i != 0; --i) x = in_8(sccc); out_8(sccc, 0x09); /* reset A or B side */ out_8(sccc, 0xc0); /* If SCC was the OF output port, read the BRG value, else * Setup for 38400 or 57600 8N1 depending on the machine */ if (ch_def != NULL) { out_8(sccc, 13); scc_inittab[1] = in_8(sccc); out_8(sccc, 12); scc_inittab[3] = in_8(sccc); } else if (machine_is_compatible("RackMac1,1") || machine_is_compatible("RackMac1,2") || machine_is_compatible("MacRISC4")) { /* Xserves and G5s default to 57600 */ scc_inittab[1] = 0; scc_inittab[3] = 0; } else { /* Others default to 38400 */ scc_inittab[1] = 0; scc_inittab[3] = 1; } for (i = 0; i < sizeof(scc_inittab); ++i) out_8(sccc, scc_inittab[i]); udbg_putc = udbg_scc_putc; udbg_getc = udbg_scc_getc; udbg_getc_poll = udbg_scc_getc_poll; udbg_puts("Hello World !\n"); bail: of_node_put(macio); of_node_put(escc); of_node_put(stdout); of_node_put(ch_def); of_node_put(ch_a); }