Merge branch 'ux500-u9540-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson into next/newsoc

From: Linus Walleij <linus.walleij@linaro.org>:
  Core support for the U9540 after finalized review

* 'ux500-u9540-for-arm-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson: (2 commits)
  ARM: ux500: ioremap differences for DB9540
  ARM: ux500: core U9540 support

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann 2012-05-02 17:20:03 +02:00
commit 87c35c56f4
233 changed files with 1824 additions and 1293 deletions

View File

@ -1,6 +1,6 @@
<refentry id="V4L2-PIX-FMT-NV12M"> <refentry id="V4L2-PIX-FMT-NV12M">
<refmeta> <refmeta>
<refentrytitle>V4L2_PIX_FMT_NV12M ('NV12M')</refentrytitle> <refentrytitle>V4L2_PIX_FMT_NV12M ('NM12')</refentrytitle>
&manvol; &manvol;
</refmeta> </refmeta>
<refnamediv> <refnamediv>

View File

@ -1,6 +1,6 @@
<refentry id="V4L2-PIX-FMT-YUV420M"> <refentry id="V4L2-PIX-FMT-YUV420M">
<refmeta> <refmeta>
<refentrytitle>V4L2_PIX_FMT_YUV420M ('YU12M')</refentrytitle> <refentrytitle>V4L2_PIX_FMT_YUV420M ('YM12')</refentrytitle>
&manvol; &manvol;
</refmeta> </refmeta>
<refnamediv> <refnamediv>

View File

@ -2321,9 +2321,9 @@ S: Supported
F: drivers/acpi/dock.c F: drivers/acpi/dock.c
DOCUMENTATION DOCUMENTATION
M: Randy Dunlap <rdunlap@xenotime.net> M: Rob Landley <rob@landley.net>
L: linux-doc@vger.kernel.org L: linux-doc@vger.kernel.org
T: quilt http://xenotime.net/kernel-doc-patches/current/ T: TBD
S: Maintained S: Maintained
F: Documentation/ F: Documentation/

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 4 PATCHLEVEL = 4
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc3 EXTRAVERSION = -rc4
NAME = Saber-toothed Squirrel NAME = Saber-toothed Squirrel
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -112,6 +112,7 @@ CONFIG_WATCHDOG=y
CONFIG_IMX2_WDT=y CONFIG_IMX2_WDT=y
CONFIG_MFD_MC13XXX=y CONFIG_MFD_MC13XXX=y
CONFIG_REGULATOR=y CONFIG_REGULATOR=y
CONFIG_REGULATOR_FIXED_VOLTAGE=y
CONFIG_REGULATOR_MC13783=y CONFIG_REGULATOR_MC13783=y
CONFIG_REGULATOR_MC13892=y CONFIG_REGULATOR_MC13892=y
CONFIG_FB=y CONFIG_FB=y

View File

@ -8,8 +8,6 @@ CONFIG_MODULE_UNLOAD=y
# CONFIG_LBDAF is not set # CONFIG_LBDAF is not set
# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_U8500=y CONFIG_ARCH_U8500=y
CONFIG_UX500_SOC_DB5500=y
CONFIG_UX500_SOC_DB8500=y
CONFIG_MACH_HREFV60=y CONFIG_MACH_HREFV60=y
CONFIG_MACH_SNOWBALL=y CONFIG_MACH_SNOWBALL=y
CONFIG_MACH_U5500=y CONFIG_MACH_U5500=y
@ -39,7 +37,6 @@ CONFIG_CAIF=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=65536 CONFIG_BLK_DEV_RAM_SIZE=65536
CONFIG_MISC_DEVICES=y
CONFIG_AB8500_PWM=y CONFIG_AB8500_PWM=y
CONFIG_SENSORS_BH1780=y CONFIG_SENSORS_BH1780=y
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
@ -65,16 +62,18 @@ CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_NOMADIK=y CONFIG_HW_RANDOM_NOMADIK=y
CONFIG_I2C=y
CONFIG_I2C_NOMADIK=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_PL022=y CONFIG_SPI_PL022=y
CONFIG_GPIO_STMPE=y CONFIG_GPIO_STMPE=y
CONFIG_GPIO_TC3589X=y CONFIG_GPIO_TC3589X=y
CONFIG_POWER_SUPPLY=y
CONFIG_AB8500_BM=y
CONFIG_AB8500_BATTERY_THERM_ON_BATCTRL=y
CONFIG_MFD_STMPE=y CONFIG_MFD_STMPE=y
CONFIG_MFD_TC3589X=y CONFIG_MFD_TC3589X=y
CONFIG_AB5500_CORE=y CONFIG_AB5500_CORE=y
CONFIG_AB8500_CORE=y CONFIG_AB8500_CORE=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_AB8500=y CONFIG_REGULATOR_AB8500=y
# CONFIG_HID_SUPPORT is not set # CONFIG_HID_SUPPORT is not set
CONFIG_USB_GADGET=y CONFIG_USB_GADGET=y

View File

@ -1162,7 +1162,6 @@ void __init at91_add_device_serial(void)
} }
} }
#else #else
void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {} void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
void __init at91_add_device_serial(void) {} void __init at91_add_device_serial(void) {}
#endif #endif

View File

@ -23,6 +23,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/clockchips.h> #include <linux/clockchips.h>
#include <linux/export.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
@ -176,6 +177,7 @@ static struct clock_event_device clkevt = {
}; };
void __iomem *at91_st_base; void __iomem *at91_st_base;
EXPORT_SYMBOL_GPL(at91_st_base);
void __init at91rm9200_ioremap_st(u32 addr) void __init at91rm9200_ioremap_st(u32 addr)
{ {

View File

@ -103,7 +103,7 @@ static struct i2c_board_info __initdata ek_i2c_devices[] = {
}; };
#define EK_FLASH_BASE AT91_CHIPSELECT_0 #define EK_FLASH_BASE AT91_CHIPSELECT_0
#define EK_FLASH_SIZE SZ_2M #define EK_FLASH_SIZE SZ_8M
static struct physmap_flash_data ek_flash_data = { static struct physmap_flash_data ek_flash_data = {
.width = 2, .width = 2,

View File

@ -76,8 +76,6 @@ static struct resource dm9000_resource[] = {
.flags = IORESOURCE_MEM .flags = IORESOURCE_MEM
}, },
[2] = { [2] = {
.start = AT91_PIN_PC11,
.end = AT91_PIN_PC11,
.flags = IORESOURCE_IRQ .flags = IORESOURCE_IRQ
| IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE, | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
} }
@ -121,6 +119,8 @@ static struct sam9_smc_config __initdata dm9000_smc_config = {
static void __init ek_add_device_dm9000(void) static void __init ek_add_device_dm9000(void)
{ {
struct resource *r = &dm9000_resource[2];
/* Configure chip-select 2 (DM9000) */ /* Configure chip-select 2 (DM9000) */
sam9_smc_configure(0, 2, &dm9000_smc_config); sam9_smc_configure(0, 2, &dm9000_smc_config);
@ -130,6 +130,7 @@ static void __init ek_add_device_dm9000(void)
/* Configure Interrupt pin as input, no pull-up */ /* Configure Interrupt pin as input, no pull-up */
at91_set_gpio_input(AT91_PIN_PC11, 0); at91_set_gpio_input(AT91_PIN_PC11, 0);
r->start = r->end = gpio_to_irq(AT91_PIN_PC11);
platform_device_register(&dm9000_device); platform_device_register(&dm9000_device);
} }
#else #else

View File

@ -35,6 +35,7 @@
#include "generic.h" #include "generic.h"
void __iomem *at91_pmc_base; void __iomem *at91_pmc_base;
EXPORT_SYMBOL_GPL(at91_pmc_base);
/* /*
* There's a lot more which can be done with clocks, including cpufreq * There's a lot more which can be done with clocks, including cpufreq

View File

@ -25,7 +25,7 @@ extern void __iomem *at91_pmc_base;
#define at91_pmc_write(field, value) \ #define at91_pmc_write(field, value) \
__raw_writel(value, at91_pmc_base + field) __raw_writel(value, at91_pmc_base + field)
#else #else
.extern at91_aic_base .extern at91_pmc_base
#endif #endif
#define AT91_PMC_SCER 0x00 /* System Clock Enable Register */ #define AT91_PMC_SCER 0x00 /* System Clock Enable Register */

View File

@ -54,6 +54,7 @@ void __init at91_init_interrupts(unsigned int *priority)
} }
void __iomem *at91_ramc_base[2]; void __iomem *at91_ramc_base[2];
EXPORT_SYMBOL_GPL(at91_ramc_base);
void __init at91_ioremap_ramc(int id, u32 addr, u32 size) void __init at91_ioremap_ramc(int id, u32 addr, u32 size)
{ {
@ -298,6 +299,7 @@ void __init at91_ioremap_rstc(u32 base_addr)
} }
void __iomem *at91_matrix_base; void __iomem *at91_matrix_base;
EXPORT_SYMBOL_GPL(at91_matrix_base);
void __init at91_ioremap_matrix(u32 base_addr) void __init at91_ioremap_matrix(u32 base_addr)
{ {

View File

@ -52,8 +52,8 @@
#include <mach/csp/chipcHw_inline.h> #include <mach/csp/chipcHw_inline.h>
#include <mach/csp/tmrHw_reg.h> #include <mach/csp/tmrHw_reg.h>
static AMBA_APB_DEVICE(uartA, "uarta", MM_ADDR_IO_UARTA, { IRQ_UARTA }, NULL); static AMBA_APB_DEVICE(uartA, "uartA", 0, MM_ADDR_IO_UARTA, {IRQ_UARTA}, NULL);
static AMBA_APB_DEVICE(uartB, "uartb", MM_ADDR_IO_UARTB, { IRQ_UARTB }, NULL); static AMBA_APB_DEVICE(uartB, "uartB", 0, MM_ADDR_IO_UARTB, {IRQ_UARTB}, NULL);
static struct clk pll1_clk = { static struct clk pll1_clk = {
.name = "PLL1", .name = "PLL1",

View File

@ -35,7 +35,7 @@ static const struct of_dev_auxdata imx27_auxdata_lookup[] __initconst = {
static int __init imx27_avic_add_irq_domain(struct device_node *np, static int __init imx27_avic_add_irq_domain(struct device_node *np,
struct device_node *interrupt_parent) struct device_node *interrupt_parent)
{ {
irq_domain_add_simple(np, 0); irq_domain_add_legacy(np, 64, 0, 0, &irq_domain_simple_ops, NULL);
return 0; return 0;
} }
@ -44,7 +44,9 @@ static int __init imx27_gpio_add_irq_domain(struct device_node *np,
{ {
static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS; static int gpio_irq_base = MXC_GPIO_IRQ_START + ARCH_NR_GPIOS;
irq_domain_add_simple(np, gpio_irq_base); gpio_irq_base -= 32;
irq_domain_add_legacy(np, 32, gpio_irq_base, 0, &irq_domain_simple_ops,
NULL);
return 0; return 0;
} }

View File

@ -35,7 +35,7 @@ static void imx5_idle(void)
} }
clk_enable(gpc_dvfs_clk); clk_enable(gpc_dvfs_clk);
mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF); mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF);
if (tzic_enable_wake() != 0) if (!tzic_enable_wake())
cpu_do_idle(); cpu_do_idle();
clk_disable(gpc_dvfs_clk); clk_disable(gpc_dvfs_clk);
} }

View File

@ -27,6 +27,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <mach/hardware.h>
#include <plat/mux.h> #include <plat/mux.h>

View File

@ -47,9 +47,9 @@ static int omap1_dm_timer_set_src(struct platform_device *pdev,
int n = (pdev->id - 1) << 1; int n = (pdev->id - 1) << 1;
u32 l; u32 l;
l = __raw_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n);
l |= source << n; l |= source << n;
__raw_writel(l, MOD_CONF_CTRL_1); omap_writel(l, MOD_CONF_CTRL_1);
return 0; return 0;
} }

View File

@ -20,6 +20,7 @@
#include <linux/usb/otg.h> #include <linux/usb/otg.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/mfd/twl6040.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h> #include <linux/regulator/fixed.h>
@ -560,7 +561,7 @@ static struct regulator_init_data sdp4430_vusim = {
}, },
}; };
static struct twl4030_codec_data twl6040_codec = { static struct twl6040_codec_data twl6040_codec = {
/* single-step ramp for headset and handsfree */ /* single-step ramp for headset and handsfree */
.hs_left_step = 0x0f, .hs_left_step = 0x0f,
.hs_right_step = 0x0f, .hs_right_step = 0x0f,
@ -568,7 +569,7 @@ static struct twl4030_codec_data twl6040_codec = {
.hf_right_step = 0x1d, .hf_right_step = 0x1d,
}; };
static struct twl4030_vibra_data twl6040_vibra = { static struct twl6040_vibra_data twl6040_vibra = {
.vibldrv_res = 8, .vibldrv_res = 8,
.vibrdrv_res = 3, .vibrdrv_res = 3,
.viblmotor_res = 10, .viblmotor_res = 10,
@ -577,16 +578,14 @@ static struct twl4030_vibra_data twl6040_vibra = {
.vddvibr_uV = 0, /* fixed volt supply - VBAT */ .vddvibr_uV = 0, /* fixed volt supply - VBAT */
}; };
static struct twl4030_audio_data twl6040_audio = { static struct twl6040_platform_data twl6040_data = {
.codec = &twl6040_codec, .codec = &twl6040_codec,
.vibra = &twl6040_vibra, .vibra = &twl6040_vibra,
.audpwron_gpio = 127, .audpwron_gpio = 127,
.naudint_irq = OMAP44XX_IRQ_SYS_2N,
.irq_base = TWL6040_CODEC_IRQ_BASE, .irq_base = TWL6040_CODEC_IRQ_BASE,
}; };
static struct twl4030_platform_data sdp4430_twldata = { static struct twl4030_platform_data sdp4430_twldata = {
.audio = &twl6040_audio,
/* Regulators */ /* Regulators */
.vusim = &sdp4430_vusim, .vusim = &sdp4430_vusim,
.vaux1 = &sdp4430_vaux1, .vaux1 = &sdp4430_vaux1,
@ -617,7 +616,8 @@ static int __init omap4_i2c_init(void)
TWL_COMMON_REGULATOR_VCXIO | TWL_COMMON_REGULATOR_VCXIO |
TWL_COMMON_REGULATOR_VUSB | TWL_COMMON_REGULATOR_VUSB |
TWL_COMMON_REGULATOR_CLK32KG); TWL_COMMON_REGULATOR_CLK32KG);
omap4_pmic_init("twl6030", &sdp4430_twldata); omap4_pmic_init("twl6030", &sdp4430_twldata,
&twl6040_data, OMAP44XX_IRQ_SYS_2N);
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); ARRAY_SIZE(sdp4430_i2c_3_boardinfo));

