Merge branches 'fixes', 'mmci' and 'sa11x0' into for-next
This commit is contained in:
commit
42cbe8271c
16 changed files with 98 additions and 106 deletions
|
@ -696,7 +696,6 @@ config ARCH_SA1100
|
|||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_IDE
|
||||
select ISA
|
||||
select NEED_MACH_GPIO_H
|
||||
select NEED_MACH_MEMORY_H
|
||||
select SPARSE_IRQ
|
||||
help
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ_IDLE=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_MODULES=y
|
||||
|
@ -11,11 +12,11 @@ CONFIG_ARCH_SA1100=y
|
|||
CONFIG_SA1100_H3600=y
|
||||
CONFIG_PCCARD=y
|
||||
CONFIG_PCMCIA_SA1100=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
# CONFIG_CPU_FREQ_STAT is not set
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
|
@ -24,13 +25,10 @@ CONFIG_IRDA=m
|
|||
CONFIG_IRLAN=m
|
||||
CONFIG_IRNET=m
|
||||
CONFIG_IRCOMM=m
|
||||
CONFIG_SA1100_FIR=m
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_REDBOOT_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
|
@ -41,19 +39,15 @@ CONFIG_MTD_SA1100=y
|
|||
CONFIG_BLK_DEV_LOOP=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECS=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
CONFIG_NET_PCMCIA=y
|
||||
CONFIG_PCMCIA_PCNET=y
|
||||
CONFIG_PPP=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
|
@ -64,8 +58,6 @@ CONFIG_SERIAL_SA1100_CONSOLE=y
|
|||
# CONFIG_HWMON is not set
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_SA1100=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_MSDOS_FS=m
|
||||
|
@ -74,6 +66,4 @@ CONFIG_JFFS2_FS=y
|
|||
CONFIG_CRAMFS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_NLS=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
|
|
|
@ -192,6 +192,7 @@ __dabt_svc:
|
|||
svc_entry
|
||||
mov r2, sp
|
||||
dabt_helper
|
||||
THUMB( ldr r5, [sp, #S_PSR] ) @ potentially updated CPSR
|
||||
svc_exit r5 @ return from exception
|
||||
UNWIND(.fnend )
|
||||
ENDPROC(__dabt_svc)
|
||||
|
|
|
@ -353,12 +353,18 @@ setup_return(struct pt_regs *regs, struct ksignal *ksig,
|
|||
*/
|
||||
thumb = handler & 1;
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
/*
|
||||
* Clear the If-Then Thumb-2 execution state
|
||||
* ARM spec requires this to be all 000s in ARM mode
|
||||
* Snapdragon S4/Krait misbehaves on a Thumb=>ARM
|
||||
* signal transition without this.
|
||||
*/
|
||||
cpsr &= ~PSR_IT_MASK;
|
||||
#endif
|
||||
|
||||
if (thumb) {
|
||||
cpsr |= PSR_T_BIT;
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
/* clear the If-Then Thumb-2 execution state */
|
||||
cpsr &= ~PSR_IT_MASK;
|
||||
#endif
|
||||
} else
|
||||
cpsr &= ~PSR_T_BIT;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ config ARCH_HIGHBANK
|
|||
select ARM_AMBA
|
||||
select ARM_ERRATA_764369
|
||||
select ARM_ERRATA_775420
|
||||
select ARM_ERRATA_798181
|
||||
select ARM_ERRATA_798181 if SMP
|
||||
select ARM_GIC
|
||||
select ARM_TIMER_SP804
|
||||
select CACHE_L2X0
|
||||
|
|
|
@ -512,6 +512,9 @@ static void __init assabet_map_io(void)
|
|||
* Its called GPCLKR0 in my SA1110 manual.
|
||||
*/
|
||||
Ser1SDCR0 |= SDCR0_SUS;
|
||||
MSC1 = (MSC1 & ~0xffff) |
|
||||
MSC_NonBrst | MSC_32BitStMem |
|
||||
MSC_RdAcc(2) | MSC_WrAcc(2) | MSC_Rec(0);
|
||||
|
||||
if (!machine_has_neponset())
|
||||
sa1100_register_uart_fns(&assabet_port_fns);
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
/*
|
||||
* arch/arm/mach-sa1100/include/mach/gpio.h
|
||||
*
|
||||
* SA1100 GPIO wrappers for arch-neutral GPIO calls
|
||||
*
|
||||
* Written by Philipp Zabel <philipp.zabel@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_SA1100_GPIO_H
|
||||
#define __ASM_ARCH_SA1100_GPIO_H
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm-generic/gpio.h>
|
||||
|
||||
#define __ARM_GPIOLIB_COMPLEX
|
||||
|
||||
static inline int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX))
|
||||
return GPLR & GPIO_GPIO(gpio);
|
||||
else
|
||||
return __gpio_get_value(gpio);
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX))
|
||||
if (value)
|
||||
GPSR = GPIO_GPIO(gpio);
|
||||
else
|
||||
GPCR = GPIO_GPIO(gpio);
|
||||
else
|
||||
__gpio_set_value(gpio, value);
|
||||
}
|
||||
|
||||
#define gpio_cansleep __gpio_cansleep
|
||||
|
||||
#endif
|
|
@ -13,6 +13,8 @@
|
|||
#ifndef _INCLUDE_H3XXX_H_
|
||||
#define _INCLUDE_H3XXX_H_
|
||||
|
||||
#include "hardware.h" /* Gives GPIO_MAX */
|
||||
|
||||
/* Physical memory regions corresponding to chip selects */
|
||||
#define H3600_EGPIO_PHYS (SA1100_CS5_PHYS + 0x01000000)
|
||||
#define H3600_BANK_2_PHYS SA1100_CS2_PHYS
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
|
|
@ -54,7 +54,7 @@ config ARCH_TEGRA_3x_SOC
|
|||
config ARCH_TEGRA_114_SOC
|
||||
bool "Enable support for Tegra114 family"
|
||||
select HAVE_ARM_ARCH_TIMER
|
||||
select ARM_ERRATA_798181
|
||||
select ARM_ERRATA_798181 if SMP
|
||||
select ARM_L1_CACHE_SHIFT_6
|
||||
select PINCTRL_TEGRA114
|
||||
help
|
||||
|
|
|
@ -687,7 +687,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
|
|||
void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
|
||||
gfp_t gfp, struct dma_attrs *attrs)
|
||||
{
|
||||
pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
|
||||
pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL);
|
||||
void *memory;
|
||||
|
||||
if (dma_alloc_from_coherent(dev, size, handle, &memory))
|
||||
|
@ -700,7 +700,7 @@ void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
|
|||
static void *arm_coherent_dma_alloc(struct device *dev, size_t size,
|
||||
dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs)
|
||||
{
|
||||
pgprot_t prot = __get_dma_pgprot(attrs, pgprot_kernel);
|
||||
pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL);
|
||||
void *memory;
|
||||
|
||||
if (dma_alloc_from_coherent(dev, size, handle, &memory))
|
||||
|
|
|
@ -9,8 +9,13 @@ int fixup_exception(struct pt_regs *regs)
|
|||
const struct exception_table_entry *fixup;
|
||||
|
||||
fixup = search_exception_tables(instruction_pointer(regs));
|
||||
if (fixup)
|
||||
if (fixup) {
|
||||
regs->ARM_pc = fixup->fixup;
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
/* Clear the IT state to avoid nasty surprises in the fixup */
|
||||
regs->ARM_cpsr &= ~PSR_IT_MASK;
|
||||
#endif
|
||||
}
|
||||
|
||||
return fixup != NULL;
|
||||
}
|
||||
|
|
|
@ -642,9 +642,9 @@ int vfp_restore_user_hwstate(struct user_vfp __user *ufp,
|
|||
static int vfp_hotplug(struct notifier_block *b, unsigned long action,
|
||||
void *hcpu)
|
||||
{
|
||||
if (action == CPU_DYING || action == CPU_DYING_FROZEN) {
|
||||
vfp_force_reload((long)hcpu, current_thread_info());
|
||||
} else if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
|
||||
if (action == CPU_DYING || action == CPU_DYING_FROZEN)
|
||||
vfp_current_hw_state[(long)hcpu] = NULL;
|
||||
else if (action == CPU_STARTING || action == CPU_STARTING_FROZEN)
|
||||
vfp_enable(NULL);
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ static unsigned int fmax = 515633;
|
|||
* @signal_direction: input/out direction of bus signals can be indicated
|
||||
* @pwrreg_clkgate: MMCIPOWER register must be used to gate the clock
|
||||
* @busy_detect: true if busy detection on dat0 is supported
|
||||
* @pwrreg_nopower: bits in MMCIPOWER don't controls ext. power supply
|
||||
*/
|
||||
struct variant_data {
|
||||
unsigned int clkreg;
|
||||
|
@ -76,6 +77,7 @@ struct variant_data {
|
|||
bool signal_direction;
|
||||
bool pwrreg_clkgate;
|
||||
bool busy_detect;
|
||||
bool pwrreg_nopower;
|
||||
};
|
||||
|
||||
static struct variant_data variant_arm = {
|
||||
|
@ -109,6 +111,7 @@ static struct variant_data variant_u300 = {
|
|||
.pwrreg_powerup = MCI_PWR_ON,
|
||||
.signal_direction = true,
|
||||
.pwrreg_clkgate = true,
|
||||
.pwrreg_nopower = true,
|
||||
};
|
||||
|
||||
static struct variant_data variant_nomadik = {
|
||||
|
@ -121,6 +124,7 @@ static struct variant_data variant_nomadik = {
|
|||
.pwrreg_powerup = MCI_PWR_ON,
|
||||
.signal_direction = true,
|
||||
.pwrreg_clkgate = true,
|
||||
.pwrreg_nopower = true,
|
||||
};
|
||||
|
||||
static struct variant_data variant_ux500 = {
|
||||
|
@ -135,6 +139,7 @@ static struct variant_data variant_ux500 = {
|
|||
.signal_direction = true,
|
||||
.pwrreg_clkgate = true,
|
||||
.busy_detect = true,
|
||||
.pwrreg_nopower = true,
|
||||
};
|
||||
|
||||
static struct variant_data variant_ux500v2 = {
|
||||
|
@ -150,6 +155,7 @@ static struct variant_data variant_ux500v2 = {
|
|||
.signal_direction = true,
|
||||
.pwrreg_clkgate = true,
|
||||
.busy_detect = true,
|
||||
.pwrreg_nopower = true,
|
||||
};
|
||||
|
||||
static int mmci_card_busy(struct mmc_host *mmc)
|
||||
|
@ -189,6 +195,21 @@ static int mmci_validate_data(struct mmci_host *host,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void mmci_reg_delay(struct mmci_host *host)
|
||||
{
|
||||
/*
|
||||
* According to the spec, at least three feedback clock cycles
|
||||
* of max 52 MHz must pass between two writes to the MMCICLOCK reg.
|
||||
* Three MCLK clock cycles must pass between two MMCIPOWER reg writes.
|
||||
* Worst delay time during card init is at 100 kHz => 30 us.
|
||||
* Worst delay time when up and running is at 25 MHz => 120 ns.
|
||||
*/
|
||||
if (host->cclk < 25000000)
|
||||
udelay(30);
|
||||
else
|
||||
ndelay(120);
|
||||
}
|
||||
|
||||
/*
|
||||
* This must be called with host->lock held
|
||||
*/
|
||||
|
@ -1264,6 +1285,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
|
|||
|
||||
mmci_set_clkreg(host, ios->clock);
|
||||
mmci_write_pwrreg(host, pwr);
|
||||
mmci_reg_delay(host);
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
|
||||
|
@ -1510,23 +1532,6 @@ static int mmci_probe(struct amba_device *dev,
|
|||
mmc->f_max = min(host->mclk, fmax);
|
||||
dev_dbg(mmc_dev(mmc), "clocking block at %u Hz\n", mmc->f_max);
|
||||
|
||||
host->pinctrl = devm_pinctrl_get(&dev->dev);
|
||||
if (IS_ERR(host->pinctrl)) {
|
||||
ret = PTR_ERR(host->pinctrl);
|
||||
goto clk_disable;
|
||||
}
|
||||
|
||||
host->pins_default = pinctrl_lookup_state(host->pinctrl,
|
||||
PINCTRL_STATE_DEFAULT);
|
||||
|
||||
/* enable pins to be muxed in and configured */
|
||||
if (!IS_ERR(host->pins_default)) {
|
||||
ret = pinctrl_select_state(host->pinctrl, host->pins_default);
|
||||
if (ret)
|
||||
dev_warn(&dev->dev, "could not set default pins\n");
|
||||
} else
|
||||
dev_warn(&dev->dev, "could not get default pinstate\n");
|
||||
|
||||
/* Get regulators and the supported OCR mask */
|
||||
mmc_regulator_get_supply(mmc);
|
||||
if (!mmc->ocr_avail)
|
||||
|
@ -1760,6 +1765,41 @@ static int mmci_resume(struct device *dev)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static void mmci_save(struct mmci_host *host)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (host->variant->pwrreg_nopower) {
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
writel(0, host->base + MMCIMASK0);
|
||||
writel(0, host->base + MMCIDATACTRL);
|
||||
writel(0, host->base + MMCIPOWER);
|
||||
writel(0, host->base + MMCICLOCK);
|
||||
mmci_reg_delay(host);
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void mmci_restore(struct mmci_host *host)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (host->variant->pwrreg_nopower) {
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
writel(host->clk_reg, host->base + MMCICLOCK);
|
||||
writel(host->datactrl_reg, host->base + MMCIDATACTRL);
|
||||
writel(host->pwr_reg, host->base + MMCIPOWER);
|
||||
writel(MCI_IRQENABLE, host->base + MMCIMASK0);
|
||||
mmci_reg_delay(host);
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static int mmci_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct amba_device *adev = to_amba_device(dev);
|
||||
|
@ -1767,6 +1807,8 @@ static int mmci_runtime_suspend(struct device *dev)
|
|||
|
||||
if (mmc) {
|
||||
struct mmci_host *host = mmc_priv(mmc);
|
||||
pinctrl_pm_select_sleep_state(dev);
|
||||
mmci_save(host);
|
||||
clk_disable_unprepare(host->clk);
|
||||
}
|
||||
|
||||
|
@ -1781,6 +1823,8 @@ static int mmci_runtime_resume(struct device *dev)
|
|||
if (mmc) {
|
||||
struct mmci_host *host = mmc_priv(mmc);
|
||||
clk_prepare_enable(host->clk);
|
||||
mmci_restore(host);
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -200,10 +200,6 @@ struct mmci_host {
|
|||
struct sg_mapping_iter sg_miter;
|
||||
unsigned int size;
|
||||
|
||||
/* pinctrl handles */
|
||||
struct pinctrl *pinctrl;
|
||||
struct pinctrl_state *pins_default;
|
||||
|
||||
#ifdef CONFIG_DMA_ENGINE
|
||||
/* DMA stuff */
|
||||
struct dma_chan *dma_current;
|
||||
|
|
Loading…
Reference in a new issue