Merge remote-tracking branch 'asoc/fix/pxa' into asoc-pxa

This commit is contained in:
Mark Brown 2013-01-08 11:29:45 +00:00
commit 07afa01813
203 changed files with 1867 additions and 1199 deletions

View File

@ -0,0 +1,10 @@
Device tree bindings for twl4030-wdt driver (TWL4030 watchdog)
Required properties:
compatible = "ti,twl4030-wdt";
Example:
watchdog {
compatible = "ti,twl4030-wdt";
};

View File

@ -5385,6 +5385,15 @@ F: arch/arm/*omap*/
F: drivers/i2c/busses/i2c-omap.c F: drivers/i2c/busses/i2c-omap.c
F: include/linux/i2c-omap.h F: include/linux/i2c-omap.h
OMAP DEVICE TREE SUPPORT
M: Benoît Cousson <b-cousson@ti.com>
M: Tony Lindgren <tony@atomide.com>
L: linux-omap@vger.kernel.org
L: devicetree-discuss@lists.ozlabs.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/boot/dts/*omap*
F: arch/arm/boot/dts/*am3*
OMAP CLOCK FRAMEWORK SUPPORT OMAP CLOCK FRAMEWORK SUPPORT
M: Paul Walmsley <paul@pwsan.com> M: Paul Walmsley <paul@pwsan.com>
L: linux-omap@vger.kernel.org L: linux-omap@vger.kernel.org

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 8 PATCHLEVEL = 8
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc1 EXTRAVERSION = -rc2
NAME = Terrified Chipmunk NAME = Terrified Chipmunk
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -19,6 +19,10 @@
interrupts = <11>; interrupts = <11>;
}; };
watchdog {
compatible = "ti,twl4030-wdt";
};
vdac: regulator-vdac { vdac: regulator-vdac {
compatible = "ti,twl4030-vdac"; compatible = "ti,twl4030-vdac";
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;

View File

@ -6,6 +6,7 @@ CONFIG_MACH_ARMADA_370=y
CONFIG_MACH_ARMADA_XP=y CONFIG_MACH_ARMADA_XP=y
CONFIG_ARCH_HIGHBANK=y CONFIG_ARCH_HIGHBANK=y
CONFIG_ARCH_SOCFPGA=y CONFIG_ARCH_SOCFPGA=y
CONFIG_ARCH_SUNXI=y
# CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA is not set # CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA is not set
CONFIG_ARM_ERRATA_754322=y CONFIG_ARM_ERRATA_754322=y
CONFIG_SMP=y CONFIG_SMP=y

View File

@ -65,6 +65,8 @@ CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_DEFAULT_PID=y CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_CONNECTOR=y CONFIG_CONNECTOR=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_MTD=y CONFIG_MTD=y
CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CHAR=y CONFIG_MTD_CHAR=y
@ -132,9 +134,11 @@ CONFIG_POWER_SUPPLY=y
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
CONFIG_OMAP_WATCHDOG=y CONFIG_OMAP_WATCHDOG=y
CONFIG_TWL4030_WATCHDOG=y CONFIG_TWL4030_WATCHDOG=y
CONFIG_MFD_TPS65217=y
CONFIG_REGULATOR_TWL4030=y CONFIG_REGULATOR_TWL4030=y
CONFIG_REGULATOR_TPS65023=y CONFIG_REGULATOR_TPS65023=y
CONFIG_REGULATOR_TPS6507X=y CONFIG_REGULATOR_TPS6507X=y
CONFIG_REGULATOR_TPS65217=y
CONFIG_FB=y CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y CONFIG_FIRMWARE_EDID=y
CONFIG_FB_MODE_HELPERS=y CONFIG_FB_MODE_HELPERS=y
@ -170,6 +174,7 @@ CONFIG_SND_DEBUG=y
CONFIG_SND_USB_AUDIO=m CONFIG_SND_USB_AUDIO=m
CONFIG_SND_SOC=m CONFIG_SND_SOC=m
CONFIG_SND_OMAP_SOC=m CONFIG_SND_OMAP_SOC=m
CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_DEBUG=y CONFIG_USB_DEBUG=y

View File

@ -4,7 +4,7 @@
# Common support # Common support
obj-y := io.o id.o sram-init.o sram.o time.o irq.o mux.o flash.o \ obj-y := io.o id.o sram-init.o sram.o time.o irq.o mux.o flash.o \
serial.o devices.o dma.o serial.o devices.o dma.o fb.o
obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o
ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)

80
arch/arm/mach-omap1/fb.c Normal file
View File

@ -0,0 +1,80 @@
/*
* File: arch/arm/plat-omap/fb.c
*
* Framebuffer device registration for TI OMAP platforms
*
* Copyright (C) 2006 Nokia Corporation
* Author: Imre Deak <imre.deak@nokia.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/memblock.h>
#include <linux/io.h>
#include <linux/omapfb.h>
#include <linux/dma-mapping.h>
#include <asm/mach/map.h>
#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
static bool omapfb_lcd_configured;
static struct omapfb_platform_data omapfb_config;
static u64 omap_fb_dma_mask = ~(u32)0;
static struct platform_device omap_fb_device = {
.name = "omapfb",
.id = -1,
.dev = {
.dma_mask = &omap_fb_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &omapfb_config,
},
.num_resources = 0,
};
void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
{
omapfb_config.lcd = *config;
omapfb_lcd_configured = true;
}
static int __init omap_init_fb(void)
{
/*
* If the board file has not set the lcd config with
* omapfb_set_lcd_config(), don't bother registering the omapfb device
*/
if (!omapfb_lcd_configured)
return 0;
return platform_device_register(&omap_fb_device);
}
arch_initcall(omap_init_fb);
#else
void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
{
}
#endif

View File

@ -3,7 +3,7 @@
# #
# Common support # Common support
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \ obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \
common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \ common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \
omap_device.o sram.o omap_device.o sram.o

View File

@ -234,7 +234,7 @@
#define OMAP343X_PADCONF_ETK_D14 OMAP343X_PADCONF_ETK(16) #define OMAP343X_PADCONF_ETK_D14 OMAP343X_PADCONF_ETK(16)
#define OMAP343X_PADCONF_ETK_D15 OMAP343X_PADCONF_ETK(17) #define OMAP343X_PADCONF_ETK_D15 OMAP343X_PADCONF_ETK(17)
/* 34xx GENERAL_WKUP regist offsets */ /* 34xx GENERAL_WKUP register offsets */
#define OMAP343X_CONTROL_WKUP_DEBOBSMUX(i) (OMAP343X_CONTROL_GENERAL_WKUP + \ #define OMAP343X_CONTROL_WKUP_DEBOBSMUX(i) (OMAP343X_CONTROL_GENERAL_WKUP + \
0x008 + (i)) 0x008 + (i))
#define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008) #define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008)

View File

@ -504,8 +504,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
if (!cpu_is_omap44xx() && !cpu_is_omap3630()) { if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
freqsel = _omap3_dpll_compute_freqsel(clk, freqsel = _omap3_dpll_compute_freqsel(clk,
dd->last_rounded_n); dd->last_rounded_n);
if (!freqsel) WARN_ON(!freqsel);
WARN_ON(1);
} }
pr_debug("%s: %s: set rate: locking rate to %lu.\n", pr_debug("%s: %s: set rate: locking rate to %lu.\n",

View File

@ -27,7 +27,6 @@
#include "omap_device.h" #include "omap_device.h"
#include "omap_hwmod.h" #include "omap_hwmod.h"
#include <plat/cpu.h>
#if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE) #if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE)

View File

@ -31,8 +31,7 @@
#include <video/omap-panel-nokia-dsi.h> #include <video/omap-panel-nokia-dsi.h>
#include <video/omap-panel-picodlp.h> #include <video/omap-panel-picodlp.h>
#include <plat/cpu.h> #include "soc.h"
#include "dss-common.h" #include "dss-common.h"
#include "mux.h" #include "mux.h"

View File

@ -1,6 +1,4 @@
/* /*
* File: arch/arm/plat-omap/fb.c
*
* Framebuffer device registration for TI OMAP platforms * Framebuffer device registration for TI OMAP platforms
* *
* Copyright (C) 2006 Nokia Corporation * Copyright (C) 2006 Nokia Corporation
@ -33,7 +31,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <plat/cpu.h> #include "soc.h"
#ifdef CONFIG_OMAP2_VRFB #ifdef CONFIG_OMAP2_VRFB
@ -94,45 +92,7 @@ static int __init omap_init_vrfb(void)
arch_initcall(omap_init_vrfb); arch_initcall(omap_init_vrfb);
#endif #endif
#if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
static bool omapfb_lcd_configured;
static struct omapfb_platform_data omapfb_config;
static u64 omap_fb_dma_mask = ~(u32)0;
static struct platform_device omap_fb_device = {
.name = "omapfb",
.id = -1,
.dev = {
.dma_mask = &omap_fb_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &omapfb_config,
},
.num_resources = 0,
};
void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
{
omapfb_config.lcd = *config;
omapfb_lcd_configured = true;
}
static int __init omap_init_fb(void)
{
/*
* If the board file has not set the lcd config with
* omapfb_set_lcd_config(), don't bother registering the omapfb device
*/
if (!omapfb_lcd_configured)
return 0;
return platform_device_register(&omap_fb_device);
}
arch_initcall(omap_init_fb);
#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
static u64 omap_fb_dma_mask = ~(u32)0; static u64 omap_fb_dma_mask = ~(u32)0;
static struct omapfb_platform_data omapfb_config; static struct omapfb_platform_data omapfb_config;
@ -155,10 +115,4 @@ static int __init omap_init_fb(void)
arch_initcall(omap_init_fb); arch_initcall(omap_init_fb);
#else
void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
{
}
#endif #endif

View File

@ -26,7 +26,6 @@
#include <linux/omap-dma.h> #include <linux/omap-dma.h>
#include <linux/platform_data/omap_ocp2scp.h>
#include <linux/platform_data/spi-omap2-mcspi.h> #include <linux/platform_data/spi-omap2-mcspi.h>
#include <linux/platform_data/asoc-ti-mcbsp.h> #include <linux/platform_data/asoc-ti-mcbsp.h>
#include <linux/platform_data/iommu-omap.h> #include <linux/platform_data/iommu-omap.h>

View File

@ -292,8 +292,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
if (twl_sr_enable_autoinit) if (twl_sr_enable_autoinit)
pr_warning("%s: unexpected multiple calls\n", __func__); pr_warning("%s: unexpected multiple calls\n", __func__);
ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp, ret = twl_i2c_read_u8(TWL_MODULE_PM_RECEIVER, &temp,
TWL4030_DCDC_GLOBAL_CFG); TWL4030_DCDC_GLOBAL_CFG);
if (ret) if (ret)
goto err; goto err;
@ -302,8 +302,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
else else
temp &= ~SMARTREFLEX_ENABLE; temp &= ~SMARTREFLEX_ENABLE;
ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp, ret = twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, temp,
TWL4030_DCDC_GLOBAL_CFG); TWL4030_DCDC_GLOBAL_CFG);
if (!ret) { if (!ret) {
twl_sr_enable_autoinit = true; twl_sr_enable_autoinit = true;
return 0; return 0;

View File

@ -11,8 +11,6 @@
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
*/ */
#include <linux/pm_runtime.h>
#include <asm/pmu.h> #include <asm/pmu.h>
#include "soc.h" #include "soc.h"

View File

@ -18,9 +18,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/irq.h> #include <linux/irq.h>
#include "soc.h"
#include "common.h" #include "common.h"
#include <plat/cpu.h>
#include "vp.h" #include "vp.h"
#include "powerdomain.h" #include "powerdomain.h"
#include "clockdomain.h" #include "clockdomain.h"

View File

@ -18,9 +18,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/irq.h> #include <linux/irq.h>
#include "soc.h"
#include "common.h" #include "common.h"
#include <plat/cpu.h>
#include "vp.h" #include "vp.h"
#include "powerdomain.h" #include "powerdomain.h"
#include "prm3xxx.h" #include "prm3xxx.h"

View File

@ -463,6 +463,9 @@
GPIO76_LCD_PCLK, \ GPIO76_LCD_PCLK, \
GPIO77_LCD_BIAS GPIO77_LCD_BIAS
/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */
#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT)
#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT)
extern int keypad_set_wake(unsigned int on); extern int keypad_set_wake(unsigned int on);
#endif /* __ASM_ARCH_MFP_PXA27X_H */ #endif /* __ASM_ARCH_MFP_PXA27X_H */

View File

@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
EXPORT_SYMBOL(pxa27x_clear_otgph); EXPORT_SYMBOL(pxa27x_clear_otgph);
static unsigned long ac97_reset_config[] = { static unsigned long ac97_reset_config[] = {
GPIO113_GPIO, GPIO113_AC97_nRESET_GPIO_HIGH,
GPIO113_AC97_nRESET, GPIO113_AC97_nRESET,
GPIO95_GPIO, GPIO95_AC97_nRESET_GPIO_HIGH,
GPIO95_AC97_nRESET, GPIO95_AC97_nRESET,
}; };

View File

@ -80,8 +80,8 @@ static void __init sunxi_dt_init(void)
} }
static const char * const sunxi_board_dt_compat[] = { static const char * const sunxi_board_dt_compat[] = {
"allwinner,sun4i", "allwinner,sun4i-a10",
"allwinner,sun5i", "allwinner,sun5i-a13",
NULL, NULL,
}; };

View File

@ -3,7 +3,7 @@
# #
# Common support # Common support
obj-y := sram.o dma.o fb.o counter_32k.o obj-y := sram.o dma.o counter_32k.o
obj-m := obj-m :=
obj-n := obj-n :=
obj- := obj- :=

View File

@ -898,19 +898,8 @@ static struct platform_driver omap_dm_timer_driver = {
}, },
}; };
static int __init omap_dm_timer_driver_init(void)
{
return platform_driver_register(&omap_dm_timer_driver);
}
static void __exit omap_dm_timer_driver_exit(void)
{
platform_driver_unregister(&omap_dm_timer_driver);
}
early_platform_init("earlytimer", &omap_dm_timer_driver); early_platform_init("earlytimer", &omap_dm_timer_driver);
module_init(omap_dm_timer_driver_init); module_platform_driver(omap_dm_timer_driver);
module_exit(omap_dm_timer_driver_exit);
MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver"); MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");

View File

@ -32,8 +32,4 @@
#include <mach/soc.h> #include <mach/soc.h>
#endif #endif
#ifdef CONFIG_ARCH_OMAP2PLUS
#include "../../mach-omap2/soc.h"
#endif
#endif #endif

View File

@ -434,7 +434,8 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
.callback = set_scan_all, .callback = set_scan_all,
.ident = "Stratus/NEC ftServer", .ident = "Stratus/NEC ftServer",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ftServer"), DMI_MATCH(DMI_SYS_VENDOR, "Stratus"),
DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
}, },
}, },
{} {}

View File

@ -538,7 +538,7 @@ static ssize_t geos_gpio_store(struct device *dev, struct device_attribute *attr
} else { } else {
count = -EINVAL; count = -EINVAL;
} }
spin_lock_irq(&card->param_queue_lock); spin_unlock_irq(&card->param_queue_lock);
return count; return count;
} }

View File

@ -184,19 +184,27 @@ EXPORT_SYMBOL(drm_mm_get_block_generic);
* -ENOSPC if no suitable free area is available. The preallocated memory node * -ENOSPC if no suitable free area is available. The preallocated memory node
* must be cleared. * must be cleared.
*/ */
int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node, int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
unsigned long size, unsigned alignment) unsigned long size, unsigned alignment,
unsigned long color)
{ {
struct drm_mm_node *hole_node; struct drm_mm_node *hole_node;
hole_node = drm_mm_search_free(mm, size, alignment, false); hole_node = drm_mm_search_free_generic(mm, size, alignment,
color, 0);
if (!hole_node) if (!hole_node)
return -ENOSPC; return -ENOSPC;
drm_mm_insert_helper(hole_node, node, size, alignment, 0); drm_mm_insert_helper(hole_node, node, size, alignment, color);
return 0; return 0;
} }
EXPORT_SYMBOL(drm_mm_insert_node_generic);
int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
unsigned long size, unsigned alignment)
{
return drm_mm_insert_node_generic(mm, node, size, alignment, 0);
}
EXPORT_SYMBOL(drm_mm_insert_node); EXPORT_SYMBOL(drm_mm_insert_node);
static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
@ -275,21 +283,30 @@ EXPORT_SYMBOL(drm_mm_get_block_range_generic);
* -ENOSPC if no suitable free area is available. This is for range * -ENOSPC if no suitable free area is available. This is for range
* restricted allocations. The preallocated memory node must be cleared. * restricted allocations. The preallocated memory node must be cleared.
*/ */
int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, struct drm_mm_node *node,
unsigned long size, unsigned alignment, unsigned long color,
unsigned long start, unsigned long end)
{
struct drm_mm_node *hole_node;
hole_node = drm_mm_search_free_in_range_generic(mm,
size, alignment, color,
start, end, 0);
if (!hole_node)
return -ENOSPC;
drm_mm_insert_helper_range(hole_node, node,
size, alignment, color,
start, end);
return 0;
}
EXPORT_SYMBOL(drm_mm_insert_node_in_range_generic);
int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node, int drm_mm_insert_node_in_range(struct drm_mm *mm, struct drm_mm_node *node,
unsigned long size, unsigned alignment, unsigned long size, unsigned alignment,
unsigned long start, unsigned long end) unsigned long start, unsigned long end)
{ {
struct drm_mm_node *hole_node; return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
hole_node = drm_mm_search_free_in_range(mm, size, alignment,
start, end, false);
if (!hole_node)
return -ENOSPC;
drm_mm_insert_helper_range(hole_node, node, size, alignment, 0,
start, end);
return 0;
} }
EXPORT_SYMBOL(drm_mm_insert_node_in_range); EXPORT_SYMBOL(drm_mm_insert_node_in_range);

View File