View File

@ -137,7 +137,7 @@ static struct twl4030_platform_data sdp4430_twldata = {
static void __init omap4_i2c_init(void) static void __init omap4_i2c_init(void)
{ {
omap4_pmic_init("twl6030", &sdp4430_twldata); omap4_pmic_init("twl6030", &sdp4430_twldata, NULL, 0);
} }
static void __init omap4_init(void) static void __init omap4_init(void)

View File

@ -25,6 +25,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/usb/otg.h> #include <linux/usb/otg.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/mfd/twl6040.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h> #include <linux/regulator/fixed.h>
#include <linux/wl12xx.h> #include <linux/wl12xx.h>
@ -284,7 +285,7 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
return 0; return 0;
} }
static struct twl4030_codec_data twl6040_codec = { static struct twl6040_codec_data twl6040_codec = {
/* single-step ramp for headset and handsfree */ /* single-step ramp for headset and handsfree */
.hs_left_step = 0x0f, .hs_left_step = 0x0f,
.hs_right_step = 0x0f, .hs_right_step = 0x0f,
@ -292,17 +293,14 @@ static struct twl4030_codec_data twl6040_codec = {
.hf_right_step = 0x1d, .hf_right_step = 0x1d,
}; };
static struct twl4030_audio_data twl6040_audio = { static struct twl6040_platform_data twl6040_data = {
.codec = &twl6040_codec, .codec = &twl6040_codec,
.audpwron_gpio = 127, .audpwron_gpio = 127,
.naudint_irq = OMAP44XX_IRQ_SYS_2N,
.irq_base = TWL6040_CODEC_IRQ_BASE, .irq_base = TWL6040_CODEC_IRQ_BASE,
}; };
/* Panda board uses the common PMIC configuration */ /* Panda board uses the common PMIC configuration */
static struct twl4030_platform_data omap4_panda_twldata = { static struct twl4030_platform_data omap4_panda_twldata;
.audio = &twl6040_audio,
};
/* /*
* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
@ -326,7 +324,8 @@ static int __init omap4_panda_i2c_init(void)
TWL_COMMON_REGULATOR_VCXIO | TWL_COMMON_REGULATOR_VCXIO |
TWL_COMMON_REGULATOR_VUSB | TWL_COMMON_REGULATOR_VUSB |
TWL_COMMON_REGULATOR_CLK32KG); TWL_COMMON_REGULATOR_CLK32KG);
omap4_pmic_init("twl6030", &omap4_panda_twldata); omap4_pmic_init("twl6030", &omap4_panda_twldata,
&twl6040_data, OMAP44XX_IRQ_SYS_2N);
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
/* /*
* Bus 3 is attached to the DVI port where devices like the pico DLP * Bus 3 is attached to the DVI port where devices like the pico DLP

View File

@ -1422,6 +1422,9 @@ static int _ocp_softreset(struct omap_hwmod *oh)
goto dis_opt_clks; goto dis_opt_clks;
_write_sysconfig(v, oh); _write_sysconfig(v, oh);
if (oh->class->sysc->srst_udelay)
udelay(oh->class->sysc->srst_udelay);
if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS) if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
omap_test_timeout((omap_hwmod_read(oh, omap_test_timeout((omap_hwmod_read(oh,
oh->class->sysc->syss_offs) oh->class->sysc->syss_offs)
@ -1903,10 +1906,20 @@ void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
*/ */
int omap_hwmod_softreset(struct omap_hwmod *oh) int omap_hwmod_softreset(struct omap_hwmod *oh)
{ {
if (!oh) u32 v;
int ret;
if (!oh || !(oh->_sysc_cache))
return -EINVAL; return -EINVAL;
return _ocp_softreset(oh); v = oh->_sysc_cache;
ret = _set_softreset(oh, &v);
if (ret)
goto error;
_write_sysconfig(v, oh);
error:
return ret;
} }
/** /**

View File

@ -1000,7 +1000,6 @@ static struct omap_hwmod_ocp_if omap2420_l4_core__dss_venc = {
.flags = OMAP_FIREWALL_L4, .flags = OMAP_FIREWALL_L4,
} }
}, },
.flags = OCPIF_SWSUP_IDLE,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };

View File

@ -1049,7 +1049,6 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__dss_venc = {
.slave = &omap2430_dss_venc_hwmod, .slave = &omap2430_dss_venc_hwmod,
.clk = "dss_ick", .clk = "dss_ick",
.addr = omap2_dss_venc_addrs, .addr = omap2_dss_venc_addrs,
.flags = OCPIF_SWSUP_IDLE,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };

View File

@ -1676,7 +1676,6 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
.flags = OMAP_FIREWALL_L4, .flags = OMAP_FIREWALL_L4,
} }
}, },
.flags = OCPIF_SWSUP_IDLE,
.user = OCP_USER_MPU | OCP_USER_SDMA, .user = OCP_USER_MPU | OCP_USER_SDMA,
}; };

View File

@ -2594,6 +2594,15 @@ static struct omap_hwmod omap44xx_ipu_hwmod = {
static struct omap_hwmod_class_sysconfig omap44xx_iss_sysc = { static struct omap_hwmod_class_sysconfig omap44xx_iss_sysc = {
.rev_offs = 0x0000, .rev_offs = 0x0000,
.sysc_offs = 0x0010, .sysc_offs = 0x0010,
/*
* ISS needs 100 OCP clk cycles delay after a softreset before
* accessing sysconfig again.
* The lowest frequency at the moment for L3 bus is 100 MHz, so
* 1usec delay is needed. Add an x2 margin to be safe (2 usecs).
*
* TODO: Indicate errata when available.
*/
.srst_udelay = 2,
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_RESET_STATUS |
SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET), SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |

View File

@ -108,8 +108,14 @@ static void omap_uart_set_noidle(struct platform_device *pdev)
static void omap_uart_set_smartidle(struct platform_device *pdev) static void omap_uart_set_smartidle(struct platform_device *pdev)
{ {
struct omap_device *od = to_omap_device(pdev); struct omap_device *od = to_omap_device(pdev);
u8 idlemode;
omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_SMART); if (od->hwmods[0]->class->sysc->idlemodes & SIDLE_SMART_WKUP)
idlemode = HWMOD_IDLEMODE_SMART_WKUP;
else
idlemode = HWMOD_IDLEMODE_SMART;
omap_hwmod_set_slave_idlemode(od->hwmods[0], idlemode);
} }
#else #else
@ -120,124 +126,8 @@ static void omap_uart_set_smartidle(struct platform_device *pdev) {}
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
#ifdef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
static struct omap_device_pad default_uart1_pads[] __initdata = {
{
.name = "uart1_cts.uart1_cts",
.enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
},
{
.name = "uart1_rts.uart1_rts",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart1_tx.uart1_tx",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart1_rx.uart1_rx",
.flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
.enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
.idle = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
},
};
static struct omap_device_pad default_uart2_pads[] __initdata = {
{
.name = "uart2_cts.uart2_cts",
.enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
},
{
.name = "uart2_rts.uart2_rts",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart2_tx.uart2_tx",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart2_rx.uart2_rx",
.flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
.enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
.idle = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
},
};
static struct omap_device_pad default_uart3_pads[] __initdata = {
{
.name = "uart3_cts_rctx.uart3_cts_rctx",
.enable = OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0,
},
{
.name = "uart3_rts_sd.uart3_rts_sd",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart3_tx_irtx.uart3_tx_irtx",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart3_rx_irrx.uart3_rx_irrx",
.flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
.enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
.idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
},
};
static struct omap_device_pad default_omap36xx_uart4_pads[] __initdata = {
{
.name = "gpmc_wait2.uart4_tx",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "gpmc_wait3.uart4_rx",
.flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
.enable = OMAP_PIN_INPUT | OMAP_MUX_MODE2,
.idle = OMAP_PIN_INPUT | OMAP_MUX_MODE2,
},
};
static struct omap_device_pad default_omap4_uart4_pads[] __initdata = {
{
.name = "uart4_tx.uart4_tx",
.enable = OMAP_PIN_OUTPUT | OMAP_MUX_MODE0,
},
{
.name = "uart4_rx.uart4_rx",
.flags = OMAP_DEVICE_PAD_REMUX | OMAP_DEVICE_PAD_WAKEUP,
.enable = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
.idle = OMAP_PIN_INPUT | OMAP_MUX_MODE0,
},
};
static void omap_serial_fill_default_pads(struct omap_board_data *bdata) static void omap_serial_fill_default_pads(struct omap_board_data *bdata)
{ {
switch (bdata->id) {
case 0:
bdata->pads = default_uart1_pads;
bdata->pads_cnt = ARRAY_SIZE(default_uart1_pads);
break;
case 1:
bdata->pads = default_uart2_pads;
bdata->pads_cnt = ARRAY_SIZE(default_uart2_pads);
break;
case 2:
bdata->pads = default_uart3_pads;
bdata->pads_cnt = ARRAY_SIZE(default_uart3_pads);
break;
case 3:
if (cpu_is_omap44xx()) {
bdata->pads = default_omap4_uart4_pads;
bdata->pads_cnt =
ARRAY_SIZE(default_omap4_uart4_pads);
} else if (cpu_is_omap3630()) {
bdata->pads = default_omap36xx_uart4_pads;
bdata->pads_cnt =
ARRAY_SIZE(default_omap36xx_uart4_pads);
}
break;
default:
break;
}
} }
#else #else
static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {} static void omap_serial_fill_default_pads(struct omap_board_data *bdata) {}

View File

@ -37,6 +37,16 @@ static struct i2c_board_info __initdata pmic_i2c_board_info = {
.flags = I2C_CLIENT_WAKE, .flags = I2C_CLIENT_WAKE,
}; };
static struct i2c_board_info __initdata omap4_i2c1_board_info[] = {
{
.addr = 0x48,
.flags = I2C_CLIENT_WAKE,
},
{
I2C_BOARD_INFO("twl6040", 0x4b),
},
};
void __init omap_pmic_init(int bus, u32 clkrate, void __init omap_pmic_init(int bus, u32 clkrate,
const char *pmic_type, int pmic_irq, const char *pmic_type, int pmic_irq,
struct twl4030_platform_data *pmic_data) struct twl4030_platform_data *pmic_data)
@ -49,13 +59,30 @@ void __init omap_pmic_init(int bus, u32 clkrate,
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1); omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
} }
void __init omap4_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data,
struct twl6040_platform_data *twl6040_data, int twl6040_irq)
{
/* PMIC part*/
strncpy(omap4_i2c1_board_info[0].type, pmic_type,
sizeof(omap4_i2c1_board_info[0].type));
omap4_i2c1_board_info[0].irq = OMAP44XX_IRQ_SYS_1N;
omap4_i2c1_board_info[0].platform_data = pmic_data;
/* TWL6040 audio IC part */
omap4_i2c1_board_info[1].irq = twl6040_irq;
omap4_i2c1_board_info[1].platform_data = twl6040_data;
omap_register_i2c_bus(1, 400, omap4_i2c1_board_info, 2);
}
void __init omap_pmic_late_init(void) void __init omap_pmic_late_init(void)
{ {
/* Init the OMAP TWL parameters (if PMIC has been registerd) */ /* Init the OMAP TWL parameters (if PMIC has been registerd) */
if (!pmic_i2c_board_info.irq) if (pmic_i2c_board_info.irq)
return;
omap3_twl_init(); omap3_twl_init();
if (omap4_i2c1_board_info[0].irq)
omap4_twl_init(); omap4_twl_init();
} }

View File

@ -29,6 +29,7 @@
struct twl4030_platform_data; struct twl4030_platform_data;
struct twl6040_platform_data;
void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq,
struct twl4030_platform_data *pmic_data); struct twl4030_platform_data *pmic_data);
@ -46,12 +47,9 @@ static inline void omap3_pmic_init(const char *pmic_type,
omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data); omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data);
} }
static inline void omap4_pmic_init(const char *pmic_type, void omap4_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data) struct twl4030_platform_data *pmic_data,
{ struct twl6040_platform_data *audio_data, int twl6040_irq);
/* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */
omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data);
}
void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
u32 pdata_flags, u32 regulators_flags); u32 pdata_flags, u32 regulators_flags);

View File

@ -17,6 +17,7 @@ config UX500_SOC_DB5500
config UX500_SOC_DB8500 config UX500_SOC_DB8500
bool bool
select MFD_DB8500_PRCMU select MFD_DB8500_PRCMU
select REGULATOR
select REGULATOR_DB8500_PRCMU select REGULATOR_DB8500_PRCMU
select CPU_FREQ_TABLE if CPU_FREQ select CPU_FREQ_TABLE if CPU_FREQ

View File

