Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -rupN a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
- --- a/arch/powerpc/kernel/head_64.S 2016-10-15 05:42:34.463066803 +0200
- +++ b/arch/powerpc/kernel/head_64.S 2016-10-15 05:30:00.808345852 +0200
- @@ -79,6 +79,13 @@ _GLOBAL(__start)
- /* NOP this out unconditionally */
- BEGIN_FTR_SECTION
- FIXUP_ENDIAN
- +/* Hack for PWRficient platforms: Due to CFE(?) bug, the 64-bit
- + * word at 0x8 needs to be set to 0. Patch it up here once we're
- + * done executing it (we can be lazy and avoid invalidating
- + * icache)
- + */
- +li r0,0
- +std 0,8(0)
- b __start_initialization_multiplatform
- END_FTR_SECTION(0, 1)
- diff -rupN a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
- --- a/arch/powerpc/kernel/setup-common.c 2016-10-15 05:42:34.499066801 +0200
- +++ b/arch/powerpc/kernel/setup-common.c 2016-10-15 05:30:00.816341837 +0200
- @@ -84,7 +84,15 @@ EXPORT_SYMBOL(ppc_md);
- struct machdep_calls *machine_id;
- EXPORT_SYMBOL(machine_id);
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- +/* FIXME!!
- + * Current PASemi code does not correctly update the value of boot_cpuid
- + * As a temporary fix we use the default 0, which is known to work.
- + */
- +int boot_cpuid = 0;
- +#else
- int boot_cpuid = -1;
- +#endif
- EXPORT_SYMBOL_GPL(boot_cpuid);
- unsigned long klimit = (unsigned long) _end;
- diff -rupN a/arch/powerpc/platforms/pasemi/pci.c b/arch/powerpc/platforms/pasemi/pci.c
- --- a/arch/powerpc/platforms/pasemi/pci.c 2016-10-15 05:42:34.859066783 +0200
- +++ b/arch/powerpc/platforms/pasemi/pci.c 2016-10-15 05:30:00.824337864 +0200
- @@ -108,6 +108,69 @@ static int workaround_5945(struct pci_bu
- return 1;
- }
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- +static int sb600_bus = 5;
- +static void __iomem *iob_mapbase = NULL;
- +
- +static int pa_pxp_read_config(struct pci_bus *bus, unsigned int devfn,
- + int offset, int len, u32 *val);
- +
- +static void sb600_set_flag(int bus)
- +{
- + struct resource res;
- + struct device_node *dn;
- + struct pci_bus *busp;
- + u32 val;
- + int err;
- +
- + if (sb600_bus == -1)
- + {
- + busp = pci_find_bus(0, 0);
- + pa_pxp_read_config(busp, PCI_DEVFN(17,0), PCI_SECONDARY_BUS, 1, &val);
- +
- + sb600_bus = val;
- +
- + printk(KERN_CRIT "NEMO SB600 on bus %d.\n",sb600_bus);
- + }
- +
- + if (iob_mapbase == NULL)
- + {
- + dn = of_find_compatible_node(NULL, "isa", "pasemi,1682m-iob");
- + if (!dn)
- + {
- + printk(KERN_CRIT "NEMO SB600 missing iob node\n");
- + return;
- + }
- +
- + err = of_address_to_resource(dn, 0, &res);
- + of_node_put(dn);
- +
- + if (err)
- + {
- + printk(KERN_CRIT "NEMO SB600 missing resource\n");
- + return;
- + }
- +
- + printk(KERN_CRIT "NEMO SB600 IOB base %08lx\n",res.start);
- +
- + iob_mapbase = ioremap(res.start + 0x100, 0x94);
- + }
- +
- + if (iob_mapbase != NULL)
- + {
- + if (bus == sb600_bus)
- + {
- + out_le32(iob_mapbase + 4, in_le32(iob_mapbase + 4) | 0x800);
- + }
- + else
- + {
- + out_le32(iob_mapbase + 4, in_le32(iob_mapbase + 4) & ~0x800);
- + }
- + }
- +}
- +#endif
- +
- +
- static int pa_pxp_read_config(struct pci_bus *bus, unsigned int devfn,
- int offset, int len, u32 *val)
- {
- @@ -126,6 +189,10 @@ static int pa_pxp_read_config(struct pci
- addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset);
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + sb600_set_flag(bus->number);
- +#endif
- +
- /*
- * Note: the caller has already checked that offset is
- * suitably aligned and that len is 1, 2 or 4.
- @@ -210,6 +277,9 @@ static int __init pas_add_bridge(struct
- /* Interpret the "ranges" property */
- pci_process_bridge_OF_ranges(hose, dev, 1);
- + /* Scan for an isa bridge. */
- + isa_bridge_find_early(hose);
- +
- return 0;
- }
- diff -rupN a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c
- --- a/arch/powerpc/platforms/pasemi/setup.c 2016-10-15 05:42:34.859066783 +0200
- +++ b/arch/powerpc/platforms/pasemi/setup.c 2016-10-15 05:30:00.880309854 +0200
- @@ -34,6 +34,7 @@
- #include <asm/prom.h>
- #include <asm/iommu.h>
- #include <asm/machdep.h>
- +#include <asm/i8259.h>
- #include <asm/mpic.h>
- #include <asm/smp.h>
- #include <asm/time.h>
- @@ -72,6 +73,17 @@ static void __noreturn pas_restart(char
- out_le32(reset_reg, 0x6000000);
- }
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- +void pas_shutdown(void)
- +{
- + /* (added by DStevens 19/06/13)
- + Set the PLD bit that makes the SB600 think the power button is being pressed */
- + void __iomem *pld_map = ioremap(0xf5000000,4096);
- + while (1)
- + out_8(pld_map+7,0x01);
- +}
- +#endif
- +
- #ifdef CONFIG_SMP
- static arch_spinlock_t timebase_lock;
- static unsigned long timebase;
- @@ -183,16 +195,30 @@ static int __init pas_setup_mce_regs(voi
- }
- machine_device_initcall(pasemi, pas_setup_mce_regs);
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- +static void sb600_8259_cascade(struct irq_desc *desc)
- +{
- + struct irq_chip *chip = irq_desc_get_chip(desc);
- + unsigned int cascade_irq = i8259_irq();
- +
- + if (cascade_irq !=NO_IRQ)
- + generic_handle_irq(cascade_irq);
- +
- + chip->irq_eoi(&desc->irq_data);
- +}
- +#endif
- +
- static __init void pas_init_IRQ(void)
- {
- struct device_node *np;
- - struct device_node *root, *mpic_node;
- + struct device_node *root, *mpic_node, *i8259_node;
- unsigned long openpic_addr;
- const unsigned int *opprop;
- int naddr, opplen;
- int mpic_flags;
- const unsigned int *nmiprop;
- struct mpic *mpic;
- + int gpio_virq;
- mpic_node = NULL;
- @@ -244,6 +270,22 @@ static __init void pas_init_IRQ(void)
- mpic_unmask_irq(irq_get_irq_data(nmi_virq));
- }
- +
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + // Connect legacy i8259 controller in SB600
- + i8259_node = of_find_node_by_path("/pxp@0,e0000000");
- + printk("Init i8259\n");
- + i8259_init(i8259_node, 0);
- + of_node_put(i8259_node);
- +
- + gpio_virq = irq_create_mapping(NULL, 3);
- + irq_set_irq_type(gpio_virq, IRQ_TYPE_LEVEL_HIGH);
- + irq_set_chained_handler(gpio_virq, sb600_8259_cascade);
- + mpic_unmask_irq(irq_get_irq_data(gpio_virq));
- +
- + irq_set_default_host(mpic->irqhost);
- +
- +#endif
- of_node_put(mpic_node);
- of_node_put(root);
- }
- @@ -398,6 +440,18 @@ static const struct of_device_id pasemi_
- {},
- };
- +static struct resource rtc_resource[] = {{
- + .name = "rtc",
- + .start = 0x70,
- + .end = 0x71,
- + .flags = IORESOURCE_IO,
- +}, {
- + .name = "rtc",
- + .start = 8,
- + .end = 8,
- + .flags = IORESOURCE_IRQ,
- +}};
- +
- static int __init pasemi_publish_devices(void)
- {
- pasemi_pcmcia_init();
- @@ -405,6 +459,10 @@ static int __init pasemi_publish_devices
- /* Publish OF platform devices for SDC and other non-PCI devices */
- of_platform_bus_probe(NULL, pasemi_bus_ids, NULL);
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + platform_device_register_simple("rtc_cmos", -1, rtc_resource, 2);
- +#endif
- +
- return 0;
- }
- machine_device_initcall(pasemi, pasemi_publish_devices);
- @@ -421,9 +479,13 @@ static int __init pas_probe(void)
- iommu_init_early_pasemi();
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + pm_power_off = pas_shutdown; // Varisys provided a way to turn us off
- +#endif
- return 1;
- }
- +
- define_machine(pasemi) {
- .name = "PA Semi PWRficient",
- .probe = pas_probe,
- @@ -435,4 +497,7 @@ define_machine(pasemi) {
- .calibrate_decr = generic_calibrate_decr,
- .progress = pas_progress,
- .machine_check_exception = pas_machine_check_handler,
- +#if 0 // def CONFIG_PPC_PASEMI_NEMO
- + .pci_probe_mode = sb600_pci_probe_mode,
- +#endif
- };
- diff -rupN a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
- --- a/drivers/ata/libata-sff.c 2016-10-15 05:42:39.063066573 +0200
- +++ b/drivers/ata/libata-sff.c 2016-10-15 05:30:00.956271851 +0200
- @@ -2429,9 +2429,9 @@ int ata_pci_sff_activate_host(struct ata
- if ((pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
- u8 tmp8, mask;
- - /* TODO: What if one channel is in native mode ... */
- + /* Don't look at dummy ports in the mask */
- pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
- - mask = (1 << 2) | (1 << 0);
- + mask = (! ata_port_is_dummy(host->ports[1]) << 2) | (! ata_port_is_dummy(host->ports[0]) << 0);
- if ((tmp8 & mask) != mask)
- legacy_mode = 1;
- }
- diff -rupN a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c
- --- a/drivers/ata/pata_atiixp.c 2016-10-15 05:42:39.067066572 +0200
- +++ b/drivers/ata/pata_atiixp.c 2016-10-15 05:30:00.968265850 +0200
- @@ -278,6 +278,11 @@ static int atiixp_init_one(struct pci_de
- };
- const struct ata_port_info *ppi[] = { &info, &info };
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + // Second port not wired on SB600, and config bit cannot be set by BIOS
- + ppi[1] = &ata_dummy_port_info;
- +#endif
- +
- return ata_pci_bmdma_init_one(pdev, ppi, &atiixp_sht, NULL,
- ATA_HOST_PARALLEL_SCAN);
- }
- diff -rupN a/drivers/ata/pata_of_platform.c b/drivers/ata/pata_of_platform.c
- --- a/drivers/ata/pata_of_platform.c 2016-10-15 05:42:39.107066570 +0200
- +++ b/drivers/ata/pata_of_platform.c 2016-10-15 05:30:00.976261850 +0200
- @@ -41,14 +41,36 @@ static int pata_of_platform_probe(struct
- return -EINVAL;
- }
- - ret = of_address_to_resource(dn, 1, &ctl_res);
- - if (ret) {
- - dev_err(&ofdev->dev, "can't get CTL address from "
- - "device tree\n");
- - return -EINVAL;
- + if (of_device_is_compatible(dn, "electra-ide")) {
- + /* Altstatus is really at offset 0x3f6 from the primary window
- + * on electra-ide. Adjust ctl_res and io_res accordingly.
- + */
- + ctl_res = io_res;
- + ctl_res.start = ctl_res.start+0x3f6;
- + io_res.end = ctl_res.start-1;
- +
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + } else if (of_device_is_compatible(dn, "electra-cf")) {
- + /* Task regs are at 0x800, with alt status @ 0x80e in the primary window
- + * on electra-cf. Adjust ctl_res and io_res accordingly.
- + */
- + ctl_res = io_res;
- + io_res.start += 0x800;
- + ctl_res.start = ctl_res.start + 0x80e;
- + io_res.end = ctl_res.start-1;
- +#endif
- + } else {
- + ret = of_address_to_resource(dn, 1, &ctl_res);
- + if (ret) {
- + dev_err(&ofdev->dev, "can't get CTL address from "
- + "device tree\n");
- + return -EINVAL;
- + }
- }
- irq_res = platform_get_resource(ofdev, IORESOURCE_IRQ, 0);
- + if (irq_res)
- + irq_res->flags = 0;
- prop = of_get_property(dn, "reg-shift", NULL);
- if (prop)
- @@ -65,6 +87,11 @@ static int pata_of_platform_probe(struct
- dev_info(&ofdev->dev, "pio-mode unspecified, assuming PIO0\n");
- }
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + irq_res = 0; // force irq off (doesn't seem to work)
- +#endif
- +
- +
- pio_mask = 1 << pio_mode;
- pio_mask |= (1 << pio_mode) - 1;
- @@ -74,6 +101,10 @@ static int pata_of_platform_probe(struct
- static struct of_device_id pata_of_platform_match[] = {
- { .compatible = "ata-generic", },
- + { .compatible = "electra-ide", },
- +#ifdef CONFIG_PPC_PASEMI_NEMO
- + { .compatible = "electra-cf",},
- +#endif
- { },
- };
- MODULE_DEVICE_TABLE(of, pata_of_platform_match);
- diff -rupN a/drivers/i2c/busses/i2c-pasemi.c b/drivers/i2c/busses/i2c-pasemi.c
- --- a/drivers/i2c/busses/i2c-pasemi.c 2016-10-15 05:42:46.847066183 +0200
- +++ b/drivers/i2c/busses/i2c-pasemi.c 2016-10-15 05:30:01.036231848 +0200
- @@ -365,7 +365,7 @@ static int pasemi_smb_probe(struct pci_d
- smbus->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
- smbus->adapter.algo = &smbus_algorithm;
- smbus->adapter.algo_data = smbus;
- - smbus->adapter.nr = PCI_FUNC(dev->devfn);
- + smbus->adapter.nr = -1;
- /* set up the sysfs linkage to our parent device */
- smbus->adapter.dev.parent = &dev->dev;
- @@ -373,7 +373,7 @@ static int pasemi_smb_probe(struct pci_d
- reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
- (CLK_100K_DIV & CTL_CLK_M)));
- - error = i2c_add_numbered_adapter(&smbus->adapter);
- + error = i2c_add_adapter(&smbus->adapter);
- if (error)
- goto out_release_region;
- diff -rupN a/drivers/pci/probe.c b/drivers/pci/probe.c
- --- a/drivers/pci/probe.c 2016-10-15 05:42:59.123065569 +0200
- +++ b/drivers/pci/probe.c 2016-10-15 05:30:01.052223845 +0200
- @@ -1849,6 +1849,8 @@ static int only_one_child(struct pci_bus
- if (!parent || !pci_is_pcie(parent))
- return 0;
- + #ifndef CONFIG_PPC_PASEMI_NEMO
- + // SB600 has non-zero devices on non-root bus.
- if (pci_pcie_type(parent) == PCI_EXP_TYPE_ROOT_PORT)
- return 1;
- @@ -1861,6 +1863,7 @@ static int only_one_child(struct pci_bus
- if (parent->has_secondary_link &&
- !pci_has_flag(PCI_SCAN_ALL_PCIE_DEVS))
- return 1;
- + #endif
- return 0;
- }
- diff -rupN a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
- --- a/sound/pci/hda/patch_sigmatel.c 2016-10-15 05:43:20.267064512 +0200
- +++ b/sound/pci/hda/patch_sigmatel.c 2016-10-15 05:30:01.060219846 +0200
- @@ -166,6 +166,7 @@ enum {
- STAC_D965_VERBS,
- STAC_DELL_3ST,
- STAC_DELL_BIOS,
- + STAC_NEMO_DEFAULT,
- STAC_DELL_BIOS_AMIC,
- STAC_DELL_BIOS_SPDIF,
- STAC_927X_DELL_DMIC,
- @@ -1360,6 +1361,23 @@ static const struct hda_pintbl oqo9200_p
- {}
- };
- +static const struct hda_pintbl nemo_pin_configs[] = {
- + { 0x0a, 0x02214020 },
- + { 0x0b, 0x02A19080 },
- + { 0x0c, 0x0181304E },
- + { 0x0d, 0x01014010 },
- + { 0x0e, 0x01A19040 },
- + { 0x0f, 0x01011012 },
- + { 0x10, 0x01016011 },
- + { 0x11, 0x01012014 },
- + { 0x12, 0x103301F0 },
- + { 0x13, 0x00000000 },
- + { 0x14, 0x00000000 },
- + { 0x21, 0x01442170 },
- + { 0x22, 0x00000000 },
- + { 0x23, 0x00000000 },
- + {}
- +};
- static void stac9200_fixup_panasonic(struct hda_codec *codec,
- const struct hda_fixup *fix, int action)
- @@ -3883,6 +3901,10 @@ static const struct hda_fixup stac927x_f
- .type = HDA_FIXUP_PINS,
- .v.pins = d965_5st_no_fp_pin_configs,
- },
- + [STAC_NEMO_DEFAULT] = {
- + .type = HDA_FIXUP_PINS,
- + .v.pins = nemo_pin_configs,
- + },
- [STAC_DELL_3ST] = {
- .type = HDA_FIXUP_PINS,
- .v.pins = dell_3st_pin_configs,
- @@ -3939,6 +3961,7 @@ static const struct hda_model_fixup stac
- { .id = STAC_D965_5ST_NO_FP, .name = "5stack-no-fp" },
- { .id = STAC_DELL_3ST, .name = "dell-3stack" },
- { .id = STAC_DELL_BIOS, .name = "dell-bios" },
- + { .id = STAC_NEMO_DEFAULT, .name = "nemo-default" },
- { .id = STAC_DELL_BIOS_AMIC, .name = "dell-bios-amic" },
- { .id = STAC_927X_VOLKNOB, .name = "volknob" },
- {}
- @@ -3977,6 +4000,8 @@ static const struct snd_pci_quirk stac92
- "Intel D965", STAC_D965_5ST),
- SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
- "Intel D965", STAC_D965_5ST),
- + /* Nemo */
- + SND_PCI_QUIRK(0x1888, 0x1000, "AmigaOne X1000", STAC_NEMO_DEFAULT),
- /* volume-knob fixes */
- SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
- {} /* terminator */
- @@ -5036,6 +5061,7 @@ static const struct hda_device_id snd_hd
- HDA_CODEC_ENTRY(0x83847683, "STAC9221D A2", patch_stac922x),
- HDA_CODEC_ENTRY(0x83847618, "STAC9227", patch_stac927x),
- HDA_CODEC_ENTRY(0x83847619, "STAC9227", patch_stac927x),
- + HDA_CODEC_ENTRY(0x83847638, "STAC92HD700", patch_stac927x),
- HDA_CODEC_ENTRY(0x83847616, "STAC9228", patch_stac927x),
- HDA_CODEC_ENTRY(0x83847617, "STAC9228", patch_stac927x),
- HDA_CODEC_ENTRY(0x83847614, "STAC9229", patch_stac927x),
Add Comment
Please, Sign In to add comment