@ -989,6 +989,9 @@ static int i915_getparam(struct drm_device *dev, void *data,
case I915_PARAM_HAS_SECURE_BATCHES: case I915_PARAM_HAS_SECURE_BATCHES:
value = capable(CAP_SYS_ADMIN); value = capable(CAP_SYS_ADMIN);
break; break;
case I915_PARAM_HAS_PINNED_BATCHES:
value = 1;
break;
default: default:
DRM_DEBUG_DRIVER("Unknown parameter %d\n", DRM_DEBUG_DRIVER("Unknown parameter %d\n",
param->param); param->param);

View File

@ -780,6 +780,7 @@ typedef struct drm_i915_private {
struct i915_hw_ppgtt *aliasing_ppgtt; struct i915_hw_ppgtt *aliasing_ppgtt;
struct shrinker inactive_shrinker; struct shrinker inactive_shrinker;
bool shrinker_no_lock_stealing;
/** /**
* List of objects currently involved in rendering. * List of objects currently involved in rendering.
@ -1100,6 +1101,7 @@ struct drm_i915_gem_object {
*/ */
atomic_t pending_flip; atomic_t pending_flip;
}; };
#define to_gem_object(obj) (&((struct drm_i915_gem_object *)(obj))->base)
#define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base) #define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
@ -1166,6 +1168,9 @@ struct drm_i915_file_private {
#define IS_IVB_GT1(dev) ((dev)->pci_device == 0x0156 || \ #define IS_IVB_GT1(dev) ((dev)->pci_device == 0x0156 || \
(dev)->pci_device == 0x0152 || \ (dev)->pci_device == 0x0152 || \
(dev)->pci_device == 0x015a) (dev)->pci_device == 0x015a)
#define IS_SNB_GT1(dev) ((dev)->pci_device == 0x0102 || \
(dev)->pci_device == 0x0106 || \
(dev)->pci_device == 0x010A)
#define IS_VALLEYVIEW(dev) (INTEL_INFO(dev)->is_valleyview) #define IS_VALLEYVIEW(dev) (INTEL_INFO(dev)->is_valleyview)
#define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell) #define IS_HASWELL(dev) (INTEL_INFO(dev)->is_haswell)
#define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile) #define IS_MOBILE(dev) (INTEL_INFO(dev)->is_mobile)
@ -1196,6 +1201,9 @@ struct drm_i915_file_private {
#define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay) #define HAS_OVERLAY(dev) (INTEL_INFO(dev)->has_overlay)
#define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical) #define OVERLAY_NEEDS_PHYSICAL(dev) (INTEL_INFO(dev)->overlay_needs_physical)
/* Early gen2 have a totally busted CS tlb and require pinned batches. */
#define HAS_BROKEN_CS_TLB(dev) (IS_I830(dev) || IS_845G(dev))
/* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte /* With the 945 and later, Y tiling got adjusted so that it was 32 128-byte
* rows, which changed the alignment requirements and fence programming. * rows, which changed the alignment requirements and fence programming.
*/ */

View File

@ -1517,9 +1517,11 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
if (obj->base.map_list.map) if (obj->base.map_list.map)
return 0; return 0;
dev_priv->mm.shrinker_no_lock_stealing = true;
ret = drm_gem_create_mmap_offset(&obj->base); ret = drm_gem_create_mmap_offset(&obj->base);
if (ret != -ENOSPC) if (ret != -ENOSPC)
return ret; goto out;
/* Badly fragmented mmap space? The only way we can recover /* Badly fragmented mmap space? The only way we can recover
* space is by destroying unwanted objects. We can't randomly release * space is by destroying unwanted objects. We can't randomly release
@ -1531,10 +1533,14 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
i915_gem_purge(dev_priv, obj->base.size >> PAGE_SHIFT); i915_gem_purge(dev_priv, obj->base.size >> PAGE_SHIFT);
ret = drm_gem_create_mmap_offset(&obj->base); ret = drm_gem_create_mmap_offset(&obj->base);
if (ret != -ENOSPC) if (ret != -ENOSPC)
return ret; goto out;
i915_gem_shrink_all(dev_priv); i915_gem_shrink_all(dev_priv);
return drm_gem_create_mmap_offset(&obj->base); ret = drm_gem_create_mmap_offset(&obj->base);
out:
dev_priv->mm.shrinker_no_lock_stealing = false;
return ret;
} }
static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj) static void i915_gem_object_free_mmap_offset(struct drm_i915_gem_object *obj)
@ -2890,7 +2896,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
{ {
struct drm_device *dev = obj->base.dev; struct drm_device *dev = obj->base.dev;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
struct drm_mm_node *free_space; struct drm_mm_node *node;
u32 size, fence_size, fence_alignment, unfenced_alignment; u32 size, fence_size, fence_alignment, unfenced_alignment;
bool mappable, fenceable; bool mappable, fenceable;
int ret; int ret;
@ -2936,66 +2942,54 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
i915_gem_object_pin_pages(obj); i915_gem_object_pin_pages(obj);
node = kzalloc(sizeof(*node), GFP_KERNEL);
if (node == NULL) {
i915_gem_object_unpin_pages(obj);
return -ENOMEM;
}
search_free: search_free:
if (map_and_fenceable) if (map_and_fenceable)
free_space = drm_mm_search_free_in_range_color(&dev_priv->mm.gtt_space, ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
size, alignment, obj->cache_level, size, alignment, obj->cache_level,
0, dev_priv->mm.gtt_mappable_end, 0, dev_priv->mm.gtt_mappable_end);
false);
else else
free_space = drm_mm_search_free_color(&dev_priv->mm.gtt_space, ret = drm_mm_insert_node_generic(&dev_priv->mm.gtt_space, node,
size, alignment, obj->cache_level, size, alignment, obj->cache_level);
false); if (ret) {
if (free_space != NULL) {
if (map_and_fenceable)
free_space =
drm_mm_get_block_range_generic(free_space,
size, alignment, obj->cache_level,
0, dev_priv->mm.gtt_mappable_end,
false);
else
free_space =
drm_mm_get_block_generic(free_space,
size, alignment, obj->cache_level,
false);
}
if (free_space == NULL) {
ret = i915_gem_evict_something(dev, size, alignment, ret = i915_gem_evict_something(dev, size, alignment,
obj->cache_level, obj->cache_level,
map_and_fenceable, map_and_fenceable,
nonblocking); nonblocking);
if (ret) { if (ret == 0)
i915_gem_object_unpin_pages(obj); goto search_free;
return ret;
}
goto search_free;
}
if (WARN_ON(!i915_gem_valid_gtt_space(dev,
free_space,
obj->cache_level))) {
i915_gem_object_unpin_pages(obj); i915_gem_object_unpin_pages(obj);
drm_mm_put_block(free_space); kfree(node);
return ret;
}
if (WARN_ON(!i915_gem_valid_gtt_space(dev, node, obj->cache_level))) {
i915_gem_object_unpin_pages(obj);
drm_mm_put_block(node);
return -EINVAL; return -EINVAL;
} }
ret = i915_gem_gtt_prepare_object(obj); ret = i915_gem_gtt_prepare_object(obj);
if (ret) { if (ret) {
i915_gem_object_unpin_pages(obj); i915_gem_object_unpin_pages(obj);
drm_mm_put_block(free_space); drm_mm_put_block(node);
return ret; return ret;
} }
list_move_tail(&obj->gtt_list, &dev_priv->mm.bound_list); list_move_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list); list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
obj->gtt_space = free_space; obj->gtt_space = node;
obj->gtt_offset = free_space->start; obj->gtt_offset = node->start;
fenceable = fenceable =
free_space->size == fence_size && node->size == fence_size &&
(free_space->start & (fence_alignment - 1)) == 0; (node->start & (fence_alignment - 1)) == 0;
mappable = mappable =
obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end; obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
@ -4392,6 +4386,9 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc)
if (!mutex_is_locked_by(&dev->struct_mutex, current)) if (!mutex_is_locked_by(&dev->struct_mutex, current))
return 0; return 0;
if (dev_priv->mm.shrinker_no_lock_stealing)
return 0;
unlock = false; unlock = false;
} }

View File

@ -226,7 +226,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,
{ {
struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); struct drm_i915_gem_object *obj = to_intel_bo(gem_obj);
return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, 0600); return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, flags);
} }
static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)

View File

@ -808,6 +808,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
flags |= I915_DISPATCH_SECURE; flags |= I915_DISPATCH_SECURE;
} }
if (args->flags & I915_EXEC_IS_PINNED)
flags |= I915_DISPATCH_PINNED;
switch (args->flags & I915_EXEC_RING_MASK) { switch (args->flags & I915_EXEC_RING_MASK) {
case I915_EXEC_DEFAULT: case I915_EXEC_DEFAULT:

View File

@ -1087,6 +1087,18 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
if (!ring->get_seqno) if (!ring->get_seqno)
return NULL; return NULL;
if (HAS_BROKEN_CS_TLB(dev_priv->dev)) {
u32 acthd = I915_READ(ACTHD);
if (WARN_ON(ring->id != RCS))
return NULL;
obj = ring->private;
if (acthd >= obj->gtt_offset &&
acthd < obj->gtt_offset + obj->base.size)
return i915_error_object_create(dev_priv, obj);
}
seqno = ring->get_seqno(ring, false); seqno = ring->get_seqno(ring, false);
list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) { list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
if (obj->ring != ring) if (obj->ring != ring)

View File

@ -517,6 +517,7 @@
* the enables for writing to the corresponding low bit. * the enables for writing to the corresponding low bit.
*/ */
#define _3D_CHICKEN 0x02084 #define _3D_CHICKEN 0x02084
#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB (1 << 10)
#define _3D_CHICKEN2 0x0208c #define _3D_CHICKEN2 0x0208c
/* Disables pipelining of read flushes past the SF-WIZ interface. /* Disables pipelining of read flushes past the SF-WIZ interface.
* Required on all Ironlake steppings according to the B-Spec, but the * Required on all Ironlake steppings according to the B-Spec, but the
@ -532,7 +533,8 @@
# define MI_FLUSH_ENABLE (1 << 12) # define MI_FLUSH_ENABLE (1 << 12)
#define GEN6_GT_MODE 0x20d0 #define GEN6_GT_MODE 0x20d0
#define GEN6_GT_MODE_HI (1 << 9) #define GEN6_GT_MODE_HI (1 << 9)
#define GEN6_TD_FOUR_ROW_DISPATCH_DISABLE (1 << 5)
#define GFX_MODE 0x02520 #define GFX_MODE 0x02520
#define GFX_MODE_GEN7 0x0229c #define GFX_MODE_GEN7 0x0229c

View File

@ -8144,10 +8144,6 @@ intel_modeset_stage_output_state(struct drm_device *dev,
DRM_DEBUG_KMS("encoder changed, full mode switch\n"); DRM_DEBUG_KMS("encoder changed, full mode switch\n");
config->mode_changed = true; config->mode_changed = true;
} }
/* Disable all disconnected encoders. */
if (connector->base.status == connector_status_disconnected)
connector->new_encoder = NULL;
} }
/* connector->new_encoder is now updated for all connectors. */ /* connector->new_encoder is now updated for all connectors. */
@ -9167,6 +9163,23 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
* the crtc fixup. */ * the crtc fixup. */
} }
static void i915_redisable_vga(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
u32 vga_reg;
if (HAS_PCH_SPLIT(dev))
vga_reg = CPU_VGACNTRL;
else
vga_reg = VGACNTRL;
if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
I915_WRITE(vga_reg, VGA_DISP_DISABLE);
POSTING_READ(vga_reg);
}
}
/* Scan out the current hw modeset state, sanitizes it and maps it into the drm /* Scan out the current hw modeset state, sanitizes it and maps it into the drm
* and i915 state tracking structures. */ * and i915 state tracking structures. */
void intel_modeset_setup_hw_state(struct drm_device *dev, void intel_modeset_setup_hw_state(struct drm_device *dev,
@ -9275,6 +9288,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
intel_set_mode(&crtc->base, &crtc->base.mode, intel_set_mode(&crtc->base, &crtc->base.mode,
crtc->base.x, crtc->base.y, crtc->base.fb); crtc->base.x, crtc->base.y, crtc->base.fb);
} }
i915_redisable_vga(dev);
} else { } else {
intel_modeset_update_staged_output_state(dev); intel_modeset_update_staged_output_state(dev);
} }

View File