@ -102,7 +102,7 @@ static int __init mop500_uib_init(void)
struct i2c_adapter *i2c0; struct i2c_adapter *i2c0;
int ret; int ret;
if (!cpu_is_u8500()) if (!cpu_is_u8500_family())
return -ENODEV; return -ENODEV;
if (uib) { if (uib) {

View File

@ -36,9 +36,11 @@ static int __init ux500_l2x0_unlock(void)
static int __init ux500_l2x0_init(void) static int __init ux500_l2x0_init(void)
{ {
u32 aux_val = 0x3e000000;
if (cpu_is_u5500()) if (cpu_is_u5500())
l2x0_base = __io_address(U5500_L2CC_BASE); l2x0_base = __io_address(U5500_L2CC_BASE);
else if (cpu_is_u8500()) else if (cpu_is_u8500_family())
l2x0_base = __io_address(U8500_L2CC_BASE); l2x0_base = __io_address(U8500_L2CC_BASE);
else else
ux500_unknown_soc(); ux500_unknown_soc();
@ -46,11 +48,19 @@ static int __init ux500_l2x0_init(void)
/* Unlock before init */ /* Unlock before init */
ux500_l2x0_unlock(); ux500_l2x0_unlock();
/* DB9540's L2 has 128KB way size */
if (cpu_is_u9540())
/* 128KB way size */
aux_val |= (0x4 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT);
else
/* 64KB way size */
aux_val |= (0x3 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT);
/* 64KB way size, 8 way associativity, force WA */ /* 64KB way size, 8 way associativity, force WA */
if (of_have_populated_dt()) if (of_have_populated_dt())
l2x0_of_init(0x3e060000, 0xc0000fff); l2x0_of_init(aux_val, 0xc0000fff);
else else
l2x0_init(l2x0_base, 0x3e060000, 0xc0000fff); l2x0_init(l2x0_base, aux_val, 0xc0000fff);
/* /*
* We can't disable l2 as we are in non secure mode, currently * We can't disable l2 as we are in non secure mode, currently

View File

@ -151,7 +151,7 @@ static unsigned long clk_mtu_get_rate(struct clk *clk)
if (cpu_is_u5500()) if (cpu_is_u5500())
addr = __io_address(U5500_PRCMU_BASE); addr = __io_address(U5500_PRCMU_BASE);
else if (cpu_is_u8500()) else if (cpu_is_u8500_family())
addr = __io_address(U8500_PRCMU_BASE); addr = __io_address(U8500_PRCMU_BASE);
else else
ux500_unknown_soc(); ux500_unknown_soc();

View File

@ -34,8 +34,8 @@ static struct map_desc u8500_uart_io_desc[] __initdata = {
__IO_DEV_DESC(U8500_UART0_BASE, SZ_4K), __IO_DEV_DESC(U8500_UART0_BASE, SZ_4K),
__IO_DEV_DESC(U8500_UART2_BASE, SZ_4K), __IO_DEV_DESC(U8500_UART2_BASE, SZ_4K),
}; };
/* U8500 and U9540 common io_desc */
static struct map_desc u8500_io_desc[] __initdata = { static struct map_desc u8500_common_io_desc[] __initdata = {
/* SCU base also covers GIC CPU BASE and TWD with its 4K page */ /* SCU base also covers GIC CPU BASE and TWD with its 4K page */
__IO_DEV_DESC(U8500_SCU_BASE, SZ_4K), __IO_DEV_DESC(U8500_SCU_BASE, SZ_4K),
__IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K), __IO_DEV_DESC(U8500_GIC_DIST_BASE, SZ_4K),
@ -49,12 +49,23 @@ static struct map_desc u8500_io_desc[] __initdata = {
__IO_DEV_DESC(U8500_CLKRST5_BASE, SZ_4K), __IO_DEV_DESC(U8500_CLKRST5_BASE, SZ_4K),
__IO_DEV_DESC(U8500_CLKRST6_BASE, SZ_4K), __IO_DEV_DESC(U8500_CLKRST6_BASE, SZ_4K),
__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K),
__IO_DEV_DESC(U8500_GPIO0_BASE, SZ_4K), __IO_DEV_DESC(U8500_GPIO0_BASE, SZ_4K),
__IO_DEV_DESC(U8500_GPIO1_BASE, SZ_4K), __IO_DEV_DESC(U8500_GPIO1_BASE, SZ_4K),
__IO_DEV_DESC(U8500_GPIO2_BASE, SZ_4K), __IO_DEV_DESC(U8500_GPIO2_BASE, SZ_4K),
__IO_DEV_DESC(U8500_GPIO3_BASE, SZ_4K), __IO_DEV_DESC(U8500_GPIO3_BASE, SZ_4K),
};
/* U8500 IO map specific description */
static struct map_desc u8500_io_desc[] __initdata = {
__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K),
__IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K), __IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K),
};
/* U9540 IO map specific description */
static struct map_desc u9540_io_desc[] __initdata = {
__IO_DEV_DESC(U8500_PRCMU_BASE, SZ_4K + SZ_8K),
__IO_DEV_DESC(U8500_PRCMU_TCDM_BASE, SZ_4K + SZ_8K),
}; };
void __init u8500_map_io(void) void __init u8500_map_io(void)
@ -66,6 +77,11 @@ void __init u8500_map_io(void)
ux500_map_io(); ux500_map_io();
iotable_init(u8500_common_io_desc, ARRAY_SIZE(u8500_common_io_desc));
if (cpu_is_u9540())
iotable_init(u9540_io_desc, ARRAY_SIZE(u9540_io_desc));
else
iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc)); iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc));
_PRCMU_BASE = __io_address(U8500_PRCMU_BASE); _PRCMU_BASE = __io_address(U8500_PRCMU_BASE);

View File

@ -43,7 +43,7 @@ void __init ux500_init_irq(void)
if (cpu_is_u5500()) { if (cpu_is_u5500()) {
dist_base = __io_address(U5500_GIC_DIST_BASE); dist_base = __io_address(U5500_GIC_DIST_BASE);
cpu_base = __io_address(U5500_GIC_CPU_BASE); cpu_base = __io_address(U5500_GIC_CPU_BASE);
} else if (cpu_is_u8500()) { } else if (cpu_is_u8500_family()) {
dist_base = __io_address(U8500_GIC_DIST_BASE); dist_base = __io_address(U8500_GIC_DIST_BASE);
cpu_base = __io_address(U8500_GIC_CPU_BASE); cpu_base = __io_address(U8500_GIC_CPU_BASE);
} else } else
@ -62,7 +62,7 @@ void __init ux500_init_irq(void)
*/ */
if (cpu_is_u5500()) if (cpu_is_u5500())
db5500_prcmu_early_init(); db5500_prcmu_early_init();
if (cpu_is_u8500()) if (cpu_is_u8500_family())
db8500_prcmu_early_init(); db8500_prcmu_early_init();
clk_init(); clk_init();
} }

View File

@ -23,7 +23,7 @@ static unsigned int ux500_read_asicid(phys_addr_t addr)
{ {
phys_addr_t base = addr & ~0xfff; phys_addr_t base = addr & ~0xfff;
struct map_desc desc = { struct map_desc desc = {
.virtual = IO_ADDRESS(base), .virtual = UX500_VIRT_ROM,
.pfn = __phys_to_pfn(base), .pfn = __phys_to_pfn(base),
.length = SZ_16K, .length = SZ_16K,
.type = MT_DEVICE, .type = MT_DEVICE,
@ -35,7 +35,7 @@ static unsigned int ux500_read_asicid(phys_addr_t addr)
local_flush_tlb_all(); local_flush_tlb_all();
flush_cache_all(); flush_cache_all();
return readl(__io_address(addr)); return readl(IOMEM(UX500_VIRT_ROM + (addr & 0xfff)));
} }
static void ux500_print_soc_info(unsigned int asicid) static void ux500_print_soc_info(unsigned int asicid)
@ -67,6 +67,7 @@ static unsigned int partnumber(unsigned int asicid)
* DB8500v2 0x412fc091 0x9001DBF4 0x008500B0 * DB8500v2 0x412fc091 0x9001DBF4 0x008500B0
* DB8520v2.2 0x412fc091 0x9001DBF4 0x008500B2 * DB8520v2.2 0x412fc091 0x9001DBF4 0x008500B2
* DB5500v1 0x412fc091 0x9001FFF4 0x005500A0 * DB5500v1 0x412fc091 0x9001FFF4 0x005500A0
* DB9540 0x413fc090 0xFFFFDBF4 0x009540xx
*/ */
void __init ux500_map_io(void) void __init ux500_map_io(void)
@ -91,6 +92,10 @@ void __init ux500_map_io(void)
/* DB5500v1 */ /* DB5500v1 */
addr = 0x9001FFF4; addr = 0x9001FFF4;
break; break;
case 0x413fc090: /* DB9540 */
addr = 0xFFFFDBF4;
break;
} }
if (addr) if (addr)

View File

@ -41,6 +41,10 @@
/* ASIC ID is at 0xbf4 offset within this region */ /* ASIC ID is at 0xbf4 offset within this region */
#define U8500_ASIC_ID_BASE 0x9001D000 #define U8500_ASIC_ID_BASE 0x9001D000
#define U9540_BOOT_ROM_BASE 0xFFFE0000
/* ASIC ID is at 0xbf4 offset within this region */
#define U9540_ASIC_ID_BASE 0xFFFFD000
#define U8500_PER6_BASE 0xa03c0000 #define U8500_PER6_BASE 0xa03c0000
#define U8500_PER7_BASE 0xa03d0000 #define U8500_PER7_BASE 0xa03d0000
#define U8500_PER5_BASE 0xa03e0000 #define U8500_PER5_BASE 0xa03e0000
@ -96,7 +100,9 @@
#define U8500_SCR_BASE (U8500_PER4_BASE + 0x05000) #define U8500_SCR_BASE (U8500_PER4_BASE + 0x05000)
#define U8500_DMC_BASE (U8500_PER4_BASE + 0x06000) #define U8500_DMC_BASE (U8500_PER4_BASE + 0x06000)
#define U8500_PRCMU_BASE (U8500_PER4_BASE + 0x07000) #define U8500_PRCMU_BASE (U8500_PER4_BASE + 0x07000)
#define U9540_DMC1_BASE (U8500_PER4_BASE + 0x0A000)
#define U8500_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x68000) #define U8500_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x68000)
#define U9540_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x6A000)
#define U8500_PRCMU_TCPM_BASE (U8500_PER4_BASE + 0x60000) #define U8500_PRCMU_TCPM_BASE (U8500_PER4_BASE + 0x60000)
#define U8500_PRCMU_TIMER_3_BASE (U8500_PER4_BASE + 0x07338) #define U8500_PRCMU_TIMER_3_BASE (U8500_PER4_BASE + 0x07338)
#define U8500_PRCMU_TIMER_4_BASE (U8500_PER4_BASE + 0x07450) #define U8500_PRCMU_TIMER_4_BASE (U8500_PER4_BASE + 0x07450)

View File

@ -17,6 +17,8 @@
*/ */
#define U8500_IO_VIRTUAL 0xf0000000 #define U8500_IO_VIRTUAL 0xf0000000
#define U8500_IO_PHYSICAL 0xa0000000 #define U8500_IO_PHYSICAL 0xa0000000
/* This is where we map in the ROM to check ASIC IDs */
#define UX500_VIRT_ROM 0xf0000000
/* This macro is used in assembly, so no cast */ /* This macro is used in assembly, so no cast */
#define IO_ADDRESS(x) \ #define IO_ADDRESS(x) \
@ -24,6 +26,7 @@
/* typesafe io address */ /* typesafe io address */
#define __io_address(n) IOMEM(IO_ADDRESS(n)) #define __io_address(n) IOMEM(IO_ADDRESS(n))
/* Used by some plat-nomadik code */ /* Used by some plat-nomadik code */
#define io_p2v(n) __io_address(n) #define io_p2v(n) __io_address(n)

View File

