diff options
Diffstat (limited to 'target/linux/generic/patches-3.8/020-ssb_update.patch')
-rw-r--r-- | target/linux/generic/patches-3.8/020-ssb_update.patch | 136 |
1 files changed, 118 insertions, 18 deletions
diff --git a/target/linux/generic/patches-3.8/020-ssb_update.patch b/target/linux/generic/patches-3.8/020-ssb_update.patch index a1b4a1fef2..22dae59498 100644 --- a/target/linux/generic/patches-3.8/020-ssb_update.patch +++ b/target/linux/generic/patches-3.8/020-ssb_update.patch @@ -1,6 +1,6 @@ --- a/drivers/ssb/Kconfig +++ b/drivers/ssb/Kconfig -@@ -136,6 +136,11 @@ config SSB_DRIVER_MIPS +@@ -136,10 +136,15 @@ config SSB_DRIVER_MIPS If unsure, say N @@ -12,6 +12,11 @@ # Assumption: We are on embedded, if we compile the MIPS core. config SSB_EMBEDDED bool +- depends on SSB_DRIVER_MIPS ++ depends on SSB_DRIVER_MIPS && SSB_PCICORE_HOSTMODE + default y + + config SSB_DRIVER_EXTIF --- a/drivers/ssb/Makefile +++ b/drivers/ssb/Makefile @@ -11,6 +11,7 @@ ssb-$(CONFIG_SSB_SDIOHOST) += sdio.o @@ -174,7 +179,7 @@ "Unknown spuravoidance settings for chip 0x%04X, not changing PLL\n", --- /dev/null +++ b/drivers/ssb/driver_chipcommon_sflash.c -@@ -0,0 +1,140 @@ +@@ -0,0 +1,166 @@ +/* + * Sonics Silicon Backplane + * ChipCommon serial flash interface @@ -186,6 +191,19 @@ + +#include "ssb_private.h" + ++static struct resource ssb_sflash_resource = { ++ .name = "ssb_sflash", ++ .start = SSB_FLASH2, ++ .end = 0, ++ .flags = IORESOURCE_MEM | IORESOURCE_READONLY, ++}; ++ ++struct platform_device ssb_sflash_dev = { ++ .name = "ssb_sflash", ++ .resource = &ssb_sflash_resource, ++ .num_resources = 1, ++}; ++ +struct ssb_sflash_tbl_e { + char *name; + u32 id; @@ -193,7 +211,7 @@ + u16 numblocks; +}; + -+static struct ssb_sflash_tbl_e ssb_sflash_st_tbl[] = { ++static const struct ssb_sflash_tbl_e ssb_sflash_st_tbl[] = { + { "M25P20", 0x11, 0x10000, 4, }, + { "M25P40", 0x12, 0x10000, 8, }, + @@ -204,7 +222,7 @@ + { 0 }, +}; + -+static struct ssb_sflash_tbl_e ssb_sflash_sst_tbl[] = { ++static const struct ssb_sflash_tbl_e ssb_sflash_sst_tbl[] = { + { "SST25WF512", 1, 0x1000, 16, }, + { "SST25VF512", 0x48, 0x1000, 16, }, + { "SST25WF010", 2, 0x1000, 32, }, @@ -222,7 +240,7 @@ + { 0 }, +}; + -+static struct ssb_sflash_tbl_e ssb_sflash_at_tbl[] = { ++static const struct ssb_sflash_tbl_e ssb_sflash_at_tbl[] = { + { "AT45DB011", 0xc, 256, 512, }, + { "AT45DB021", 0x14, 256, 1024, }, + { "AT45DB041", 0x1c, 256, 2048, }, @@ -250,7 +268,8 @@ +/* Initialize serial flash access */ +int ssb_sflash_init(struct ssb_chipcommon *cc) +{ -+ struct ssb_sflash_tbl_e *e; ++ struct ssb_sflash *sflash = &cc->dev->bus->mipscore.sflash; ++ const struct ssb_sflash_tbl_e *e; + u32 id, id2; + + switch (cc->capabilities & SSB_CHIPCO_CAP_FLASHT) { @@ -308,9 +327,21 @@ + return -ENOTSUPP; + } + ++ sflash->window = SSB_FLASH2; ++ sflash->blocksize = e->blocksize; ++ sflash->numblocks = e->numblocks; ++ sflash->size = sflash->blocksize * sflash->numblocks; ++ sflash->present = true; ++ + pr_info("Found %s serial flash (blocksize: 0x%X, blocks: %d)\n", + e->name, e->blocksize, e->numblocks); + ++ /* Prepare platform device, but don't register it yet. It's too early, ++ * malloc (required by device_private_init) is not available yet. */ ++ ssb_sflash_dev.resource[0].end = ssb_sflash_dev.resource[0].start + ++ sflash->size; ++ ssb_sflash_dev.dev.platform_data = sflash; ++ + pr_err("Serial flash support is not implemented yet!\n"); + + return -ENOTSUPP; @@ -626,7 +657,7 @@ /* Set dev to NULL to not unregister * dev on error unwinding. */ sdev->dev = NULL; -@@ -549,6 +545,14 @@ static int ssb_devices_register(struct s +@@ -549,6 +545,22 @@ static int ssb_devices_register(struct s dev_idx++; } @@ -638,10 +669,18 @@ + } +#endif + ++#ifdef CONFIG_SSB_SFLASH ++ if (bus->mipscore.sflash.present) { ++ err = platform_device_register(&ssb_sflash_dev); ++ if (err) ++ pr_err("Error registering serial flash\n"); ++ } ++#endif ++ return 0; error: /* Unwind the already registered devices. */ -@@ -817,10 +821,9 @@ static int ssb_bus_register(struct ssb_b +@@ -817,10 +829,9 @@ static int ssb_bus_register(struct ssb_b ssb_mipscore_init(&bus->mipscore); err = ssb_gpio_init(bus); if (err == -ENOTSUPP) @@ -654,7 +693,7 @@ err = ssb_fetch_invariants(bus, get_invariants); if (err) { ssb_bus_may_powerdown(bus); -@@ -870,11 +873,11 @@ int ssb_bus_pcibus_register(struct ssb_b +@@ -870,11 +881,11 @@ int ssb_bus_pcibus_register(struct ssb_b err = ssb_bus_register(bus, ssb_pci_get_invariants, 0); if (!err) { @@ -670,7 +709,7 @@ } return err; -@@ -895,8 +898,8 @@ int ssb_bus_pcmciabus_register(struct ss +@@ -895,8 +906,8 @@ int ssb_bus_pcmciabus_register(struct ss err = ssb_bus_register(bus, ssb_pcmcia_get_invariants, baseaddr); if (!err) { @@ -681,7 +720,7 @@ } return err; -@@ -917,8 +920,8 @@ int ssb_bus_sdiobus_register(struct ssb_ +@@ -917,8 +928,8 @@ int ssb_bus_sdiobus_register(struct ssb_ err = ssb_bus_register(bus, ssb_sdio_get_invariants, ~0); if (!err) { @@ -692,7 +731,7 @@ } return err; -@@ -936,8 +939,8 @@ int ssb_bus_ssbbus_register(struct ssb_b +@@ -936,8 +947,8 @@ int ssb_bus_ssbbus_register(struct ssb_b err = ssb_bus_register(bus, get_invariants, baseaddr); if (!err) { @@ -703,7 +742,7 @@ } return err; -@@ -1331,7 +1334,7 @@ out: +@@ -1331,7 +1342,7 @@ out: #endif return err; error: @@ -712,7 +751,7 @@ goto out; } EXPORT_SYMBOL(ssb_bus_may_powerdown); -@@ -1354,7 +1357,7 @@ int ssb_bus_powerup(struct ssb_bus *bus, +@@ -1354,7 +1365,7 @@ int ssb_bus_powerup(struct ssb_bus *bus, return 0; error: @@ -721,7 +760,7 @@ return err; } EXPORT_SYMBOL(ssb_bus_powerup); -@@ -1462,15 +1465,13 @@ static int __init ssb_modinit(void) +@@ -1462,15 +1473,13 @@ static int __init ssb_modinit(void) err = b43_pci_ssb_bridge_init(); if (err) { @@ -1028,6 +1067,17 @@ } } err = sprom_extract(bus, sprom, buf, bus->sprom_size); +--- a/drivers/ssb/pcihost_wrapper.c ++++ b/drivers/ssb/pcihost_wrapper.c +@@ -38,7 +38,7 @@ static int ssb_pcihost_resume(struct pci + struct ssb_bus *ssb = pci_get_drvdata(dev); + int err; + +- pci_set_power_state(dev, 0); ++ pci_set_power_state(dev, PCI_D0); + err = pci_enable_device(dev); + if (err) + return err; --- a/drivers/ssb/pcmcia.c +++ b/drivers/ssb/pcmcia.c @@ -143,7 +143,7 @@ int ssb_pcmcia_switch_coreidx(struct ssb @@ -1247,6 +1297,15 @@ bus->pcicore.dev = dev; --- a/drivers/ssb/sprom.c +++ b/drivers/ssb/sprom.c +@@ -54,7 +54,7 @@ static int hex2sprom(u16 *sprom, const c + while (cnt < sprom_size_words) { + memcpy(tmp, dump, 4); + dump += 4; +- err = strict_strtoul(tmp, 16, &parsed); ++ err = kstrtoul(tmp, 16, &parsed); + if (err) + return err; + sprom[cnt++] = swab16((u16)parsed); @@ -127,13 +127,13 @@ ssize_t ssb_attr_sprom_store(struct ssb_ goto out_kfree; err = ssb_devices_freeze(bus, &freeze); @@ -1297,7 +1356,7 @@ #endif #ifdef CONFIG_SSB_DEBUG -@@ -217,6 +228,21 @@ extern u32 ssb_chipco_watchdog_timer_set +@@ -217,6 +228,25 @@ extern u32 ssb_chipco_watchdog_timer_set u32 ticks); extern u32 ssb_chipco_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms); @@ -1316,6 +1375,10 @@ +extern struct platform_device ssb_pflash_dev; +#endif + ++#ifdef CONFIG_SSB_SFLASH ++extern struct platform_device ssb_sflash_dev; ++#endif ++ #ifdef CONFIG_SSB_DRIVER_EXTIF extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks); extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms); @@ -1443,7 +1506,36 @@ #endif /* LINUX_SSB_DRIVER_GIGE_H_ */ --- a/include/linux/ssb/ssb_driver_mips.h +++ b/include/linux/ssb/ssb_driver_mips.h -@@ -45,6 +45,11 @@ void ssb_mipscore_init(struct ssb_mipsco +@@ -20,6 +20,18 @@ struct ssb_pflash { + u32 window_size; + }; + ++#ifdef CONFIG_SSB_SFLASH ++struct ssb_sflash { ++ bool present; ++ u32 window; ++ u32 blocksize; ++ u16 numblocks; ++ u32 size; ++ ++ void *priv; ++}; ++#endif ++ + struct ssb_mipscore { + struct ssb_device *dev; + +@@ -27,6 +39,9 @@ struct ssb_mipscore { + struct ssb_serial_port serial_ports[4]; + + struct ssb_pflash pflash; ++#ifdef CONFIG_SSB_SFLASH ++ struct ssb_sflash sflash; ++#endif + }; + + extern void ssb_mipscore_init(struct ssb_mipscore *mcore); +@@ -45,6 +60,11 @@ void ssb_mipscore_init(struct ssb_mipsco { } @@ -1457,7 +1549,15 @@ #endif /* LINUX_SSB_MIPSCORE_H_ */ --- a/include/linux/ssb/ssb_regs.h +++ b/include/linux/ssb/ssb_regs.h -@@ -289,11 +289,11 @@ +@@ -172,6 +172,7 @@ + #define SSB_SPROMSIZE_WORDS_R4 220 + #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) + #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) ++#define SSB_SPROMSIZE_WORDS_R10 230 + #define SSB_SPROM_BASE1 0x1000 + #define SSB_SPROM_BASE31 0x0800 + #define SSB_SPROM_REVISION 0x007E +@@ -289,11 +290,11 @@ #define SSB_SPROM4_ETHPHY_ET1A_SHIFT 5 #define SSB_SPROM4_ETHPHY_ET0M (1<<14) /* MDIO for enet0 */ #define SSB_SPROM4_ETHPHY_ET1M (1<<15) /* MDIO for enet1 */ |