@ -405,7 +405,7 @@ void intel_update_fbc(struct drm_device *dev)
* - going to an unsupported config (interlace, pixel multiply, etc.) * - going to an unsupported config (interlace, pixel multiply, etc.)
*/ */
list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) {
if (tmp_crtc->enabled && if (to_intel_crtc(tmp_crtc)->active &&
!to_intel_crtc(tmp_crtc)->primary_disabled && !to_intel_crtc(tmp_crtc)->primary_disabled &&
tmp_crtc->fb) { tmp_crtc->fb) {
if (crtc) { if (crtc) {
@ -992,7 +992,7 @@ static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)
struct drm_crtc *crtc, *enabled = NULL; struct drm_crtc *crtc, *enabled = NULL;
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
if (crtc->enabled && crtc->fb) { if (to_intel_crtc(crtc)->active && crtc->fb) {
if (enabled) if (enabled)
return NULL; return NULL;
enabled = crtc; enabled = crtc;
@ -1086,7 +1086,7 @@ static bool g4x_compute_wm0(struct drm_device *dev,
int entries, tlb_miss; int entries, tlb_miss;
crtc = intel_get_crtc_for_plane(dev, plane); crtc = intel_get_crtc_for_plane(dev, plane);
if (crtc->fb == NULL || !crtc->enabled) { if (crtc->fb == NULL || !to_intel_crtc(crtc)->active) {
*cursor_wm = cursor->guard_size; *cursor_wm = cursor->guard_size;
*plane_wm = display->guard_size; *plane_wm = display->guard_size;
return false; return false;
@ -1215,7 +1215,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev,
int entries; int entries;
crtc = intel_get_crtc_for_plane(dev, plane); crtc = intel_get_crtc_for_plane(dev, plane);
if (crtc->fb == NULL || !crtc->enabled) if (crtc->fb == NULL || !to_intel_crtc(crtc)->active)
return false; return false;
clock = crtc->mode.clock; /* VESA DOT Clock */ clock = crtc->mode.clock; /* VESA DOT Clock */
@ -1286,6 +1286,7 @@ static void valleyview_update_wm(struct drm_device *dev)
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
int planea_wm, planeb_wm, cursora_wm, cursorb_wm; int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
int plane_sr, cursor_sr; int plane_sr, cursor_sr;
int ignore_plane_sr, ignore_cursor_sr;
unsigned int enabled = 0; unsigned int enabled = 0;
vlv_update_drain_latency(dev); vlv_update_drain_latency(dev);
@ -1302,17 +1303,23 @@ static void valleyview_update_wm(struct drm_device *dev)
&planeb_wm, &cursorb_wm)) &planeb_wm, &cursorb_wm))
enabled |= 2; enabled |= 2;
plane_sr = cursor_sr = 0;
if (single_plane_enabled(enabled) && if (single_plane_enabled(enabled) &&
g4x_compute_srwm(dev, ffs(enabled) - 1, g4x_compute_srwm(dev, ffs(enabled) - 1,
sr_latency_ns, sr_latency_ns,
&valleyview_wm_info, &valleyview_wm_info,
&valleyview_cursor_wm_info, &valleyview_cursor_wm_info,
&plane_sr, &cursor_sr)) &plane_sr, &ignore_cursor_sr) &&
g4x_compute_srwm(dev, ffs(enabled) - 1,
2*sr_latency_ns,
&valleyview_wm_info,
&valleyview_cursor_wm_info,
&ignore_plane_sr, &cursor_sr)) {
I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN); I915_WRITE(FW_BLC_SELF_VLV, FW_CSPWRDWNEN);
else } else {
I915_WRITE(FW_BLC_SELF_VLV, I915_WRITE(FW_BLC_SELF_VLV,
I915_READ(FW_BLC_SELF_VLV) & ~FW_CSPWRDWNEN); I915_READ(FW_BLC_SELF_VLV) & ~FW_CSPWRDWNEN);
plane_sr = cursor_sr = 0;
}
DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n", DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
planea_wm, cursora_wm, planea_wm, cursora_wm,
@ -1352,17 +1359,18 @@ static void g4x_update_wm(struct drm_device *dev)
&planeb_wm, &cursorb_wm)) &planeb_wm, &cursorb_wm))
enabled |= 2; enabled |= 2;
plane_sr = cursor_sr = 0;
if (single_plane_enabled(enabled) && if (single_plane_enabled(enabled) &&
g4x_compute_srwm(dev, ffs(enabled) - 1, g4x_compute_srwm(dev, ffs(enabled) - 1,
sr_latency_ns, sr_latency_ns,
&g4x_wm_info, &g4x_wm_info,
&g4x_cursor_wm_info, &g4x_cursor_wm_info,
&plane_sr, &cursor_sr)) &plane_sr, &cursor_sr)) {
I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
else } else {
I915_WRITE(FW_BLC_SELF, I915_WRITE(FW_BLC_SELF,
I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN); I915_READ(FW_BLC_SELF) & ~FW_BLC_SELF_EN);
plane_sr = cursor_sr = 0;
}
DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n", DRM_DEBUG_KMS("Setting FIFO watermarks - A: plane=%d, cursor=%d, B: plane=%d, cursor=%d, SR: plane=%d, cursor=%d\n",
planea_wm, cursora_wm, planea_wm, cursora_wm,
@ -1468,7 +1476,7 @@ static void i9xx_update_wm(struct drm_device *dev)
fifo_size = dev_priv->display.get_fifo_size(dev, 0); fifo_size = dev_priv->display.get_fifo_size(dev, 0);
crtc = intel_get_crtc_for_plane(dev, 0); crtc = intel_get_crtc_for_plane(dev, 0);
if (crtc->enabled && crtc->fb) { if (to_intel_crtc(crtc)->active && crtc->fb) {
int cpp = crtc->fb->bits_per_pixel / 8; int cpp = crtc->fb->bits_per_pixel / 8;
if (IS_GEN2(dev)) if (IS_GEN2(dev))
cpp = 4; cpp = 4;
@ -1482,7 +1490,7 @@ static void i9xx_update_wm(struct drm_device *dev)
fifo_size = dev_priv->display.get_fifo_size(dev, 1); fifo_size = dev_priv->display.get_fifo_size(dev, 1);
crtc = intel_get_crtc_for_plane(dev, 1); crtc = intel_get_crtc_for_plane(dev, 1);
if (crtc->enabled && crtc->fb) { if (to_intel_crtc(crtc)->active && crtc->fb) {
int cpp = crtc->fb->bits_per_pixel / 8; int cpp = crtc->fb->bits_per_pixel / 8;
if (IS_GEN2(dev)) if (IS_GEN2(dev))
cpp = 4; cpp = 4;
@ -1811,21 +1819,6 @@ static void sandybridge_update_wm(struct drm_device *dev)
enabled |= 2; enabled |= 2;
} }
if ((dev_priv->num_pipe == 3) &&
g4x_compute_wm0(dev, 2,
&sandybridge_display_wm_info, latency,
&sandybridge_cursor_wm_info, latency,
&plane_wm, &cursor_wm)) {
val = I915_READ(WM0_PIPEC_IVB);
val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
I915_WRITE(WM0_PIPEC_IVB, val |
((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
DRM_DEBUG_KMS("FIFO watermarks For pipe C -"
" plane %d, cursor: %d\n",
plane_wm, cursor_wm);
enabled |= 3;
}
/* /*
* Calculate and update the self-refresh watermark only when one * Calculate and update the self-refresh watermark only when one
* display plane is used. * display plane is used.
@ -1891,6 +1884,128 @@ static void sandybridge_update_wm(struct drm_device *dev)
cursor_wm); cursor_wm);
} }
static void ivybridge_update_wm(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
int latency = SNB_READ_WM0_LATENCY() * 100; /* In unit 0.1us */
u32 val;
int fbc_wm, plane_wm, cursor_wm;
int ignore_fbc_wm, ignore_plane_wm, ignore_cursor_wm;
unsigned int enabled;
enabled = 0;
if (g4x_compute_wm0(dev, 0,
&sandybridge_display_wm_info, latency,
&sandybridge_cursor_wm_info, latency,
&plane_wm, &cursor_wm)) {
val = I915_READ(WM0_PIPEA_ILK);
val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
I915_WRITE(WM0_PIPEA_ILK, val |
((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
" plane %d, " "cursor: %d\n",
plane_wm, cursor_wm);
enabled |= 1;
}
if (g4x_compute_wm0(dev, 1,
&sandybridge_display_wm_info, latency,
&sandybridge_cursor_wm_info, latency,
&plane_wm, &cursor_wm)) {
val = I915_READ(WM0_PIPEB_ILK);
val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
I915_WRITE(WM0_PIPEB_ILK, val |
((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
" plane %d, cursor: %d\n",
plane_wm, cursor_wm);
enabled |= 2;
}
if (g4x_compute_wm0(dev, 2,
&sandybridge_display_wm_info, latency,
&sandybridge_cursor_wm_info, latency,
&plane_wm, &cursor_wm)) {
val = I915_READ(WM0_PIPEC_IVB);
val &= ~(WM0_PIPE_PLANE_MASK | WM0_PIPE_CURSOR_MASK);
I915_WRITE(WM0_PIPEC_IVB, val |
((plane_wm << WM0_PIPE_PLANE_SHIFT) | cursor_wm));
DRM_DEBUG_KMS("FIFO watermarks For pipe C -"
" plane %d, cursor: %d\n",
plane_wm, cursor_wm);
enabled |= 3;
}
/*
* Calculate and update the self-refresh watermark only when one
* display plane is used.
*
* SNB support 3 levels of watermark.
*
* WM1/WM2/WM2 watermarks have to be enabled in the ascending order,
* and disabled in the descending order
*
*/
I915_WRITE(WM3_LP_ILK, 0);
I915_WRITE(WM2_LP_ILK, 0);
I915_WRITE(WM1_LP_ILK, 0);
if (!single_plane_enabled(enabled) ||
dev_priv->sprite_scaling_enabled)
return;
enabled = ffs(enabled) - 1;
/* WM1 */
if (!ironlake_compute_srwm(dev, 1, enabled,
SNB_READ_WM1_LATENCY() * 500,
&sandybridge_display_srwm_info,
&sandybridge_cursor_srwm_info,
&fbc_wm, &plane_wm, &cursor_wm))
return;
I915_WRITE(WM1_LP_ILK,
WM1_LP_SR_EN |
(SNB_READ_WM1_LATENCY() << WM1_LP_LATENCY_SHIFT) |
(fbc_wm << WM1_LP_FBC_SHIFT) |
(plane_wm << WM1_LP_SR_SHIFT) |
cursor_wm);
/* WM2 */
if (!ironlake_compute_srwm(dev, 2, enabled,
SNB_READ_WM2_LATENCY() * 500,
&sandybridge_display_srwm_info,
&sandybridge_cursor_srwm_info,
&fbc_wm, &plane_wm, &cursor_wm))
return;
I915_WRITE(WM2_LP_ILK,
WM2_LP_EN |
(SNB_READ_WM2_LATENCY() << WM1_LP_LATENCY_SHIFT) |
(fbc_wm << WM1_LP_FBC_SHIFT) |
(plane_wm << WM1_LP_SR_SHIFT) |
cursor_wm);
/* WM3, note we have to correct the cursor latency */
if (!ironlake_compute_srwm(dev, 3, enabled,
SNB_READ_WM3_LATENCY() * 500,
&sandybridge_display_srwm_info,
&sandybridge_cursor_srwm_info,
&fbc_wm, &plane_wm, &ignore_cursor_wm) ||
!ironlake_compute_srwm(dev, 3, enabled,
2 * SNB_READ_WM3_LATENCY() * 500,
&sandybridge_display_srwm_info,
&sandybridge_cursor_srwm_info,
&ignore_fbc_wm, &ignore_plane_wm, &cursor_wm))
return;
I915_WRITE(WM3_LP_ILK,
WM3_LP_EN |
(SNB_READ_WM3_LATENCY() << WM1_LP_LATENCY_SHIFT) |
(fbc_wm << WM1_LP_FBC_SHIFT) |
(plane_wm << WM1_LP_SR_SHIFT) |
cursor_wm);
}
static void static void
haswell_update_linetime_wm(struct drm_device *dev, int pipe, haswell_update_linetime_wm(struct drm_device *dev, int pipe,
struct drm_display_mode *mode) struct drm_display_mode *mode)
@ -1929,7 +2044,7 @@ sandybridge_compute_sprite_wm(struct drm_device *dev, int plane,
int entries, tlb_miss; int entries, tlb_miss;
crtc = intel_get_crtc_for_plane(dev, plane); crtc = intel_get_crtc_for_plane(dev, plane);
if (crtc->fb == NULL || !crtc->enabled) { if (crtc->fb == NULL || !to_intel_crtc(crtc)->active) {
*sprite_wm = display->guard_size; *sprite_wm = display->guard_size;
return false; return false;
} }
@ -3471,6 +3586,15 @@ static void gen6_init_clock_gating(struct drm_device *dev)
I915_READ(ILK_DISPLAY_CHICKEN2) | I915_READ(ILK_DISPLAY_CHICKEN2) |
ILK_ELPIN_409_SELECT); ILK_ELPIN_409_SELECT);
/* WaDisableHiZPlanesWhenMSAAEnabled */
I915_WRITE(_3D_CHICKEN,
_MASKED_BIT_ENABLE(_3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB));
/* WaSetupGtModeTdRowDispatch */
if (IS_SNB_GT1(dev))
I915_WRITE(GEN6_GT_MODE,
_MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE));
I915_WRITE(WM3_LP_ILK, 0); I915_WRITE(WM3_LP_ILK, 0);
I915_WRITE(WM2_LP_ILK, 0); I915_WRITE(WM2_LP_ILK, 0);
I915_WRITE(WM1_LP_ILK, 0); I915_WRITE(WM1_LP_ILK, 0);
@ -3999,7 +4123,7 @@ void intel_init_pm(struct drm_device *dev)
} else if (IS_IVYBRIDGE(dev)) { } else if (IS_IVYBRIDGE(dev)) {
/* FIXME: detect B0+ stepping and use auto training */ /* FIXME: detect B0+ stepping and use auto training */
if (SNB_READ_WM0_LATENCY()) { if (SNB_READ_WM0_LATENCY()) {
dev_priv->display.update_wm = sandybridge_update_wm; dev_priv->display.update_wm = ivybridge_update_wm;
dev_priv->display.update_sprite_wm = sandybridge_update_sprite_wm; dev_priv->display.update_sprite_wm = sandybridge_update_sprite_wm;
} else { } else {
DRM_DEBUG_KMS("Failed to read display plane latency. " DRM_DEBUG_KMS("Failed to read display plane latency. "

View File

@ -547,9 +547,14 @@ static int init_render_ring(struct intel_ring_buffer *ring)
static void render_ring_cleanup(struct intel_ring_buffer *ring) static void render_ring_cleanup(struct intel_ring_buffer *ring)
{ {
struct drm_device *dev = ring->dev;
if (!ring->private) if (!ring->private)
return; return;
if (HAS_BROKEN_CS_TLB(dev))
drm_gem_object_unreference(to_gem_object(ring->private));
cleanup_pipe_control(ring); cleanup_pipe_control(ring);
} }
@ -969,6 +974,8 @@ i965_dispatch_execbuffer(struct intel_ring_buffer *ring,
return 0; return 0;
} }
/* Just userspace ABI convention to limit the wa batch bo to a resonable size */
#define I830_BATCH_LIMIT (256*1024)
static int static int
i830_dispatch_execbuffer(struct intel_ring_buffer *ring, i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
u32 offset, u32 len, u32 offset, u32 len,
@ -976,15 +983,47 @@ i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
{ {
int ret; int ret;
ret = intel_ring_begin(ring, 4); if (flags & I915_DISPATCH_PINNED) {
if (ret) ret = intel_ring_begin(ring, 4);
return ret; if (ret)
return ret;
intel_ring_emit(ring, MI_BATCH_BUFFER); intel_ring_emit(ring, MI_BATCH_BUFFER);
intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE)); intel_ring_emit(ring, offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
intel_ring_emit(ring, offset + len - 8); intel_ring_emit(ring, offset + len - 8);
intel_ring_emit(ring, 0); intel_ring_emit(ring, MI_NOOP);
intel_ring_advance(ring); intel_ring_advance(ring);
} else {
struct drm_i915_gem_object *obj = ring->private;
u32 cs_offset = obj->gtt_offset;
if (len > I830_BATCH_LIMIT)
return -ENOSPC;
ret = intel_ring_begin(ring, 9+3);
if (ret)
return ret;
/* Blit the batch (which has now all relocs applied) to the stable batch
* scratch bo area (so that the CS never stumbles over its tlb
* invalidation bug) ... */
intel_ring_emit(ring, XY_SRC_COPY_BLT_CMD |
XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB);
intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_GXCOPY | 4096);
intel_ring_emit(ring, 0);
intel_ring_emit(ring, (DIV_ROUND_UP(len, 4096) << 16) | 1024);
intel_ring_emit(ring, cs_offset);
intel_ring_emit(ring, 0);
intel_ring_emit(ring, 4096);
intel_ring_emit(ring, offset);
intel_ring_emit(ring, MI_FLUSH);
/* ... and execute it. */
intel_ring_emit(ring, MI_BATCH_BUFFER);
intel_ring_emit(ring, cs_offset | (flags & I915_DISPATCH_SECURE ? 0 : MI_BATCH_NON_SECURE));
intel_ring_emit(ring, cs_offset + len - 8);
intel_ring_advance(ring);
}
return 0; return 0;
} }
@ -1596,6 +1635,27 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
ring->init = init_render_ring; ring->init = init_render_ring;
ring->cleanup = render_ring_cleanup; ring->cleanup = render_ring_cleanup;
/* Workaround batchbuffer to combat CS tlb bug. */
if (HAS_BROKEN_CS_TLB(dev)) {
struct drm_i915_gem_object *obj;
int ret;
obj = i915_gem_alloc_object(dev, I830_BATCH_LIMIT);
if (obj == NULL) {
DRM_ERROR("Failed to allocate batch bo\n");
return -ENOMEM;
}
ret = i915_gem_object_pin(obj, 0, true, false);
if (ret != 0) {
drm_gem_object_unreference(&obj->base);
DRM_ERROR("Failed to ping batch bo\n");
return ret;
}
ring->private = obj;
}
return intel_init_ring_buffer(dev, ring); return intel_init_ring_buffer(dev, ring);
} }

View File

@ -94,6 +94,7 @@ struct intel_ring_buffer {
u32 offset, u32 length, u32 offset, u32 length,
unsigned flags); unsigned flags);
#define I915_DISPATCH_SECURE 0x1 #define I915_DISPATCH_SECURE 0x1
#define I915_DISPATCH_PINNED 0x2
void (*cleanup)(struct intel_ring_buffer *ring); void (*cleanup)(struct intel_ring_buffer *ring);
int (*sync_to)(struct intel_ring_buffer *ring, int (*sync_to)(struct intel_ring_buffer *ring,
struct intel_ring_buffer *to, struct intel_ring_buffer *to,

View File

@ -57,6 +57,11 @@ chipsets:
.b16 #nve4_gpc_mmio_tail .b16 #nve4_gpc_mmio_tail
.b16 #nve4_tpc_mmio_head .b16 #nve4_tpc_mmio_head
.b16 #nve4_tpc_mmio_tail .b16 #nve4_tpc_mmio_tail
.b8 0xe6 0 0 0
.b16 #nve4_gpc_mmio_head
.b16 #nve4_gpc_mmio_tail
.b16 #nve4_tpc_mmio_head
.b16 #nve4_tpc_mmio_tail
.b8 0 0 0 0 .b8 0 0 0 0
// GPC mmio lists // GPC mmio lists

View File

@ -34,13 +34,16 @@ uint32_t nve0_grgpc_data[] = {
0x00000000, 0x00000000,
/* 0x0064: chipsets */ /* 0x0064: chipsets */
0x000000e4, 0x000000e4,
0x01040080, 0x0110008c,
0x014c0104, 0x01580110,
0x000000e7, 0x000000e7,
0x01040080, 0x0110008c,
0x014c0104, 0x01580110,
0x000000e6,
0x0110008c,
0x01580110,
0x00000000, 0x00000000,
/* 0x0080: nve4_gpc_mmio_head */ /* 0x008c: nve4_gpc_mmio_head */
0x00000380, 0x00000380,
0x04000400, 0x04000400,
0x0800040c, 0x0800040c,
@ -74,8 +77,8 @@ uint32_t nve0_grgpc_data[] = {
0x14003100, 0x14003100,
0x000031d0, 0x000031d0,
0x040031e0, 0x040031e0,
/* 0x0104: nve4_gpc_mmio_tail */ /* 0x0110: nve4_gpc_mmio_tail */
/* 0x0104: nve4_tpc_mmio_head */ /* 0x0110: nve4_tpc_mmio_head */
0x00000048, 0x00000048,
0x00000064, 0x00000064,
0x00000088, 0x00000088,

View File

@ -754,6 +754,16 @@ ctx_mmio_exec:
// on load it means: "a save preceeded this load" // on load it means: "a save preceeded this load"
// //
ctx_xfer: ctx_xfer:
// according to mwk, some kind of wait for idle
mov $r15 0xc00
shl b32 $r15 6
mov $r14 4
iowr I[$r15 + 0x200] $r14
ctx_xfer_idle:
iord $r14 I[$r15 + 0x000]
and $r14 0x2000
bra ne #ctx_xfer_idle
bra not $p1 #ctx_xfer_pre bra not $p1 #ctx_xfer_pre
bra $p2 #ctx_xfer_pre_load bra $p2 #ctx_xfer_pre_load
ctx_xfer_pre: ctx_xfer_pre:

View File

@ -799,79 +799,80 @@ uint32_t nvc0_grhub_code[] = {
0x01fa0613, 0x01fa0613,
0xf803f806, 0xf803f806,
/* 0x0829: ctx_xfer */ /* 0x0829: ctx_xfer */
0x0611f400, 0x00f7f100,
/* 0x082f: ctx_xfer_pre */ 0x06f4b60c,
0xf01102f4, 0xd004e7f0,
0x21f510f7, /* 0x0836: ctx_xfer_idle */
0x21f50698, 0xfecf80fe,
0x11f40631, 0x00e4f100,
/* 0x083d: ctx_xfer_pre_load */ 0xf91bf420,
0x02f7f01c, 0xf40611f4,
0x065721f5, /* 0x0846: ctx_xfer_pre */
0x066621f5, 0xf7f01102,
0x067821f5, 0x9821f510,
0x21f5f4bd, 0x3121f506,
0x21f50657, 0x1c11f406,
/* 0x0856: ctx_xfer_exec */ /* 0x0854: ctx_xfer_pre_load */
0x019806b8, 0xf502f7f0,
0x1427f116, 0xf5065721,
0x0624b604, 0xf5066621,
0xf10020d0, 0xbd067821,
0xf0a500e7, 0x5721f5f4,
0x1fb941e3, 0xb821f506,
0x8d21f402, /* 0x086d: ctx_xfer_exec */
0xf004e0b6, 0x16019806,
0x2cf001fc, 0x041427f1,
0x0124b602, 0xd00624b6,
0xf405f2fd, 0xe7f10020,
0x17f18d21, 0xe3f0a500,
0x13f04afc, 0x021fb941,
0x0c27f002, 0xb68d21f4,
0xf50012d0, 0xfcf004e0,
0xf1020721, 0x022cf001,
0xf047fc27, 0xfd0124b6,
0x20d00223, 0x21f405f2,
0x012cf000, 0xfc17f18d,
0xd00320b6, 0x0213f04a,
0xacf00012, 0xd00c27f0,
0x06a5f001, 0x21f50012,
0x9800b7f0, 0x27f10207,
0x0d98140c, 0x23f047fc,
0x00e7f015, 0x0020d002,
0x015c21f5, 0xb6012cf0,
0xf508a7f0, 0x12d00320,
0xf5010321, 0x01acf000,
0xf4020721, 0xf006a5f0,
0xa7f02201, 0x0c9800b7,
0xc921f40c, 0x150d9814,
0x0a1017f1, 0xf500e7f0,
0xf00614b6, 0xf0015c21,
0x12d00527, 0x21f508a7,
/* 0x08dd: ctx_xfer_post_save_wait */ 0x21f50103,
0x0012cf00, 0x01f40207,
0xf40522fd, 0x0ca7f022,
0x02f4fa1b, 0xf1c921f4,
/* 0x08e9: ctx_xfer_post */ 0xb60a1017,
0x02f7f032, 0x27f00614,
0x065721f5, 0x0012d005,
0x21f5f4bd, /* 0x08f4: ctx_xfer_post_save_wait */
0x21f50698, 0xfd0012cf,
0x21f50226, 0x1bf40522,
0xf4bd0666, 0x3202f4fa,
0x065721f5, /* 0x0900: ctx_xfer_post */
0x981011f4, 0xf502f7f0,
0x11fd8001, 0xbd065721,
0x070bf405, 0x9821f5f4,
0x07df21f5, 0x2621f506,
/* 0x0914: ctx_xfer_no_post_mmio */ 0x6621f502,
0x064921f5, 0xf5f4bd06,
/* 0x0918: ctx_xfer_done */ 0xf4065721,
0x000000f8, 0x01981011,
0x00000000, 0x0511fd80,
0x00000000, 0xf5070bf4,
0x00000000, /* 0x092b: ctx_xfer_no_post_mmio */
0x00000000, 0xf507df21,
0x00000000, /* 0x092f: ctx_xfer_done */
0xf8064921,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,

View File

@ -44,6 +44,9 @@ chipsets:
.b8 0xe7 0 0 0 .b8 0xe7 0 0 0
.b16 #nve4_hub_mmio_head .b16 #nve4_hub_mmio_head
.b16 #nve4_hub_mmio_tail .b16 #nve4_hub_mmio_tail
.b8 0xe6 0 0 0
.b16 #nve4_hub_mmio_head
.b16 #nve4_hub_mmio_tail
.b8 0 0 0 0 .b8 0 0 0 0
nve4_hub_mmio_head: nve4_hub_mmio_head:
@ -680,6 +683,16 @@ ctx_mmio_exec:
// on load it means: "a save preceeded this load" // on load it means: "a save preceeded this load"
// //
ctx_xfer: ctx_xfer:
// according to mwk, some kind of wait for idle
mov $r15 0xc00
shl b32 $r15 6
mov $r14 4
iowr I[$r15 + 0x200] $r14
ctx_xfer_idle:
iord $r14 I[$r15 + 0x000]
and $r14 0x2000
bra ne #ctx_xfer_idle
bra not $p1 #ctx_xfer_pre bra not $p1 #ctx_xfer_pre
bra $p2 #ctx_xfer_pre_load bra $p2 #ctx_xfer_pre_load
ctx_xfer_pre: ctx_xfer_pre:

View File

@ -30,11 +30,13 @@ uint32_t nve0_grhub_data[] = {
0x00000000, 0x00000000,
/* 0x005c: chipsets */ /* 0x005c: chipsets */
0x000000e4, 0x000000e4,
0x013c0070, 0x01440078,
0x000000e7, 0x000000e7,
0x013c0070, 0x01440078,
0x000000e6,
0x01440078,
0x00000000, 0x00000000,
/* 0x0070: nve4_hub_mmio_head */ /* 0x0078: nve4_hub_mmio_head */
0x0417e91c, 0x0417e91c,
0x04400204, 0x04400204,
0x18404010, 0x18404010,
@ -86,9 +88,7 @@ uint32_t nve0_grhub_data[] = {
0x00408840, 0x00408840,
0x08408900, 0x08408900,
0x00408980, 0x00408980,
/* 0x013c: nve4_hub_mmio_tail */ /* 0x0144: nve4_hub_mmio_tail */
0x00000000,
0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
@ -781,77 +781,78 @@ uint32_t nve0_grhub_code[] = {
0x0613f002, 0x0613f002,
0xf80601fa, 0xf80601fa,
/* 0x07fb: ctx_xfer */ /* 0x07fb: ctx_xfer */
0xf400f803, 0xf100f803,
0x02f40611, 0xb60c00f7,
/* 0x0801: ctx_xfer_pre */ 0xe7f006f4,
0x10f7f00d, 0x80fed004,
0x067221f5, /* 0x0808: ctx_xfer_idle */
/* 0x080b: ctx_xfer_pre_load */ 0xf100fecf,
0xf01c11f4, 0xf42000e4,
0x21f502f7, 0x11f4f91b,
0x21f50631, 0x0d02f406,
0x21f50640, /* 0x0818: ctx_xfer_pre */
0xf4bd0652, 0xf510f7f0,
0x063121f5, 0xf4067221,
0x069221f5, /* 0x0822: ctx_xfer_pre_load */
/* 0x0824: ctx_xfer_exec */ 0xf7f01c11,
0xf1160198, 0x3121f502,
0xb6041427, 0x4021f506,
0x20d00624, 0x5221f506,
0x00e7f100, 0xf5f4bd06,
0x41e3f0a5, 0xf5063121,
0xf4021fb9, /* 0x083b: ctx_xfer_exec */
0xe0b68d21, 0x98069221,
0x01fcf004, 0x27f11601,
0xb6022cf0, 0x24b60414,
0xf2fd0124, 0x0020d006,
0x8d21f405, 0xa500e7f1,
0x4afc17f1, 0xb941e3f0,
0xf00213f0, 0x21f4021f,
0x12d00c27, 0x04e0b68d,
0x0721f500, 0xf001fcf0,
0xfc27f102, 0x24b6022c,
0x0223f047, 0x05f2fd01,
0xf00020d0, 0xf18d21f4,
0x20b6012c, 0xf04afc17,
0x0012d003, 0x27f00213,
0xf001acf0, 0x0012d00c,
0xb7f006a5, 0x020721f5,
0x140c9800, 0x47fc27f1,
0xf0150d98, 0xd00223f0,
0x21f500e7, 0x2cf00020,
0xa7f0015c, 0x0320b601,
0x0321f508, 0xf00012d0,
0x0721f501, 0xa5f001ac,
0x2201f402, 0x00b7f006,
0xf40ca7f0, 0x98140c98,
0x17f1c921, 0xe7f0150d,
0x14b60a10, 0x5c21f500,
0x0527f006, 0x08a7f001,
/* 0x08ab: ctx_xfer_post_save_wait */ 0x010321f5,
0xcf0012d0, 0x020721f5,
0x22fd0012, 0xf02201f4,
0xfa1bf405, 0x21f40ca7,
/* 0x08b7: ctx_xfer_post */ 0x1017f1c9,
0xf02e02f4, 0x0614b60a,
0x21f502f7, 0xd00527f0,
0xf4bd0631, /* 0x08c2: ctx_xfer_post_save_wait */
0x067221f5, 0x12cf0012,
0x022621f5, 0x0522fd00,
0x064021f5, 0xf4fa1bf4,
0x21f5f4bd, /* 0x08ce: ctx_xfer_post */
0x11f40631, 0xf7f02e02,
0x80019810, 0x3121f502,
0xf40511fd, 0xf5f4bd06,
0x21f5070b, 0xf5067221,
/* 0x08e2: ctx_xfer_no_post_mmio */ 0xf5022621,
/* 0x08e2: ctx_xfer_done */ 0xbd064021,
0x00f807b1, 0x3121f5f4,
0x00000000, 0x1011f406,
0x00000000, 0xfd800198,
0x00000000, 0x0bf40511,
0x00000000, 0xb121f507,
0x00000000, /* 0x08f9: ctx_xfer_no_post_mmio */
0x00000000, /* 0x08f9: ctx_xfer_done */
0x0000f807,
0x00000000, 0x00000000,
}; };

View File

@ -516,18 +516,9 @@ nvc0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
{ {
struct nouveau_device *device = nv_device(parent); struct nouveau_device *device = nv_device(parent);
struct nvc0_graph_priv *priv; struct nvc0_graph_priv *priv;
bool enable = true;
int ret, i; int ret, i;
switch (device->chipset) { ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
case 0xd9: /* known broken without binary driver firmware */
enable = false;
break;
default:
break;
}
ret = nouveau_graph_create(parent, engine, oclass, enable, &priv);
*pobject = nv_object(priv); *pobject = nv_object(priv);
if (ret) if (ret)
return ret; return ret;

View File

@ -121,6 +121,7 @@ nvc0_graph_class(void *obj)
return 0x9297; return 0x9297;
case 0xe4: case 0xe4:
case 0xe7: case 0xe7:
case 0xe6:
return 0xa097; return 0xa097;
default: default:
return 0; return 0;

View File

@ -203,7 +203,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
struct nvc0_graph_priv *priv; struct nvc0_graph_priv *priv;
int ret, i; int ret, i;
ret = nouveau_graph_create(parent, engine, oclass, false, &priv); ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
*pobject = nv_object(priv); *pobject = nv_object(priv);
if (ret) if (ret)
return ret; return ret;
@ -252,6 +252,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
priv->magic_not_rop_nr = 1; priv->magic_not_rop_nr = 1;
break; break;
case 0xe7: case 0xe7:
case 0xe6:
priv->magic_not_rop_nr = 1; priv->magic_not_rop_nr = 1;
break; break;
default: default:

View File

@ -17,6 +17,7 @@ struct nouveau_bios {
u8 chip; u8 chip;
u8 minor; u8 minor;
u8 micro; u8 micro;
u8 patch;
} version; } version;
}; };

View File

@ -25,9 +25,11 @@ struct dcb_gpio_func {
u8 param; u8 param;
}; };
u16 dcb_gpio_table(struct nouveau_bios *); u16 dcb_gpio_table(struct nouveau_bios *, u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 dcb_gpio_entry(struct nouveau_bios *, int idx, int ent, u8 *ver); u16 dcb_gpio_entry(struct nouveau_bios *, int idx, int ent, u8 *ver, u8 *len);
int dcb_gpio_parse(struct nouveau_bios *, int idx, u8 func, u8 line, u16 dcb_gpio_parse(struct nouveau_bios *, int idx, int ent, u8 *ver, u8 *len,
struct dcb_gpio_func *); struct dcb_gpio_func *);
u16 dcb_gpio_match(struct nouveau_bios *, int idx, u8 func, u8 line,
u8 *ver, u8 *len, struct dcb_gpio_func *);
#endif #endif

View File

@ -13,6 +13,7 @@ struct nvbios_init {
u32 nested; u32 nested;
u16 repeat; u16 repeat;
u16 repend; u16 repend;
u32 ramcfg;
}; };
int nvbios_exec(struct nvbios_init *); int nvbios_exec(struct nvbios_init *);

View File

@ -11,7 +11,7 @@ struct nouveau_gpio {
struct nouveau_subdev base; struct nouveau_subdev base;
/* hardware interfaces */ /* hardware interfaces */
void (*reset)(struct nouveau_gpio *); void (*reset)(struct nouveau_gpio *, u8 func);
int (*drive)(struct nouveau_gpio *, int line, int dir, int out); int (*drive)(struct nouveau_gpio *, int line, int dir, int out);
int (*sense)(struct nouveau_gpio *, int line); int (*sense)(struct nouveau_gpio *, int line);
void (*irq_enable)(struct nouveau_gpio *, int line, bool); void (*irq_enable)(struct nouveau_gpio *, int line, bool);

View File

@ -447,6 +447,7 @@ nouveau_bios_ctor(struct nouveau_object *parent,
bios->version.chip = nv_ro08(bios, bit_i.offset + 2); bios->version.chip = nv_ro08(bios, bit_i.offset + 2);
bios->version.minor = nv_ro08(bios, bit_i.offset + 1); bios->version.minor = nv_ro08(bios, bit_i.offset + 1);
bios->version.micro = nv_ro08(bios, bit_i.offset + 0); bios->version.micro = nv_ro08(bios, bit_i.offset + 0);
bios->version.patch = nv_ro08(bios, bit_i.offset + 4);
} else } else
if (bmp_version(bios)) { if (bmp_version(bios)) {
bios->version.major = nv_ro08(bios, bios->bmp_offset + 13); bios->version.major = nv_ro08(bios, bios->bmp_offset + 13);
@ -455,9 +456,9 @@ nouveau_bios_ctor(struct nouveau_object *parent,
bios->version.micro = nv_ro08(bios, bios->bmp_offset + 10); bios->version.micro = nv_ro08(bios, bios->bmp_offset + 10);
} }
nv_info(bios, "version %02x.%02x.%02x.%02x\n", nv_info(bios, "version %02x.%02x.%02x.%02x.%02x\n",
bios->version.major, bios->version.chip, bios->version.major, bios->version.chip,
bios->version.minor, bios->version.micro); bios->version.minor, bios->version.micro, bios->version.patch);
return 0; return 0;
} }

View File

@ -27,84 +27,105 @@
#include <subdev/bios/gpio.h> #include <subdev/bios/gpio.h>
u16 u16
dcb_gpio_table(struct nouveau_bios *bios) dcb_gpio_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len)
{ {
u8 ver, hdr, cnt, len; u16 data = 0x0000;
u16 dcb = dcb_table(bios, &ver, &hdr, &cnt, &len); u16 dcb = dcb_table(bios, ver, hdr, cnt, len);
if (dcb) { if (dcb) {
if (ver >= 0x30 && hdr >= 0x0c) if (*ver >= 0x30 && *hdr >= 0x0c)
return nv_ro16(bios, dcb + 0x0a); data = nv_ro16(bios, dcb + 0x0a);
if (ver >= 0x22 && nv_ro08(bios, dcb - 1) >= 0x13) else
return nv_ro16(bios, dcb - 0x0f); if (*ver >= 0x22 && nv_ro08(bios, dcb - 1) >= 0x13)
data = nv_ro16(bios, dcb - 0x0f);
if (data) {
*ver = nv_ro08(bios, data + 0x00);
if (*ver < 0x30) {
*hdr = 3;
*cnt = nv_ro08(bios, data + 0x02);
*len = nv_ro08(bios, data + 0x01);
} else
if (*ver <= 0x41) {
*hdr = nv_ro08(bios, data + 0x01);
*cnt = nv_ro08(bios, data + 0x02);
*len = nv_ro08(bios, data + 0x03);
} else {
data = 0x0000;
}
}
} }
return data;
}
u16
dcb_gpio_entry(struct nouveau_bios *bios, int idx, int ent, u8 *ver, u8 *len)
{
u8 hdr, cnt;
u16 gpio = !idx ? dcb_gpio_table(bios, ver, &hdr, &cnt, len) : 0x0000;
if (gpio && ent < cnt)
return gpio + hdr + (ent * *len);
return 0x0000; return 0x0000;
} }
u16 u16
dcb_gpio_entry(struct nouveau_bios *bios, int idx, int ent, u8 *ver) dcb_gpio_parse(struct nouveau_bios *bios, int idx, int ent, u8 *ver, u8 *len,
{
u16 gpio = dcb_gpio_table(bios);
if (gpio) {
*ver = nv_ro08(bios, gpio);
if (*ver < 0x30 && ent < nv_ro08(bios, gpio + 2))
return gpio + 3 + (ent * nv_ro08(bios, gpio + 1));
else if (ent < nv_ro08(bios, gpio + 2))
return gpio + nv_ro08(bios, gpio + 1) +
(ent * nv_ro08(bios, gpio + 3));
}
return 0x0000;
}
int
dcb_gpio_parse(struct nouveau_bios *bios, int idx, u8 func, u8 line,
struct dcb_gpio_func *gpio) struct dcb_gpio_func *gpio)
{ {
u8 ver, hdr, cnt, len; u16 data = dcb_gpio_entry(bios, idx, ent, ver, len);
u16 entry; if (data) {
int i = -1; if (*ver < 0x40) {
u16 info = nv_ro16(bios, data);
while ((entry = dcb_gpio_entry(bios, idx, ++i, &ver))) {
if (ver < 0x40) {
u16 data = nv_ro16(bios, entry);
*gpio = (struct dcb_gpio_func) { *gpio = (struct dcb_gpio_func) {
.line = (data & 0x001f) >> 0, .line = (info & 0x001f) >> 0,
.func = (data & 0x07e0) >> 5, .func = (info & 0x07e0) >> 5,
.log[0] = (data & 0x1800) >> 11, .log[0] = (info & 0x1800) >> 11,
.log[1] = (data & 0x6000) >> 13, .log[1] = (info & 0x6000) >> 13,
.param = !!(data & 0x8000), .param = !!(info & 0x8000),
}; };
} else } else
if (ver < 0x41) { if (*ver < 0x41) {
u32 data = nv_ro32(bios, entry); u32 info = nv_ro32(bios, data);
*gpio = (struct dcb_gpio_func) { *gpio = (struct dcb_gpio_func) {
.line = (data & 0x0000001f) >> 0, .line = (info & 0x0000001f) >> 0,
.func = (data & 0x0000ff00) >> 8, .func = (info & 0x0000ff00) >> 8,
.log[0] = (data & 0x18000000) >> 27, .log[0] = (info & 0x18000000) >> 27,
.log[1] = (data & 0x60000000) >> 29, .log[1] = (info & 0x60000000) >> 29,
.param = !!(data & 0x80000000), .param = !!(info & 0x80000000),
}; };
} else { } else {
u32 data = nv_ro32(bios, entry + 0); u32 info = nv_ro32(bios, data + 0);
u8 data1 = nv_ro32(bios, entry + 4); u8 info1 = nv_ro32(bios, data + 4);
*gpio = (struct dcb_gpio_func) { *gpio = (struct dcb_gpio_func) {
.line = (data & 0x0000003f) >> 0, .line = (info & 0x0000003f) >> 0,
.func = (data & 0x0000ff00) >> 8, .func = (info & 0x0000ff00) >> 8,
.log[0] = (data1 & 0x30) >> 4, .log[0] = (info1 & 0x30) >> 4,
.log[1] = (data1 & 0xc0) >> 6, .log[1] = (info1 & 0xc0) >> 6,
.param = !!(data & 0x80000000), .param = !!(info & 0x80000000),
}; };
} }
}
return data;
}
u16
dcb_gpio_match(struct nouveau_bios *bios, int idx, u8 func, u8 line,
u8 *ver, u8 *len, struct dcb_gpio_func *gpio)
{
u8 hdr, cnt, i = 0;
u16 data;
while ((data = dcb_gpio_parse(bios, idx, i++, ver, len, gpio))) {
if ((line == 0xff || line == gpio->line) && if ((line == 0xff || line == gpio->line) &&
(func == 0xff || func == gpio->func)) (func == 0xff || func == gpio->func))
return 0; return data;
} }
/* DCB 2.2, fixed TVDAC GPIO data */ /* DCB 2.2, fixed TVDAC GPIO data */
if ((entry = dcb_table(bios, &ver, &hdr, &cnt, &len))) { if ((data = dcb_table(bios, ver, &hdr, &cnt, len))) {
if (ver >= 0x22 && ver < 0x30 && func == DCB_GPIO_TVDAC0) { if (*ver >= 0x22 && *ver < 0x30 && func == DCB_GPIO_TVDAC0) {
u8 conf = nv_ro08(bios, entry - 5); u8 conf = nv_ro08(bios, data - 5);
u8 addr = nv_ro08(bios, entry - 4); u8 addr = nv_ro08(bios, data - 4);
if (conf & 0x01) { if (conf & 0x01) {
*gpio = (struct dcb_gpio_func) { *gpio = (struct dcb_gpio_func) {
.func = DCB_GPIO_TVDAC0, .func = DCB_GPIO_TVDAC0,
@ -112,10 +133,11 @@ dcb_gpio_parse(struct nouveau_bios *bios, int idx, u8 func, u8 line,
.log[0] = !!(conf & 0x02), .log[0] = !!(conf & 0x02),
.log[1] = !(conf & 0x02), .log[1] = !(conf & 0x02),
}; };
return 0; *ver = 0x00;
return data;
} }
} }
} }
return -EINVAL; return 0x0000;
} }

View File

@ -2,11 +2,12 @@
#include <core/device.h> #include <core/device.h>
#include <subdev/bios.h> #include <subdev/bios.h>
#include <subdev/bios/conn.h>
#include <subdev/bios/bmp.h> #include <subdev/bios/bmp.h>
#include <subdev/bios/bit.h> #include <subdev/bios/bit.h>
#include <subdev/bios/conn.h>
#include <subdev/bios/dcb.h> #include <subdev/bios/dcb.h>
#include <subdev/bios/dp.h> #include <subdev/bios/dp.h>
#include <subdev/bios/gpio.h>
#include <subdev/bios/init.h> #include <subdev/bios/init.h>
#include <subdev/devinit.h> #include <subdev/devinit.h>
#include <subdev/clock.h> #include <subdev/clock.h>
@ -409,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init)
return 0x00; return 0x00;
} }
static u8
init_ram_restrict_strap(struct nvbios_init *init)
{
/* This appears to be the behaviour of the VBIOS parser, and *is*
* important to cache the NV_PEXTDEV_BOOT0 on later chipsets to
* avoid fucking up the memory controller (somehow) by reading it
* on every INIT_RAM_RESTRICT_ZM_GROUP opcode.
*
* Preserving the non-caching behaviour on earlier chipsets just
* in case *not* re-reading the strap causes similar breakage.
*/
if (!init->ramcfg || init->bios->version.major < 0x70)
init->ramcfg = init_rd32(init, 0x101000);
return (init->ramcfg & 0x00000003c) >> 2;
}
static u8 static u8
init_ram_restrict(struct nvbios_init *init) init_ram_restrict(struct nvbios_init *init)
{ {
u32 strap = (init_rd32(init, 0x101000) & 0x0000003c) >> 2; u8 strap = init_ram_restrict_strap(init);
u16 table = init_ram_restrict_table(init); u16 table = init_ram_restrict_table(init);
if (table) if (table)
return nv_ro08(init->bios, table + strap); return nv_ro08(init->bios, table + strap);
@ -1781,7 +1798,7 @@ init_gpio(struct nvbios_init *init)
init->offset += 1; init->offset += 1;
if (init_exec(init) && gpio && gpio->reset) if (init_exec(init) && gpio && gpio->reset)
gpio->reset(gpio); gpio->reset(gpio, DCB_GPIO_UNUSED);
} }
/** /**
@ -1995,6 +2012,47 @@ init_i2c_long_if(struct nvbios_init *init)
init_exec_set(init, false); init_exec_set(init, false);
} }
/**
* INIT_GPIO_NE - opcode 0xa9
*
*/
static void
init_gpio_ne(struct nvbios_init *init)
{
struct nouveau_bios *bios = init->bios;
struct nouveau_gpio *gpio = nouveau_gpio(bios);
struct dcb_gpio_func func;
u8 count = nv_ro08(bios, init->offset + 1);
u8 idx = 0, ver, len;
u16 data, i;
trace("GPIO_NE\t");
init->offset += 2;
for (i = init->offset; i < init->offset + count; i++)
cont("0x%02x ", nv_ro08(bios, i));
cont("\n");
while ((data = dcb_gpio_parse(bios, 0, idx++, &ver, &len, &func))) {
if (func.func != DCB_GPIO_UNUSED) {
for (i = init->offset; i < init->offset + count; i++) {
if (func.func == nv_ro08(bios, i))
break;
}
trace("\tFUNC[0x%02x]", func.func);
if (i == (init->offset + count)) {
cont(" *");
if (init_exec(init) && gpio && gpio->reset)
gpio->reset(gpio, func.func);
}
cont("\n");
}
}
init->offset += count;
}
static struct nvbios_init_opcode { static struct nvbios_init_opcode {
void (*exec)(struct nvbios_init *); void (*exec)(struct nvbios_init *);
} init_opcode[] = { } init_opcode[] = {
@ -2059,6 +2117,7 @@ static struct nvbios_init_opcode {
[0x98] = { init_auxch }, [0x98] = { init_auxch },
[0x99] = { init_zm_auxch }, [0x99] = { init_zm_auxch },
[0x9a] = { init_i2c_long_if }, [0x9a] = { init_i2c_long_if },
[0xa9] = { init_gpio_ne },
}; };
#define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0])) #define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0]))

View File

@ -109,6 +109,34 @@ nve0_identify(struct nouveau_device *device)
device->oclass[NVDEV_ENGINE_VP ] = &nve0_vp_oclass; device->oclass[NVDEV_ENGINE_VP ] = &nve0_vp_oclass;
device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass; device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
break; break;
case 0xe6:
device->cname = "GK106";
device->oclass[NVDEV_SUBDEV_VBIOS ] = &nouveau_bios_oclass;
device->oclass[NVDEV_SUBDEV_GPIO ] = &nvd0_gpio_oclass;
device->oclass[NVDEV_SUBDEV_I2C ] = &nouveau_i2c_oclass;
device->oclass[NVDEV_SUBDEV_CLOCK ] = &nvc0_clock_oclass;
device->oclass[NVDEV_SUBDEV_THERM ] = &nv50_therm_oclass;
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nv50_devinit_oclass;
device->oclass[NVDEV_SUBDEV_MC ] = &nvc0_mc_oclass;
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
device->oclass[NVDEV_SUBDEV_FB ] = &nvc0_fb_oclass;
device->oclass[NVDEV_SUBDEV_LTCG ] = &nvc0_ltcg_oclass;
device->oclass[NVDEV_SUBDEV_IBUS ] = &nve0_ibus_oclass;
device->oclass[NVDEV_SUBDEV_INSTMEM] = &nv50_instmem_oclass;
device->oclass[NVDEV_SUBDEV_VM ] = &nvc0_vmmgr_oclass;
device->oclass[NVDEV_SUBDEV_BAR ] = &nvc0_bar_oclass;
device->oclass[NVDEV_ENGINE_DMAOBJ ] = &nvd0_dmaeng_oclass;
device->oclass[NVDEV_ENGINE_FIFO ] = &nve0_fifo_oclass;
device->oclass[NVDEV_ENGINE_SW ] = &nvc0_software_oclass;
device->oclass[NVDEV_ENGINE_GR ] = &nve0_graph_oclass;
device->oclass[NVDEV_ENGINE_DISP ] = &nve0_disp_oclass;
device->oclass[NVDEV_ENGINE_COPY0 ] = &nve0_copy0_oclass;
device->oclass[NVDEV_ENGINE_COPY1 ] = &nve0_copy1_oclass;
device->oclass[NVDEV_ENGINE_BSP ] = &nve0_bsp_oclass;
device->oclass[NVDEV_ENGINE_VP ] = &nve0_vp_oclass;
device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
break;
default: default:
nv_fatal(device, "unknown Kepler chipset\n"); nv_fatal(device, "unknown Kepler chipset\n");
return -EINVAL; return -EINVAL;

View File

@ -43,10 +43,15 @@ static int
nouveau_gpio_find(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line, nouveau_gpio_find(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line,
struct dcb_gpio_func *func) struct dcb_gpio_func *func)
{ {
struct nouveau_bios *bios = nouveau_bios(gpio);
u8 ver, len;
u16 data;
if (line == 0xff && tag == 0xff) if (line == 0xff && tag == 0xff)
return -EINVAL; return -EINVAL;
if (!dcb_gpio_parse(nouveau_bios(gpio), idx, tag, line, func)) data = dcb_gpio_match(bios, idx, tag, line, &ver, &len, func);
if (data)
return 0; return 0;
/* Apple iMac G4 NV18 */ /* Apple iMac G4 NV18 */
@ -265,7 +270,7 @@ nouveau_gpio_init(struct nouveau_gpio *gpio)
int ret = nouveau_subdev_init(&gpio->base); int ret = nouveau_subdev_init(&gpio->base);
if (ret == 0 && gpio->reset) { if (ret == 0 && gpio->reset) {
if (dmi_check_system(gpio_reset_ids)) if (dmi_check_system(gpio_reset_ids))
gpio->reset(gpio); gpio->reset(gpio, DCB_GPIO_UNUSED);
} }
return ret; return ret;
} }

View File

@ -29,15 +29,15 @@ struct nv50_gpio_priv {
}; };
static void static void
nv50_gpio_reset(struct nouveau_gpio *gpio) nv50_gpio_reset(struct nouveau_gpio *gpio, u8 match)
{ {
struct nouveau_bios *bios = nouveau_bios(gpio); struct nouveau_bios *bios = nouveau_bios(gpio);
struct nv50_gpio_priv *priv = (void *)gpio; struct nv50_gpio_priv *priv = (void *)gpio;
u8 ver, len;
u16 entry; u16 entry;
u8 ver;
int ent = -1; int ent = -1;
while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver))) { while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver, &len))) {
static const u32 regs[] = { 0xe100, 0xe28c }; static const u32 regs[] = { 0xe100, 0xe28c };
u32 data = nv_ro32(bios, entry); u32 data = nv_ro32(bios, entry);
u8 line = (data & 0x0000001f); u8 line = (data & 0x0000001f);
@ -48,7 +48,8 @@ nv50_gpio_reset(struct nouveau_gpio *gpio)
u32 val = (unk1 << 16) | unk0; u32 val = (unk1 << 16) | unk0;
u32 reg = regs[line >> 4]; line &= 0x0f; u32 reg = regs[line >> 4]; line &= 0x0f;
if (func == 0xff) if ( func == DCB_GPIO_UNUSED ||
(match != DCB_GPIO_UNUSED && match != func))
continue; continue;
gpio->set(gpio, 0, func, line, defs); gpio->set(gpio, 0, func, line, defs);

View File

@ -29,15 +29,15 @@ struct nvd0_gpio_priv {
}; };
static void static void
nvd0_gpio_reset(struct nouveau_gpio *gpio) nvd0_gpio_reset(struct nouveau_gpio *gpio, u8 match)
{ {
struct nouveau_bios *bios = nouveau_bios(gpio); struct nouveau_bios *bios = nouveau_bios(gpio);
struct nvd0_gpio_priv *priv = (void *)gpio; struct nvd0_gpio_priv *priv = (void *)gpio;
u8 ver, len;
u16 entry; u16 entry;
u8 ver;
int ent = -1; int ent = -1;
while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver))) { while ((entry = dcb_gpio_entry(bios, 0, ++ent, &ver, &len))) {
u32 data = nv_ro32(bios, entry); u32 data = nv_ro32(bios, entry);
u8 line = (data & 0x0000003f); u8 line = (data & 0x0000003f);
u8 defs = !!(data & 0x00000080); u8 defs = !!(data & 0x00000080);
@ -45,7 +45,8 @@ nvd0_gpio_reset(struct nouveau_gpio *gpio)
u8 unk0 = (data & 0x00ff0000) >> 16; u8 unk0 = (data & 0x00ff0000) >> 16;
u8 unk1 = (data & 0x1f000000) >> 24; u8 unk1 = (data & 0x1f000000) >> 24;
if (func == 0xff) if ( func == DCB_GPIO_UNUSED ||
(match != DCB_GPIO_UNUSED && match != func))
continue; continue;
gpio->set(gpio, 0, func, line, defs); gpio->set(gpio, 0, func, line, defs);

View File

@ -260,7 +260,7 @@ nouveau_mxm_create_(struct nouveau_object *parent,
data = mxm_table(bios, &ver, &len); data = mxm_table(bios, &ver, &len);
if (!data || !(ver = nv_ro08(bios, data))) { if (!data || !(ver = nv_ro08(bios, data))) {
nv_info(mxm, "no VBIOS data, nothing to do\n"); nv_debug(mxm, "no VBIOS data, nothing to do\n");
return 0; return 0;
} }

View File

@ -2654,6 +2654,35 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
ib[idx+4] = upper_32_bits(offset) & 0xff; ib[idx+4] = upper_32_bits(offset) & 0xff;
} }
break; break;
case PACKET3_MEM_WRITE:
{
u64 offset;
if (pkt->count != 3) {
DRM_ERROR("bad MEM_WRITE (invalid count)\n");
return -EINVAL;
}
r = evergreen_cs_packet_next_reloc(p, &reloc);
if (r) {
DRM_ERROR("bad MEM_WRITE (missing reloc)\n");
return -EINVAL;
}
offset = radeon_get_ib_value(p, idx+0);
offset += ((u64)(radeon_get_ib_value(p, idx+1) & 0xff)) << 32UL;
if (offset & 0x7) {
DRM_ERROR("bad MEM_WRITE (address not qwords aligned)\n");
return -EINVAL;
}
if ((offset + 8) > radeon_bo_size(reloc->robj)) {
DRM_ERROR("bad MEM_WRITE bo too small: 0x%llx, 0x%lx\n",
offset + 8, radeon_bo_size(reloc->robj));
return -EINVAL;
}
offset += reloc->lobj.gpu_offset;
ib[idx+0] = offset;
ib[idx+1] = upper_32_bits(offset) & 0xff;
break;
}
case PACKET3_COPY_DW: case PACKET3_COPY_DW:
if (pkt->count != 4) { if (pkt->count != 4) {
DRM_ERROR("bad COPY_DW (invalid count)\n"); DRM_ERROR("bad COPY_DW (invalid count)\n");
@ -3287,6 +3316,7 @@ static bool evergreen_vm_reg_valid(u32 reg)
/* check config regs */ /* check config regs */
switch (reg) { switch (reg) {
case WAIT_UNTIL:
case GRBM_GFX_INDEX: case GRBM_GFX_INDEX:
case CP_STRMOUT_CNTL: case CP_STRMOUT_CNTL:
case CP_COHER_CNTL: case CP_COHER_CNTL:

View File

@ -2294,6 +2294,35 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
ib[idx+4] = upper_32_bits(offset) & 0xff; ib[idx+4] = upper_32_bits(offset) & 0xff;
} }
break; break;
case PACKET3_MEM_WRITE:
{
u64 offset;
if (pkt->count != 3) {
DRM_ERROR("bad MEM_WRITE (invalid count)\n");
return -EINVAL;
}
r = r600_cs_packet_next_reloc(p, &reloc);
if (r) {
DRM_ERROR("bad MEM_WRITE (missing reloc)\n");
return -EINVAL;
}
offset = radeon_get_ib_value(p, idx+0);
offset += ((u64)(radeon_get_ib_value(p, idx+1) & 0xff)) << 32UL;
if (offset & 0x7) {
DRM_ERROR("bad MEM_WRITE (address not qwords aligned)\n");
return -EINVAL;
}
if ((offset + 8) > radeon_bo_size(reloc->robj)) {
DRM_ERROR("bad MEM_WRITE bo too small: 0x%llx, 0x%lx\n",
offset + 8, radeon_bo_size(reloc->robj));
return -EINVAL;
}
offset += reloc->lobj.gpu_offset;
ib[idx+0] = offset;
ib[idx+1] = upper_32_bits(offset) & 0xff;
break;
}
case PACKET3_COPY_DW: case PACKET3_COPY_DW:
if (pkt->count != 4) { if (pkt->count != 4) {
DRM_ERROR("bad COPY_DW (invalid count)\n"); DRM_ERROR("bad COPY_DW (invalid count)\n");

View File

@ -225,12 +225,13 @@ struct radeon_fence {
int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
int radeon_fence_driver_init(struct radeon_device *rdev); int radeon_fence_driver_init(struct radeon_device *rdev);
void radeon_fence_driver_fini(struct radeon_device *rdev); void radeon_fence_driver_fini(struct radeon_device *rdev);
void radeon_fence_driver_force_completion(struct radeon_device *rdev);
int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring);
void radeon_fence_process(struct radeon_device *rdev, int ring); void radeon_fence_process(struct radeon_device *rdev, int ring);
bool radeon_fence_signaled(struct radeon_fence *fence); bool radeon_fence_signaled(struct radeon_fence *fence);
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring);
void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring);
int radeon_fence_wait_any(struct radeon_device *rdev, int radeon_fence_wait_any(struct radeon_device *rdev,
struct radeon_fence **fences, struct radeon_fence **fences,
bool intr); bool intr);

View File

@ -1164,6 +1164,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_connector *connector; struct drm_connector *connector;
int i, r; int i, r;
bool force_completion = false;
if (dev == NULL || dev->dev_private == NULL) { if (dev == NULL || dev->dev_private == NULL) {
return -ENODEV; return -ENODEV;
@ -1206,8 +1207,16 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
mutex_lock(&rdev->ring_lock); mutex_lock(&rdev->ring_lock);
/* wait for gpu to finish processing current batch */ /* wait for gpu to finish processing current batch */
for (i = 0; i < RADEON_NUM_RINGS; i++) for (i = 0; i < RADEON_NUM_RINGS; i++) {
radeon_fence_wait_empty_locked(rdev, i); r = radeon_fence_wait_empty_locked(rdev, i);
if (r) {
/* delay GPU reset to resume */
force_completion = true;
}
}
if (force_completion) {
radeon_fence_driver_force_completion(rdev);
}
mutex_unlock(&rdev->ring_lock); mutex_unlock(&rdev->ring_lock);
radeon_save_bios_scratch_regs(rdev); radeon_save_bios_scratch_regs(rdev);
@ -1338,7 +1347,6 @@ retry:
} }
radeon_restore_bios_scratch_regs(rdev); radeon_restore_bios_scratch_regs(rdev);
drm_helper_resume_force_mode(rdev->ddev);
if (!r) { if (!r) {
for (i = 0; i < RADEON_NUM_RINGS; ++i) { for (i = 0; i < RADEON_NUM_RINGS; ++i) {
@ -1358,11 +1366,14 @@ retry:
} }
} }
} else { } else {
radeon_fence_driver_force_completion(rdev);
for (i = 0; i < RADEON_NUM_RINGS; ++i) { for (i = 0; i < RADEON_NUM_RINGS; ++i) {
kfree(ring_data[i]); kfree(ring_data[i]);
} }
} }
drm_helper_resume_force_mode(rdev->ddev);
ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
if (r) { if (r) {
/* bad news, how to tell it to userspace ? */ /* bad news, how to tell it to userspace ? */

View File

@ -68,9 +68,10 @@
* 2.25.0 - eg+: new info request for num SE and num SH * 2.25.0 - eg+: new info request for num SE and num SH
* 2.26.0 - r600-eg: fix htile size computation * 2.26.0 - r600-eg: fix htile size computation
* 2.27.0 - r600-SI: Add CS ioctl support for async DMA * 2.27.0 - r600-SI: Add CS ioctl support for async DMA
* 2.28.0 - r600-eg: Add MEM_WRITE packet support
*/ */
#define KMS_DRIVER_MAJOR 2 #define KMS_DRIVER_MAJOR 2
#define KMS_DRIVER_MINOR 27 #define KMS_DRIVER_MINOR 28
#define KMS_DRIVER_PATCHLEVEL 0 #define KMS_DRIVER_PATCHLEVEL 0
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
int radeon_driver_unload_kms(struct drm_device *dev); int radeon_driver_unload_kms(struct drm_device *dev);

View File

@ -609,26 +609,20 @@ int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring)
* Returns 0 if the fences have passed, error for all other cases. * Returns 0 if the fences have passed, error for all other cases.
* Caller must hold ring lock. * Caller must hold ring lock.
*/ */
void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring) int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring)
{ {
uint64_t seq = rdev->fence_drv[ring].sync_seq[ring]; uint64_t seq = rdev->fence_drv[ring].sync_seq[ring];
int r;
while(1) { r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
int r; if (r) {
r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
if (r == -EDEADLK) { if (r == -EDEADLK) {
mutex_unlock(&rdev->ring_lock); return -EDEADLK;
r = radeon_gpu_reset(rdev);
mutex_lock(&rdev->ring_lock);
if (!r)
continue;
} }
if (r) { dev_err(rdev->dev, "error waiting for ring[%d] to become idle (%d)\n",
dev_err(rdev->dev, "error waiting for ring to become" ring, r);
" idle (%d)\n", r);
}
return;
} }
return 0;
} }
/** /**
@ -854,13 +848,17 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
*/ */
void radeon_fence_driver_fini(struct radeon_device *rdev) void radeon_fence_driver_fini(struct radeon_device *rdev)
{ {
int ring; int ring, r;
mutex_lock(&rdev->ring_lock); mutex_lock(&rdev->ring_lock);
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) { for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
if (!rdev->fence_drv[ring].initialized) if (!rdev->fence_drv[ring].initialized)
continue; continue;
radeon_fence_wait_empty_locked(rdev, ring); r = radeon_fence_wait_empty_locked(rdev, ring);
if (r) {
/* no need to trigger GPU reset as we are unloading */
radeon_fence_driver_force_completion(rdev);
}
wake_up_all(&rdev->fence_queue); wake_up_all(&rdev->fence_queue);
radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg); radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
rdev->fence_drv[ring].initialized = false; rdev->fence_drv[ring].initialized = false;
@ -868,6 +866,25 @@ void radeon_fence_driver_fini(struct radeon_device *rdev)
mutex_unlock(&rdev->ring_lock); mutex_unlock(&rdev->ring_lock);
} }
/**
* radeon_fence_driver_force_completion - force all fence waiter to complete
*
* @rdev: radeon device pointer
*
* In case of GPU reset failure make sure no process keep waiting on fence
* that will never complete.
*/
void radeon_fence_driver_force_completion(struct radeon_device *rdev)
{
int ring;
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
if (!rdev->fence_drv[ring].initialized)
continue;
radeon_fence_write(rdev, rdev->fence_drv[ring].sync_seq[ring], ring);
}
}
/* /*
* Fence debugfs * Fence debugfs

View File

@ -234,7 +234,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)
static void radeon_pm_set_clocks(struct radeon_device *rdev) static void radeon_pm_set_clocks(struct radeon_device *rdev)
{ {
int i; int i, r;
/* no need to take locks, etc. if nothing's going to change */ /* no need to take locks, etc. if nothing's going to change */
if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) && if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) &&
@ -248,8 +248,17 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
/* wait for the rings to drain */ /* wait for the rings to drain */
for (i = 0; i < RADEON_NUM_RINGS; i++) { for (i = 0; i < RADEON_NUM_RINGS; i++) {
struct radeon_ring *ring = &rdev->ring[i]; struct radeon_ring *ring = &rdev->ring[i];
if (ring->ready) if (!ring->ready) {
radeon_fence_wait_empty_locked(rdev, i); continue;
}
r = radeon_fence_wait_empty_locked(rdev, i);
if (r) {
/* needs a GPU reset dont reset here */
mutex_unlock(&rdev->ring_lock);
up_write(&rdev->pm.mclk_lock);
mutex_unlock(&rdev->ddev->struct_mutex);
return;
}
} }
radeon_unmap_vram_bos(rdev); radeon_unmap_vram_bos(rdev);