@ -41,6 +41,16 @@ static inline bool __attribute_const__ cpu_is_u8500(void)
return dbx500_partnumber() == 0x8500; return dbx500_partnumber() == 0x8500;
} }
static inline bool __attribute_const__ cpu_is_u9540(void)
{
return dbx500_partnumber() == 0x9540;
}
static inline bool cpu_is_u8500_family(void)
{
return cpu_is_u8500() || cpu_is_u9540();
}
static inline bool __attribute_const__ cpu_is_u5500(void) static inline bool __attribute_const__ cpu_is_u5500(void)
{ {
return dbx500_partnumber() == 0x5500; return dbx500_partnumber() == 0x5500;
@ -111,7 +121,12 @@ static inline bool cpu_is_u8500v21(void)
static inline bool cpu_is_u8500v20_or_later(void) static inline bool cpu_is_u8500v20_or_later(void)
{ {
return cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11(); /*
* U9540 has so much in common with U8500 that is is considered a
* U8500 variant.
*/
return cpu_is_u9540() ||
(cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11());
} }
static inline bool ux500_is_svp(void) static inline bool ux500_is_svp(void)

View File

@ -24,7 +24,7 @@
*/ */
#define IRQ_MTU0 (IRQ_SHPI_START + 4) #define IRQ_MTU0 (IRQ_SHPI_START + 4)
#define DBX500_NR_INTERNAL_IRQS 160 #define DBX500_NR_INTERNAL_IRQS 166
/* After chip-specific IRQ numbers we have the GPIO ones */ /* After chip-specific IRQ numbers we have the GPIO ones */
#define NOMADIK_NR_GPIO 288 #define NOMADIK_NR_GPIO 288

View File

@ -50,7 +50,7 @@ static void __iomem *scu_base_addr(void)
{ {
if (cpu_is_u5500()) if (cpu_is_u5500())
return __io_address(U5500_SCU_BASE); return __io_address(U5500_SCU_BASE);
else if (cpu_is_u8500()) else if (cpu_is_u8500_family())
return __io_address(U8500_SCU_BASE); return __io_address(U8500_SCU_BASE);
else else
ux500_unknown_soc(); ux500_unknown_soc();
@ -99,7 +99,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
*/ */
write_pen_release(cpu_logical_map(cpu)); write_pen_release(cpu_logical_map(cpu));
gic_raise_softirq(cpumask_of(cpu), 1); smp_send_reschedule(cpu);
timeout = jiffies + (1 * HZ); timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) { while (time_before(jiffies, timeout)) {
@ -122,7 +122,7 @@ static void __init wakeup_secondary(void)
if (cpu_is_u5500()) if (cpu_is_u5500())
backupram = __io_address(U5500_BACKUPRAM0_BASE); backupram = __io_address(U5500_BACKUPRAM0_BASE);
else if (cpu_is_u8500()) else if (cpu_is_u8500_family())
backupram = __io_address(U8500_BACKUPRAM0_BASE); backupram = __io_address(U8500_BACKUPRAM0_BASE);
else else
ux500_unknown_soc(); ux500_unknown_soc();

View File

@ -51,7 +51,7 @@ static void __init ux500_timer_init(void)
if (cpu_is_u5500()) { if (cpu_is_u5500()) {
mtu_timer_base = __io_address(U5500_MTU0_BASE); mtu_timer_base = __io_address(U5500_MTU0_BASE);
prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE); prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE);
} else if (cpu_is_u8500()) { } else if (cpu_is_u8500_family()) {
mtu_timer_base = __io_address(U8500_MTU0_BASE); mtu_timer_base = __io_address(U8500_MTU0_BASE);
prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE);
} else { } else {

View File

@ -305,6 +305,7 @@ struct omap_hwmod_sysc_fields {
* @rev_offs: IP block revision register offset (from module base addr) * @rev_offs: IP block revision register offset (from module base addr)
* @sysc_offs: OCP_SYSCONFIG register offset (from module base addr) * @sysc_offs: OCP_SYSCONFIG register offset (from module base addr)
* @syss_offs: OCP_SYSSTATUS register offset (from module base addr) * @syss_offs: OCP_SYSSTATUS register offset (from module base addr)
* @srst_udelay: Delay needed after doing a softreset in usecs
* @idlemodes: One or more of {SIDLE,MSTANDBY}_{OFF,FORCE,SMART} * @idlemodes: One or more of {SIDLE,MSTANDBY}_{OFF,FORCE,SMART}
* @sysc_flags: SYS{C,S}_HAS* flags indicating SYSCONFIG bits supported * @sysc_flags: SYS{C,S}_HAS* flags indicating SYSCONFIG bits supported
* @clockact: the default value of the module CLOCKACTIVITY bits * @clockact: the default value of the module CLOCKACTIVITY bits
@ -330,9 +331,10 @@ struct omap_hwmod_class_sysconfig {
u16 sysc_offs; u16 sysc_offs;
u16 syss_offs; u16 syss_offs;
u16 sysc_flags; u16 sysc_flags;
struct omap_hwmod_sysc_fields *sysc_fields;
u8 srst_udelay;
u8 idlemodes; u8 idlemodes;
u8 clockact; u8 clockact;
struct omap_hwmod_sysc_fields *sysc_fields;
}; };
/** /**

View File

@ -348,7 +348,6 @@ u32 omap3_configure_core_dpll(u32 m2, u32 unlock_dll, u32 f, u32 inc,
sdrc_actim_ctrl_b_1, sdrc_mr_1); sdrc_actim_ctrl_b_1, sdrc_mr_1);
} }
#ifdef CONFIG_PM
void omap3_sram_restore_context(void) void omap3_sram_restore_context(void)
{ {
omap_sram_ceil = omap_sram_base + omap_sram_size; omap_sram_ceil = omap_sram_base + omap_sram_size;
@ -358,17 +357,18 @@ void omap3_sram_restore_context(void)
omap3_sram_configure_core_dpll_sz); omap3_sram_configure_core_dpll_sz);
omap_push_sram_idle(); omap_push_sram_idle();
} }
#endif /* CONFIG_PM */
#endif /* CONFIG_ARCH_OMAP3 */
static inline int omap34xx_sram_init(void) static inline int omap34xx_sram_init(void)
{ {
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
omap3_sram_restore_context(); omap3_sram_restore_context();
#endif
return 0; return 0;
} }
#else
static inline int omap34xx_sram_init(void)
{
return 0;
}
#endif /* CONFIG_ARCH_OMAP3 */
static inline int am33xx_sram_init(void) static inline int am33xx_sram_init(void)
{ {

View File

@ -106,15 +106,16 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
return -EFAULT; return -EFAULT;
{ {
register unsigned long r8 __asm ("r8") = 0; register unsigned long r8 __asm ("r8");
unsigned long prev; unsigned long prev;
__asm__ __volatile__( __asm__ __volatile__(
" mf;; \n" " mf;; \n"
" mov ar.ccv=%3;; \n" " mov %0=r0 \n"
"[1:] cmpxchg4.acq %0=[%1],%2,ar.ccv \n" " mov ar.ccv=%4;; \n"
"[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n"
" .xdata4 \"__ex_table\", 1b-., 2f-. \n" " .xdata4 \"__ex_table\", 1b-., 2f-. \n"
"[2:]" "[2:]"
: "=r" (prev) : "=r" (r8), "=r" (prev)
: "r" (uaddr), "r" (newval), : "r" (uaddr), "r" (newval),
"rO" ((long) (unsigned) oldval) "rO" ((long) (unsigned) oldval)
: "memory"); : "memory");

View File

@ -604,12 +604,6 @@ pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f)
spin_unlock(&(x)->ctx_lock); spin_unlock(&(x)->ctx_lock);
} }
static inline unsigned int
pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct)
{
return do_munmap(mm, addr, len);
}
static inline unsigned long static inline unsigned long
pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec) pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec)
{ {
@ -1458,8 +1452,9 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu)
* a PROTECT_CTX() section. * a PROTECT_CTX() section.
*/ */
static int static int
pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long size) pfm_remove_smpl_mapping(void *vaddr, unsigned long size)
{ {
struct task_struct *task = current;
int r; int r;
/* sanity checks */ /* sanity checks */
@ -1473,13 +1468,8 @@ pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long siz
/* /*
* does the actual unmapping * does the actual unmapping
*/ */
down_write(&task->mm->mmap_sem); r = vm_munmap((unsigned long)vaddr, size);
DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size));
r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0);
up_write(&task->mm->mmap_sem);
if (r !=0) { if (r !=0) {
printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size); printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size);
} }
@ -1945,7 +1935,7 @@ pfm_flush(struct file *filp, fl_owner_t id)
* because some VM function reenables interrupts. * because some VM function reenables interrupts.
* *
*/ */
if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size); if (smpl_buf_vaddr) pfm_remove_smpl_mapping(smpl_buf_vaddr, smpl_buf_size);
return 0; return 0;
} }

View File

@ -49,7 +49,6 @@ CONFIG_BLK_DEV_RAM=y
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
CONFIG_FEC=y CONFIG_FEC=y
CONFIG_FEC2=y
# CONFIG_NETDEV_1000 is not set # CONFIG_NETDEV_1000 is not set
# CONFIG_NETDEV_10000 is not set # CONFIG_NETDEV_10000 is not set
CONFIG_PPP=y CONFIG_PPP=y

View File

@ -74,9 +74,7 @@ static void __init m527x_fec_init(void)
writew(par | 0xf00, MCF_IPSBAR + 0x100082); writew(par | 0xf00, MCF_IPSBAR + 0x100082);
v = readb(MCF_IPSBAR + 0x100078); v = readb(MCF_IPSBAR + 0x100078);
writeb(v | 0xc0, MCF_IPSBAR + 0x100078); writeb(v | 0xc0, MCF_IPSBAR + 0x100078);
#endif
#ifdef CONFIG_FEC2
/* Set multi-function pins to ethernet mode for fec1 */ /* Set multi-function pins to ethernet mode for fec1 */
par = readw(MCF_IPSBAR + 0x100082); par = readw(MCF_IPSBAR + 0x100082);
writew(par | 0xa0, MCF_IPSBAR + 0x100082); writew(par | 0xa0, MCF_IPSBAR + 0x100082);

View File

@ -3,9 +3,3 @@
# #
obj-y := config.o obj-y := config.o
extra-y := bootlogo.rh
$(obj)/bootlogo.rh: $(src)/bootlogo.h
perl $(src)/../68328/bootlogo.pl < $(src)/bootlogo.h \
> $(obj)/bootlogo.rh

View File

@ -3,14 +3,9 @@
# #
obj-y := config.o obj-y := config.o
logo-$(UCDIMM) := bootlogo.rh extra-$(DRAGEN2):= screen.h
logo-$(DRAGEN2) := screen.h
extra-y := $(logo-y)
$(obj)/bootlogo.rh: $(src)/../68EZ328/bootlogo.h
perl $(src)/bootlogo.pl < $(src)/../68328/bootlogo.h > $(obj)/bootlogo.rh
$(obj)/screen.h: $(src)/screen.xbm $(src)/xbm2lcd.pl $(obj)/screen.h: $(src)/screen.xbm $(src)/xbm2lcd.pl
perl $(src)/xbm2lcd.pl < $(src)/screen.xbm > $(obj)/screen.h perl $(src)/xbm2lcd.pl < $(src)/screen.xbm > $(obj)/screen.h
clean-files := $(obj)/screen.h $(obj)/bootlogo.rh clean-files := $(obj)/screen.h

View File

