diff --git a/patches/drivers/drivers.scc b/patches/drivers/drivers.scc index 7ef94a9761126d078dc42accb8ffbefa34a45de8..5e2cb557b321481e11fb108d8b7d5d7de36ac19b 100644 --- a/patches/drivers/drivers.scc +++ b/patches/drivers/drivers.scc @@ -1,2 +1,6 @@ # merged upstream #patch MIPS-i8259-Use-struct-syscore_ops-instead-of-sysdevs.patch +patch mfd-lpc_sch-Accomodate-partial-population-of-the-MFD.patch +patch gpio-sch-Allow-for-more-than-8-lines-in-the-resume-w.patch +patch pch_gbe-Use-PCH_GBE_PHY_REGS_LEN-instead-of-32.patch +patch pch_uart-Add-uart_clk-selection-for-the-MinnowBoard.patch diff --git a/patches/drivers/gpio-sch-Allow-for-more-than-8-lines-in-the-resume-w.patch b/patches/drivers/gpio-sch-Allow-for-more-than-8-lines-in-the-resume-w.patch new file mode 100644 index 0000000000000000000000000000000000000000..d737a3b85d4026b29efccceb177549d079248fef --- /dev/null +++ b/patches/drivers/gpio-sch-Allow-for-more-than-8-lines-in-the-resume-w.patch @@ -0,0 +1,106 @@ +From 0daa5c8eed91b6ea670f679644b43be0f53e80ed Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:53 -0700 +Subject: [PATCH 2/4] gpio-sch: Allow for more than 8 lines in the resume well + +commit 3cbf1822b5fd98eccb641c94c8cd2455fdad9221 upstream + +The E6xx (TunnelCreek) CPUs have 9 GPIO lines in the resume well. Update +the resume functions to allow for more than 8 GPIO lines, using the core +functions as a template. + +Cc: <stable@vger.kernel.org> # 3.4.x +Cc: <stable@vger.kernel.org> # 3.8.x +Cc: Grant Likely <grant.likely@secretlab.ca> +Cc: Linus Walleij <linus.walleij@linaro.org> +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/gpio/gpio-sch.c | 37 +++++++++++++++++++++++++++---------- + 1 file changed, 27 insertions(+), 10 deletions(-) + +diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c +index edae963..529c488 100644 +--- a/drivers/gpio/gpio-sch.c ++++ b/drivers/gpio/gpio-sch.c +@@ -125,13 +125,17 @@ static int sch_gpio_resume_direction_in(struct gpio_chip *gc, + unsigned gpio_num) + { + u8 curr_dirs; ++ unsigned short offset, bit; + + spin_lock(&gpio_lock); + +- curr_dirs = inb(gpio_ba + RGIO); ++ offset = RGIO + gpio_num / 8; ++ bit = gpio_num % 8; ++ ++ curr_dirs = inb(gpio_ba + offset); + +- if (!(curr_dirs & (1 << gpio_num))) +- outb(curr_dirs | (1 << gpio_num) , gpio_ba + RGIO); ++ if (!(curr_dirs & (1 << bit))) ++ outb(curr_dirs | (1 << bit) , gpio_ba + offset); + + spin_unlock(&gpio_lock); + return 0; +@@ -139,22 +143,31 @@ static int sch_gpio_resume_direction_in(struct gpio_chip *gc, + + static int sch_gpio_resume_get(struct gpio_chip *gc, unsigned gpio_num) + { +- return !!(inb(gpio_ba + RGLV) & (1 << gpio_num)); ++ unsigned short offset, bit; ++ ++ offset = RGLV + gpio_num / 8; ++ bit = gpio_num % 8; ++ ++ return !!(inb(gpio_ba + offset) & (1 << bit)); + } + + static void sch_gpio_resume_set(struct gpio_chip *gc, + unsigned gpio_num, int val) + { + u8 curr_vals; ++ unsigned short offset, bit; + + spin_lock(&gpio_lock); + +- curr_vals = inb(gpio_ba + RGLV); ++ offset = RGLV + gpio_num / 8; ++ bit = gpio_num % 8; ++ ++ curr_vals = inb(gpio_ba + offset); + + if (val) +- outb(curr_vals | (1 << gpio_num), gpio_ba + RGLV); ++ outb(curr_vals | (1 << bit), gpio_ba + offset); + else +- outb((curr_vals & ~(1 << gpio_num)), gpio_ba + RGLV); ++ outb((curr_vals & ~(1 << bit)), gpio_ba + offset); + + spin_unlock(&gpio_lock); + } +@@ -163,14 +176,18 @@ static int sch_gpio_resume_direction_out(struct gpio_chip *gc, + unsigned gpio_num, int val) + { + u8 curr_dirs; ++ unsigned short offset, bit; + + sch_gpio_resume_set(gc, gpio_num, val); + ++ offset = RGIO + gpio_num / 8; ++ bit = gpio_num % 8; ++ + spin_lock(&gpio_lock); + +- curr_dirs = inb(gpio_ba + RGIO); +- if (curr_dirs & (1 << gpio_num)) +- outb(curr_dirs & ~(1 << gpio_num), gpio_ba + RGIO); ++ curr_dirs = inb(gpio_ba + offset); ++ if (curr_dirs & (1 << bit)) ++ outb(curr_dirs & ~(1 << bit), gpio_ba + offset); + + spin_unlock(&gpio_lock); + return 0; +-- +1.7.10.4 + diff --git a/patches/drivers/mfd-lpc_sch-Accomodate-partial-population-of-the-MFD.patch b/patches/drivers/mfd-lpc_sch-Accomodate-partial-population-of-the-MFD.patch new file mode 100644 index 0000000000000000000000000000000000000000..0f1c5d98423a3a1845e8a512c40f2ce9f46a7e1b --- /dev/null +++ b/patches/drivers/mfd-lpc_sch-Accomodate-partial-population-of-the-MFD.patch @@ -0,0 +1,223 @@ +From 64bf5aebc72faecb87baea47caae195fdca44d4a Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:52 -0700 +Subject: [PATCH 1/4] mfd: lpc_sch: Accomodate partial population of the MFD + devices + +commit 5829e9b64e657560e840dc0ecfee177cb002cd69 upstream + +The current probe aborts if any of the 3 base address registers are +disabled. On a TunnelCreek system I am working on, this resulted in the +SMBIOS and GPIO devices being removed when it couldn't read the base +address for the watchdog timer. + +This patch accommodates partial population of the lpc_sch_cells array and +only aborts if all the base address registers are disabled. A max size +array is allocated and the individual device cells are added to it after +their base addresses are successfully determined. This simplifies the +code a bit by removing the need for the separate tunnelcreek cells array +and combining some of the add/remove logic. + +Cc: Grant Likely <grant.likely@secretlab.ca>, +Cc: Denis Turischev <denis@compulab.co.il>, +Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>, +Cc: Linus Walleij <linus.walleij@linaro.org> +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> +--- + drivers/mfd/lpc_sch.c | 147 ++++++++++++++++++++++++------------------------- + 1 file changed, 71 insertions(+), 76 deletions(-) + +diff --git a/drivers/mfd/lpc_sch.c b/drivers/mfd/lpc_sch.c +index 5624fcb..8cc6aac 100644 +--- a/drivers/mfd/lpc_sch.c ++++ b/drivers/mfd/lpc_sch.c +@@ -45,34 +45,32 @@ static struct resource smbus_sch_resource = { + .flags = IORESOURCE_IO, + }; + +- + static struct resource gpio_sch_resource = { + .flags = IORESOURCE_IO, + }; + +-static struct mfd_cell lpc_sch_cells[] = { +- { +- .name = "isch_smbus", +- .num_resources = 1, +- .resources = &smbus_sch_resource, +- }, +- { +- .name = "sch_gpio", +- .num_resources = 1, +- .resources = &gpio_sch_resource, +- }, +-}; +- + static struct resource wdt_sch_resource = { + .flags = IORESOURCE_IO, + }; + +-static struct mfd_cell tunnelcreek_cells[] = { +- { +- .name = "ie6xx_wdt", +- .num_resources = 1, +- .resources = &wdt_sch_resource, +- }, ++static struct mfd_cell lpc_sch_cells[3]; ++ ++static struct mfd_cell isch_smbus_cell = { ++ .name = "isch_smbus", ++ .num_resources = 1, ++ .resources = &smbus_sch_resource, ++}; ++ ++static struct mfd_cell sch_gpio_cell = { ++ .name = "sch_gpio", ++ .num_resources = 1, ++ .resources = &gpio_sch_resource, ++}; ++ ++static struct mfd_cell wdt_sch_cell = { ++ .name = "ie6xx_wdt", ++ .num_resources = 1, ++ .resources = &wdt_sch_resource, + }; + + static DEFINE_PCI_DEVICE_TABLE(lpc_sch_ids) = { +@@ -88,79 +86,76 @@ static int lpc_sch_probe(struct pci_dev *dev, + { + unsigned int base_addr_cfg; + unsigned short base_addr; +- int i; ++ int i, cells = 0; + int ret; + + pci_read_config_dword(dev, SMBASE, &base_addr_cfg); +- if (!(base_addr_cfg & (1 << 31))) { +- dev_err(&dev->dev, "Decode of the SMBus I/O range disabled\n"); +- return -ENODEV; +- } +- base_addr = (unsigned short)base_addr_cfg; +- if (base_addr == 0) { +- dev_err(&dev->dev, "I/O space for SMBus uninitialized\n"); +- return -ENODEV; +- } +- +- smbus_sch_resource.start = base_addr; +- smbus_sch_resource.end = base_addr + SMBUS_IO_SIZE - 1; ++ base_addr = 0; ++ if (!(base_addr_cfg & (1 << 31))) ++ dev_warn(&dev->dev, "Decode of the SMBus I/O range disabled\n"); ++ else ++ base_addr = (unsigned short)base_addr_cfg; + +- pci_read_config_dword(dev, GPIOBASE, &base_addr_cfg); +- if (!(base_addr_cfg & (1 << 31))) { +- dev_err(&dev->dev, "Decode of the GPIO I/O range disabled\n"); +- return -ENODEV; +- } +- base_addr = (unsigned short)base_addr_cfg; + if (base_addr == 0) { +- dev_err(&dev->dev, "I/O space for GPIO uninitialized\n"); +- return -ENODEV; ++ dev_warn(&dev->dev, "I/O space for SMBus uninitialized\n"); ++ } else { ++ lpc_sch_cells[cells++] = isch_smbus_cell; ++ smbus_sch_resource.start = base_addr; ++ smbus_sch_resource.end = base_addr + SMBUS_IO_SIZE - 1; + } + +- gpio_sch_resource.start = base_addr; +- +- if (id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) +- gpio_sch_resource.end = base_addr + GPIO_IO_SIZE_CENTERTON - 1; ++ pci_read_config_dword(dev, GPIOBASE, &base_addr_cfg); ++ base_addr = 0; ++ if (!(base_addr_cfg & (1 << 31))) ++ dev_warn(&dev->dev, "Decode of the GPIO I/O range disabled\n"); + else +- gpio_sch_resource.end = base_addr + GPIO_IO_SIZE - 1; +- +- for (i=0; i < ARRAY_SIZE(lpc_sch_cells); i++) +- lpc_sch_cells[i].id = id->device; ++ base_addr = (unsigned short)base_addr_cfg; + +- ret = mfd_add_devices(&dev->dev, 0, +- lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL, +- 0, NULL); +- if (ret) +- goto out_dev; ++ if (base_addr == 0) { ++ dev_warn(&dev->dev, "I/O space for GPIO uninitialized\n"); ++ } else { ++ lpc_sch_cells[cells++] = sch_gpio_cell; ++ gpio_sch_resource.start = base_addr; ++ if (id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) ++ gpio_sch_resource.end = base_addr + GPIO_IO_SIZE_CENTERTON - 1; ++ else ++ gpio_sch_resource.end = base_addr + GPIO_IO_SIZE - 1; ++ } + + if (id->device == PCI_DEVICE_ID_INTEL_ITC_LPC +- || id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) { ++ || id->device == PCI_DEVICE_ID_INTEL_CENTERTON_ILB) { + pci_read_config_dword(dev, WDTBASE, &base_addr_cfg); +- if (!(base_addr_cfg & (1 << 31))) { +- dev_err(&dev->dev, "Decode of the WDT I/O range disabled\n"); +- ret = -ENODEV; +- goto out_dev; ++ base_addr = 0; ++ if (!(base_addr_cfg & (1 << 31))) ++ dev_warn(&dev->dev, "Decode of the WDT I/O range disabled\n"); ++ else ++ base_addr = (unsigned short)base_addr_cfg; ++ if (base_addr == 0) ++ dev_warn(&dev->dev, "I/O space for WDT uninitialized\n"); ++ else { ++ lpc_sch_cells[cells++] = wdt_sch_cell; ++ wdt_sch_resource.start = base_addr; ++ wdt_sch_resource.end = base_addr + WDT_IO_SIZE - 1; + } +- base_addr = (unsigned short)base_addr_cfg; +- if (base_addr == 0) { +- dev_err(&dev->dev, "I/O space for WDT uninitialized\n"); +- ret = -ENODEV; +- goto out_dev; +- } +- +- wdt_sch_resource.start = base_addr; +- wdt_sch_resource.end = base_addr + WDT_IO_SIZE - 1; ++ } + +- for (i = 0; i < ARRAY_SIZE(tunnelcreek_cells); i++) +- tunnelcreek_cells[i].id = id->device; ++ if (WARN_ON(cells > ARRAY_SIZE(lpc_sch_cells))) { ++ dev_err(&dev->dev, "Cell count exceeds array size"); ++ return -ENODEV; ++ } + +- ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells, +- ARRAY_SIZE(tunnelcreek_cells), NULL, +- 0, NULL); ++ if (cells == 0) { ++ dev_err(&dev->dev, "All decode registers disabled.\n"); ++ return -ENODEV; + } + +- return ret; +-out_dev: +- mfd_remove_devices(&dev->dev); ++ for (i = 0; i < cells; i++) ++ lpc_sch_cells[i].id = id->device; ++ ++ ret = mfd_add_devices(&dev->dev, 0, lpc_sch_cells, cells, NULL, 0, NULL); ++ if (ret) ++ mfd_remove_devices(&dev->dev); ++ + return ret; + } + +-- +1.7.10.4 + diff --git a/patches/drivers/pch_gbe-Use-PCH_GBE_PHY_REGS_LEN-instead-of-32.patch b/patches/drivers/pch_gbe-Use-PCH_GBE_PHY_REGS_LEN-instead-of-32.patch new file mode 100644 index 0000000000000000000000000000000000000000..167b3dcb66b11a3ab3e4a2598548a6f26a5aedb1 --- /dev/null +++ b/patches/drivers/pch_gbe-Use-PCH_GBE_PHY_REGS_LEN-instead-of-32.patch @@ -0,0 +1,29 @@ +From e844306965048d528c14a725cf2fd9c8a8e17406 Mon Sep 17 00:00:00 2001 +From: Darren Hart <dvhart@linux.intel.com> +Date: Sat, 18 May 2013 14:45:55 -0700 +Subject: [PATCH 3/4] pch_gbe: Use PCH_GBE_PHY_REGS_LEN instead of 32 + +Avoid using magic numbers when we have perfectly good defines just lying +around. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +index 73ce7dd..8adeb4d 100644 +--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c ++++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c +@@ -670,7 +670,7 @@ static int pch_gbe_init_phy(struct pch_gbe_adapter *adapter) + } + adapter->hw.phy.addr = adapter->mii.phy_id; + pr_debug("phy_addr = %d\n", adapter->mii.phy_id); +- if (addr == 32) ++ if (addr == PCH_GBE_PHY_REGS_LEN) + return -EAGAIN; + /* Selected the phy and isolate the rest */ + for (addr = 0; addr < PCH_GBE_PHY_REGS_LEN; addr++) { +-- +1.7.10.4 + diff --git a/patches/drivers/pch_uart-Add-uart_clk-selection-for-the-MinnowBoard.patch b/patches/drivers/pch_uart-Add-uart_clk-selection-for-the-MinnowBoard.patch new file mode 100644 index 0000000000000000000000000000000000000000..d3b889eea1d531a84806e4e78ac7aa9109af0451 --- /dev/null +++ b/patches/drivers/pch_uart-Add-uart_clk-selection-for-the-MinnowBoard.patch @@ -0,0 +1,40 @@ +From 6ed6ca790b7afef5881de4566850bbc30ae26df6 Mon Sep 17 00:00:00 2001 +From: Darren Hart <darren@dvhart.com> +Date: Sat, 18 May 2013 14:45:56 -0700 +Subject: [PATCH 4/4] pch_uart: Add uart_clk selection for the MinnowBoard + +Use DMI_BOARD_NAME to determine if we are running on a MinnowBoard and +set the uart clock to 50MHz if so. This removes the need to pass the +user_uartclk to the kernel at boot time. + +Signed-off-by: Darren Hart <dvhart@linux.intel.com> +--- + drivers/tty/serial/pch_uart.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c +index 8318925..a9e4be7 100644 +--- a/drivers/tty/serial/pch_uart.c ++++ b/drivers/tty/serial/pch_uart.c +@@ -214,6 +214,7 @@ enum { + #define FRI2_64_UARTCLK 64000000 /* 64.0000 MHz */ + #define FRI2_48_UARTCLK 48000000 /* 48.0000 MHz */ + #define NTC1_UARTCLK 64000000 /* 64.0000 MHz */ ++#define MINNOW_UARTCLK 50000000 /* 50.0000 MHz */ + + struct pch_uart_buffer { + unsigned char *buf; +@@ -395,6 +396,10 @@ static int pch_uart_get_uartclk(void) + strstr(cmp, "nanoETXexpress-TT"))) + return NTC1_UARTCLK; + ++ cmp = dmi_get_system_info(DMI_BOARD_NAME); ++ if (cmp && strstr(cmp, "MinnowBoard")) ++ return MINNOW_UARTCLK; ++ + return DEFAULT_UARTCLK; + } + +-- +1.7.10.4 +