View File

@ -102,12 +102,12 @@ static int tegra_dc_set_timings(struct tegra_dc *dc,
((mode->hsync_end - mode->hsync_start) << 0); ((mode->hsync_end - mode->hsync_start) << 0);
tegra_dc_writel(dc, value, DC_DISP_SYNC_WIDTH); tegra_dc_writel(dc, value, DC_DISP_SYNC_WIDTH);
value = ((mode->vsync_start - mode->vdisplay) << 16) |
((mode->hsync_start - mode->hdisplay) << 0);
tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
value = ((mode->vtotal - mode->vsync_end) << 16) | value = ((mode->vtotal - mode->vsync_end) << 16) |
((mode->htotal - mode->hsync_end) << 0); ((mode->htotal - mode->hsync_end) << 0);
tegra_dc_writel(dc, value, DC_DISP_BACK_PORCH);
value = ((mode->vsync_start - mode->vdisplay) << 16) |
((mode->hsync_start - mode->hdisplay) << 0);
tegra_dc_writel(dc, value, DC_DISP_FRONT_PORCH); tegra_dc_writel(dc, value, DC_DISP_FRONT_PORCH);
value = (mode->vdisplay << 16) | mode->hdisplay; value = (mode->vdisplay << 16) | mode->hdisplay;
@ -221,8 +221,7 @@ static int tegra_crtc_mode_set(struct drm_crtc *crtc,
win.stride = crtc->fb->pitches[0]; win.stride = crtc->fb->pitches[0];
/* program window registers */ /* program window registers */
value = tegra_dc_readl(dc, DC_CMD_DISPLAY_WINDOW_HEADER); value = WINDOW_A_SELECT;
value |= WINDOW_A_SELECT;
tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER); tegra_dc_writel(dc, value, DC_CMD_DISPLAY_WINDOW_HEADER);
tegra_dc_writel(dc, win.fmt, DC_WIN_COLOR_DEPTH); tegra_dc_writel(dc, win.fmt, DC_WIN_COLOR_DEPTH);

View File

@ -204,24 +204,6 @@ extern int tegra_output_parse_dt(struct tegra_output *output);
extern int tegra_output_init(struct drm_device *drm, struct tegra_output *output); extern int tegra_output_init(struct drm_device *drm, struct tegra_output *output);
extern int tegra_output_exit(struct tegra_output *output); extern int tegra_output_exit(struct tegra_output *output);
/* from gem.c */
extern struct tegra_gem_object *tegra_gem_alloc(struct drm_device *drm,
size_t size);
extern int tegra_gem_handle_create(struct drm_device *drm,
struct drm_file *file, size_t size,
unsigned long flags, uint32_t *handle);
extern int tegra_gem_dumb_create(struct drm_file *file, struct drm_device *drm,
struct drm_mode_create_dumb *args);
extern int tegra_gem_dumb_map_offset(struct drm_file *file,
struct drm_device *drm, uint32_t handle,
uint64_t *offset);
extern int tegra_gem_dumb_destroy(struct drm_file *file,
struct drm_device *drm, uint32_t handle);
extern int tegra_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
extern int tegra_gem_init_object(struct drm_gem_object *obj);
extern void tegra_gem_free_object(struct drm_gem_object *obj);
extern struct vm_operations_struct tegra_gem_vm_ops;
/* from fb.c */ /* from fb.c */
extern int tegra_drm_fb_init(struct drm_device *drm); extern int tegra_drm_fb_init(struct drm_device *drm);
extern void tegra_drm_fb_exit(struct drm_device *drm); extern void tegra_drm_fb_exit(struct drm_device *drm);

View File

@ -149,7 +149,7 @@ struct tmds_config {
}; };
static const struct tmds_config tegra2_tmds_config[] = { static const struct tmds_config tegra2_tmds_config[] = {
{ /* 480p modes */ { /* slow pixel clock modes */
.pclk = 27000000, .pclk = 27000000,
.pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) | .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(0) | SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(0) |
@ -163,21 +163,8 @@ static const struct tmds_config tegra2_tmds_config[] = {
DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) | DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) | DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA), DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
}, { /* 720p modes */ },
.pclk = 74250000, { /* high pixel clock modes */
.pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
SOR_PLL_TX_REG_LOAD(3),
.pll1 = SOR_PLL_TMDS_TERM_ENABLE | SOR_PLL_PE_EN,
.pe_current = PE_CURRENT0(PE_CURRENT_6_0_mA) |
PE_CURRENT1(PE_CURRENT_6_0_mA) |
PE_CURRENT2(PE_CURRENT_6_0_mA) |
PE_CURRENT3(PE_CURRENT_6_0_mA),
.drive_current = DRIVE_CURRENT_LANE0(DRIVE_CURRENT_7_125_mA) |
DRIVE_CURRENT_LANE1(DRIVE_CURRENT_7_125_mA) |
DRIVE_CURRENT_LANE2(DRIVE_CURRENT_7_125_mA) |
DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
}, { /* 1080p modes */
.pclk = UINT_MAX, .pclk = UINT_MAX,
.pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) | .pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) | SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
@ -479,7 +466,7 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi,
return; return;
} }
h_front_porch = mode->htotal - mode->hsync_end; h_front_porch = mode->hsync_start - mode->hdisplay;
memset(&frame, 0, sizeof(frame)); memset(&frame, 0, sizeof(frame));
frame.r = HDMI_AVI_R_SAME; frame.r = HDMI_AVI_R_SAME;
@ -634,8 +621,8 @@ static int tegra_output_hdmi_enable(struct tegra_output *output)
pclk = mode->clock * 1000; pclk = mode->clock * 1000;
h_sync_width = mode->hsync_end - mode->hsync_start; h_sync_width = mode->hsync_end - mode->hsync_start;
h_front_porch = mode->htotal - mode->hsync_end; h_back_porch = mode->htotal - mode->hsync_end;
h_back_porch = mode->hsync_start - mode->hdisplay; h_front_porch = mode->hsync_start - mode->hdisplay;
err = regulator_enable(hdmi->vdd); err = regulator_enable(hdmi->vdd);
if (err < 0) { if (err < 0) {

View File

@ -239,6 +239,8 @@ int host1x_register_client(struct host1x *host1x, struct host1x_client *client)
} }
} }
client->host1x = host1x;
return 0; return 0;
} }