@ -1,6 +1,6 @@
#define splash_width 640 #define splash_width 640
#define splash_height 480 #define splash_height 480
static unsigned char splash_bits[] = { unsigned char __attribute__ ((aligned(16))) bootlogo_bits[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

View File

@ -114,7 +114,7 @@ static struct resource mcf_fec1_resources[] = {
static struct platform_device mcf_fec1 = { static struct platform_device mcf_fec1 = {
.name = "fec", .name = "fec",
.id = 0, .id = 1,
.num_resources = ARRAY_SIZE(mcf_fec1_resources), .num_resources = ARRAY_SIZE(mcf_fec1_resources),
.resource = mcf_fec1_resources, .resource = mcf_fec1_resources,
}; };

View File

@ -90,7 +90,6 @@ config S390
select HAVE_KERNEL_XZ select HAVE_KERNEL_XZ
select HAVE_ARCH_MUTEX_CPU_RELAX select HAVE_ARCH_MUTEX_CPU_RELAX
select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
select HAVE_RCU_TABLE_FREE if SMP
select ARCH_SAVE_PAGE_KEYS if HIBERNATION select ARCH_SAVE_PAGE_KEYS if HIBERNATION
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP select HAVE_MEMBLOCK_NODE_MAP

View File

@ -1,8 +1,12 @@
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
CONFIG_SYSVIPC=y CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE=y
CONFIG_FHANDLE=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_AUDIT=y CONFIG_AUDIT=y
CONFIG_RCU_TRACE=y
CONFIG_IKCONFIG=y CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y CONFIG_IKCONFIG_PROC=y
CONFIG_CGROUPS=y CONFIG_CGROUPS=y
@ -14,16 +18,22 @@ CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_SCHED=y
CONFIG_RT_GROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y
CONFIG_BLK_CGROUP=y CONFIG_BLK_CGROUP=y
CONFIG_NAMESPACES=y
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
CONFIG_EXPERT=y
# CONFIG_COMPAT_BRK is not set # CONFIG_COMPAT_BRK is not set
CONFIG_SLAB=y
CONFIG_PROFILING=y CONFIG_PROFILING=y
CONFIG_OPROFILE=y CONFIG_OPROFILE=y
CONFIG_KPROBES=y CONFIG_KPROBES=y
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y CONFIG_MODVERSIONS=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_IBM_PARTITION=y
CONFIG_DEFAULT_DEADLINE=y CONFIG_DEFAULT_DEADLINE=y
CONFIG_NO_HZ=y CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
@ -34,18 +44,15 @@ CONFIG_KSM=y
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
CONFIG_CMM=m CONFIG_CMM=m
CONFIG_HZ_100=y CONFIG_HZ_100=y
CONFIG_KEXEC=y CONFIG_CRASH_DUMP=y
CONFIG_PM=y
CONFIG_HIBERNATION=y CONFIG_HIBERNATION=y
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_UNIX=y CONFIG_UNIX=y
CONFIG_NET_KEY=y CONFIG_NET_KEY=y
CONFIG_AFIUCV=m
CONFIG_INET=y CONFIG_INET=y
CONFIG_IP_MULTICAST=y CONFIG_IP_MULTICAST=y
# CONFIG_INET_LRO is not set # CONFIG_INET_LRO is not set
CONFIG_IPV6=y CONFIG_IPV6=y
CONFIG_NET_SCTPPROBE=m
CONFIG_L2TP=m CONFIG_L2TP=m
CONFIG_L2TP_DEBUGFS=m CONFIG_L2TP_DEBUGFS=m
CONFIG_VLAN_8021Q=y CONFIG_VLAN_8021Q=y
@ -84,15 +91,14 @@ CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_ZFCP=y CONFIG_ZFCP=y
CONFIG_ZFCP_DIF=y
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
CONFIG_DUMMY=m
CONFIG_BONDING=m CONFIG_BONDING=m
CONFIG_DUMMY=m
CONFIG_EQUALIZER=m CONFIG_EQUALIZER=m
CONFIG_TUN=m CONFIG_TUN=m
CONFIG_NET_ETHERNET=y
CONFIG_VIRTIO_NET=y CONFIG_VIRTIO_NET=y
CONFIG_RAW_DRIVER=m CONFIG_RAW_DRIVER=m
CONFIG_VIRTIO_BALLOON=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
@ -103,27 +109,21 @@ CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_POSIX_ACL=y
# CONFIG_NETWORK_FILESYSTEMS is not set # CONFIG_NETWORK_FILESYSTEMS is not set
CONFIG_PARTITION_ADVANCED=y
CONFIG_IBM_PARTITION=y
CONFIG_DLM=m
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
CONFIG_TIMER_STATS=y CONFIG_TIMER_STATS=y
CONFIG_PROVE_LOCKING=y CONFIG_PROVE_LOCKING=y
CONFIG_PROVE_RCU=y CONFIG_PROVE_RCU=y
CONFIG_LOCK_STAT=y CONFIG_LOCK_STAT=y
CONFIG_DEBUG_LOCKDEP=y CONFIG_DEBUG_LOCKDEP=y
CONFIG_DEBUG_SPINLOCK_SLEEP=y
CONFIG_DEBUG_LIST=y CONFIG_DEBUG_LIST=y
CONFIG_DEBUG_NOTIFIERS=y CONFIG_DEBUG_NOTIFIERS=y
# CONFIG_RCU_CPU_STALL_DETECTOR is not set CONFIG_RCU_TRACE=y
CONFIG_KPROBES_SANITY_TEST=y CONFIG_KPROBES_SANITY_TEST=y
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
CONFIG_LATENCYTOP=y CONFIG_LATENCYTOP=y
CONFIG_SYSCTL_SYSCALL_CHECK=y
CONFIG_DEBUG_PAGEALLOC=y CONFIG_DEBUG_PAGEALLOC=y
# CONFIG_FTRACE is not set CONFIG_BLK_DEV_IO_TRACE=y
# CONFIG_STRICT_DEVMEM is not set # CONFIG_STRICT_DEVMEM is not set
CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_CRYPTD=m
@ -173,4 +173,3 @@ CONFIG_CRYPTO_SHA512_S390=m
CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_DES_S390=m
CONFIG_CRYPTO_AES_S390=m CONFIG_CRYPTO_AES_S390=m
CONFIG_CRC7=m CONFIG_CRC7=m
CONFIG_VIRTIO_BALLOON=y

View File

@ -38,12 +38,11 @@ static inline void stfle(u64 *stfle_fac_list, int size)
unsigned long nr; unsigned long nr;
preempt_disable(); preempt_disable();
S390_lowcore.stfl_fac_list = 0;
asm volatile( asm volatile(
" .insn s,0xb2b10000,0(0)\n" /* stfl */ " .insn s,0xb2b10000,0(0)\n" /* stfl */
"0:\n" "0:\n"
EX_TABLE(0b, 0b) EX_TABLE(0b, 0b)
: "=m" (S390_lowcore.stfl_fac_list)); : "+m" (S390_lowcore.stfl_fac_list));
nr = 4; /* bytes stored by stfl */ nr = 4; /* bytes stored by stfl */
memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4); memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4);
if (S390_lowcore.stfl_fac_list & 0x01000000) { if (S390_lowcore.stfl_fac_list & 0x01000000) {

View File

@ -22,10 +22,7 @@ void crst_table_free(struct mm_struct *, unsigned long *);
unsigned long *page_table_alloc(struct mm_struct *, unsigned long); unsigned long *page_table_alloc(struct mm_struct *, unsigned long);
void page_table_free(struct mm_struct *, unsigned long *); void page_table_free(struct mm_struct *, unsigned long *);
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
void page_table_free_rcu(struct mmu_gather *, unsigned long *); void page_table_free_rcu(struct mmu_gather *, unsigned long *);
void __tlb_remove_table(void *_table);
#endif
static inline void clear_table(unsigned long *s, unsigned long val, size_t n) static inline void clear_table(unsigned long *s, unsigned long val, size_t n)
{ {

View File

@ -77,7 +77,7 @@ static inline __u16 __arch_swab16p(const __u16 *x)
asm volatile( asm volatile(
#ifndef __s390x__ #ifndef __s390x__
" icm %0,2,%O+1(%R1)\n" " icm %0,2,%O1+1(%R1)\n"
" ic %0,%1\n" " ic %0,%1\n"
: "=&d" (result) : "Q" (*x) : "cc"); : "=&d" (result) : "Q" (*x) : "cc");
#else /* __s390x__ */ #else /* __s390x__ */

View File

@ -30,14 +30,10 @@
struct mmu_gather { struct mmu_gather {
struct mm_struct *mm; struct mm_struct *mm;
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
struct mmu_table_batch *batch; struct mmu_table_batch *batch;
#endif
unsigned int fullmm; unsigned int fullmm;
unsigned int need_flush;
}; };
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
struct mmu_table_batch { struct mmu_table_batch {
struct rcu_head rcu; struct rcu_head rcu;
unsigned int nr; unsigned int nr;
@ -49,7 +45,6 @@ struct mmu_table_batch {
extern void tlb_table_flush(struct mmu_gather *tlb); extern void tlb_table_flush(struct mmu_gather *tlb);
extern void tlb_remove_table(struct mmu_gather *tlb, void *table); extern void tlb_remove_table(struct mmu_gather *tlb, void *table);
#endif
static inline void tlb_gather_mmu(struct mmu_gather *tlb, static inline void tlb_gather_mmu(struct mmu_gather *tlb,
struct mm_struct *mm, struct mm_struct *mm,
@ -57,29 +52,20 @@ static inline void tlb_gather_mmu(struct mmu_gather *tlb,
{ {
tlb->mm = mm; tlb->mm = mm;
tlb->fullmm = full_mm_flush; tlb->fullmm = full_mm_flush;
tlb->need_flush = 0;
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
tlb->batch = NULL; tlb->batch = NULL;
#endif
if (tlb->fullmm) if (tlb->fullmm)
__tlb_flush_mm(mm); __tlb_flush_mm(mm);
} }
static inline void tlb_flush_mmu(struct mmu_gather *tlb) static inline void tlb_flush_mmu(struct mmu_gather *tlb)
{ {
if (!tlb->need_flush)
return;
tlb->need_flush = 0;
__tlb_flush_mm(tlb->mm);
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
tlb_table_flush(tlb); tlb_table_flush(tlb);
#endif
} }
static inline void tlb_finish_mmu(struct mmu_gather *tlb, static inline void tlb_finish_mmu(struct mmu_gather *tlb,
unsigned long start, unsigned long end) unsigned long start, unsigned long end)
{ {
tlb_flush_mmu(tlb); tlb_table_flush(tlb);
} }
/* /*
@ -105,10 +91,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page)
static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
unsigned long address) unsigned long address)
{ {
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
if (!tlb->fullmm) if (!tlb->fullmm)
return page_table_free_rcu(tlb, (unsigned long *) pte); return page_table_free_rcu(tlb, (unsigned long *) pte);
#endif
page_table_free(tlb->mm, (unsigned long *) pte); page_table_free(tlb->mm, (unsigned long *) pte);
} }
@ -125,10 +109,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
#ifdef __s390x__ #ifdef __s390x__
if (tlb->mm->context.asce_limit <= (1UL << 31)) if (tlb->mm->context.asce_limit <= (1UL << 31))
return; return;
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
if (!tlb->fullmm) if (!tlb->fullmm)
return tlb_remove_table(tlb, pmd); return tlb_remove_table(tlb, pmd);
#endif
crst_table_free(tlb->mm, (unsigned long *) pmd); crst_table_free(tlb->mm, (unsigned long *) pmd);
#endif #endif
} }
@ -146,10 +128,8 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
#ifdef __s390x__ #ifdef __s390x__
if (tlb->mm->context.asce_limit <= (1UL << 42)) if (tlb->mm->context.asce_limit <= (1UL << 42))
return; return;
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
if (!tlb->fullmm) if (!tlb->fullmm)
return tlb_remove_table(tlb, pud); return tlb_remove_table(tlb, pud);
#endif
crst_table_free(tlb->mm, (unsigned long *) pud); crst_table_free(tlb->mm, (unsigned long *) pud);
#endif #endif
} }

View File

@ -474,9 +474,9 @@ ENTRY(startup_kdump)
stck __LC_LAST_UPDATE_CLOCK stck __LC_LAST_UPDATE_CLOCK
spt 5f-.LPG0(%r13) spt 5f-.LPG0(%r13)
mvc __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13) mvc __LC_LAST_UPDATE_TIMER(8),5f-.LPG0(%r13)
xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
#ifndef CONFIG_MARCH_G5 #ifndef CONFIG_MARCH_G5
# check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10} # check capabilities against MARCH_{G5,Z900,Z990,Z9_109,Z10}
xc __LC_STFL_FAC_LIST(8),__LC_STFL_FAC_LIST
.insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list .insn s,0xb2b10000,__LC_STFL_FAC_LIST # store facility list
tm __LC_STFL_FAC_LIST,0x01 # stfle available ? tm __LC_STFL_FAC_LIST,0x01 # stfle available ?
jz 0f jz 0f

View File

@ -118,10 +118,11 @@ asmlinkage void do_softirq(void)
"a" (__do_softirq) "a" (__do_softirq)
: "0", "1", "2", "3", "4", "5", "14", : "0", "1", "2", "3", "4", "5", "14",
"cc", "memory" ); "cc", "memory" );
} else } else {
/* We are already on the async stack. */ /* We are already on the async stack. */
__do_softirq(); __do_softirq();
} }
}
local_irq_restore(flags); local_irq_restore(flags);
} }
@ -192,11 +193,12 @@ int unregister_external_interrupt(u16 code, ext_int_handler_t handler)
int index = ext_hash(code); int index = ext_hash(code);
spin_lock_irqsave(&ext_int_hash_lock, flags); spin_lock_irqsave(&ext_int_hash_lock, flags);
list_for_each_entry_rcu(p, &ext_int_hash[index], entry) list_for_each_entry_rcu(p, &ext_int_hash[index], entry) {
if (p->code == code && p->handler == handler) { if (p->code == code && p->handler == handler) {
list_del_rcu(&p->entry); list_del_rcu(&p->entry);
kfree_rcu(p, rcu); kfree_rcu(p, rcu);
} }
}
spin_unlock_irqrestore(&ext_int_hash_lock, flags); spin_unlock_irqrestore(&ext_int_hash_lock, flags);
return 0; return 0;
} }
@ -211,9 +213,10 @@ void __irq_entry do_extint(struct pt_regs *regs, struct ext_code ext_code,
old_regs = set_irq_regs(regs); old_regs = set_irq_regs(regs);
irq_enter(); irq_enter();
if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) {
/* Serve timer interrupts first. */ /* Serve timer interrupts first. */
clock_comparator_work(); clock_comparator_work();
}
kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++; kstat_cpu(smp_processor_id()).irqs[EXTERNAL_INTERRUPT]++;
if (ext_code.code != 0x1004) if (ext_code.code != 0x1004)
__get_cpu_var(s390_idle).nohz_delay = 1; __get_cpu_var(s390_idle).nohz_delay = 1;

View File

@ -178,7 +178,7 @@ static void cpumf_pmu_enable(struct pmu *pmu)
err = lcctl(cpuhw->state); err = lcctl(cpuhw->state);
if (err) { if (err) {
pr_err("Enabling the performance measuring unit " pr_err("Enabling the performance measuring unit "
"failed with rc=%lx\n", err); "failed with rc=%x\n", err);
return; return;
} }
@ -203,7 +203,7 @@ static void cpumf_pmu_disable(struct pmu *pmu)
err = lcctl(inactive); err = lcctl(inactive);
if (err) { if (err) {
pr_err("Disabling the performance measuring unit " pr_err("Disabling the performance measuring unit "
"failed with rc=%lx\n", err); "failed with rc=%x\n", err);
return; return;
} }

View File

@ -61,21 +61,14 @@ long probe_kernel_write(void *dst, const void *src, size_t size)
return copied < 0 ? -EFAULT : 0; return copied < 0 ? -EFAULT : 0;
} }
/* static int __memcpy_real(void *dest, void *src, size_t count)
* Copy memory in real mode (kernel to kernel)
*/
int memcpy_real(void *dest, void *src, size_t count)
{ {
register unsigned long _dest asm("2") = (unsigned long) dest; register unsigned long _dest asm("2") = (unsigned long) dest;
register unsigned long _len1 asm("3") = (unsigned long) count; register unsigned long _len1 asm("3") = (unsigned long) count;
register unsigned long _src asm("4") = (unsigned long) src; register unsigned long _src asm("4") = (unsigned long) src;
register unsigned long _len2 asm("5") = (unsigned long) count; register unsigned long _len2 asm("5") = (unsigned long) count;
unsigned long flags;
int rc = -EFAULT; int rc = -EFAULT;
if (!count)
return 0;
flags = __arch_local_irq_stnsm(0xf8UL);
asm volatile ( asm volatile (
"0: mvcle %1,%2,0x0\n" "0: mvcle %1,%2,0x0\n"
"1: jo 0b\n" "1: jo 0b\n"
@ -86,7 +79,23 @@ int memcpy_real(void *dest, void *src, size_t count)
"+d" (_len2), "=m" (*((long *) dest)) "+d" (_len2), "=m" (*((long *) dest))
: "m" (*((long *) src)) : "m" (*((long *) src))
: "cc", "memory"); : "cc", "memory");
arch_local_irq_restore(flags); return rc;
}
/*
* Copy memory in real mode (kernel to kernel)
*/
int memcpy_real(void *dest, void *src, size_t count)
{
unsigned long flags;
int rc;
if (!count)
return 0;
local_irq_save(flags);
__arch_local_irq_stnsm(0xfbUL);
rc = __memcpy_real(dest, src, count);
local_irq_restore(flags);
return rc; return rc;
} }

View File

@ -678,8 +678,6 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
} }
} }
#ifdef CONFIG_HAVE_RCU_TABLE_FREE
static void __page_table_free_rcu(void *table, unsigned bit) static void __page_table_free_rcu(void *table, unsigned bit)
{ {
struct page *page; struct page *page;
@ -733,7 +731,66 @@ void __tlb_remove_table(void *_table)
free_pages((unsigned long) table, ALLOC_ORDER); free_pages((unsigned long) table, ALLOC_ORDER);
} }
#endif static void tlb_remove_table_smp_sync(void *arg)
{
/* Simply deliver the interrupt */
}
static void tlb_remove_table_one(void *table)
{
/*
* This isn't an RCU grace period and hence the page-tables cannot be
* assumed to be actually RCU-freed.
*
* It is however sufficient for software page-table walkers that rely
* on IRQ disabling. See the comment near struct mmu_table_batch.
*/
smp_call_function(tlb_remove_table_smp_sync, NULL, 1);
__tlb_remove_table(table);
}
static void tlb_remove_table_rcu(struct rcu_head *head)
{
struct mmu_table_batch *batch;
int i;
batch = container_of(head, struct mmu_table_batch, rcu);
for (i = 0; i < batch->nr; i++)
__tlb_remove_table(batch->tables[i]);
free_page((unsigned long)batch);
}
void tlb_table_flush(struct mmu_gather *tlb)
{
struct mmu_table_batch **batch = &tlb->batch;
if (*batch) {
__tlb_flush_mm(tlb->mm);
call_rcu_sched(&(*batch)->rcu, tlb_remove_table_rcu);
*batch = NULL;
}
}
void tlb_remove_table(struct mmu_gather *tlb, void *table)
{
struct mmu_table_batch **batch = &tlb->batch;
if (*batch == NULL) {
*batch = (struct mmu_table_batch *)
__get_free_page(GFP_NOWAIT | __GFP_NOWARN);
if (*batch == NULL) {
__tlb_flush_mm(tlb->mm);
tlb_remove_table_one(table);
return;
}
(*batch)->nr = 0;
}
(*batch)->tables[(*batch)->nr++] = table;
if ((*batch)->nr == MAX_TABLE_BATCH)
tlb_table_flush(tlb);
}
/* /*
* switch on pgstes for its userspace process (for kvm) * switch on pgstes for its userspace process (for kvm)

View File

@ -23,6 +23,7 @@
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/cpu.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
@ -78,6 +79,8 @@ void __cpuinit leon_callin(void)
local_flush_tlb_all(); local_flush_tlb_all();
leon_configure_cache_smp(); leon_configure_cache_smp();
notify_cpu_starting(cpuid);
/* Get our local ticker going. */ /* Get our local ticker going. */
smp_setup_percpu_timer(); smp_setup_percpu_timer();

View File

@ -566,15 +566,10 @@ out:
SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len) SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)
{ {
long ret;
if (invalid_64bit_range(addr, len)) if (invalid_64bit_range(addr, len))
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); return vm_munmap(addr, len);
ret = do_munmap(current->mm, addr, len);
up_write(&current->mm->mmap_sem);
return ret;
} }
extern unsigned long do_mremap(unsigned long addr, extern unsigned long do_mremap(unsigned long addr,

View File

@ -346,12 +346,10 @@ void single_step_once(struct pt_regs *regs)
} }
/* allocate a cache line of writable, executable memory */ /* allocate a cache line of writable, executable memory */
down_write(&current->mm->mmap_sem); buffer = (void __user *) vm_mmap(NULL, 0, 64,
buffer = (void __user *) do_mmap(NULL, 0, 64,
PROT_EXEC | PROT_READ | PROT_WRITE, PROT_EXEC | PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, MAP_PRIVATE | MAP_ANONYMOUS,
0); 0);
up_write(&current->mm->mmap_sem);
if (IS_ERR((void __force *)buffer)) { if (IS_ERR((void __force *)buffer)) {
kfree(state); kfree(state);

View File

@ -119,9 +119,7 @@ static void set_brk(unsigned long start, unsigned long end)
end = PAGE_ALIGN(end); end = PAGE_ALIGN(end);
if (end <= start) if (end <= start)
return; return;
down_write(&current->mm->mmap_sem); vm_brk(start, end - start);
do_brk(start, end - start);
up_write(&current->mm->mmap_sem);
} }
#ifdef CORE_DUMP #ifdef CORE_DUMP
@ -332,9 +330,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
pos = 32; pos = 32;
map_size = ex.a_text+ex.a_data; map_size = ex.a_text+ex.a_data;
down_write(&current->mm->mmap_sem); error = vm_brk(text_addr & PAGE_MASK, map_size);
error = do_brk(text_addr & PAGE_MASK, map_size);
up_write(&current->mm->mmap_sem);
if (error != (text_addr & PAGE_MASK)) { if (error != (text_addr & PAGE_MASK)) {
send_sig(SIGKILL, current, 0); send_sig(SIGKILL, current, 0);
@ -373,9 +369,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
loff_t pos = fd_offset; loff_t pos = fd_offset;
down_write(&current->mm->mmap_sem); vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
do_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
up_write(&current->mm->mmap_sem);
bprm->file->f_op->read(bprm->file, bprm->file->f_op->read(bprm->file,
(char __user *)N_TXTADDR(ex), (char __user *)N_TXTADDR(ex),
ex.a_text+ex.a_data, &pos); ex.a_text+ex.a_data, &pos);
@ -385,26 +379,22 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
goto beyond_if; goto beyond_if;
} }
down_write(&current->mm->mmap_sem); error = vm_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
error = do_mmap(bprm->file, N_TXTADDR(ex), ex.a_text,
PROT_READ | PROT_EXEC, PROT_READ | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
MAP_EXECUTABLE | MAP_32BIT, MAP_EXECUTABLE | MAP_32BIT,
fd_offset); fd_offset);
up_write(&current->mm->mmap_sem);
if (error != N_TXTADDR(ex)) { if (error != N_TXTADDR(ex)) {
send_sig(SIGKILL, current, 0); send_sig(SIGKILL, current, 0);
return error; return error;
} }
down_write(&current->mm->mmap_sem); error = vm_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
error = do_mmap(bprm->file, N_DATADDR(ex), ex.a_data,
PROT_READ | PROT_WRITE | PROT_EXEC, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE |
MAP_EXECUTABLE | MAP_32BIT, MAP_EXECUTABLE | MAP_32BIT,
fd_offset + ex.a_text); fd_offset + ex.a_text);
up_write(&current->mm->mmap_sem);
if (error != N_DATADDR(ex)) { if (error != N_DATADDR(ex)) {
send_sig(SIGKILL, current, 0); send_sig(SIGKILL, current, 0);
return error; return error;
@ -476,9 +466,7 @@ static int load_aout_library(struct file *file)
error_time = jiffies; error_time = jiffies;
} }
#endif #endif
down_write(&current->mm->mmap_sem); vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
do_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
up_write(&current->mm->mmap_sem);
file->f_op->read(file, (char __user *)start_addr, file->f_op->read(file, (char __user *)start_addr,
ex.a_text + ex.a_data, &pos); ex.a_text + ex.a_data, &pos);
@ -490,12 +478,10 @@ static int load_aout_library(struct file *file)
goto out; goto out;
} }
/* Now use mmap to map the library into memory. */ /* Now use mmap to map the library into memory. */
down_write(&current->mm->mmap_sem); error = vm_mmap(file, start_addr, ex.a_text + ex.a_data,
error = do_mmap(file, start_addr, ex.a_text + ex.a_data,
PROT_READ | PROT_WRITE | PROT_EXEC, PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT, MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE | MAP_32BIT,
N_TXTOFF(ex)); N_TXTOFF(ex));
up_write(&current->mm->mmap_sem);
retval = error; retval = error;
if (error != start_addr) if (error != start_addr)
goto out; goto out;
@ -503,9 +489,7 @@ static int load_aout_library(struct file *file)
len = PAGE_ALIGN(ex.a_text + ex.a_data); len = PAGE_ALIGN(ex.a_text + ex.a_data);
bss = ex.a_text + ex.a_data + ex.a_bss; bss = ex.a_text + ex.a_data + ex.a_bss;
if (bss > len) { if (bss > len) {
down_write(&current->mm->mmap_sem); error = vm_brk(start_addr + len, bss - len);
error = do_brk(start_addr + len, bss - len);
up_write(&current->mm->mmap_sem);
retval = error; retval = error;
if (error != start_addr + len) if (error != start_addr + len)
goto out; goto out;

View File

@ -459,17 +459,17 @@ void kvm_pmu_cpuid_update(struct kvm_vcpu *vcpu)
pmu->available_event_types = ~entry->ebx & ((1ull << bitmap_len) - 1); pmu->available_event_types = ~entry->ebx & ((1ull << bitmap_len) - 1);
if (pmu->version == 1) { if (pmu->version == 1) {
pmu->global_ctrl = (1 << pmu->nr_arch_gp_counters) - 1; pmu->nr_arch_fixed_counters = 0;
return; } else {
}
pmu->nr_arch_fixed_counters = min((int)(entry->edx & 0x1f), pmu->nr_arch_fixed_counters = min((int)(entry->edx & 0x1f),
X86_PMC_MAX_FIXED); X86_PMC_MAX_FIXED);
pmu->counter_bitmask[KVM_PMC_FIXED] = pmu->counter_bitmask[KVM_PMC_FIXED] =
((u64)1 << ((entry->edx >> 5) & 0xff)) - 1; ((u64)1 << ((entry->edx >> 5) & 0xff)) - 1;
pmu->global_ctrl_mask = ~(((1 << pmu->nr_arch_gp_counters) - 1) }
| (((1ull << pmu->nr_arch_fixed_counters) - 1)
<< X86_PMC_IDX_FIXED)); pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) |
(((1ull << pmu->nr_arch_fixed_counters) - 1) << X86_PMC_IDX_FIXED);
pmu->global_ctrl_mask = ~pmu->global_ctrl;
} }
void kvm_pmu_init(struct kvm_vcpu *vcpu) void kvm_pmu_init(struct kvm_vcpu *vcpu)

View File

@ -2210,9 +2210,12 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
msr = find_msr_entry(vmx, msr_index); msr = find_msr_entry(vmx, msr_index);
if (msr) { if (msr) {
msr->data = data; msr->data = data;
if (msr - vmx->guest_msrs < vmx->save_nmsrs) if (msr - vmx->guest_msrs < vmx->save_nmsrs) {
preempt_disable();
kvm_set_shared_msr(msr->index, msr->data, kvm_set_shared_msr(msr->index, msr->data,
msr->mask); msr->mask);
preempt_enable();
}
break; break;
} }
ret = kvm_set_msr_common(vcpu, msr_index, data); ret = kvm_set_msr_common(vcpu, msr_index, data);

View File