View File

@ -187,7 +187,7 @@ static struct emc6w201_data *emc6w201_update_device(struct device *dev)
* Sysfs callback functions * Sysfs callback functions
*/ */
static const u16 nominal_mv[6] = { 2500, 1500, 3300, 5000, 1500, 1500 }; static const s16 nominal_mv[6] = { 2500, 1500, 3300, 5000, 1500, 1500 };
static ssize_t show_in(struct device *dev, struct device_attribute *devattr, static ssize_t show_in(struct device *dev, struct device_attribute *devattr,
char *buf) char *buf)

View File

@ -49,6 +49,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
long temp; long temp;
short value; short value;
s32 err;
int status = kstrtol(buf, 10, &temp); int status = kstrtol(buf, 10, &temp);
if (status < 0) if (status < 0)
@ -57,8 +58,8 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
/* Write value */ /* Write value */
value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4), value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4),
(LM73_TEMP_MAX*4)) << 5; (LM73_TEMP_MAX*4)) << 5;
i2c_smbus_write_word_swapped(client, attr->index, value); err = i2c_smbus_write_word_swapped(client, attr->index, value);
return count; return (err < 0) ? err : count;
} }
static ssize_t show_temp(struct device *dev, struct device_attribute *da, static ssize_t show_temp(struct device *dev, struct device_attribute *da,
@ -66,11 +67,16 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da,
{ {
struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *client = to_i2c_client(dev); struct i2c_client *client = to_i2c_client(dev);
int temp;
s32 err = i2c_smbus_read_word_swapped(client, attr->index);
if (err < 0)
return err;
/* use integer division instead of equivalent right shift to /* use integer division instead of equivalent right shift to
guarantee arithmetic shift and preserve the sign */ guarantee arithmetic shift and preserve the sign */
int temp = ((s16) (i2c_smbus_read_word_swapped(client, temp = (((s16) err) * 250) / 32;
attr->index))*250) / 32; return scnprintf(buf, PAGE_SIZE, "%d\n", temp);
return sprintf(buf, "%d\n", temp);
} }

View File

@ -139,7 +139,7 @@ static unsigned short ali1535_offset;
Note the differences between kernels with the old PCI BIOS interface and Note the differences between kernels with the old PCI BIOS interface and
newer kernels with the real PCI interface. In compat.h some things are newer kernels with the real PCI interface. In compat.h some things are
defined to make the transition easier. */ defined to make the transition easier. */
static int __devinit ali1535_setup(struct pci_dev *dev) static int ali1535_setup(struct pci_dev *dev)
{ {
int retval; int retval;
unsigned char temp; unsigned char temp;
@ -502,7 +502,7 @@ static DEFINE_PCI_DEVICE_TABLE(ali1535_ids) = {
MODULE_DEVICE_TABLE(pci, ali1535_ids); MODULE_DEVICE_TABLE(pci, ali1535_ids);
static int __devinit ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id) static int ali1535_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
if (ali1535_setup(dev)) { if (ali1535_setup(dev)) {
dev_warn(&dev->dev, dev_warn(&dev->dev,
@ -518,7 +518,7 @@ static int __devinit ali1535_probe(struct pci_dev *dev, const struct pci_device_
return i2c_add_adapter(&ali1535_adapter); return i2c_add_adapter(&ali1535_adapter);
} }
static void __devexit ali1535_remove(struct pci_dev *dev) static void ali1535_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&ali1535_adapter); i2c_del_adapter(&ali1535_adapter);
release_region(ali1535_smba, ALI1535_SMB_IOSIZE); release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
@ -528,7 +528,7 @@ static struct pci_driver ali1535_driver = {
.name = "ali1535_smbus", .name = "ali1535_smbus",
.id_table = ali1535_ids, .id_table = ali1535_ids,
.probe = ali1535_probe, .probe = ali1535_probe,
.remove = __devexit_p(ali1535_remove), .remove = ali1535_remove,
}; };
module_pci_driver(ali1535_driver); module_pci_driver(ali1535_driver);

View File

@ -326,7 +326,7 @@ static u32 ali1563_func(struct i2c_adapter * a)
} }
static int __devinit ali1563_setup(struct pci_dev * dev) static int ali1563_setup(struct pci_dev *dev)
{ {
u16 ctrl; u16 ctrl;
@ -390,8 +390,8 @@ static struct i2c_adapter ali1563_adapter = {
.algo = &ali1563_algorithm, .algo = &ali1563_algorithm,
}; };
static int __devinit ali1563_probe(struct pci_dev * dev, static int ali1563_probe(struct pci_dev *dev,
const struct pci_device_id * id_table) const struct pci_device_id *id_table)
{ {
int error; int error;
@ -411,7 +411,7 @@ exit:
return error; return error;
} }
static void __devexit ali1563_remove(struct pci_dev * dev) static void ali1563_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&ali1563_adapter); i2c_del_adapter(&ali1563_adapter);
ali1563_shutdown(dev); ali1563_shutdown(dev);
@ -428,7 +428,7 @@ static struct pci_driver ali1563_pci_driver = {
.name = "ali1563_smbus", .name = "ali1563_smbus",
.id_table = ali1563_id_table, .id_table = ali1563_id_table,
.probe = ali1563_probe, .probe = ali1563_probe,
.remove = __devexit_p(ali1563_remove), .remove = ali1563_remove,
}; };
module_pci_driver(ali1563_pci_driver); module_pci_driver(ali1563_pci_driver);

View File

@ -131,7 +131,7 @@ MODULE_PARM_DESC(force_addr,
static struct pci_driver ali15x3_driver; static struct pci_driver ali15x3_driver;
static unsigned short ali15x3_smba; static unsigned short ali15x3_smba;
static int __devinit ali15x3_setup(struct pci_dev *ALI15X3_dev) static int ali15x3_setup(struct pci_dev *ALI15X3_dev)
{ {
u16 a; u16 a;
unsigned char temp; unsigned char temp;
@ -484,7 +484,7 @@ static DEFINE_PCI_DEVICE_TABLE(ali15x3_ids) = {
MODULE_DEVICE_TABLE (pci, ali15x3_ids); MODULE_DEVICE_TABLE (pci, ali15x3_ids);
static int __devinit ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id) static int ali15x3_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
if (ali15x3_setup(dev)) { if (ali15x3_setup(dev)) {
dev_err(&dev->dev, dev_err(&dev->dev,
@ -500,7 +500,7 @@ static int __devinit ali15x3_probe(struct pci_dev *dev, const struct pci_device_
return i2c_add_adapter(&ali15x3_adapter); return i2c_add_adapter(&ali15x3_adapter);
} }
static void __devexit ali15x3_remove(struct pci_dev *dev) static void ali15x3_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&ali15x3_adapter); i2c_del_adapter(&ali15x3_adapter);
release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE); release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE);
@ -510,7 +510,7 @@ static struct pci_driver ali15x3_driver = {
.name = "ali15x3_smbus", .name = "ali15x3_smbus",
.id_table = ali15x3_ids, .id_table = ali15x3_ids,
.probe = ali15x3_probe, .probe = ali15x3_probe,
.remove = __devexit_p(ali15x3_remove), .remove = ali15x3_remove,
}; };
module_pci_driver(ali15x3_driver); module_pci_driver(ali15x3_driver);

View File

@ -324,8 +324,7 @@ static DEFINE_PCI_DEVICE_TABLE(amd756_ids) = {
MODULE_DEVICE_TABLE (pci, amd756_ids); MODULE_DEVICE_TABLE (pci, amd756_ids);
static int __devinit amd756_probe(struct pci_dev *pdev, static int amd756_probe(struct pci_dev *pdev, const struct pci_device_id *id)
const struct pci_device_id *id)
{ {
int nforce = (id->driver_data == NFORCE); int nforce = (id->driver_data == NFORCE);
int error; int error;
@ -397,7 +396,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev,
return error; return error;
} }
static void __devexit amd756_remove(struct pci_dev *dev) static void amd756_remove(struct pci_dev *dev)
{ {
i2c_del_adapter(&amd756_smbus); i2c_del_adapter(&amd756_smbus);
release_region(amd756_ioport, SMB_IOSIZE); release_region(amd756_ioport, SMB_IOSIZE);
@ -407,7 +406,7 @@ static struct pci_driver amd756_driver = {
.name = "amd756_smbus", .name = "amd756_smbus",
.id_table = amd756_ids, .id_table = amd756_ids,
.probe = amd756_probe, .probe = amd756_probe,
.remove = __devexit_p(amd756_remove), .remove = amd756_remove,
}; };
module_pci_driver(amd756_driver); module_pci_driver(amd756_driver);

View File

@ -422,8 +422,7 @@ static DEFINE_PCI_DEVICE_TABLE(amd8111_ids) = {
MODULE_DEVICE_TABLE (pci, amd8111_ids); MODULE_DEVICE_TABLE (pci, amd8111_ids);
static int __devinit amd8111_probe(struct pci_dev *dev, static int amd8111_probe(struct pci_dev *dev, const struct pci_device_id *id)
const struct pci_device_id *id)
{ {
struct amd_smbus *smbus; struct amd_smbus *smbus;
int error; int error;
@ -475,7 +474,7 @@ static int __devinit amd8111_probe(struct pci_dev *dev,
return error; return error;
} }
static void __devexit amd8111_remove(struct pci_dev *dev) static void amd8111_remove(struct pci_dev *dev)
{ {
struct amd_smbus *smbus = pci_get_drvdata(dev); struct amd_smbus *smbus = pci_get_drvdata(dev);
@ -488,7 +487,7 @@ static struct pci_driver amd8111_driver = {
.name = "amd8111_smbus2", .name = "amd8111_smbus2",
.id_table = amd8111_ids, .id_table = amd8111_ids,
.probe = amd8111_probe, .probe = amd8111_probe,
.remove = __devexit_p(amd8111_remove), .remove = amd8111_remove,
}; };
module_pci_driver(amd8111_driver); module_pci_driver(amd8111_driver);

View File

@ -145,7 +145,7 @@ static void at91_init_twi_bus(struct at91_twi_dev *dev)
* Calculate symmetric clock as stated in datasheet: * Calculate symmetric clock as stated in datasheet:
* twi_clk = F_MAIN / (2 * (cdiv * (1 << ckdiv) + offset)) * twi_clk = F_MAIN / (2 * (cdiv * (1 << ckdiv) + offset))
*/ */
static void __devinit at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk) static void at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk)
{ {
int ckdiv, cdiv, div; int ckdiv, cdiv, div;
struct at91_twi_pdata *pdata = dev->pdata; struct at91_twi_pdata *pdata = dev->pdata;
@ -604,7 +604,7 @@ MODULE_DEVICE_TABLE(of, atmel_twi_dt_ids);
#define atmel_twi_dt_ids NULL #define atmel_twi_dt_ids NULL
#endif #endif
static bool __devinit filter(struct dma_chan *chan, void *slave) static bool filter(struct dma_chan *chan, void *slave)
{ {
struct at_dma_slave *sl = slave; struct at_dma_slave *sl = slave;
@ -616,7 +616,7 @@ static bool __devinit filter(struct dma_chan *chan, void *slave)
} }
} }
static int __devinit at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr)
{ {
int ret = 0; int ret = 0;
struct at_dma_slave *sdata; struct at_dma_slave *sdata;
@ -688,7 +688,7 @@ error:
return ret; return ret;
} }
static struct at91_twi_pdata * __devinit at91_twi_get_driver_data( static struct at91_twi_pdata *at91_twi_get_driver_data(
struct platform_device *pdev) struct platform_device *pdev)
{ {
if (pdev->dev.of_node) { if (pdev->dev.of_node) {
@ -701,7 +701,7 @@ static struct at91_twi_pdata * __devinit at91_twi_get_driver_data(
return (struct at91_twi_pdata *) platform_get_device_id(pdev)->driver_data; return (struct at91_twi_pdata *) platform_get_device_id(pdev)->driver_data;
} }
static int __devinit at91_twi_probe(struct platform_device *pdev) static int at91_twi_probe(struct platform_device *pdev)
{ {
struct at91_twi_dev *dev; struct at91_twi_dev *dev;
struct resource *mem; struct resource *mem;
@ -779,7 +779,7 @@ static int __devinit at91_twi_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int __devexit at91_twi_remove(struct platform_device *pdev) static int at91_twi_remove(struct platform_device *pdev)
{ {
struct at91_twi_dev *dev = platform_get_drvdata(pdev); struct at91_twi_dev *dev = platform_get_drvdata(pdev);
int rc; int rc;
@ -820,7 +820,7 @@ static const struct dev_pm_ops at91_twi_pm = {
static struct platform_driver at91_twi_driver = { static struct platform_driver at91_twi_driver = {
.probe = at91_twi_probe, .probe = at91_twi_probe,
.remove = __devexit_p(at91_twi_remove), .remove = at91_twi_remove,
.id_table = at91_twi_devtypes, .id_table = at91_twi_devtypes,
.driver = { .driver = {
.name = "at91_i2c", .name = "at91_i2c",

View File

@ -313,7 +313,7 @@ static void i2c_au1550_disable(struct i2c_au1550_data *priv)
* Prior to calling us, the 50MHz clock frequency and routing * Prior to calling us, the 50MHz clock frequency and routing
* must have been set up for the PSC indicated by the adapter. * must have been set up for the PSC indicated by the adapter.
*/ */
static int __devinit static int
i2c_au1550_probe(struct platform_device *pdev) i2c_au1550_probe(struct platform_device *pdev)
{ {
struct i2c_au1550_data *priv; struct i2c_au1550_data *priv;
@ -372,7 +372,7 @@ out:
return ret; return ret;
} }
static int __devexit i2c_au1550_remove(struct platform_device *pdev) static int i2c_au1550_remove(struct platform_device *pdev)
{ {
struct i2c_au1550_data *priv = platform_get_drvdata(pdev); struct i2c_au1550_data *priv = platform_get_drvdata(pdev);
@ -423,7 +423,7 @@ static struct platform_driver au1xpsc_smbus_driver = {
.pm = AU1XPSC_SMBUS_PMOPS, .pm = AU1XPSC_SMBUS_PMOPS,
}, },
.probe = i2c_au1550_probe, .probe = i2c_au1550_probe,
.remove = __devexit_p(i2c_au1550_remove), .remove = i2c_au1550_remove,
}; };
module_platform_driver(au1xpsc_smbus_driver); module_platform_driver(au1xpsc_smbus_driver);

View File

@ -426,7 +426,7 @@ static const struct i2c_adapter cpm_ops = {
.algo = &cpm_i2c_algo, .algo = &cpm_i2c_algo,
}; };
static int __devinit cpm_i2c_setup(struct cpm_i2c *cpm) static int cpm_i2c_setup(struct cpm_i2c *cpm)
{ {
struct platform_device *ofdev = cpm->ofdev; struct platform_device *ofdev = cpm->ofdev;
const u32 *data; const u32 *data;
@ -634,7 +634,7 @@ static void cpm_i2c_shutdown(struct cpm_i2c *cpm)
cpm_muram_free(cpm->i2c_addr); cpm_muram_free(cpm->i2c_addr);
} }
static int __devinit cpm_i2c_probe(struct platform_device *ofdev) static int cpm_i2c_probe(struct platform_device *ofdev)
{ {
int result, len; int result, len;
struct cpm_i2c *cpm; struct cpm_i2c *cpm;
@ -688,7 +688,7 @@ out_free:
return result; return result;
} }
static int __devexit cpm_i2c_remove(struct platform_device *ofdev) static int cpm_i2c_remove(struct platform_device *ofdev)
{ {
struct cpm_i2c *cpm = dev_get_drvdata(&ofdev->dev); struct cpm_i2c *cpm = dev_get_drvdata(&ofdev->dev);
@ -716,7 +716,7 @@ MODULE_DEVICE_TABLE(of, cpm_i2c_match);
static struct platform_driver cpm_i2c_driver = { static struct platform_driver cpm_i2c_driver = {
.probe = cpm_i2c_probe, .probe = cpm_i2c_probe,
.remove = __devexit_p(cpm_i2c_remove), .remove = cpm_i2c_remove,
.driver = { .driver = {
.name = "fsl-i2c-cpm", .name = "fsl-i2c-cpm",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -207,7 +207,7 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
return dev->controller->clk_khz; return dev->controller->clk_khz;
} }
static int __devinit i2c_dw_pci_probe(struct pci_dev *pdev, static int i2c_dw_pci_probe(struct pci_dev *pdev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
struct dw_i2c_dev *dev; struct dw_i2c_dev *dev;
@ -328,7 +328,7 @@ exit:
return r; return r;
} }
static void __devexit i2c_dw_pci_remove(struct pci_dev *pdev) static void i2c_dw_pci_remove(struct pci_dev *pdev)
{ {
struct dw_i2c_dev *dev = pci_get_drvdata(pdev); struct dw_i2c_dev *dev = pci_get_drvdata(pdev);
@ -368,7 +368,7 @@ static struct pci_driver dw_i2c_driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.id_table = i2_designware_pci_ids, .id_table = i2_designware_pci_ids,
.probe = i2c_dw_pci_probe, .probe = i2c_dw_pci_probe,
.remove = __devexit_p(i2c_dw_pci_remove), .remove = i2c_dw_pci_remove,
.driver = { .driver = {
.pm = &i2c_dw_pm_ops, .pm = &i2c_dw_pm_ops,
}, },

View File

@ -50,7 +50,7 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
return clk_get_rate(dev->clk)/1000; return clk_get_rate(dev->clk)/1000;
} }
static int __devinit dw_i2c_probe(struct platform_device *pdev) static int dw_i2c_probe(struct platform_device *pdev)
{ {
struct dw_i2c_dev *dev; struct dw_i2c_dev *dev;
struct i2c_adapter *adap; struct i2c_adapter *adap;
@ -169,7 +169,7 @@ err_release_region:
return r; return r;
} }
static int __devexit dw_i2c_remove(struct platform_device *pdev) static int dw_i2c_remove(struct platform_device *pdev)
{ {
struct dw_i2c_dev *dev = platform_get_drvdata(pdev); struct dw_i2c_dev *dev = platform_get_drvdata(pdev);
struct resource *mem; struct resource *mem;
@ -228,7 +228,7 @@ static SIMPLE_DEV_PM_OPS(dw_i2c_dev_pm_ops, dw_i2c_suspend, dw_i2c_resume);
MODULE_ALIAS("platform:i2c_designware"); MODULE_ALIAS("platform:i2c_designware");
static struct platform_driver dw_i2c_driver = { static struct platform_driver dw_i2c_driver = {
.remove = __devexit_p(dw_i2c_remove), .remove = dw_i2c_remove,
.driver = { .driver = {
.name = "i2c_designware", .name = "i2c_designware",
.owner = THIS_MODULE, .owner = THIS_MODULE,

View File

@ -758,7 +758,7 @@ static void pch_i2c_disbl_int(struct i2c_algo_pch_data *adap)
iowrite32(BUFFER_MODE_INTR_DISBL, p + PCH_I2CBUFMSK); iowrite32(BUFFER_MODE_INTR_DISBL, p + PCH_I2CBUFMSK);
} }
static int __devinit pch_i2c_probe(struct pci_dev *pdev, static int pch_i2c_probe(struct pci_dev *pdev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
void __iomem *base_addr; void __iomem *base_addr;
@ -851,7 +851,7 @@ err_pci_enable:
return ret; return ret;
} }
static void __devexit pch_i2c_remove(struct pci_dev *pdev) static void pch_i2c_remove(struct pci_dev *pdev)
{ {
int i; int i;
struct adapter_info *adap_info = pci_get_drvdata(pdev); struct adapter_info *adap_info = pci_get_drvdata(pdev);
@ -948,7 +948,7 @@ static struct pci_driver pch_pcidriver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.id_table = pch_pcidev_id, .id_table = pch_pcidev_id,
.probe = pch_i2c_probe, .probe = pch_i2c_probe,
.remove = __devexit_p(pch_i2c_remove), .remove = pch_i2c_remove,
.suspend = pch_i2c_suspend, .suspend = pch_i2c_suspend,
.resume = pch_i2c_resume .resume = pch_i2c_resume
}; };

View File

@ -205,7 +205,7 @@ static struct i2c_adapter pcf_isa_ops = {
.name = "i2c-elektor", .name = "i2c-elektor",
}; };
static int __devinit elektor_match(struct device *dev, unsigned int id) static int elektor_match(struct device *dev, unsigned int id)
{ {
#ifdef __alpha__ #ifdef __alpha__
/* check to see we have memory mapped PCF8584 connected to the /* check to see we have memory mapped PCF8584 connected to the
@ -264,7 +264,7 @@ static int __devinit elektor_match(struct device *dev, unsigned int id)
return 1; return 1;
} }
static int __devinit elektor_probe(struct device *dev, unsigned int id) static int elektor_probe(struct device *dev, unsigned int id)
{ {
init_waitqueue_head(&pcf_wait); init_waitqueue_head(&pcf_wait);
if (pcf_isa_init()) if (pcf_isa_init())
@ -293,7 +293,7 @@ static int __devinit elektor_probe(struct device *dev, unsigned int id)
return -ENODEV; return -ENODEV;
} }
static int __devexit elektor_remove(struct device *dev, unsigned int id) static int elektor_remove(struct device *dev, unsigned int id)
{ {
i2c_del_adapter(&pcf_isa_ops); i2c_del_adapter(&pcf_isa_ops);
@ -316,7 +316,7 @@ static int __devexit elektor_remove(struct device *dev, unsigned int id)
static struct isa_driver i2c_elektor_driver = { static struct isa_driver i2c_elektor_driver = {
.match = elektor_match, .match = elektor_match,
.probe = elektor_probe, .probe = elektor_probe,
.remove = __devexit_p(elektor_remove), .remove = elektor_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "i2c-elektor", .name = "i2c-elektor",

View File

@ -85,7 +85,7 @@ static int i2c_gpio_getscl(void *data)
return gpio_get_value(pdata->scl_pin); return gpio_get_value(pdata->scl_pin);
} }
static int __devinit of_i2c_gpio_probe(struct device_node *np, static int of_i2c_gpio_probe(struct device_node *np,
struct i2c_gpio_platform_data *pdata) struct i2c_gpio_platform_data *pdata)
{ {
u32 reg; u32 reg;
@ -117,7 +117,7 @@ static int __devinit of_i2c_gpio_probe(struct device_node *np,
return 0; return 0;
} }
static int __devinit i2c_gpio_probe(struct platform_device *pdev) static int i2c_gpio_probe(struct platform_device *pdev)
{ {
struct i2c_gpio_private_data *priv; struct i2c_gpio_private_data *priv;
struct i2c_gpio_platform_data *pdata; struct i2c_gpio_platform_data *pdata;
@ -218,7 +218,7 @@ err_request_sda:
return ret; return ret;
} }
static int __devexit i2c_gpio_remove(struct platform_device *pdev) static int i2c_gpio_remove(struct platform_device *pdev)
{ {
struct i2c_gpio_private_data *priv; struct i2c_gpio_private_data *priv;
struct i2c_gpio_platform_data *pdata; struct i2c_gpio_platform_data *pdata;
@ -251,7 +251,7 @@ static struct platform_driver i2c_gpio_driver = {
.of_match_table = of_match_ptr(i2c_gpio_dt_ids), .of_match_table = of_match_ptr(i2c_gpio_dt_ids),
}, },
.probe = i2c_gpio_probe, .probe = i2c_gpio_probe,
.remove = __devexit_p(i2c_gpio_remove), .remove = i2c_gpio_remove,
}; };
static int __init i2c_gpio_init(void) static int __init i2c_gpio_init(void)

View File

@ -356,7 +356,7 @@ static const struct i2c_algorithm highlander_i2c_algo = {
.functionality = highlander_i2c_func, .functionality = highlander_i2c_func,
}; };
static int __devinit highlander_i2c_probe(struct platform_device *pdev) static int highlander_i2c_probe(struct platform_device *pdev)
{ {
struct highlander_i2c_dev *dev; struct highlander_i2c_dev *dev;
struct i2c_adapter *adap; struct i2c_adapter *adap;
@ -441,7 +441,7 @@ err:
return ret; return ret;
} }
static int __devexit highlander_i2c_remove(struct platform_device *pdev) static int highlander_i2c_remove(struct platform_device *pdev)
{ {
struct highlander_i2c_dev *dev = platform_get_drvdata(pdev); struct highlander_i2c_dev *dev = platform_get_drvdata(pdev);
@ -465,7 +465,7 @@ static struct platform_driver highlander_i2c_driver = {
}, },
.probe = highlander_i2c_probe, .probe = highlander_i2c_probe,
.remove = __devexit_p(highlander_i2c_remove), .remove = highlander_i2c_remove,
}; };
module_platform_driver(highlander_i2c_driver); module_platform_driver(highlander_i2c_driver);

View File

@ -112,7 +112,7 @@ static DEFINE_PCI_DEVICE_TABLE(hydra_ids) = {
MODULE_DEVICE_TABLE (pci, hydra_ids); MODULE_DEVICE_TABLE (pci, hydra_ids);
static int __devinit hydra_probe(struct pci_dev *dev, static int hydra_probe(struct pci_dev *dev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
unsigned long base = pci_resource_start(dev, 0); unsigned long base = pci_resource_start(dev, 0);
@ -139,7 +139,7 @@ static int __devinit hydra_probe(struct pci_dev *dev,
return 0; return 0;
} }
static void __devexit hydra_remove(struct pci_dev *dev) static void hydra_remove(struct pci_dev *dev)
{ {
pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */ pdregw(hydra_bit_data.data, 0); /* clear SCLK_OE and SDAT_OE */
i2c_del_adapter(&hydra_adap); i2c_del_adapter(&hydra_adap);
@ -153,7 +153,7 @@ static struct pci_driver hydra_driver = {
.name = "hydra_smbus", .name = "hydra_smbus",
.id_table = hydra_ids, .id_table = hydra_ids,
.probe = hydra_probe, .probe = hydra_probe,
.remove = __devexit_p(hydra_remove), .remove = hydra_remove,
}; };
module_pci_driver(hydra_driver); module_pci_driver(hydra_driver);

View File

@ -841,14 +841,14 @@ struct dmi_onboard_device_info {
const char *i2c_type; const char *i2c_type;
}; };
static struct dmi_onboard_device_info __devinitdata dmi_devices[] = { static const struct dmi_onboard_device_info dmi_devices[] = {
{ "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" }, { "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" },
{ "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" }, { "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
{ "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" }, { "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
}; };
static void __devinit dmi_check_onboard_device(u8 type, const char *name, static void dmi_check_onboard_device(u8 type, const char *name,
struct i2c_adapter *adap) struct i2c_adapter *adap)
{ {
int i; int i;
struct i2c_board_info info; struct i2c_board_info info;
@ -871,8 +871,7 @@ static void __devinit dmi_check_onboard_device(u8 type, const char *name,
/* We use our own function to check for onboard devices instead of /* We use our own function to check for onboard devices instead of
dmi_find_device() as some buggy BIOS's have the devices we are interested dmi_find_device() as some buggy BIOS's have the devices we are interested
in marked as disabled */ in marked as disabled */
static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm, static void dmi_check_onboard_devices(const struct dmi_header *dm, void *adap)
void *adap)
{ {
int i, count; int i, count;
@ -901,7 +900,7 @@ static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
} }
/* Register optional slaves */ /* Register optional slaves */
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) static void i801_probe_optional_slaves(struct i801_priv *priv)
{ {
/* Only register slaves on main SMBus channel */ /* Only register slaves on main SMBus channel */
if (priv->features & FEATURE_IDF) if (priv->features & FEATURE_IDF)
@ -921,7 +920,7 @@ static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
} }
#else #else
static void __init input_apanel_init(void) {} static void __init input_apanel_init(void) {}
static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {} static void i801_probe_optional_slaves(struct i801_priv *priv) {}
#endif /* CONFIG_X86 && CONFIG_DMI */ #endif /* CONFIG_X86 && CONFIG_DMI */
#if (defined CONFIG_I2C_MUX_GPIO || defined CONFIG_I2C_MUX_GPIO_MODULE) && \ #if (defined CONFIG_I2C_MUX_GPIO || defined CONFIG_I2C_MUX_GPIO_MODULE) && \
@ -944,7 +943,7 @@ static struct i801_mux_config i801_mux_config_asus_z8_d18 = {
.n_gpios = 2, .n_gpios = 2,
}; };
static struct dmi_system_id __devinitdata mux_dmi_table[] = { static const struct dmi_system_id mux_dmi_table[] = {
{ {
.matches = { .matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
@ -1012,7 +1011,7 @@ static struct dmi_system_id __devinitdata mux_dmi_table[] = {
}; };
/* Setup multiplexing if needed */ /* Setup multiplexing if needed */
static int __devinit i801_add_mux(struct i801_priv *priv) static int i801_add_mux(struct i801_priv *priv)
{ {
struct device *dev = &priv->adapter.dev; struct device *dev = &priv->adapter.dev;
const struct i801_mux_config *mux_config; const struct i801_mux_config *mux_config;
@ -1048,13 +1047,13 @@ static int __devinit i801_add_mux(struct i801_priv *priv)
return 0; return 0;
} }
static void __devexit i801_del_mux(struct i801_priv *priv) static void i801_del_mux(struct i801_priv *priv)
{ {
if (priv->mux_pdev) if (priv->mux_pdev)
platform_device_unregister(priv->mux_pdev); platform_device_unregister(priv->mux_pdev);
} }
static unsigned int __devinit i801_get_adapter_class(struct i801_priv *priv) static unsigned int i801_get_adapter_class(struct i801_priv *priv)
{ {
const struct dmi_system_id *id; const struct dmi_system_id *id;
const struct i801_mux_config *mux_config; const struct i801_mux_config *mux_config;
@ -1084,8 +1083,7 @@ static inline unsigned int i801_get_adapter_class(struct i801_priv *priv)
} }
#endif #endif
static int __devinit i801_probe(struct pci_dev *dev, static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
const struct pci_device_id *id)
{ {
unsigned char temp; unsigned char temp;
int err, i; int err, i;
@ -1226,7 +1224,7 @@ exit:
return err; return err;
} }
static void __devexit i801_remove(struct pci_dev *dev) static void i801_remove(struct pci_dev *dev)
{ {
struct i801_priv *priv = pci_get_drvdata(dev); struct i801_priv *priv = pci_get_drvdata(dev);
@ -1272,7 +1270,7 @@ static struct pci_driver i801_driver = {
.name = "i801_smbus", .name = "i801_smbus",
.id_table = i801_ids, .id_table = i801_ids,
.probe = i801_probe, .probe = i801_probe,
.remove = __devexit_p(i801_remove), .remove = i801_remove,
.suspend = i801_suspend, .suspend = i801_suspend,
.resume = i801_resume, .resume = i801_resume,
}; };

View File

@ -660,7 +660,7 @@ static inline u8 iic_clckdiv(unsigned int opb)
return (u8)((opb + 9) / 10 - 1); return (u8)((opb + 9) / 10 - 1);
} }
static int __devinit iic_request_irq(struct platform_device *ofdev, static int iic_request_irq(struct platform_device *ofdev,
struct ibm_iic_private *dev) struct ibm_iic_private *dev)
{ {
struct device_node *np = ofdev->dev.of_node; struct device_node *np = ofdev->dev.of_node;
@ -691,7 +691,7 @@ static int __devinit iic_request_irq(struct platform_device *ofdev,
/* /*
* Register single IIC interface * Register single IIC interface
*/ */
static int __devinit iic_probe(struct platform_device *ofdev) static int iic_probe(struct platform_device *ofdev)
{ {
struct device_node *np = ofdev->dev.of_node; struct device_node *np = ofdev->dev.of_node;
struct ibm_iic_private *dev; struct ibm_iic_private *dev;
@ -781,7 +781,7 @@ error_cleanup:
/* /*
* Cleanup initialized IIC interface * Cleanup initialized IIC interface
*/ */
static int __devexit iic_remove(struct platform_device *ofdev) static int iic_remove(struct platform_device *ofdev)
{ {
struct ibm_iic_private *dev = dev_get_drvdata(&ofdev->dev); struct ibm_iic_private *dev = dev_get_drvdata(&ofdev->dev);
@ -812,7 +812,7 @@ static struct platform_driver ibm_iic_driver = {
.of_match_table = ibm_iic_match, .of_match_table = ibm_iic_match,
}, },
.probe = iic_probe, .probe = iic_probe,
.remove = __devexit_p(iic_remove), .remove = iic_remove,
}; };
module_platform_driver(ibm_iic_driver); module_platform_driver(ibm_iic_driver);

View File

@ -947,7 +947,7 @@ static const struct dev_pm_ops intel_mid_i2c_pm_ops = {
* 5. Call intel_mid_i2c_hwinit() for hardware initialization * 5. Call intel_mid_i2c_hwinit() for hardware initialization
* 6. Register I2C adapter in i2c-core * 6. Register I2C adapter in i2c-core
*/ */
static int __devinit intel_mid_i2c_probe(struct pci_dev *dev, static int intel_mid_i2c_probe(struct pci_dev *dev,
const struct pci_device_id *id) const struct pci_device_id *id)
{ {
struct intel_mid_i2c_private *mrst; struct intel_mid_i2c_private *mrst;
@ -1079,7 +1079,7 @@ exit:
return err; return err;
} }
static void __devexit intel_mid_i2c_remove(struct pci_dev *dev) static void intel_mid_i2c_remove(struct pci_dev *dev)
{ {
struct intel_mid_i2c_private *mrst = pci_get_drvdata(dev); struct intel_mid_i2c_private *mrst = pci_get_drvdata(dev);
intel_mid_i2c_disable(&mrst->adap); intel_mid_i2c_disable(&mrst->adap);
@ -1113,7 +1113,7 @@ static struct pci_driver intel_mid_i2c_driver = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.id_table = intel_mid_i2c_ids, .id_table = intel_mid_i2c_ids,
.probe = intel_mid_i2c_probe, .probe = intel_mid_i2c_probe,
.remove = __devexit_p(intel_mid_i2c_remove), .remove = intel_mid_i2c_remove,
}; };
module_pci_driver(intel_mid_i2c_driver); module_pci_driver(intel_mid_i2c_driver);

View File

@ -249,7 +249,7 @@ static struct i2c_adapter sch_adapter = {
.algo = &smbus_algorithm, .algo = &smbus_algorithm,
}; };
static int __devinit smbus_sch_probe(struct platform_device *dev) static int smbus_sch_probe(struct platform_device *dev)
{ {
struct resource *res; struct resource *res;
int retval; int retval;
@ -284,7 +284,7 @@ static int __devinit smbus_sch_probe(struct platform_device *dev)
return retval; return retval;
} }
static int __devexit smbus_sch_remove(struct platform_device *pdev) static int smbus_sch_remove(struct platform_device *pdev)
{ {
struct resource *res; struct resource *res;
if (sch_smba) { if (sch_smba) {
@ -303,7 +303,7 @@ static struct platform_driver smbus_sch_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = smbus_sch_probe, .probe = smbus_sch_probe,
.remove = __devexit_p(smbus_sch_remove), .remove = smbus_sch_remove,
}; };
module_platform_driver(smbus_sch_driver); module_platform_driver(smbus_sch_driver);

View File

@ -175,7 +175,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing)
} }
#if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x) #if defined(CONFIG_PPC_MPC52xx) || defined(CONFIG_PPC_MPC512x)
static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] __devinitconst = { static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] = {
{20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23}, {20, 0x20}, {22, 0x21}, {24, 0x22}, {26, 0x23},
{28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02}, {28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02},
{36, 0x26}, {40, 0x27}, {44, 0x04}, {48, 0x28}, {36, 0x26}, {40, 0x27}, {44, 0x04}, {48, 0x28},
@ -196,7 +196,7 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_52xx[] __devinitconst = {
{10240, 0x9d}, {12288, 0x9e}, {15360, 0x9f} {10240, 0x9d}, {12288, 0x9e}, {15360, 0x9f}
}; };
static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock, static int mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
int prescaler, u32 *real_clk) int prescaler, u32 *real_clk)
{ {
const struct mpc_i2c_divider *div = NULL; const struct mpc_i2c_divider *div = NULL;
@ -230,7 +230,7 @@ static int __devinit mpc_i2c_get_fdr_52xx(struct device_node *node, u32 clock,
return (int)div->fdr; return (int)div->fdr;
} }
static void __devinit mpc_i2c_setup_52xx(struct device_node *node, static void mpc_i2c_setup_52xx(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -252,7 +252,7 @@ static void __devinit mpc_i2c_setup_52xx(struct device_node *node,
fdr); fdr);
} }
#else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */ #else /* !(CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x) */
static void __devinit mpc_i2c_setup_52xx(struct device_node *node, static void mpc_i2c_setup_52xx(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -260,7 +260,7 @@ static void __devinit mpc_i2c_setup_52xx(struct device_node *node,
#endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */ #endif /* CONFIG_PPC_MPC52xx || CONFIG_PPC_MPC512x */
#ifdef CONFIG_PPC_MPC512x #ifdef CONFIG_PPC_MPC512x
static void __devinit mpc_i2c_setup_512x(struct device_node *node, static void mpc_i2c_setup_512x(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -288,7 +288,7 @@ static void __devinit mpc_i2c_setup_512x(struct device_node *node,
mpc_i2c_setup_52xx(node, i2c, clock, prescaler); mpc_i2c_setup_52xx(node, i2c, clock, prescaler);
} }
#else /* CONFIG_PPC_MPC512x */ #else /* CONFIG_PPC_MPC512x */
static void __devinit mpc_i2c_setup_512x(struct device_node *node, static void mpc_i2c_setup_512x(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -296,7 +296,7 @@ static void __devinit mpc_i2c_setup_512x(struct device_node *node,
#endif /* CONFIG_PPC_MPC512x */ #endif /* CONFIG_PPC_MPC512x */
#ifdef CONFIG_FSL_SOC #ifdef CONFIG_FSL_SOC
static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] __devinitconst = { static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] = {
{160, 0x0120}, {192, 0x0121}, {224, 0x0122}, {256, 0x0123}, {160, 0x0120}, {192, 0x0121}, {224, 0x0122}, {256, 0x0123},
{288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102}, {288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102},
{416, 0x0602}, {448, 0x0126}, {480, 0x0103}, {512, 0x0127}, {416, 0x0602}, {448, 0x0126}, {480, 0x0103}, {512, 0x0127},
@ -316,7 +316,7 @@ static const struct mpc_i2c_divider mpc_i2c_dividers_8xxx[] __devinitconst = {
{49152, 0x011e}, {61440, 0x011f} {49152, 0x011e}, {61440, 0x011f}
}; };
static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void) static u32 mpc_i2c_get_sec_cfg_8xxx(void)
{ {
struct device_node *node = NULL; struct device_node *node = NULL;
u32 __iomem *reg; u32 __iomem *reg;
@ -345,7 +345,7 @@ static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void)
return val; return val;
} }
static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock, static int mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock,
u32 prescaler, u32 *real_clk) u32 prescaler, u32 *real_clk)
{ {
const struct mpc_i2c_divider *div = NULL; const struct mpc_i2c_divider *div = NULL;
@ -383,7 +383,7 @@ static int __devinit mpc_i2c_get_fdr_8xxx(struct device_node *node, u32 clock,
return div ? (int)div->fdr : -EINVAL; return div ? (int)div->fdr : -EINVAL;
} }
static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, static void mpc_i2c_setup_8xxx(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -408,7 +408,7 @@ static void __devinit mpc_i2c_setup_8xxx(struct device_node *node,
} }
#else /* !CONFIG_FSL_SOC */ #else /* !CONFIG_FSL_SOC */
static void __devinit mpc_i2c_setup_8xxx(struct device_node *node, static void mpc_i2c_setup_8xxx(struct device_node *node,
struct mpc_i2c *i2c, struct mpc_i2c *i2c,
u32 clock, u32 prescaler) u32 clock, u32 prescaler)
{ {
@ -615,7 +615,7 @@ static struct i2c_adapter mpc_ops = {
}; };
static const struct of_device_id mpc_i2c_of_match[]; static const struct of_device_id mpc_i2c_of_match[];
static int __devinit fsl_i2c_probe(struct platform_device *op) static int fsl_i2c_probe(struct platform_device *op)
{ {
const struct of_device_id *match; const struct of_device_id *match;
struct mpc_i2c *i2c; struct mpc_i2c *i2c;
@ -706,7 +706,7 @@ static int __devinit fsl_i2c_probe(struct platform_device *op)
return result; return result;
}; };
static int __devexit fsl_i2c_remove(struct platform_device *op) static int fsl_i2c_remove(struct platform_device *op)
{ {
struct mpc_i2c *i2c = dev_get_drvdata(&op->dev); struct mpc_i2c *i2c = dev_get_drvdata(&op->dev);
@ -746,24 +746,24 @@ static int mpc_i2c_resume(struct device *dev)
SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume); SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume);
#endif #endif
static const struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = { static const struct mpc_i2c_data mpc_i2c_data_512x = {
.setup = mpc_i2c_setup_512x, .setup = mpc_i2c_setup_512x,
}; };
static const struct mpc_i2c_data mpc_i2c_data_52xx __devinitdata = { static const struct mpc_i2c_data mpc_i2c_data_52xx = {
.setup = mpc_i2c_setup_52xx, .setup = mpc_i2c_setup_52xx,
}; };
static const struct mpc_i2c_data mpc_i2c_data_8313 __devinitdata = { static const struct mpc_i2c_data mpc_i2c_data_8313 = {
.setup = mpc_i2c_setup_8xxx, .setup = mpc_i2c_setup_8xxx,
}; };
static const struct mpc_i2c_data mpc_i2c_data_8543 __devinitdata = { static const struct mpc_i2c_data mpc_i2c_data_8543 = {
.setup = mpc_i2c_setup_8xxx, .setup = mpc_i2c_setup_8xxx,
.prescaler = 2, .prescaler = 2,
}; };
static const struct mpc_i2c_data mpc_i2c_data_8544 __devinitdata = { static const struct mpc_i2c_data mpc_i2c_data_8544 = {
.setup = mpc_i2c_setup_8xxx, .setup = mpc_i2c_setup_8xxx,
.prescaler = 3, .prescaler = 3,
}; };
@ -785,7 +785,7 @@ MODULE_DEVICE_TABLE(of, mpc_i2c_of_match);
/* Structure for a device driver */ /* Structure for a device driver */
static struct platform_driver mpc_i2c_driver = { static struct platform_driver mpc_i2c_driver = {
.probe = fsl_i2c_probe, .probe = fsl_i2c_probe,
.remove = __devexit_p(fsl_i2c_remove), .remove = fsl_i2c_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = DRV_NAME, .name = DRV_NAME,

View File

@ -495,7 +495,7 @@ static const struct i2c_algorithm mv64xxx_i2c_algo = {
* *
***************************************************************************** *****************************************************************************
*/ */
static int __devinit static int
mv64xxx_i2c_map_regs(struct platform_device *pd, mv64xxx_i2c_map_regs(struct platform_device *pd,
struct mv64xxx_i2c_data *drv_data) struct mv64xxx_i2c_data *drv_data)
{ {
@ -530,13 +530,13 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
} }
#ifdef CONFIG_OF #ifdef CONFIG_OF
static int __devinit static int
mv64xxx_calc_freq(const int tclk, const int n, const int m) mv64xxx_calc_freq(const int tclk, const int n, const int m)
{ {
return tclk / (10 * (m + 1) * (2 << n)); return tclk / (10 * (m + 1) * (2 << n));
} }
static bool __devinit static bool
mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n, mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n,
u32 *best_m) u32 *best_m)
{ {
@ -560,7 +560,7 @@ mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n,
return true; return true;
} }
static int __devinit static int
mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
struct device_node *np) struct device_node *np)
{ {
@ -597,7 +597,7 @@ out:
#endif #endif
} }
#else /* CONFIG_OF */ #else /* CONFIG_OF */
static int __devinit static int
mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
struct device_node *np) struct device_node *np)
{ {
@ -605,7 +605,7 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
} }
#endif /* CONFIG_OF */ #endif /* CONFIG_OF */
static int __devinit static int
mv64xxx_i2c_probe(struct platform_device *pd) mv64xxx_i2c_probe(struct platform_device *pd)
{ {
struct mv64xxx_i2c_data *drv_data; struct mv64xxx_i2c_data *drv_data;
@ -697,7 +697,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)
return rc; return rc;
} }
static int __devexit static int
mv64xxx_i2c_remove(struct platform_device *dev) mv64xxx_i2c_remove(struct platform_device *dev)
{ {
struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(dev); struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(dev);
@ -718,7 +718,7 @@ mv64xxx_i2c_remove(struct platform_device *dev)
return rc; return rc;
} }
static const struct of_device_id mv64xxx_i2c_of_match_table[] __devinitdata = { static const struct of_device_id mv64xxx_i2c_of_match_table[] = {
{ .compatible = "marvell,mv64xxx-i2c", }, { .compatible = "marvell,mv64xxx-i2c", },
{} {}
}; };
@ -726,7 +726,7 @@ MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table);
static struct platform_driver mv64xxx_i2c_driver = { static struct platform_driver mv64xxx_i2c_driver = {
.probe = mv64xxx_i2c_probe, .probe = mv64xxx_i2c_probe,
.remove = __devexit_p(mv64xxx_i2c_remove), .remove = mv64xxx_i2c_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = MV64XXX_I2C_CTLR_NAME, .name = MV64XXX_I2C_CTLR_NAME,

View File

@ -432,7 +432,7 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c)
return 0; return 0;
} }
static int __devinit mxs_i2c_probe(struct platform_device *pdev) static int mxs_i2c_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct mxs_i2c_dev *i2c; struct mxs_i2c_dev *i2c;
@ -515,7 +515,7 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int __devexit mxs_i2c_remove(struct platform_device *pdev) static int mxs_i2c_remove(struct platform_device *pdev)
{ {
struct mxs_i2c_dev *i2c = platform_get_drvdata(pdev); struct mxs_i2c_dev *i2c = platform_get_drvdata(pdev);
int ret; int ret;
@ -546,7 +546,7 @@ static struct platform_driver mxs_i2c_driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = mxs_i2c_dt_ids, .of_match_table = mxs_i2c_dt_ids,
}, },
.remove = __devexit_p(mxs_i2c_remove), .remove = mxs_i2c_remove,
}; };
static int __init mxs_i2c_init(void) static int __init mxs_i2c_init(void)

View File

@ -117,7 +117,7 @@ struct nforce2_smbus {
#define MAX_TIMEOUT 100 #define MAX_TIMEOUT 100
/* We disable the second SMBus channel on these boards */ /* We disable the second SMBus channel on these boards */
static struct dmi_system_id __devinitdata nforce2_dmi_blacklist2[] = { static const struct dmi_system_id nforce2_dmi_blacklist2[] = {
{ {
.ident = "DFI Lanparty NF4 Expert", .ident = "DFI Lanparty NF4 Expert",
.matches = { .matches = {
@ -330,8 +330,8 @@ static DEFINE_PCI_DEVICE_TABLE(nforce2_ids) = {
MODULE_DEVICE_TABLE (pci, nforce2_ids); MODULE_DEVICE_TABLE (pci, nforce2_ids);
static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar, static int nforce2_probe_smb(struct pci_dev *dev, int bar, int alt_reg,
int alt_reg, struct nforce2_smbus *smbus, const char *name) struct nforce2_smbus *smbus, const char *name)
{ {
int error; int error;
@ -382,7 +382,7 @@ static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
} }
static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id) static int nforce2_probe(struct pci_dev *dev, const struct pci_device_id *id)
{ {
struct nforce2_smbus *smbuses; struct nforce2_smbus *smbuses;
int res1, res2; int res1, res2;
@ -430,7 +430,7 @@ static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_
} }
static void __devexit nforce2_remove(struct pci_dev *dev) static void nforce2_remove(struct pci_dev *dev)
{ {
struct nforce2_smbus *smbuses = pci_get_drvdata(dev); struct nforce2_smbus *smbuses = pci_get_drvdata(dev);
@ -450,7 +450,7 @@ static struct pci_driver nforce2_driver = {
.name = "nForce2_smbus", .name = "nForce2_smbus",
.id_table = nforce2_ids, .id_table = nforce2_ids,
.probe = nforce2_probe, .probe = nforce2_probe,
.remove = __devexit_p(nforce2_remove), .remove = nforce2_remove,
}; };
module_pci_driver(nforce2_driver); module_pci_driver(nforce2_driver);

View File

@ -518,7 +518,7 @@ static const struct i2c_algorithm nuc900_i2c_algorithm = {
* called by the bus driver when a suitable device is found * called by the bus driver when a suitable device is found
*/ */
static int __devinit nuc900_i2c_probe(struct platform_device *pdev) static int nuc900_i2c_probe(struct platform_device *pdev)
{ {
struct nuc900_i2c *i2c; struct nuc900_i2c *i2c;
struct nuc900_platform_i2c *pdata; struct nuc900_platform_i2c *pdata;
@ -663,7 +663,7 @@ static int __devinit nuc900_i2c_probe(struct platform_device *pdev)
* called when device is removed from the bus * called when device is removed from the bus
*/ */
static int __devexit nuc900_i2c_remove(struct platform_device *pdev) static int nuc900_i2c_remove(struct platform_device *pdev)
{ {
struct nuc900_i2c *i2c = platform_get_drvdata(pdev); struct nuc900_i2c *i2c = platform_get_drvdata(pdev);
@ -684,7 +684,7 @@ static int __devexit nuc900_i2c_remove(struct platform_device *pdev)
static struct platform_driver nuc900_i2c_driver = { static struct platform_driver nuc900_i2c_driver = {
.probe = nuc900_i2c_probe, .probe = nuc900_i2c_probe,
.remove = __devexit_p(nuc900_i2c_remove), .remove = nuc900_i2c_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "nuc900-i2c0", .name = "nuc900-i2c0",

View File

@ -343,7 +343,7 @@ static int ocores_i2c_of_probe(struct platform_device *pdev,
#define ocores_i2c_of_probe(pdev,i2c) -ENODEV #define ocores_i2c_of_probe(pdev,i2c) -ENODEV
#endif #endif
static int __devinit ocores_i2c_probe(struct platform_device *pdev) static int ocores_i2c_probe(struct platform_device *pdev)
{ {
struct ocores_i2c *i2c; struct ocores_i2c *i2c;
struct ocores_i2c_platform_data *pdata; struct ocores_i2c_platform_data *pdata;
@ -441,7 +441,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
return 0; return 0;
} }
static int __devexit ocores_i2c_remove(struct platform_device *pdev) static int ocores_i2c_remove(struct platform_device *pdev)
{ {
struct ocores_i2c *i2c = platform_get_drvdata(pdev); struct ocores_i2c *i2c = platform_get_drvdata(pdev);
@ -485,7 +485,7 @@ static SIMPLE_DEV_PM_OPS(ocores_i2c_pm, ocores_i2c_suspend, ocores_i2c_resume);
static struct platform_driver ocores_i2c_driver = { static struct platform_driver ocores_i2c_driver = {
.probe = ocores_i2c_probe, .probe = ocores_i2c_probe,
.remove = __devexit_p(ocores_i2c_remove), .remove = ocores_i2c_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "ocores-i2c", .name = "ocores-i2c",

View File

@ -446,7 +446,7 @@ static struct i2c_adapter octeon_i2c_ops = {
/** /**
* octeon_i2c_setclock - Calculate and set clock divisors. * octeon_i2c_setclock - Calculate and set clock divisors.
*/ */
static int __devinit octeon_i2c_setclock(struct octeon_i2c *i2c) static int octeon_i2c_setclock(struct octeon_i2c *i2c)
{ {
int tclk, thp_base, inc, thp_idx, mdiv_idx, ndiv_idx, foscl, diff; int tclk, thp_base, inc, thp_idx, mdiv_idx, ndiv_idx, foscl, diff;
int thp = 0x18, mdiv = 2, ndiv = 0, delta_hz = 1000000; int thp = 0x18, mdiv = 2, ndiv = 0, delta_hz = 1000000;
@ -489,7 +489,7 @@ static int __devinit octeon_i2c_setclock(struct octeon_i2c *i2c)
return 0; return 0;
} }
static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c) static int octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
{ {
u8 status; u8 status;
int tries; int tries;
@ -510,7 +510,7 @@ static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
return -EIO; return -EIO;
} }
static int __devinit octeon_i2c_probe(struct platform_device *pdev) static int octeon_i2c_probe(struct platform_device *pdev)
{ {
int irq, result = 0; int irq, result = 0;
struct octeon_i2c *i2c; struct octeon_i2c *i2c;
@ -609,7 +609,7 @@ out:
return result; return result;
}; };
static int __devexit octeon_i2c_remove(struct platform_device *pdev) static int octeon_i2c_remove(struct platform_device *pdev)
{ {
struct octeon_i2c *i2c = platform_get_drvdata(pdev); struct octeon_i2c *i2c = platform_get_drvdata(pdev);
@ -628,7 +628,7 @@ MODULE_DEVICE_TABLE(of, octeon_i2c_match);
static struct platform_driver octeon_i2c_driver = { static struct platform_driver octeon_i2c_driver = {
.probe = octeon_i2c_probe, .probe = octeon_i2c_probe,
.remove = __devexit_p(octeon_i2c_remove), .remove = octeon_i2c_remove,
.driver = { .driver = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = DRV_NAME, .name = DRV_NAME,

View File

@ -1069,7 +1069,7 @@ MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
#define OMAP_I2C_SCHEME_0 0 #define OMAP_I2C_SCHEME_0 0
#define OMAP_I2C_SCHEME_1 1 #define OMAP_I2C_SCHEME_1 1
static int __devinit static int
omap_i2c_probe(struct platform_device *pdev) omap_i2c_probe(struct platform_device *pdev)
{ {
struct omap_i2c_dev *dev; struct omap_i2c_dev *dev;
@ -1267,7 +1267,7 @@ err_free_mem:
return r; return r;
} }
static int __devexit omap_i2c_remove(struct platform_device *pdev) static int omap_i2c_remove(struct platform_device *pdev)
{ {
struct omap_i2c_dev *dev = platform_get_drvdata(pdev); struct omap_i2c_dev *dev = platform_get_drvdata(pdev);
int ret; int ret;
@ -1333,7 +1333,7 @@ static struct dev_pm_ops omap_i2c_pm_ops = {
static struct platform_driver omap_i2c_driver = { static struct platform_driver omap_i2c_driver = {
.probe = omap_i2c_probe, .probe = omap_i2c_probe,
.remove = __devexit_p(omap_i2c_remove), .remove = omap_i2c_remove,
.driver = { .driver = {
.name = "omap_i2c", .name = "omap_i2c",
.owner = THIS_MODULE, .owner = THIS_MODULE,

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