@ -6336,13 +6336,11 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
if (npages && !old.rmap) { if (npages && !old.rmap) {
unsigned long userspace_addr; unsigned long userspace_addr;
down_write(&current->mm->mmap_sem); userspace_addr = vm_mmap(NULL, 0,
userspace_addr = do_mmap(NULL, 0,
npages * PAGE_SIZE, npages * PAGE_SIZE,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
map_flags, map_flags,
0); 0);
up_write(&current->mm->mmap_sem);
if (IS_ERR((void *)userspace_addr)) if (IS_ERR((void *)userspace_addr))
return PTR_ERR((void *)userspace_addr); return PTR_ERR((void *)userspace_addr);
@ -6366,10 +6364,8 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
if (!user_alloc && !old.user_alloc && old.rmap && !npages) { if (!user_alloc && !old.user_alloc && old.rmap && !npages) {
int ret; int ret;
down_write(&current->mm->mmap_sem); ret = vm_munmap(old.userspace_addr,
ret = do_munmap(current->mm, old.userspace_addr,
old.npages * PAGE_SIZE); old.npages * PAGE_SIZE);
up_write(&current->mm->mmap_sem);
if (ret < 0) if (ret < 0)
printk(KERN_WARNING printk(KERN_WARNING
"kvm_vm_ioctl_set_memory_region: " "kvm_vm_ioctl_set_memory_region: "

View File

@ -379,8 +379,8 @@ err_out:
return; return;
} }
/* Decode moffset16/32/64 */ /* Decode moffset16/32/64. Return 0 if failed */
static void __get_moffset(struct insn *insn) static int __get_moffset(struct insn *insn)
{ {
switch (insn->addr_bytes) { switch (insn->addr_bytes) {
case 2: case 2:
@ -397,15 +397,19 @@ static void __get_moffset(struct insn *insn)
insn->moffset2.value = get_next(int, insn); insn->moffset2.value = get_next(int, insn);
insn->moffset2.nbytes = 4; insn->moffset2.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->moffset1.got = insn->moffset2.got = 1; insn->moffset1.got = insn->moffset2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode imm v32(Iz) */ /* Decode imm v32(Iz). Return 0 if failed */
static void __get_immv32(struct insn *insn) static int __get_immv32(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
@ -417,14 +421,18 @@ static void __get_immv32(struct insn *insn)
insn->immediate.value = get_next(int, insn); insn->immediate.value = get_next(int, insn);
insn->immediate.nbytes = 4; insn->immediate.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode imm v64(Iv/Ov) */ /* Decode imm v64(Iv/Ov), Return 0 if failed */
static void __get_immv(struct insn *insn) static int __get_immv(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
@ -441,15 +449,18 @@ static void __get_immv(struct insn *insn)
insn->immediate2.value = get_next(int, insn); insn->immediate2.value = get_next(int, insn);
insn->immediate2.nbytes = 4; insn->immediate2.nbytes = 4;
break; break;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->immediate1.got = insn->immediate2.got = 1; insn->immediate1.got = insn->immediate2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/* Decode ptr16:16/32(Ap) */ /* Decode ptr16:16/32(Ap) */
static void __get_immptr(struct insn *insn) static int __get_immptr(struct insn *insn)
{ {
switch (insn->opnd_bytes) { switch (insn->opnd_bytes) {
case 2: case 2:
@ -462,14 +473,17 @@ static void __get_immptr(struct insn *insn)
break; break;
case 8: case 8:
/* ptr16:64 is not exist (no segment) */ /* ptr16:64 is not exist (no segment) */
return; return 0;
default: /* opnd_bytes must be modified manually */
goto err_out;
} }
insn->immediate2.value = get_next(unsigned short, insn); insn->immediate2.value = get_next(unsigned short, insn);
insn->immediate2.nbytes = 2; insn->immediate2.nbytes = 2;
insn->immediate1.got = insn->immediate2.got = 1; insn->immediate1.got = insn->immediate2.got = 1;
return 1;
err_out: err_out:
return; return 0;
} }
/** /**
@ -489,7 +503,8 @@ void insn_get_immediate(struct insn *insn)
insn_get_displacement(insn); insn_get_displacement(insn);
if (inat_has_moffset(insn->attr)) { if (inat_has_moffset(insn->attr)) {
__get_moffset(insn); if (!__get_moffset(insn))
goto err_out;
goto done; goto done;
} }
@ -517,16 +532,20 @@ void insn_get_immediate(struct insn *insn)
insn->immediate2.nbytes = 4; insn->immediate2.nbytes = 4;
break; break;
case INAT_IMM_PTR: case INAT_IMM_PTR:
__get_immptr(insn); if (!__get_immptr(insn))
goto err_out;
break; break;
case INAT_IMM_VWORD32: case INAT_IMM_VWORD32:
__get_immv32(insn); if (!__get_immv32(insn))
goto err_out;
break; break;
case INAT_IMM_VWORD: case INAT_IMM_VWORD:
__get_immv(insn); if (!__get_immv(insn))
goto err_out;
break; break;
default: default:
break; /* Here, insn must have an immediate, but failed */
goto err_out;
} }
if (inat_has_second_immediate(insn->attr)) { if (inat_has_second_immediate(insn->attr)) {
insn->immediate2.value = get_next(char, insn); insn->immediate2.value = get_next(char, insn);

View File

@ -174,7 +174,7 @@ sha512_update(struct shash_desc *desc, const u8 *data, unsigned int len)
index = sctx->count[0] & 0x7f; index = sctx->count[0] & 0x7f;
/* Update number of bytes */ /* Update number of bytes */
if (!(sctx->count[0] += len)) if ((sctx->count[0] += len) < len)
sctx->count[1]++; sctx->count[1]++;
part_len = 128 - index; part_len = 128 - index;

View File

@ -74,7 +74,8 @@ acpi_status acpi_reset(void)
/* Check if the reset register is supported */ /* Check if the reset register is supported */
if (!reset_reg->address) { if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
!reset_reg->address) {
return_ACPI_STATUS(AE_NOT_EXIST); return_ACPI_STATUS(AE_NOT_EXIST);
} }

View File

@ -607,8 +607,7 @@ acpi_os_install_interrupt_handler(u32 gsi, acpi_osd_handler handler,
acpi_irq_handler = handler; acpi_irq_handler = handler;
acpi_irq_context = context; acpi_irq_context = context;
if (request_threaded_irq(irq, NULL, acpi_irq, IRQF_SHARED, "acpi", if (request_irq(irq, acpi_irq, IRQF_SHARED, "acpi", acpi_irq)) {
acpi_irq)) {
printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq); printk(KERN_ERR PREFIX "SCI (IRQ%d) allocation failed\n", irq);
acpi_irq_handler = NULL; acpi_irq_handler = NULL;
return AE_NOT_ACQUIRED; return AE_NOT_ACQUIRED;

View File

@ -23,7 +23,8 @@ void acpi_reboot(void)
/* Is the reset register supported? The spec says we should be /* Is the reset register supported? The spec says we should be
* checking the bit width and bit offset, but Windows ignores * checking the bit width and bit offset, but Windows ignores
* these fields */ * these fields */
/* Ignore also acpi_gbl_FADT.flags.ACPI_FADT_RESET_REGISTER */ if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER))
return;
reset_value = acpi_gbl_FADT.reset_value; reset_value = acpi_gbl_FADT.reset_value;

View File

@ -329,6 +329,8 @@ static const struct pci_device_id piix_pci_tbl[] = {
{ 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
/* SATA Controller IDE (Lynx Point) */ /* SATA Controller IDE (Lynx Point) */
{ 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
/* SATA Controller IDE (DH89xxCC) */
{ 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
{ } /* terminate list */ { } /* terminate list */
}; };

View File

@ -95,7 +95,7 @@ static unsigned int ata_dev_set_xfermode(struct ata_device *dev);
static void ata_dev_xfermask(struct ata_device *dev); static void ata_dev_xfermask(struct ata_device *dev);
static unsigned long ata_dev_blacklisted(const struct ata_device *dev); static unsigned long ata_dev_blacklisted(const struct ata_device *dev);
unsigned int ata_print_id = 1; atomic_t ata_print_id = ATOMIC_INIT(1);
struct ata_force_param { struct ata_force_param {
const char *name; const char *name;
@ -6029,7 +6029,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
/* give ports names and add SCSI hosts */ /* give ports names and add SCSI hosts */
for (i = 0; i < host->n_ports; i++) for (i = 0; i < host->n_ports; i++)
host->ports[i]->print_id = ata_print_id++; host->ports[i]->print_id = atomic_inc_return(&ata_print_id);
/* Create associated sysfs transport objects */ /* Create associated sysfs transport objects */

View File

@ -3843,7 +3843,7 @@ int ata_sas_async_port_init(struct ata_port *ap)
int rc = ap->ops->port_start(ap); int rc = ap->ops->port_start(ap);
if (!rc) { if (!rc) {
ap->print_id = ata_print_id++; ap->print_id = atomic_inc_return(&ata_print_id);
__ata_port_probe(ap); __ata_port_probe(ap);
} }
@ -3867,7 +3867,7 @@ int ata_sas_port_init(struct ata_port *ap)
int rc = ap->ops->port_start(ap); int rc = ap->ops->port_start(ap);
if (!rc) { if (!rc) {
ap->print_id = ata_print_id++; ap->print_id = atomic_inc_return(&ata_print_id);
rc = ata_port_probe(ap); rc = ata_port_probe(ap);
} }

View File

@ -294,6 +294,7 @@ int ata_tport_add(struct device *parent,
device_enable_async_suspend(dev); device_enable_async_suspend(dev);
pm_runtime_set_active(dev); pm_runtime_set_active(dev);
pm_runtime_enable(dev); pm_runtime_enable(dev);
pm_runtime_forbid(dev);
transport_add_device(dev); transport_add_device(dev);
transport_configure_device(dev); transport_configure_device(dev);

View File

@ -53,7 +53,7 @@ enum {
ATA_DNXFER_QUIET = (1 << 31), ATA_DNXFER_QUIET = (1 << 31),
}; };
extern unsigned int ata_print_id; extern atomic_t ata_print_id;
extern int atapi_passthru16; extern int atapi_passthru16;
extern int libata_fua; extern int libata_fua;
extern int libata_noacpi; extern int libata_noacpi;

View File

@ -4025,7 +4025,8 @@ static int mv_platform_probe(struct platform_device *pdev)
struct ata_host *host; struct ata_host *host;
struct mv_host_priv *hpriv; struct mv_host_priv *hpriv;
struct resource *res; struct resource *res;
int n_ports, rc; int n_ports = 0;
int rc;
ata_print_version_once(&pdev->dev, DRV_VERSION); ata_print_version_once(&pdev->dev, DRV_VERSION);

View File

@ -375,6 +375,34 @@ static int init_vq(struct virtio_blk *vblk)
return err; return err;
} }
/*
* Legacy naming scheme used for virtio devices. We are stuck with it for
* virtio blk but don't ever use it for any new driver.
*/
static int virtblk_name_format(char *prefix, int index, char *buf, int buflen)
{
const int base = 'z' - 'a' + 1;
char *begin = buf + strlen(prefix);
char *end = buf + buflen;
char *p;
int unit;
p = end - 1;
*p = '\0';
unit = base;
do {
if (p == begin)
return -EINVAL;
*--p = 'a' + (index % unit);
index = (index / unit) - 1;
} while (index >= 0);
memmove(begin, p, end - p);
memcpy(buf, prefix, strlen(prefix));
return 0;
}
static int __devinit virtblk_probe(struct virtio_device *vdev) static int __devinit virtblk_probe(struct virtio_device *vdev)
{ {
struct virtio_blk *vblk; struct virtio_blk *vblk;
@ -443,18 +471,7 @@ static int __devinit virtblk_probe(struct virtio_device *vdev)
q->queuedata = vblk; q->queuedata = vblk;
if (index < 26) { virtblk_name_format("vd", index, vblk->disk->disk_name, DISK_NAME_LEN);
sprintf(vblk->disk->disk_name, "vd%c", 'a' + index % 26);
} else if (index < (26 + 1) * 26) {
sprintf(vblk->disk->disk_name, "vd%c%c",
'a' + index / 26 - 1, 'a' + index % 26);
} else {
const unsigned int m1 = (index / 26 - 1) / 26 - 1;
const unsigned int m2 = (index / 26 - 1) % 26;
const unsigned int m3 = index % 26;
sprintf(vblk->disk->disk_name, "vd%c%c%c",
'a' + m1, 'a' + m2, 'a' + m3);
}
vblk->disk->major = major; vblk->disk->major = major;
vblk->disk->first_minor = index_to_minor(index); vblk->disk->first_minor = index_to_minor(index);

View File

@ -416,7 +416,7 @@ static void xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info
"discard-secure", "%d", "discard-secure", "%d",
blkif->vbd.discard_secure); blkif->vbd.discard_secure);
if (err) { if (err) {
dev_warn(dev-dev, "writing discard-secure (%d)", err); dev_warn(&dev->dev, "writing discard-secure (%d)", err);
return; return;
} }
} }

View File

@ -161,7 +161,7 @@ static struct cpufreq_driver db8500_cpufreq_driver = {
static int __init db8500_cpufreq_register(void) static int __init db8500_cpufreq_register(void)
{ {
if (!cpu_is_u8500v20_or_later()) if (!cpu_is_u8500_family())
return -ENODEV; return -ENODEV;
pr_info("cpufreq for DB8500 started\n"); pr_info("cpufreq for DB8500 started\n");

View File

@ -18,6 +18,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/gfp.h> #include <linux/gfp.h>
#include <linux/module.h>
#include <crypto/ctr.h> #include <crypto/ctr.h>
#include <crypto/des.h> #include <crypto/des.h>

View File

@ -124,6 +124,9 @@ struct talitos_private {
void __iomem *reg; void __iomem *reg;
int irq[2]; int irq[2];
/* SEC global registers lock */
spinlock_t reg_lock ____cacheline_aligned;
/* SEC version geometry (from device tree node) */ /* SEC version geometry (from device tree node) */
unsigned int num_channels; unsigned int num_channels;
unsigned int chfifo_len; unsigned int chfifo_len;
@ -412,6 +415,7 @@ static void talitos_done_##name(unsigned long data) \
{ \ { \
struct device *dev = (struct device *)data; \ struct device *dev = (struct device *)data; \
struct talitos_private *priv = dev_get_drvdata(dev); \ struct talitos_private *priv = dev_get_drvdata(dev); \
unsigned long flags; \
\ \
if (ch_done_mask & 1) \ if (ch_done_mask & 1) \
flush_channel(dev, 0, 0, 0); \ flush_channel(dev, 0, 0, 0); \
@ -427,8 +431,10 @@ static void talitos_done_##name(unsigned long data) \
out: \ out: \
/* At this point, all completed channels have been processed */ \ /* At this point, all completed channels have been processed */ \
/* Unmask done interrupts for channels completed later on. */ \ /* Unmask done interrupts for channels completed later on. */ \
spin_lock_irqsave(&priv->reg_lock, flags); \
setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ setbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
setbits32(priv->reg + TALITOS_IMR_LO, TALITOS_IMR_LO_INIT); \ setbits32(priv->reg + TALITOS_IMR_LO, TALITOS_IMR_LO_INIT); \
spin_unlock_irqrestore(&priv->reg_lock, flags); \
} }
DEF_TALITOS_DONE(4ch, TALITOS_ISR_4CHDONE) DEF_TALITOS_DONE(4ch, TALITOS_ISR_4CHDONE)
DEF_TALITOS_DONE(ch0_2, TALITOS_ISR_CH_0_2_DONE) DEF_TALITOS_DONE(ch0_2, TALITOS_ISR_CH_0_2_DONE)
@ -619,21 +625,27 @@ static irqreturn_t talitos_interrupt_##name(int irq, void *data) \
struct device *dev = data; \ struct device *dev = data; \
struct talitos_private *priv = dev_get_drvdata(dev); \ struct talitos_private *priv = dev_get_drvdata(dev); \
u32 isr, isr_lo; \ u32 isr, isr_lo; \
unsigned long flags; \
\ \
spin_lock_irqsave(&priv->reg_lock, flags); \
isr = in_be32(priv->reg + TALITOS_ISR); \ isr = in_be32(priv->reg + TALITOS_ISR); \
isr_lo = in_be32(priv->reg + TALITOS_ISR_LO); \ isr_lo = in_be32(priv->reg + TALITOS_ISR_LO); \
/* Acknowledge interrupt */ \ /* Acknowledge interrupt */ \
out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \ out_be32(priv->reg + TALITOS_ICR, isr & (ch_done_mask | ch_err_mask)); \
out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \ out_be32(priv->reg + TALITOS_ICR_LO, isr_lo); \
\ \
if (unlikely((isr & ~TALITOS_ISR_4CHDONE) & ch_err_mask || isr_lo)) \ if (unlikely(isr & ch_err_mask || isr_lo)) { \
talitos_error(dev, isr, isr_lo); \ spin_unlock_irqrestore(&priv->reg_lock, flags); \
else \ talitos_error(dev, isr & ch_err_mask, isr_lo); \
} \
else { \
if (likely(isr & ch_done_mask)) { \ if (likely(isr & ch_done_mask)) { \
/* mask further done interrupts. */ \ /* mask further done interrupts. */ \
clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \ clrbits32(priv->reg + TALITOS_IMR, ch_done_mask); \
/* done_task will unmask done interrupts at exit */ \ /* done_task will unmask done interrupts at exit */ \
tasklet_schedule(&priv->done_task[tlet]); \ tasklet_schedule(&priv->done_task[tlet]); \
} \
spin_unlock_irqrestore(&priv->reg_lock, flags); \
} \ } \
\ \
return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \ return (isr & (ch_done_mask | ch_err_mask) || isr_lo) ? IRQ_HANDLED : \
@ -2719,6 +2731,8 @@ static int talitos_probe(struct platform_device *ofdev)
priv->ofdev = ofdev; priv->ofdev = ofdev;
spin_lock_init(&priv->reg_lock);
err = talitos_probe_irq(ofdev); err = talitos_probe_irq(ofdev);
if (err) if (err)
goto err_out; goto err_out;

View File

@ -91,11 +91,10 @@ config DW_DMAC
config AT_HDMAC config AT_HDMAC
tristate "Atmel AHB DMA support" tristate "Atmel AHB DMA support"
depends on ARCH_AT91SAM9RL || ARCH_AT91SAM9G45 depends on ARCH_AT91
select DMA_ENGINE select DMA_ENGINE
help help
Support the Atmel AHB DMA controller. This can be integrated in Support the Atmel AHB DMA controller.
chips such as the Atmel AT91SAM9RL.
config FSL_DMA config FSL_DMA
tristate "Freescale Elo and Elo Plus DMA support" tristate "Freescale Elo and Elo Plus DMA support"

View File

@ -1510,8 +1510,8 @@ int drm_freebufs(struct drm_device *dev, void *data,
* \param arg pointer to a drm_buf_map structure. * \param arg pointer to a drm_buf_map structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Maps the AGP, SG or PCI buffer region with do_mmap(), and copies information * Maps the AGP, SG or PCI buffer region with vm_mmap(), and copies information
* about each buffer into user space. For PCI buffers, it calls do_mmap() with * about each buffer into user space. For PCI buffers, it calls vm_mmap() with
* offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls * offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls
* drm_mmap_dma(). * drm_mmap_dma().
*/ */
@ -1553,18 +1553,14 @@ int drm_mapbufs(struct drm_device *dev, void *data,
retcode = -EINVAL; retcode = -EINVAL;
goto done; goto done;
} }
down_write(&current->mm->mmap_sem); virtual = vm_mmap(file_priv->filp, 0, map->size,
virtual = do_mmap(file_priv->filp, 0, map->size,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, MAP_SHARED,
token); token);
up_write(&current->mm->mmap_sem);
} else { } else {
down_write(&current->mm->mmap_sem); virtual = vm_mmap(file_priv->filp, 0, dma->byte_count,
virtual = do_mmap(file_priv->filp, 0, dma->byte_count,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, 0); MAP_SHARED, 0);
up_write(&current->mm->mmap_sem);
} }
if (virtual > -1024UL) { if (virtual > -1024UL) {
/* Real error */ /* Real error */

View File

@ -3335,11 +3335,13 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
ret = crtc->funcs->page_flip(crtc, fb, e); ret = crtc->funcs->page_flip(crtc, fb, e);
if (ret) { if (ret) {
if (page_flip->flags & DRM_MODE_PAGE_FLIP_EVENT) {
spin_lock_irqsave(&dev->event_lock, flags); spin_lock_irqsave(&dev->event_lock, flags);
file_priv->event_space += sizeof e->event; file_priv->event_space += sizeof e->event;
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
kfree(e); kfree(e);
} }
}
out: out:
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);

View File

@ -507,12 +507,12 @@ int drm_release(struct inode *inode, struct file *filp)
drm_events_release(file_priv); drm_events_release(file_priv);
if (dev->driver->driver_features & DRIVER_GEM)
drm_gem_release(dev, file_priv);
if (dev->driver->driver_features & DRIVER_MODESET) if (dev->driver->driver_features & DRIVER_MODESET)
drm_fb_release(file_priv); drm_fb_release(file_priv);
if (dev->driver->driver_features & DRIVER_GEM)
drm_gem_release(dev, file_priv);
mutex_lock(&dev->ctxlist_mutex); mutex_lock(&dev->ctxlist_mutex);
if (!list_empty(&dev->ctxlist)) { if (!list_empty(&dev->ctxlist)) {
struct drm_ctx_list *pos, *n; struct drm_ctx_list *pos, *n;

View File

@ -1,6 +1,6 @@
#include "drmP.h" #include "drmP.h"
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/export.h> #include <linux/module.h>
int drm_get_usb_dev(struct usb_interface *interface, int drm_get_usb_dev(struct usb_interface *interface,
const struct usb_device_id *id, const struct usb_device_id *id,
@ -114,3 +114,7 @@ void drm_usb_exit(struct drm_driver *driver,
usb_deregister(udriver); usb_deregister(udriver);
} }
EXPORT_SYMBOL(drm_usb_exit); EXPORT_SYMBOL(drm_usb_exit);
MODULE_AUTHOR("David Airlie");
MODULE_DESCRIPTION("USB DRM support");
MODULE_LICENSE("GPL and additional rights");

View File

@ -581,10 +581,8 @@ int exynos_drm_gem_mmap_ioctl(struct drm_device *dev, void *data,
obj->filp->f_op = &exynos_drm_gem_fops; obj->filp->f_op = &exynos_drm_gem_fops;
obj->filp->private_data = obj; obj->filp->private_data = obj;
down_write(&current->mm->mmap_sem); addr = vm_mmap(obj->filp, 0, args->size,
addr = do_mmap(obj->filp, 0, args->size,
PROT_READ | PROT_WRITE, MAP_SHARED, 0); PROT_READ | PROT_WRITE, MAP_SHARED, 0);
up_write(&current->mm->mmap_sem);
drm_gem_object_unreference_unlocked(obj); drm_gem_object_unreference_unlocked(obj);

View File

@ -29,7 +29,6 @@
#define __MDFLD_DSI_OUTPUT_H__ #define __MDFLD_DSI_OUTPUT_H__
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/version.h>
#include <drm/drmP.h> #include <drm/drmP.h>
#include <drm/drm.h> #include <drm/drm.h>
#include <drm/drm_crtc.h> #include <drm/drm_crtc.h>

View File

@ -129,6 +129,7 @@ static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv)
if (buf_priv->currently_mapped == I810_BUF_MAPPED) if (buf_priv->currently_mapped == I810_BUF_MAPPED)
return -EINVAL; return -EINVAL;
/* This is all entirely broken */
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
old_fops = file_priv->filp->f_op; old_fops = file_priv->filp->f_op;
file_priv->filp->f_op = &i810_buffer_fops; file_priv->filp->f_op = &i810_buffer_fops;
@ -157,11 +158,8 @@ static int i810_unmap_buffer(struct drm_buf *buf)
if (buf_priv->currently_mapped != I810_BUF_MAPPED) if (buf_priv->currently_mapped != I810_BUF_MAPPED)
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); retcode = vm_munmap((unsigned long)buf_priv->virtual,
retcode = do_munmap(current->mm,
(unsigned long)buf_priv->virtual,
(size_t) buf->total); (size_t) buf->total);
up_write(&current->mm->mmap_sem);
buf_priv->currently_mapped = I810_BUF_UNMAPPED; buf_priv->currently_mapped = I810_BUF_UNMAPPED;
buf_priv->virtual = NULL; buf_priv->virtual = NULL;

View File

@ -1087,11 +1087,9 @@ i915_gem_mmap_ioctl(struct drm_device *dev, void *data,
if (obj == NULL) if (obj == NULL)
return -ENOENT; return -ENOENT;
down_write(&current->mm->mmap_sem); addr = vm_mmap(obj->filp, 0, args->size,
addr = do_mmap(obj->filp, 0, args->size,
PROT_READ | PROT_WRITE, MAP_SHARED, PROT_READ | PROT_WRITE, MAP_SHARED,
args->offset); args->offset);
up_write(&current->mm->mmap_sem);
drm_gem_object_unreference_unlocked(obj); drm_gem_object_unreference_unlocked(obj);
if (IS_ERR((void *)addr)) if (IS_ERR((void *)addr))
return addr; return addr;

View File

@ -3478,7 +3478,10 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
return false; return false;
} }
/* All interlaced capable intel hw wants timings in frames. */ /* All interlaced capable intel hw wants timings in frames. Note though
* that intel_lvds_mode_fixup does some funny tricks with the crtc
* timings, so we need to be careful not to clobber these.*/
if (!(adjusted_mode->private_flags & INTEL_MODE_CRTC_TIMINGS_SET))
drm_mode_set_crtcinfo(adjusted_mode, 0); drm_mode_set_crtcinfo(adjusted_mode, 0);
return true; return true;
@ -7465,7 +7468,13 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
OUT_RING(fb->pitches[0] | obj->tiling_mode); OUT_RING(fb->pitches[0] | obj->tiling_mode);
OUT_RING(obj->gtt_offset); OUT_RING(obj->gtt_offset);
pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE; /* Contrary to the suggestions in the documentation,
* "Enable Panel Fitter" does not seem to be required when page
* flipping with a non-native mode, and worse causes a normal
* modeset to fail.
* pf = I915_READ(PF_CTL(intel_crtc->pipe)) & PF_ENABLE;
*/
pf = 0;
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
OUT_RING(pf | pipesrc); OUT_RING(pf | pipesrc);
ADVANCE_LP_RING(); ADVANCE_LP_RING();

View File

@ -105,6 +105,10 @@
#define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0) #define INTEL_MODE_PIXEL_MULTIPLIER_SHIFT (0x0)
#define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT) #define INTEL_MODE_PIXEL_MULTIPLIER_MASK (0xf << INTEL_MODE_PIXEL_MULTIPLIER_SHIFT)
#define INTEL_MODE_DP_FORCE_6BPC (0x10) #define INTEL_MODE_DP_FORCE_6BPC (0x10)
/* This flag must be set by the encoder's mode_fixup if it changes the crtc
* timings in the mode to prevent the crtc fixup from overwriting them.
* Currently only lvds needs that. */
#define INTEL_MODE_CRTC_TIMINGS_SET (0x20)
static inline void static inline void
intel_mode_set_pixel_multiplier(struct drm_display_mode *mode, intel_mode_set_pixel_multiplier(struct drm_display_mode *mode,

View File

@ -279,6 +279,8 @@ void intel_fb_restore_mode(struct drm_device *dev)
struct drm_mode_config *config = &dev->mode_config; struct drm_mode_config *config = &dev->mode_config;
struct drm_plane *plane; struct drm_plane *plane;
mutex_lock(&dev->mode_config.mutex);
ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper); ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper);
if (ret) if (ret)
DRM_DEBUG("failed to restore crtc mode\n"); DRM_DEBUG("failed to restore crtc mode\n");
@ -286,4 +288,6 @@ void intel_fb_restore_mode(struct drm_device *dev)
/* Be sure to shut off any planes that may be active */ /* Be sure to shut off any planes that may be active */
list_for_each_entry(plane, &config->plane_list, head) list_for_each_entry(plane, &config->plane_list, head)
plane->funcs->disable_plane(plane); plane->funcs->disable_plane(plane);
mutex_unlock(&dev->mode_config.mutex);
} }

View File

@ -187,6 +187,8 @@ centre_horizontally(struct drm_display_mode *mode,
mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos; mode->crtc_hsync_start = mode->crtc_hblank_start + sync_pos;
mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width; mode->crtc_hsync_end = mode->crtc_hsync_start + sync_width;
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
} }
static void static void
@ -208,6 +210,8 @@ centre_vertically(struct drm_display_mode *mode,
mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos; mode->crtc_vsync_start = mode->crtc_vblank_start + sync_pos;
mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width; mode->crtc_vsync_end = mode->crtc_vsync_start + sync_width;
mode->private_flags |= INTEL_MODE_CRTC_TIMINGS_SET;
} }
static inline u32 panel_fitter_scaling(u32 source, u32 target) static inline u32 panel_fitter_scaling(u32 source, u32 target)
@ -283,6 +287,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
for_each_pipe(pipe) for_each_pipe(pipe)
I915_WRITE(BCLRPAT(pipe), 0); I915_WRITE(BCLRPAT(pipe), 0);
drm_mode_set_crtcinfo(adjusted_mode, 0);
switch (intel_lvds->fitting_mode) { switch (intel_lvds->fitting_mode) {
case DRM_MODE_SCALE_CENTER: case DRM_MODE_SCALE_CENTER:
/* /*

View File

@ -47,8 +47,6 @@ intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
adjusted_mode->vtotal = fixed_mode->vtotal; adjusted_mode->vtotal = fixed_mode->vtotal;
adjusted_mode->clock = fixed_mode->clock; adjusted_mode->clock = fixed_mode->clock;
drm_mode_set_crtcinfo(adjusted_mode, 0);
} }
/* adjusted_mode has been preset to be the panel's fixed mode */ /* adjusted_mode has been preset to be the panel's fixed mode */

Some files were not shown because too many files have changed in this diff Show More