Merge remote-tracking branch 'asoc/fix/pxa' into asoc-pxa
This commit is contained in:
commit
07afa01813
|
@ -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";
|
||||
};
|
|
@ -5385,6 +5385,15 @@ F: arch/arm/*omap*/
|
|||
F: drivers/i2c/busses/i2c-omap.c
|
||||
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
|
||||
M: Paul Walmsley <paul@pwsan.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Terrified Chipmunk
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -19,6 +19,10 @@
|
|||
interrupts = <11>;
|
||||
};
|
||||
|
||||
watchdog {
|
||||
compatible = "ti,twl4030-wdt";
|
||||
};
|
||||
|
||||
vdac: regulator-vdac {
|
||||
compatible = "ti,twl4030-vdac";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
|
|
|
@ -6,6 +6,7 @@ CONFIG_MACH_ARMADA_370=y
|
|||
CONFIG_MACH_ARMADA_XP=y
|
||||
CONFIG_ARCH_HIGHBANK=y
|
||||
CONFIG_ARCH_SOCFPGA=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
# CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA is not set
|
||||
CONFIG_ARM_ERRATA_754322=y
|
||||
CONFIG_SMP=y
|
||||
|
|
|
@ -65,6 +65,8 @@ CONFIG_MAC80211_RC_PID=y
|
|||
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_CONNECTOR=y
|
||||
CONFIG_DEVTMPFS=y
|
||||
CONFIG_DEVTMPFS_MOUNT=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
|
@ -132,9 +134,11 @@ CONFIG_POWER_SUPPLY=y
|
|||
CONFIG_WATCHDOG=y
|
||||
CONFIG_OMAP_WATCHDOG=y
|
||||
CONFIG_TWL4030_WATCHDOG=y
|
||||
CONFIG_MFD_TPS65217=y
|
||||
CONFIG_REGULATOR_TWL4030=y
|
||||
CONFIG_REGULATOR_TPS65023=y
|
||||
CONFIG_REGULATOR_TPS6507X=y
|
||||
CONFIG_REGULATOR_TPS65217=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FIRMWARE_EDID=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
|
@ -170,6 +174,7 @@ CONFIG_SND_DEBUG=y
|
|||
CONFIG_SND_USB_AUDIO=m
|
||||
CONFIG_SND_SOC=m
|
||||
CONFIG_SND_OMAP_SOC=m
|
||||
CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
|
||||
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEBUG=y
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
# Common support
|
||||
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
|
||||
|
||||
ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
|
||||
|
|
|
@ -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
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
# 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 \
|
||||
omap_device.o sram.o
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@
|
|||
#define OMAP343X_PADCONF_ETK_D14 OMAP343X_PADCONF_ETK(16)
|
||||
#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 + \
|
||||
0x008 + (i))
|
||||
#define OMAP343X_CONTROL_WKUP_DEBOBS0 (OMAP343X_CONTROL_GENERAL_WKUP + 0x008)
|
||||
|
|
|
@ -504,8 +504,7 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
|
||||
freqsel = _omap3_dpll_compute_freqsel(clk,
|
||||
dd->last_rounded_n);
|
||||
if (!freqsel)
|
||||
WARN_ON(1);
|
||||
WARN_ON(!freqsel);
|
||||
}
|
||||
|
||||
pr_debug("%s: %s: set rate: locking rate to %lu.\n",
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "omap_device.h"
|
||||
#include "omap_hwmod.h"
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#if defined(CONFIG_DRM_OMAP) || (CONFIG_DRM_OMAP_MODULE)
|
||||
|
||||
|
|
|
@ -31,8 +31,7 @@
|
|||
#include <video/omap-panel-nokia-dsi.h>
|
||||
#include <video/omap-panel-picodlp.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "dss-common.h"
|
||||
#include "mux.h"
|
||||
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
* File: arch/arm/plat-omap/fb.c
|
||||
*
|
||||
* Framebuffer device registration for TI OMAP platforms
|
||||
*
|
||||
* Copyright (C) 2006 Nokia Corporation
|
||||
|
@ -33,7 +31,7 @@
|
|||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include "soc.h"
|
||||
|
||||
#ifdef CONFIG_OMAP2_VRFB
|
||||
|
||||
|
@ -94,45 +92,7 @@ static int __init omap_init_vrfb(void)
|
|||
arch_initcall(omap_init_vrfb);
|
||||
#endif
|
||||
|
||||
#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);
|
||||
|
||||
#elif defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
|
||||
#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
|
||||
|
||||
static u64 omap_fb_dma_mask = ~(u32)0;
|
||||
static struct omapfb_platform_data omapfb_config;
|
||||
|
@ -155,10 +115,4 @@ static int __init omap_init_fb(void)
|
|||
|
||||
arch_initcall(omap_init_fb);
|
||||
|
||||
#else
|
||||
|
||||
void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
|
@ -26,7 +26,6 @@
|
|||
|
||||
#include <linux/omap-dma.h>
|
||||
|
||||
#include <linux/platform_data/omap_ocp2scp.h>
|
||||
#include <linux/platform_data/spi-omap2-mcspi.h>
|
||||
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
||||
#include <linux/platform_data/iommu-omap.h>
|
||||
|
|
|
@ -292,8 +292,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
|
|||
if (twl_sr_enable_autoinit)
|
||||
pr_warning("%s: unexpected multiple calls\n", __func__);
|
||||
|
||||
ret = twl_i2c_read_u8(TWL4030_MODULE_PM_RECEIVER, &temp,
|
||||
TWL4030_DCDC_GLOBAL_CFG);
|
||||
ret = twl_i2c_read_u8(TWL_MODULE_PM_RECEIVER, &temp,
|
||||
TWL4030_DCDC_GLOBAL_CFG);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
|
@ -302,8 +302,8 @@ int __init omap3_twl_set_sr_bit(bool enable)
|
|||
else
|
||||
temp &= ~SMARTREFLEX_ENABLE;
|
||||
|
||||
ret = twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, temp,
|
||||
TWL4030_DCDC_GLOBAL_CFG);
|
||||
ret = twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, temp,
|
||||
TWL4030_DCDC_GLOBAL_CFG);
|
||||
if (!ret) {
|
||||
twl_sr_enable_autoinit = true;
|
||||
return 0;
|
||||
|
|
|
@ -11,8 +11,6 @@
|
|||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include <asm/pmu.h>
|
||||
|
||||
#include "soc.h"
|
||||
|
|
|
@ -18,9 +18,8 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "common.h"
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include "vp.h"
|
||||
#include "powerdomain.h"
|
||||
#include "clockdomain.h"
|
||||
|
|
|
@ -18,9 +18,8 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "common.h"
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include "vp.h"
|
||||
#include "powerdomain.h"
|
||||
#include "prm3xxx.h"
|
||||
|
|
|
@ -463,6 +463,9 @@
|
|||
GPIO76_LCD_PCLK, \
|
||||
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);
|
||||
#endif /* __ASM_ARCH_MFP_PXA27X_H */
|
||||
|
|
|
@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void)
|
|||
EXPORT_SYMBOL(pxa27x_clear_otgph);
|
||||
|
||||
static unsigned long ac97_reset_config[] = {
|
||||
GPIO113_GPIO,
|
||||
GPIO113_AC97_nRESET_GPIO_HIGH,
|
||||
GPIO113_AC97_nRESET,
|
||||
GPIO95_GPIO,
|
||||
GPIO95_AC97_nRESET_GPIO_HIGH,
|
||||
GPIO95_AC97_nRESET,
|
||||
};
|
||||
|
||||
|
|
|
@ -80,8 +80,8 @@ static void __init sunxi_dt_init(void)
|
|||
}
|
||||
|
||||
static const char * const sunxi_board_dt_compat[] = {
|
||||
"allwinner,sun4i",
|
||||
"allwinner,sun5i",
|
||||
"allwinner,sun4i-a10",
|
||||
"allwinner,sun5i-a13",
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
# 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-n :=
|
||||
obj- :=
|
||||
|
|
|
@ -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);
|
||||
module_init(omap_dm_timer_driver_init);
|
||||
module_exit(omap_dm_timer_driver_exit);
|
||||
module_platform_driver(omap_dm_timer_driver);
|
||||
|
||||
MODULE_DESCRIPTION("OMAP Dual-Mode Timer Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -32,8 +32,4 @@
|
|||
#include <mach/soc.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
#include "../../mach-omap2/soc.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -434,7 +434,8 @@ static const struct dmi_system_id __devinitconst pciprobe_dmi_table[] = {
|
|||
.callback = set_scan_all,
|
||||
.ident = "Stratus/NEC ftServer",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ftServer"),
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Stratus"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
|
|
|
@ -538,7 +538,7 @@ static ssize_t geos_gpio_store(struct device *dev, struct device_attribute *attr
|
|||
} else {
|
||||
count = -EINVAL;
|
||||
}
|
||||
spin_lock_irq(&card->param_queue_lock);
|
||||
spin_unlock_irq(&card->param_queue_lock);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
|
@ -184,19 +184,27 @@ EXPORT_SYMBOL(drm_mm_get_block_generic);
|
|||
* -ENOSPC if no suitable free area is available. The preallocated memory node
|
||||
* must be cleared.
|
||||
*/
|
||||
int drm_mm_insert_node(struct drm_mm *mm, struct drm_mm_node *node,
|
||||
unsigned long size, unsigned alignment)
|
||||
int drm_mm_insert_node_generic(struct drm_mm *mm, struct drm_mm_node *node,
|
||||
unsigned long size, unsigned alignment,
|
||||
unsigned long color)
|
||||
{
|
||||
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)
|
||||
return -ENOSPC;
|
||||
|
||||
drm_mm_insert_helper(hole_node, node, size, alignment, 0);
|
||||
|
||||
drm_mm_insert_helper(hole_node, node, size, alignment, color);
|
||||
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);
|
||||
|
||||
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
|
||||
* 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,
|
||||
unsigned long size, unsigned alignment,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
struct drm_mm_node *hole_node;
|
||||
|
||||
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;
|
||||
return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, 0, start, end);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_mm_insert_node_in_range);
|
||||
|
||||
|
|
|
@ -989,6 +989,9 @@ static int i915_getparam(struct drm_device *dev, void *data,
|
|||
case I915_PARAM_HAS_SECURE_BATCHES:
|
||||
value = capable(CAP_SYS_ADMIN);
|
||||
break;
|
||||
case I915_PARAM_HAS_PINNED_BATCHES:
|
||||
value = 1;
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG_DRIVER("Unknown parameter %d\n",
|
||||
param->param);
|
||||
|
|
|
@ -780,6 +780,7 @@ typedef struct drm_i915_private {
|
|||
struct i915_hw_ppgtt *aliasing_ppgtt;
|
||||
|
||||
struct shrinker inactive_shrinker;
|
||||
bool shrinker_no_lock_stealing;
|
||||
|
||||
/**
|
||||
* List of objects currently involved in rendering.
|
||||
|
@ -1100,6 +1101,7 @@ struct drm_i915_gem_object {
|
|||
*/
|
||||
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)
|
||||
|
||||
|
@ -1166,6 +1168,9 @@ struct drm_i915_file_private {
|
|||
#define IS_IVB_GT1(dev) ((dev)->pci_device == 0x0156 || \
|
||||
(dev)->pci_device == 0x0152 || \
|
||||
(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_HASWELL(dev) (INTEL_INFO(dev)->is_haswell)
|
||||
#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 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
|
||||
* rows, which changed the alignment requirements and fence programming.
|
||||
*/
|
||||
|
|
|
@ -1517,9 +1517,11 @@ static int i915_gem_object_create_mmap_offset(struct drm_i915_gem_object *obj)
|
|||
if (obj->base.map_list.map)
|
||||
return 0;
|
||||
|
||||
dev_priv->mm.shrinker_no_lock_stealing = true;
|
||||
|
||||
ret = drm_gem_create_mmap_offset(&obj->base);
|
||||
if (ret != -ENOSPC)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
/* Badly fragmented mmap space? The only way we can recover
|
||||
* 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);
|
||||
ret = drm_gem_create_mmap_offset(&obj->base);
|
||||
if (ret != -ENOSPC)
|
||||
return ret;
|
||||
goto out;
|
||||
|
||||
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)
|
||||
|
@ -2890,7 +2896,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
|
|||
{
|
||||
struct drm_device *dev = obj->base.dev;
|
||||
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;
|
||||
bool mappable, fenceable;
|
||||
int ret;
|
||||
|
@ -2936,66 +2942,54 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *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:
|
||||
if (map_and_fenceable)
|
||||
free_space = drm_mm_search_free_in_range_color(&dev_priv->mm.gtt_space,
|
||||
size, alignment, obj->cache_level,
|
||||
0, dev_priv->mm.gtt_mappable_end,
|
||||
false);
|
||||
ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
|
||||
size, alignment, obj->cache_level,
|
||||
0, dev_priv->mm.gtt_mappable_end);
|
||||
else
|
||||
free_space = drm_mm_search_free_color(&dev_priv->mm.gtt_space,
|
||||
size, alignment, obj->cache_level,
|
||||
false);
|
||||
|
||||
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 = drm_mm_insert_node_generic(&dev_priv->mm.gtt_space, node,
|
||||
size, alignment, obj->cache_level);
|
||||
if (ret) {
|
||||
ret = i915_gem_evict_something(dev, size, alignment,
|
||||
obj->cache_level,
|
||||
map_and_fenceable,
|
||||
nonblocking);
|
||||
if (ret) {
|
||||
i915_gem_object_unpin_pages(obj);
|
||||
return ret;
|
||||
}
|
||||
if (ret == 0)
|
||||
goto search_free;
|
||||
|
||||
goto search_free;
|
||||
}
|
||||
if (WARN_ON(!i915_gem_valid_gtt_space(dev,
|
||||
free_space,
|
||||
obj->cache_level))) {
|
||||
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;
|
||||
}
|
||||
|
||||
ret = i915_gem_gtt_prepare_object(obj);
|
||||
if (ret) {
|
||||
i915_gem_object_unpin_pages(obj);
|
||||
drm_mm_put_block(free_space);
|
||||
drm_mm_put_block(node);
|
||||
return ret;
|
||||
}
|
||||
|
||||
list_move_tail(&obj->gtt_list, &dev_priv->mm.bound_list);
|
||||
list_add_tail(&obj->mm_list, &dev_priv->mm.inactive_list);
|
||||
|
||||
obj->gtt_space = free_space;
|
||||
obj->gtt_offset = free_space->start;
|
||||
obj->gtt_space = node;
|
||||
obj->gtt_offset = node->start;
|
||||
|
||||
fenceable =
|
||||
free_space->size == fence_size &&
|
||||
(free_space->start & (fence_alignment - 1)) == 0;
|
||||
node->size == fence_size &&
|
||||
(node->start & (fence_alignment - 1)) == 0;
|
||||
|
||||
mappable =
|
||||
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))
|
||||
return 0;
|
||||
|
||||
if (dev_priv->mm.shrinker_no_lock_stealing)
|
||||
return 0;
|
||||
|
||||
unlock = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
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)
|
||||
|
|
|
@ -808,6 +808,8 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
|||
|
||||
flags |= I915_DISPATCH_SECURE;
|
||||
}
|
||||
if (args->flags & I915_EXEC_IS_PINNED)
|
||||
flags |= I915_DISPATCH_PINNED;
|
||||
|
||||
switch (args->flags & I915_EXEC_RING_MASK) {
|
||||
case I915_EXEC_DEFAULT:
|
||||
|
|
|
@ -1087,6 +1087,18 @@ i915_error_first_batchbuffer(struct drm_i915_private *dev_priv,
|
|||
if (!ring->get_seqno)
|
||||
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);
|
||||
list_for_each_entry(obj, &dev_priv->mm.active_list, mm_list) {
|
||||
if (obj->ring != ring)
|
||||
|
|
|
@ -517,6 +517,7 @@
|
|||
* the enables for writing to the corresponding low bit.
|
||||
*/
|
||||
#define _3D_CHICKEN 0x02084
|
||||
#define _3D_CHICKEN_HIZ_PLANE_DISABLE_MSAA_4X_SNB (1 << 10)
|
||||
#define _3D_CHICKEN2 0x0208c
|
||||
/* Disables pipelining of read flushes past the SF-WIZ interface.
|
||||
* Required on all Ironlake steppings according to the B-Spec, but the
|
||||
|
@ -532,7 +533,8 @@
|
|||
# define MI_FLUSH_ENABLE (1 << 12)
|
||||
|
||||
#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_GEN7 0x0229c
|
||||
|
|
|
@ -8144,10 +8144,6 @@ intel_modeset_stage_output_state(struct drm_device *dev,
|
|||
DRM_DEBUG_KMS("encoder changed, full mode switch\n");
|
||||
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. */
|
||||
|
||||
|
@ -9167,6 +9163,23 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
|
|||
* 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
|
||||
* and i915 state tracking structures. */
|
||||
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,
|
||||
crtc->base.x, crtc->base.y, crtc->base.fb);
|
||||
}
|
||||
|
||||
i915_redisable_vga(dev);
|
||||
} else {
|
||||
intel_modeset_update_staged_output_state(dev);
|
||||
}
|
||||
|
|
|
@ -405,7 +405,7 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
* - going to an unsupported config (interlace, pixel multiply, etc.)
|
||||
*/
|
||||
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 &&
|
||||
tmp_crtc->fb) {
|
||||
if (crtc) {
|
||||
|
@ -992,7 +992,7 @@ static struct drm_crtc *single_enabled_crtc(struct drm_device *dev)
|
|||
struct drm_crtc *crtc, *enabled = NULL;
|
||||
|
||||
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)
|
||||
return NULL;
|
||||
enabled = crtc;
|
||||
|
@ -1086,7 +1086,7 @@ static bool g4x_compute_wm0(struct drm_device *dev,
|
|||
int entries, tlb_miss;
|
||||
|
||||
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;
|
||||
*plane_wm = display->guard_size;
|
||||
return false;
|
||||
|
@ -1215,7 +1215,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev,
|
|||
int entries;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
int planea_wm, planeb_wm, cursora_wm, cursorb_wm;
|
||||
int plane_sr, cursor_sr;
|
||||
int ignore_plane_sr, ignore_cursor_sr;
|
||||
unsigned int enabled = 0;
|
||||
|
||||
vlv_update_drain_latency(dev);
|
||||
|
@ -1302,17 +1303,23 @@ static void valleyview_update_wm(struct drm_device *dev)
|
|||
&planeb_wm, &cursorb_wm))
|
||||
enabled |= 2;
|
||||
|
||||
plane_sr = cursor_sr = 0;
|
||||
if (single_plane_enabled(enabled) &&
|
||||
g4x_compute_srwm(dev, ffs(enabled) - 1,
|
||||
sr_latency_ns,
|
||||
&valleyview_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);
|
||||
else
|
||||
} else {
|
||||
I915_WRITE(FW_BLC_SELF_VLV,
|
||||
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",
|
||||
planea_wm, cursora_wm,
|
||||
|
@ -1352,17 +1359,18 @@ static void g4x_update_wm(struct drm_device *dev)
|
|||
&planeb_wm, &cursorb_wm))
|
||||
enabled |= 2;
|
||||
|
||||
plane_sr = cursor_sr = 0;
|
||||
if (single_plane_enabled(enabled) &&
|
||||
g4x_compute_srwm(dev, ffs(enabled) - 1,
|
||||
sr_latency_ns,
|
||||
&g4x_wm_info,
|
||||
&g4x_cursor_wm_info,
|
||||
&plane_sr, &cursor_sr))
|
||||
&plane_sr, &cursor_sr)) {
|
||||
I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
|
||||
else
|
||||
} else {
|
||||
I915_WRITE(FW_BLC_SELF,
|
||||
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",
|
||||
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);
|
||||
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;
|
||||
if (IS_GEN2(dev))
|
||||
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);
|
||||
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;
|
||||
if (IS_GEN2(dev))
|
||||
cpp = 4;
|
||||
|
@ -1811,21 +1819,6 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
|||
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
|
||||
* display plane is used.
|
||||
|
@ -1891,6 +1884,128 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
|||
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
|
||||
haswell_update_linetime_wm(struct drm_device *dev, int pipe,
|
||||
struct drm_display_mode *mode)
|
||||
|
@ -1929,7 +2044,7 @@ sandybridge_compute_sprite_wm(struct drm_device *dev, int plane,
|
|||
int entries, tlb_miss;
|
||||
|
||||
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;
|
||||
return false;
|
||||
}
|
||||
|
@ -3471,6 +3586,15 @@ static void gen6_init_clock_gating(struct drm_device *dev)
|
|||
I915_READ(ILK_DISPLAY_CHICKEN2) |
|
||||
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(WM2_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)) {
|
||||
/* FIXME: detect B0+ stepping and use auto training */
|
||||
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;
|
||||
} else {
|
||||
DRM_DEBUG_KMS("Failed to read display plane latency. "
|
||||
|
|
|
@ -547,9 +547,14 @@ static int init_render_ring(struct intel_ring_buffer *ring)
|
|||
|
||||
static void render_ring_cleanup(struct intel_ring_buffer *ring)
|
||||
{
|
||||
struct drm_device *dev = ring->dev;
|
||||
|
||||
if (!ring->private)
|
||||
return;
|
||||
|
||||
if (HAS_BROKEN_CS_TLB(dev))
|
||||
drm_gem_object_unreference(to_gem_object(ring->private));
|
||||
|
||||
cleanup_pipe_control(ring);
|
||||
}
|
||||
|
||||
|
@ -969,6 +974,8 @@ i965_dispatch_execbuffer(struct intel_ring_buffer *ring,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Just userspace ABI convention to limit the wa batch bo to a resonable size */
|
||||
#define I830_BATCH_LIMIT (256*1024)
|
||||
static int
|
||||
i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
|
||||
u32 offset, u32 len,
|
||||
|
@ -976,15 +983,47 @@ i830_dispatch_execbuffer(struct intel_ring_buffer *ring,
|
|||
{
|
||||
int ret;
|
||||
|
||||
ret = intel_ring_begin(ring, 4);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (flags & I915_DISPATCH_PINNED) {
|
||||
ret = intel_ring_begin(ring, 4);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
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 + len - 8);
|
||||
intel_ring_emit(ring, 0);
|
||||
intel_ring_advance(ring);
|
||||
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 + len - 8);
|
||||
intel_ring_emit(ring, MI_NOOP);
|
||||
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;
|
||||
}
|
||||
|
@ -1596,6 +1635,27 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
|
|||
ring->init = init_render_ring;
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -94,6 +94,7 @@ struct intel_ring_buffer {
|
|||
u32 offset, u32 length,
|
||||
unsigned flags);
|
||||
#define I915_DISPATCH_SECURE 0x1
|
||||
#define I915_DISPATCH_PINNED 0x2
|
||||
void (*cleanup)(struct intel_ring_buffer *ring);
|
||||
int (*sync_to)(struct intel_ring_buffer *ring,
|
||||
struct intel_ring_buffer *to,
|
||||
|
|
|
@ -57,6 +57,11 @@ chipsets:
|
|||
.b16 #nve4_gpc_mmio_tail
|
||||
.b16 #nve4_tpc_mmio_head
|
||||
.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
|
||||
|
||||
// GPC mmio lists
|
||||
|
|
|
@ -34,13 +34,16 @@ uint32_t nve0_grgpc_data[] = {
|
|||
0x00000000,
|
||||
/* 0x0064: chipsets */
|
||||
0x000000e4,
|
||||
0x01040080,
|
||||
0x014c0104,
|
||||
0x0110008c,
|
||||
0x01580110,
|
||||
0x000000e7,
|
||||
0x01040080,
|
||||
0x014c0104,
|
||||
0x0110008c,
|
||||
0x01580110,
|
||||
0x000000e6,
|
||||
0x0110008c,
|
||||
0x01580110,
|
||||
0x00000000,
|
||||
/* 0x0080: nve4_gpc_mmio_head */
|
||||
/* 0x008c: nve4_gpc_mmio_head */
|
||||
0x00000380,
|
||||
0x04000400,
|
||||
0x0800040c,
|
||||
|
@ -74,8 +77,8 @@ uint32_t nve0_grgpc_data[] = {
|
|||
0x14003100,
|
||||
0x000031d0,
|
||||
0x040031e0,
|
||||
/* 0x0104: nve4_gpc_mmio_tail */
|
||||
/* 0x0104: nve4_tpc_mmio_head */
|
||||
/* 0x0110: nve4_gpc_mmio_tail */
|
||||
/* 0x0110: nve4_tpc_mmio_head */
|
||||
0x00000048,
|
||||
0x00000064,
|
||||
0x00000088,
|
||||
|
|
|
@ -754,6 +754,16 @@ ctx_mmio_exec:
|
|||
// on load it means: "a save preceeded this load"
|
||||
//
|
||||
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 $p2 #ctx_xfer_pre_load
|
||||
ctx_xfer_pre:
|
||||
|
|
|
@ -799,79 +799,80 @@ uint32_t nvc0_grhub_code[] = {
|
|||
0x01fa0613,
|
||||
0xf803f806,
|
||||
/* 0x0829: ctx_xfer */
|
||||
0x0611f400,
|
||||
/* 0x082f: ctx_xfer_pre */
|
||||
0xf01102f4,
|
||||
0x21f510f7,
|
||||
0x21f50698,
|
||||
0x11f40631,
|
||||
/* 0x083d: ctx_xfer_pre_load */
|
||||
0x02f7f01c,
|
||||
0x065721f5,
|
||||
0x066621f5,
|
||||
0x067821f5,
|
||||
0x21f5f4bd,
|
||||
0x21f50657,
|
||||
/* 0x0856: ctx_xfer_exec */
|
||||
0x019806b8,
|
||||
0x1427f116,
|
||||
0x0624b604,
|
||||
0xf10020d0,
|
||||
0xf0a500e7,
|
||||
0x1fb941e3,
|
||||
0x8d21f402,
|
||||
0xf004e0b6,
|
||||
0x2cf001fc,
|
||||
0x0124b602,
|
||||
0xf405f2fd,
|
||||
0x17f18d21,
|
||||
0x13f04afc,
|
||||
0x0c27f002,
|
||||
0xf50012d0,
|
||||
0xf1020721,
|
||||
0xf047fc27,
|
||||
0x20d00223,
|
||||
0x012cf000,
|
||||
0xd00320b6,
|
||||
0xacf00012,
|
||||
0x06a5f001,
|
||||
0x9800b7f0,
|
||||
0x0d98140c,
|
||||
0x00e7f015,
|
||||
0x015c21f5,
|
||||
0xf508a7f0,
|
||||
0xf5010321,
|
||||
0xf4020721,
|
||||
0xa7f02201,
|
||||
0xc921f40c,
|
||||
0x0a1017f1,
|
||||
0xf00614b6,
|
||||
0x12d00527,
|
||||
/* 0x08dd: ctx_xfer_post_save_wait */
|
||||
0x0012cf00,
|
||||
0xf40522fd,
|
||||
0x02f4fa1b,
|
||||
/* 0x08e9: ctx_xfer_post */
|
||||
0x02f7f032,
|
||||
0x065721f5,
|
||||
0x21f5f4bd,
|
||||
0x21f50698,
|
||||
0x21f50226,
|
||||
0xf4bd0666,
|
||||
0x065721f5,
|
||||
0x981011f4,
|
||||
0x11fd8001,
|
||||
0x070bf405,
|
||||
0x07df21f5,
|
||||
/* 0x0914: ctx_xfer_no_post_mmio */
|
||||
0x064921f5,
|
||||
/* 0x0918: ctx_xfer_done */
|
||||
0x000000f8,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00f7f100,
|
||||
0x06f4b60c,
|
||||
0xd004e7f0,
|
||||
/* 0x0836: ctx_xfer_idle */
|
||||
0xfecf80fe,
|
||||
0x00e4f100,
|
||||
0xf91bf420,
|
||||
0xf40611f4,
|
||||
/* 0x0846: ctx_xfer_pre */
|
||||
0xf7f01102,
|
||||
0x9821f510,
|
||||
0x3121f506,
|
||||
0x1c11f406,
|
||||
/* 0x0854: ctx_xfer_pre_load */
|
||||
0xf502f7f0,
|
||||
0xf5065721,
|
||||
0xf5066621,
|
||||
0xbd067821,
|
||||
0x5721f5f4,
|
||||
0xb821f506,
|
||||
/* 0x086d: ctx_xfer_exec */
|
||||
0x16019806,
|
||||
0x041427f1,
|
||||
0xd00624b6,
|
||||
0xe7f10020,
|
||||
0xe3f0a500,
|
||||
0x021fb941,
|
||||
0xb68d21f4,
|
||||
0xfcf004e0,
|
||||
0x022cf001,
|
||||
0xfd0124b6,
|
||||
0x21f405f2,
|
||||
0xfc17f18d,
|
||||
0x0213f04a,
|
||||
0xd00c27f0,
|
||||
0x21f50012,
|
||||
0x27f10207,
|
||||
0x23f047fc,
|
||||
0x0020d002,
|
||||
0xb6012cf0,
|
||||
0x12d00320,
|
||||
0x01acf000,
|
||||
0xf006a5f0,
|
||||
0x0c9800b7,
|
||||
0x150d9814,
|
||||
0xf500e7f0,
|
||||
0xf0015c21,
|
||||
0x21f508a7,
|
||||
0x21f50103,
|
||||
0x01f40207,
|
||||
0x0ca7f022,
|
||||
0xf1c921f4,
|
||||
0xb60a1017,
|
||||
0x27f00614,
|
||||
0x0012d005,
|
||||
/* 0x08f4: ctx_xfer_post_save_wait */
|
||||
0xfd0012cf,
|
||||
0x1bf40522,
|
||||
0x3202f4fa,
|
||||
/* 0x0900: ctx_xfer_post */
|
||||
0xf502f7f0,
|
||||
0xbd065721,
|
||||
0x9821f5f4,
|
||||
0x2621f506,
|
||||
0x6621f502,
|
||||
0xf5f4bd06,
|
||||
0xf4065721,
|
||||
0x01981011,
|
||||
0x0511fd80,
|
||||
0xf5070bf4,
|
||||
/* 0x092b: ctx_xfer_no_post_mmio */
|
||||
0xf507df21,
|
||||
/* 0x092f: ctx_xfer_done */
|
||||
0xf8064921,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
|
|
@ -44,6 +44,9 @@ chipsets:
|
|||
.b8 0xe7 0 0 0
|
||||
.b16 #nve4_hub_mmio_head
|
||||
.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
|
||||
|
||||
nve4_hub_mmio_head:
|
||||
|
@ -680,6 +683,16 @@ ctx_mmio_exec:
|
|||
// on load it means: "a save preceeded this load"
|
||||
//
|
||||
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 $p2 #ctx_xfer_pre_load
|
||||
ctx_xfer_pre:
|
||||
|
|
|
@ -30,11 +30,13 @@ uint32_t nve0_grhub_data[] = {
|
|||
0x00000000,
|
||||
/* 0x005c: chipsets */
|
||||
0x000000e4,
|
||||
0x013c0070,
|
||||
0x01440078,
|
||||
0x000000e7,
|
||||
0x013c0070,
|
||||
0x01440078,
|
||||
0x000000e6,
|
||||
0x01440078,
|
||||
0x00000000,
|
||||
/* 0x0070: nve4_hub_mmio_head */
|
||||
/* 0x0078: nve4_hub_mmio_head */
|
||||
0x0417e91c,
|
||||
0x04400204,
|
||||
0x18404010,
|
||||
|
@ -86,9 +88,7 @@ uint32_t nve0_grhub_data[] = {
|
|||
0x00408840,
|
||||
0x08408900,
|
||||
0x00408980,
|
||||
/* 0x013c: nve4_hub_mmio_tail */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
/* 0x0144: nve4_hub_mmio_tail */
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
|
@ -781,77 +781,78 @@ uint32_t nve0_grhub_code[] = {
|
|||
0x0613f002,
|
||||
0xf80601fa,
|
||||
/* 0x07fb: ctx_xfer */
|
||||
0xf400f803,
|
||||
0x02f40611,
|
||||
/* 0x0801: ctx_xfer_pre */
|
||||
0x10f7f00d,
|
||||
0x067221f5,
|
||||
/* 0x080b: ctx_xfer_pre_load */
|
||||
0xf01c11f4,
|
||||
0x21f502f7,
|
||||
0x21f50631,
|
||||
0x21f50640,
|
||||
0xf4bd0652,
|
||||
0x063121f5,
|
||||
0x069221f5,
|
||||
/* 0x0824: ctx_xfer_exec */
|
||||
0xf1160198,
|
||||
0xb6041427,
|
||||
0x20d00624,
|
||||
0x00e7f100,
|
||||
0x41e3f0a5,
|
||||
0xf4021fb9,
|
||||
0xe0b68d21,
|
||||
0x01fcf004,
|
||||
0xb6022cf0,
|
||||
0xf2fd0124,
|
||||
0x8d21f405,
|
||||
0x4afc17f1,
|
||||
0xf00213f0,
|
||||
0x12d00c27,
|
||||
0x0721f500,
|
||||
0xfc27f102,
|
||||
0x0223f047,
|
||||
0xf00020d0,
|
||||
0x20b6012c,
|
||||
0x0012d003,
|
||||
0xf001acf0,
|
||||
0xb7f006a5,
|
||||
0x140c9800,
|
||||
0xf0150d98,
|
||||
0x21f500e7,
|
||||
0xa7f0015c,
|
||||
0x0321f508,
|
||||
0x0721f501,
|
||||
0x2201f402,
|
||||
0xf40ca7f0,
|
||||
0x17f1c921,
|
||||
0x14b60a10,
|
||||
0x0527f006,
|
||||
/* 0x08ab: ctx_xfer_post_save_wait */
|
||||
0xcf0012d0,
|
||||
0x22fd0012,
|
||||
0xfa1bf405,
|
||||
/* 0x08b7: ctx_xfer_post */
|
||||
0xf02e02f4,
|
||||
0x21f502f7,
|
||||
0xf4bd0631,
|
||||
0x067221f5,
|
||||
0x022621f5,
|
||||
0x064021f5,
|
||||
0x21f5f4bd,
|
||||
0x11f40631,
|
||||
0x80019810,
|
||||
0xf40511fd,
|
||||
0x21f5070b,
|
||||
/* 0x08e2: ctx_xfer_no_post_mmio */
|
||||
/* 0x08e2: ctx_xfer_done */
|
||||
0x00f807b1,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0x00000000,
|
||||
0xf100f803,
|
||||
0xb60c00f7,
|
||||
0xe7f006f4,
|
||||
0x80fed004,
|
||||
/* 0x0808: ctx_xfer_idle */
|
||||
0xf100fecf,
|
||||
0xf42000e4,
|
||||
0x11f4f91b,
|
||||
0x0d02f406,
|
||||
/* 0x0818: ctx_xfer_pre */
|
||||
0xf510f7f0,
|
||||
0xf4067221,
|
||||
/* 0x0822: ctx_xfer_pre_load */
|
||||
0xf7f01c11,
|
||||
0x3121f502,
|
||||
0x4021f506,
|
||||
0x5221f506,
|
||||
0xf5f4bd06,
|
||||
0xf5063121,
|
||||
/* 0x083b: ctx_xfer_exec */
|
||||
0x98069221,
|
||||
0x27f11601,
|
||||
0x24b60414,
|
||||
0x0020d006,
|
||||
0xa500e7f1,
|
||||
0xb941e3f0,
|
||||
0x21f4021f,
|
||||
0x04e0b68d,
|
||||
0xf001fcf0,
|
||||
0x24b6022c,
|
||||
0x05f2fd01,
|
||||
0xf18d21f4,
|
||||
0xf04afc17,
|
||||
0x27f00213,
|
||||
0x0012d00c,
|
||||
0x020721f5,
|
||||
0x47fc27f1,
|
||||
0xd00223f0,
|
||||
0x2cf00020,
|
||||
0x0320b601,
|
||||
0xf00012d0,
|
||||
0xa5f001ac,
|
||||
0x00b7f006,
|
||||
0x98140c98,
|
||||
0xe7f0150d,
|
||||
0x5c21f500,
|
||||
0x08a7f001,
|
||||
0x010321f5,
|
||||
0x020721f5,
|
||||
0xf02201f4,
|
||||
0x21f40ca7,
|
||||
0x1017f1c9,
|
||||
0x0614b60a,
|
||||
0xd00527f0,
|
||||
/* 0x08c2: ctx_xfer_post_save_wait */
|
||||
0x12cf0012,
|
||||
0x0522fd00,
|
||||
0xf4fa1bf4,
|
||||
/* 0x08ce: ctx_xfer_post */
|
||||
0xf7f02e02,
|
||||
0x3121f502,
|
||||
0xf5f4bd06,
|
||||
0xf5067221,
|
||||
0xf5022621,
|
||||
0xbd064021,
|
||||
0x3121f5f4,
|
||||
0x1011f406,
|
||||
0xfd800198,
|
||||
0x0bf40511,
|
||||
0xb121f507,
|
||||
/* 0x08f9: ctx_xfer_no_post_mmio */
|
||||
/* 0x08f9: ctx_xfer_done */
|
||||
0x0000f807,
|
||||
0x00000000,
|
||||
};
|
||||
|
|
|
@ -516,18 +516,9 @@ nvc0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
|
|||
{
|
||||
struct nouveau_device *device = nv_device(parent);
|
||||
struct nvc0_graph_priv *priv;
|
||||
bool enable = true;
|
||||
int ret, i;
|
||||
|
||||
switch (device->chipset) {
|
||||
case 0xd9: /* known broken without binary driver firmware */
|
||||
enable = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ret = nouveau_graph_create(parent, engine, oclass, enable, &priv);
|
||||
ret = nouveau_graph_create(parent, engine, oclass, true, &priv);
|
||||
*pobject = nv_object(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
@ -121,6 +121,7 @@ nvc0_graph_class(void *obj)
|
|||
return 0x9297;
|
||||
case 0xe4:
|
||||
case 0xe7:
|
||||
case 0xe6:
|
||||
return 0xa097;
|
||||
default:
|
||||
return 0;
|
||||
|
|
|
@ -203,7 +203,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
|
|||
struct nvc0_graph_priv *priv;
|
||||
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);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -252,6 +252,7 @@ nve0_graph_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
|
|||
priv->magic_not_rop_nr = 1;
|
||||
break;
|
||||
case 0xe7:
|
||||
case 0xe6:
|
||||
priv->magic_not_rop_nr = 1;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -17,6 +17,7 @@ struct nouveau_bios {
|
|||
u8 chip;
|
||||
u8 minor;
|
||||
u8 micro;
|
||||
u8 patch;
|
||||
} version;
|
||||
};
|
||||
|
||||
|
|
|
@ -25,9 +25,11 @@ struct dcb_gpio_func {
|
|||
u8 param;
|
||||
};
|
||||
|
||||
u16 dcb_gpio_table(struct nouveau_bios *);
|
||||
u16 dcb_gpio_entry(struct nouveau_bios *, int idx, int ent, u8 *ver);
|
||||
int dcb_gpio_parse(struct nouveau_bios *, int idx, u8 func, u8 line,
|
||||
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, u8 *len);
|
||||
u16 dcb_gpio_parse(struct nouveau_bios *, int idx, int ent, u8 *ver, u8 *len,
|
||||
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
|
||||
|
|
|
@ -13,6 +13,7 @@ struct nvbios_init {
|
|||
u32 nested;
|
||||
u16 repeat;
|
||||
u16 repend;
|
||||
u32 ramcfg;
|
||||
};
|
||||
|
||||
int nvbios_exec(struct nvbios_init *);
|
||||
|
|
|
@ -11,7 +11,7 @@ struct nouveau_gpio {
|
|||
struct nouveau_subdev base;
|
||||
|
||||
/* 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 (*sense)(struct nouveau_gpio *, int line);
|
||||
void (*irq_enable)(struct nouveau_gpio *, int line, bool);
|
||||
|
|
|
@ -447,6 +447,7 @@ nouveau_bios_ctor(struct nouveau_object *parent,
|
|||
bios->version.chip = nv_ro08(bios, bit_i.offset + 2);
|
||||
bios->version.minor = nv_ro08(bios, bit_i.offset + 1);
|
||||
bios->version.micro = nv_ro08(bios, bit_i.offset + 0);
|
||||
bios->version.patch = nv_ro08(bios, bit_i.offset + 4);
|
||||
} else
|
||||
if (bmp_version(bios)) {
|
||||
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);
|
||||
}
|
||||
|
||||
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.minor, bios->version.micro);
|
||||
bios->version.minor, bios->version.micro, bios->version.patch);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -27,84 +27,105 @@
|
|||
#include <subdev/bios/gpio.h>
|
||||
|
||||
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 dcb = dcb_table(bios, &ver, &hdr, &cnt, &len);
|
||||
u16 data = 0x0000;
|
||||
u16 dcb = dcb_table(bios, ver, hdr, cnt, len);
|
||||
if (dcb) {
|
||||
if (ver >= 0x30 && hdr >= 0x0c)
|
||||
return nv_ro16(bios, dcb + 0x0a);
|
||||
if (ver >= 0x22 && nv_ro08(bios, dcb - 1) >= 0x13)
|
||||
return nv_ro16(bios, dcb - 0x0f);
|
||||
if (*ver >= 0x30 && *hdr >= 0x0c)
|
||||
data = nv_ro16(bios, dcb + 0x0a);
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
||||
u16
|
||||
dcb_gpio_entry(struct nouveau_bios *bios, int idx, int ent, u8 *ver)
|
||||
{
|
||||
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,
|
||||
dcb_gpio_parse(struct nouveau_bios *bios, int idx, int ent, u8 *ver, u8 *len,
|
||||
struct dcb_gpio_func *gpio)
|
||||
{
|
||||
u8 ver, hdr, cnt, len;
|
||||
u16 entry;
|
||||
int i = -1;
|
||||
|
||||
while ((entry = dcb_gpio_entry(bios, idx, ++i, &ver))) {
|
||||
if (ver < 0x40) {
|
||||
u16 data = nv_ro16(bios, entry);
|
||||
u16 data = dcb_gpio_entry(bios, idx, ent, ver, len);
|
||||
if (data) {
|
||||
if (*ver < 0x40) {
|
||||
u16 info = nv_ro16(bios, data);
|
||||
*gpio = (struct dcb_gpio_func) {
|
||||
.line = (data & 0x001f) >> 0,
|
||||
.func = (data & 0x07e0) >> 5,
|
||||
.log[0] = (data & 0x1800) >> 11,
|
||||
.log[1] = (data & 0x6000) >> 13,
|
||||
.param = !!(data & 0x8000),
|
||||
.line = (info & 0x001f) >> 0,
|
||||
.func = (info & 0x07e0) >> 5,
|
||||
.log[0] = (info & 0x1800) >> 11,
|
||||
.log[1] = (info & 0x6000) >> 13,
|
||||
.param = !!(info & 0x8000),
|
||||
};
|
||||
} else
|
||||
if (ver < 0x41) {
|
||||
u32 data = nv_ro32(bios, entry);
|
||||
if (*ver < 0x41) {
|
||||
u32 info = nv_ro32(bios, data);
|
||||
*gpio = (struct dcb_gpio_func) {
|
||||
.line = (data & 0x0000001f) >> 0,
|
||||
.func = (data & 0x0000ff00) >> 8,
|
||||
.log[0] = (data & 0x18000000) >> 27,
|
||||
.log[1] = (data & 0x60000000) >> 29,
|
||||
.param = !!(data & 0x80000000),
|
||||
.line = (info & 0x0000001f) >> 0,
|
||||
.func = (info & 0x0000ff00) >> 8,
|
||||
.log[0] = (info & 0x18000000) >> 27,
|
||||
.log[1] = (info & 0x60000000) >> 29,
|
||||
.param = !!(info & 0x80000000),
|
||||
};
|
||||
} else {
|
||||
u32 data = nv_ro32(bios, entry + 0);
|
||||
u8 data1 = nv_ro32(bios, entry + 4);
|
||||
u32 info = nv_ro32(bios, data + 0);
|
||||
u8 info1 = nv_ro32(bios, data + 4);
|
||||
*gpio = (struct dcb_gpio_func) {
|
||||
.line = (data & 0x0000003f) >> 0,
|
||||
.func = (data & 0x0000ff00) >> 8,
|
||||
.log[0] = (data1 & 0x30) >> 4,
|
||||
.log[1] = (data1 & 0xc0) >> 6,
|
||||
.param = !!(data & 0x80000000),
|
||||
.line = (info & 0x0000003f) >> 0,
|
||||
.func = (info & 0x0000ff00) >> 8,
|
||||
.log[0] = (info1 & 0x30) >> 4,
|
||||
.log[1] = (info1 & 0xc0) >> 6,
|
||||
.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) &&
|
||||
(func == 0xff || func == gpio->func))
|
||||
return 0;
|
||||
return data;
|
||||
}
|
||||
|
||||
/* DCB 2.2, fixed TVDAC GPIO data */
|
||||
if ((entry = dcb_table(bios, &ver, &hdr, &cnt, &len))) {
|
||||
if (ver >= 0x22 && ver < 0x30 && func == DCB_GPIO_TVDAC0) {
|
||||
u8 conf = nv_ro08(bios, entry - 5);
|
||||
u8 addr = nv_ro08(bios, entry - 4);
|
||||
if ((data = dcb_table(bios, ver, &hdr, &cnt, len))) {
|
||||
if (*ver >= 0x22 && *ver < 0x30 && func == DCB_GPIO_TVDAC0) {
|
||||
u8 conf = nv_ro08(bios, data - 5);
|
||||
u8 addr = nv_ro08(bios, data - 4);
|
||||
if (conf & 0x01) {
|
||||
*gpio = (struct dcb_gpio_func) {
|
||||
.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[1] = !(conf & 0x02),
|
||||
};
|
||||
return 0;
|
||||
*ver = 0x00;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
return 0x0000;
|
||||
}
|
||||
|
|
|
@ -2,11 +2,12 @@
|
|||
#include <core/device.h>
|
||||
|
||||
#include <subdev/bios.h>
|
||||
#include <subdev/bios/conn.h>
|
||||
#include <subdev/bios/bmp.h>
|
||||
#include <subdev/bios/bit.h>
|
||||
#include <subdev/bios/conn.h>
|
||||
#include <subdev/bios/dcb.h>
|
||||
#include <subdev/bios/dp.h>
|
||||
#include <subdev/bios/gpio.h>
|
||||
#include <subdev/bios/init.h>
|
||||
#include <subdev/devinit.h>
|
||||
#include <subdev/clock.h>
|
||||
|
@ -409,10 +410,26 @@ init_ram_restrict_group_count(struct nvbios_init *init)
|
|||
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
|
||||
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);
|
||||
if (table)
|
||||
return nv_ro08(init->bios, table + strap);
|
||||
|
@ -1781,7 +1798,7 @@ init_gpio(struct nvbios_init *init)
|
|||
init->offset += 1;
|
||||
|
||||
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_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 {
|
||||
void (*exec)(struct nvbios_init *);
|
||||
} init_opcode[] = {
|
||||
|
@ -2059,6 +2117,7 @@ static struct nvbios_init_opcode {
|
|||
[0x98] = { init_auxch },
|
||||
[0x99] = { init_zm_auxch },
|
||||
[0x9a] = { init_i2c_long_if },
|
||||
[0xa9] = { init_gpio_ne },
|
||||
};
|
||||
|
||||
#define init_opcode_nr (sizeof(init_opcode) / sizeof(init_opcode[0]))
|
||||
|
|
|
@ -109,6 +109,34 @@ nve0_identify(struct nouveau_device *device)
|
|||
device->oclass[NVDEV_ENGINE_VP ] = &nve0_vp_oclass;
|
||||
device->oclass[NVDEV_ENGINE_PPP ] = &nvc0_ppp_oclass;
|
||||
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:
|
||||
nv_fatal(device, "unknown Kepler chipset\n");
|
||||
return -EINVAL;
|
||||
|
|
|
@ -43,10 +43,15 @@ static int
|
|||
nouveau_gpio_find(struct nouveau_gpio *gpio, int idx, u8 tag, u8 line,
|
||||
struct dcb_gpio_func *func)
|
||||
{
|
||||
struct nouveau_bios *bios = nouveau_bios(gpio);
|
||||
u8 ver, len;
|
||||
u16 data;
|
||||
|
||||
if (line == 0xff && tag == 0xff)
|
||||
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;
|
||||
|
||||
/* Apple iMac G4 NV18 */
|
||||
|
@ -265,7 +270,7 @@ nouveau_gpio_init(struct nouveau_gpio *gpio)
|
|||
int ret = nouveau_subdev_init(&gpio->base);
|
||||
if (ret == 0 && gpio->reset) {
|
||||
if (dmi_check_system(gpio_reset_ids))
|
||||
gpio->reset(gpio);
|
||||
gpio->reset(gpio, DCB_GPIO_UNUSED);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -29,15 +29,15 @@ struct nv50_gpio_priv {
|
|||
};
|
||||
|
||||
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 nv50_gpio_priv *priv = (void *)gpio;
|
||||
u8 ver, len;
|
||||
u16 entry;
|
||||
u8 ver;
|
||||
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 };
|
||||
u32 data = nv_ro32(bios, entry);
|
||||
u8 line = (data & 0x0000001f);
|
||||
|
@ -48,7 +48,8 @@ nv50_gpio_reset(struct nouveau_gpio *gpio)
|
|||
u32 val = (unk1 << 16) | unk0;
|
||||
u32 reg = regs[line >> 4]; line &= 0x0f;
|
||||
|
||||
if (func == 0xff)
|
||||
if ( func == DCB_GPIO_UNUSED ||
|
||||
(match != DCB_GPIO_UNUSED && match != func))
|
||||
continue;
|
||||
|
||||
gpio->set(gpio, 0, func, line, defs);
|
||||
|
|
|
@ -29,15 +29,15 @@ struct nvd0_gpio_priv {
|
|||
};
|
||||
|
||||
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 nvd0_gpio_priv *priv = (void *)gpio;
|
||||
u8 ver, len;
|
||||
u16 entry;
|
||||
u8 ver;
|
||||
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);
|
||||
u8 line = (data & 0x0000003f);
|
||||
u8 defs = !!(data & 0x00000080);
|
||||
|
@ -45,7 +45,8 @@ nvd0_gpio_reset(struct nouveau_gpio *gpio)
|
|||
u8 unk0 = (data & 0x00ff0000) >> 16;
|
||||
u8 unk1 = (data & 0x1f000000) >> 24;
|
||||
|
||||
if (func == 0xff)
|
||||
if ( func == DCB_GPIO_UNUSED ||
|
||||
(match != DCB_GPIO_UNUSED && match != func))
|
||||
continue;
|
||||
|
||||
gpio->set(gpio, 0, func, line, defs);
|
||||
|
|
|
@ -260,7 +260,7 @@ nouveau_mxm_create_(struct nouveau_object *parent,
|
|||
|
||||
data = mxm_table(bios, &ver, &len);
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -2654,6 +2654,35 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
|
|||
ib[idx+4] = upper_32_bits(offset) & 0xff;
|
||||
}
|
||||
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:
|
||||
if (pkt->count != 4) {
|
||||
DRM_ERROR("bad COPY_DW (invalid count)\n");
|
||||
|
@ -3287,6 +3316,7 @@ static bool evergreen_vm_reg_valid(u32 reg)
|
|||
|
||||
/* check config regs */
|
||||
switch (reg) {
|
||||
case WAIT_UNTIL:
|
||||
case GRBM_GFX_INDEX:
|
||||
case CP_STRMOUT_CNTL:
|
||||
case CP_COHER_CNTL:
|
||||
|
|
|
@ -2294,6 +2294,35 @@ static int r600_packet3_check(struct radeon_cs_parser *p,
|
|||
ib[idx+4] = upper_32_bits(offset) & 0xff;
|
||||
}
|
||||
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:
|
||||
if (pkt->count != 4) {
|
||||
DRM_ERROR("bad COPY_DW (invalid count)\n");
|
||||
|
|
|
@ -225,12 +225,13 @@ struct radeon_fence {
|
|||
int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring);
|
||||
int radeon_fence_driver_init(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);
|
||||
void radeon_fence_process(struct radeon_device *rdev, int ring);
|
||||
bool radeon_fence_signaled(struct radeon_fence *fence);
|
||||
int radeon_fence_wait(struct radeon_fence *fence, bool interruptible);
|
||||
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,
|
||||
struct radeon_fence **fences,
|
||||
bool intr);
|
||||
|
|
|
@ -1164,6 +1164,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
|||
struct drm_crtc *crtc;
|
||||
struct drm_connector *connector;
|
||||
int i, r;
|
||||
bool force_completion = false;
|
||||
|
||||
if (dev == NULL || dev->dev_private == NULL) {
|
||||
return -ENODEV;
|
||||
|
@ -1206,8 +1207,16 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
|||
|
||||
mutex_lock(&rdev->ring_lock);
|
||||
/* wait for gpu to finish processing current batch */
|
||||
for (i = 0; i < RADEON_NUM_RINGS; i++)
|
||||
radeon_fence_wait_empty_locked(rdev, i);
|
||||
for (i = 0; i < RADEON_NUM_RINGS; 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);
|
||||
|
||||
radeon_save_bios_scratch_regs(rdev);
|
||||
|
@ -1338,7 +1347,6 @@ retry:
|
|||
}
|
||||
|
||||
radeon_restore_bios_scratch_regs(rdev);
|
||||
drm_helper_resume_force_mode(rdev->ddev);
|
||||
|
||||
if (!r) {
|
||||
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
|
||||
|
@ -1358,11 +1366,14 @@ retry:
|
|||
}
|
||||
}
|
||||
} else {
|
||||
radeon_fence_driver_force_completion(rdev);
|
||||
for (i = 0; i < RADEON_NUM_RINGS; ++i) {
|
||||
kfree(ring_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
drm_helper_resume_force_mode(rdev->ddev);
|
||||
|
||||
ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
|
||||
if (r) {
|
||||
/* bad news, how to tell it to userspace ? */
|
||||
|
|
|
@ -68,9 +68,10 @@
|
|||
* 2.25.0 - eg+: new info request for num SE and num SH
|
||||
* 2.26.0 - r600-eg: fix htile size computation
|
||||
* 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_MINOR 27
|
||||
#define KMS_DRIVER_MINOR 28
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
|
|
@ -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.
|
||||
* 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];
|
||||
int r;
|
||||
|
||||
while(1) {
|
||||
int r;
|
||||
r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
|
||||
r = radeon_fence_wait_seq(rdev, seq, ring, false, false);
|
||||
if (r) {
|
||||
if (r == -EDEADLK) {
|
||||
mutex_unlock(&rdev->ring_lock);
|
||||
r = radeon_gpu_reset(rdev);
|
||||
mutex_lock(&rdev->ring_lock);
|
||||
if (!r)
|
||||
continue;
|
||||
return -EDEADLK;
|
||||
}
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "error waiting for ring to become"
|
||||
" idle (%d)\n", r);
|
||||
}
|
||||
return;
|
||||
dev_err(rdev->dev, "error waiting for ring[%d] to become idle (%d)\n",
|
||||
ring, r);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -854,13 +848,17 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
|
|||
*/
|
||||
void radeon_fence_driver_fini(struct radeon_device *rdev)
|
||||
{
|
||||
int ring;
|
||||
int ring, r;
|
||||
|
||||
mutex_lock(&rdev->ring_lock);
|
||||
for (ring = 0; ring < RADEON_NUM_RINGS; ring++) {
|
||||
if (!rdev->fence_drv[ring].initialized)
|
||||
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);
|
||||
radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg);
|
||||
rdev->fence_drv[ring].initialized = false;
|
||||
|
@ -868,6 +866,25 @@ void radeon_fence_driver_fini(struct radeon_device *rdev)
|
|||
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
|
||||
|
|
|
@ -234,7 +234,7 @@ static void radeon_set_power_state(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 */
|
||||
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 */
|
||||
for (i = 0; i < RADEON_NUM_RINGS; i++) {
|
||||
struct radeon_ring *ring = &rdev->ring[i];
|
||||
if (ring->ready)
|
||||
radeon_fence_wait_empty_locked(rdev, i);
|
||||
if (!ring->ready) {
|
||||
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);
|
||||
|
|
|
@ -102,12 +102,12 @@ static int tegra_dc_set_timings(struct tegra_dc *dc,
|
|||
((mode->hsync_end - mode->hsync_start) << 0);
|
||||
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) |
|
||||
((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);
|
||||
|
||||
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];
|
||||
|
||||
/* 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, win.fmt, DC_WIN_COLOR_DEPTH);
|
||||
|
|
|
@ -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_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 */
|
||||
extern int tegra_drm_fb_init(struct drm_device *drm);
|
||||
extern void tegra_drm_fb_exit(struct drm_device *drm);
|
||||
|
|
|
@ -149,7 +149,7 @@ struct tmds_config {
|
|||
};
|
||||
|
||||
static const struct tmds_config tegra2_tmds_config[] = {
|
||||
{ /* 480p modes */
|
||||
{ /* slow pixel clock modes */
|
||||
.pclk = 27000000,
|
||||
.pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
|
||||
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_LANE2(DRIVE_CURRENT_7_125_mA) |
|
||||
DRIVE_CURRENT_LANE3(DRIVE_CURRENT_7_125_mA),
|
||||
}, { /* 720p modes */
|
||||
.pclk = 74250000,
|
||||
.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 */
|
||||
},
|
||||
{ /* high pixel clock modes */
|
||||
.pclk = UINT_MAX,
|
||||
.pll0 = SOR_PLL_BG_V17_S(3) | SOR_PLL_ICHPMP(1) |
|
||||
SOR_PLL_RESISTORSEL | SOR_PLL_VCOCAP(1) |
|
||||
|
@ -479,7 +466,7 @@ static void tegra_hdmi_setup_avi_infoframe(struct tegra_hdmi *hdmi,
|
|||
return;
|
||||
}
|
||||
|
||||
h_front_porch = mode->htotal - mode->hsync_end;
|
||||
h_front_porch = mode->hsync_start - mode->hdisplay;
|
||||
memset(&frame, 0, sizeof(frame));
|
||||
frame.r = HDMI_AVI_R_SAME;
|
||||
|
||||
|
@ -634,8 +621,8 @@ static int tegra_output_hdmi_enable(struct tegra_output *output)
|
|||
|
||||
pclk = mode->clock * 1000;
|
||||
h_sync_width = mode->hsync_end - mode->hsync_start;
|
||||
h_front_porch = mode->htotal - mode->hsync_end;
|
||||
h_back_porch = mode->hsync_start - mode->hdisplay;
|
||||
h_back_porch = mode->htotal - mode->hsync_end;
|
||||
h_front_porch = mode->hsync_start - mode->hdisplay;
|
||||
|
||||
err = regulator_enable(hdmi->vdd);
|
||||
if (err < 0) {
|
||||
|
|
|
@ -239,6 +239,8 @@ int host1x_register_client(struct host1x *host1x, struct host1x_client *client)
|
|||
}
|
||||
}
|
||||
|
||||
client->host1x = host1x;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -187,7 +187,7 @@ static struct emc6w201_data *emc6w201_update_device(struct device *dev)
|
|||
* 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,
|
||||
char *buf)
|
||||
|
|
|
@ -49,6 +49,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
|
|||
struct i2c_client *client = to_i2c_client(dev);
|
||||
long temp;
|
||||
short value;
|
||||
s32 err;
|
||||
|
||||
int status = kstrtol(buf, 10, &temp);
|
||||
if (status < 0)
|
||||
|
@ -57,8 +58,8 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da,
|
|||
/* Write value */
|
||||
value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4),
|
||||
(LM73_TEMP_MAX*4)) << 5;
|
||||
i2c_smbus_write_word_swapped(client, attr->index, value);
|
||||
return count;
|
||||
err = i2c_smbus_write_word_swapped(client, attr->index, value);
|
||||
return (err < 0) ? err : count;
|
||||
}
|
||||
|
||||
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 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
|
||||
guarantee arithmetic shift and preserve the sign */
|
||||
int temp = ((s16) (i2c_smbus_read_word_swapped(client,
|
||||
attr->index))*250) / 32;
|
||||
return sprintf(buf, "%d\n", temp);
|
||||
temp = (((s16) err) * 250) / 32;
|
||||
return scnprintf(buf, PAGE_SIZE, "%d\n", temp);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -139,7 +139,7 @@ static unsigned short ali1535_offset;
|
|||
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
|
||||
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;
|
||||
unsigned char temp;
|
||||
|
@ -502,7 +502,7 @@ static DEFINE_PCI_DEVICE_TABLE(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)) {
|
||||
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);
|
||||
}
|
||||
|
||||
static void __devexit ali1535_remove(struct pci_dev *dev)
|
||||
static void ali1535_remove(struct pci_dev *dev)
|
||||
{
|
||||
i2c_del_adapter(&ali1535_adapter);
|
||||
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
|
||||
|
@ -528,7 +528,7 @@ static struct pci_driver ali1535_driver = {
|
|||
.name = "ali1535_smbus",
|
||||
.id_table = ali1535_ids,
|
||||
.probe = ali1535_probe,
|
||||
.remove = __devexit_p(ali1535_remove),
|
||||
.remove = ali1535_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(ali1535_driver);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -390,8 +390,8 @@ static struct i2c_adapter ali1563_adapter = {
|
|||
.algo = &ali1563_algorithm,
|
||||
};
|
||||
|
||||
static int __devinit ali1563_probe(struct pci_dev * dev,
|
||||
const struct pci_device_id * id_table)
|
||||
static int ali1563_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id_table)
|
||||
{
|
||||
int error;
|
||||
|
||||
|
@ -411,7 +411,7 @@ exit:
|
|||
return error;
|
||||
}
|
||||
|
||||
static void __devexit ali1563_remove(struct pci_dev * dev)
|
||||
static void ali1563_remove(struct pci_dev *dev)
|
||||
{
|
||||
i2c_del_adapter(&ali1563_adapter);
|
||||
ali1563_shutdown(dev);
|
||||
|
@ -428,7 +428,7 @@ static struct pci_driver ali1563_pci_driver = {
|
|||
.name = "ali1563_smbus",
|
||||
.id_table = ali1563_id_table,
|
||||
.probe = ali1563_probe,
|
||||
.remove = __devexit_p(ali1563_remove),
|
||||
.remove = ali1563_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(ali1563_pci_driver);
|
||||
|
|
|
@ -131,7 +131,7 @@ MODULE_PARM_DESC(force_addr,
|
|||
static struct pci_driver ali15x3_driver;
|
||||
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;
|
||||
unsigned char temp;
|
||||
|
@ -484,7 +484,7 @@ static DEFINE_PCI_DEVICE_TABLE(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)) {
|
||||
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);
|
||||
}
|
||||
|
||||
static void __devexit ali15x3_remove(struct pci_dev *dev)
|
||||
static void ali15x3_remove(struct pci_dev *dev)
|
||||
{
|
||||
i2c_del_adapter(&ali15x3_adapter);
|
||||
release_region(ali15x3_smba, ALI15X3_SMB_IOSIZE);
|
||||
|
@ -510,7 +510,7 @@ static struct pci_driver ali15x3_driver = {
|
|||
.name = "ali15x3_smbus",
|
||||
.id_table = ali15x3_ids,
|
||||
.probe = ali15x3_probe,
|
||||
.remove = __devexit_p(ali15x3_remove),
|
||||
.remove = ali15x3_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(ali15x3_driver);
|
||||
|
|
|
@ -324,8 +324,7 @@ static DEFINE_PCI_DEVICE_TABLE(amd756_ids) = {
|
|||
|
||||
MODULE_DEVICE_TABLE (pci, amd756_ids);
|
||||
|
||||
static int __devinit amd756_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *id)
|
||||
static int amd756_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
int nforce = (id->driver_data == NFORCE);
|
||||
int error;
|
||||
|
@ -397,7 +396,7 @@ static int __devinit amd756_probe(struct pci_dev *pdev,
|
|||
return error;
|
||||
}
|
||||
|
||||
static void __devexit amd756_remove(struct pci_dev *dev)
|
||||
static void amd756_remove(struct pci_dev *dev)
|
||||
{
|
||||
i2c_del_adapter(&amd756_smbus);
|
||||
release_region(amd756_ioport, SMB_IOSIZE);
|
||||
|
@ -407,7 +406,7 @@ static struct pci_driver amd756_driver = {
|
|||
.name = "amd756_smbus",
|
||||
.id_table = amd756_ids,
|
||||
.probe = amd756_probe,
|
||||
.remove = __devexit_p(amd756_remove),
|
||||
.remove = amd756_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(amd756_driver);
|
||||
|
|
|
@ -422,8 +422,7 @@ static DEFINE_PCI_DEVICE_TABLE(amd8111_ids) = {
|
|||
|
||||
MODULE_DEVICE_TABLE (pci, amd8111_ids);
|
||||
|
||||
static int __devinit amd8111_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id)
|
||||
static int amd8111_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
struct amd_smbus *smbus;
|
||||
int error;
|
||||
|
@ -475,7 +474,7 @@ static int __devinit amd8111_probe(struct pci_dev *dev,
|
|||
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);
|
||||
|
||||
|
@ -488,7 +487,7 @@ static struct pci_driver amd8111_driver = {
|
|||
.name = "amd8111_smbus2",
|
||||
.id_table = amd8111_ids,
|
||||
.probe = amd8111_probe,
|
||||
.remove = __devexit_p(amd8111_remove),
|
||||
.remove = amd8111_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(amd8111_driver);
|
||||
|
|
|
@ -145,7 +145,7 @@ static void at91_init_twi_bus(struct at91_twi_dev *dev)
|
|||
* Calculate symmetric clock as stated in datasheet:
|
||||
* 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;
|
||||
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
|
||||
#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;
|
||||
|
||||
|
@ -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;
|
||||
struct at_dma_slave *sdata;
|
||||
|
@ -688,7 +688,7 @@ error:
|
|||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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 resource *mem;
|
||||
|
@ -779,7 +779,7 @@ static int __devinit at91_twi_probe(struct platform_device *pdev)
|
|||
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);
|
||||
int rc;
|
||||
|
@ -820,7 +820,7 @@ static const struct dev_pm_ops at91_twi_pm = {
|
|||
|
||||
static struct platform_driver at91_twi_driver = {
|
||||
.probe = at91_twi_probe,
|
||||
.remove = __devexit_p(at91_twi_remove),
|
||||
.remove = at91_twi_remove,
|
||||
.id_table = at91_twi_devtypes,
|
||||
.driver = {
|
||||
.name = "at91_i2c",
|
||||
|
|
|
@ -313,7 +313,7 @@ static void i2c_au1550_disable(struct i2c_au1550_data *priv)
|
|||
* Prior to calling us, the 50MHz clock frequency and routing
|
||||
* must have been set up for the PSC indicated by the adapter.
|
||||
*/
|
||||
static int __devinit
|
||||
static int
|
||||
i2c_au1550_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct i2c_au1550_data *priv;
|
||||
|
@ -372,7 +372,7 @@ out:
|
|||
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);
|
||||
|
||||
|
@ -423,7 +423,7 @@ static struct platform_driver au1xpsc_smbus_driver = {
|
|||
.pm = AU1XPSC_SMBUS_PMOPS,
|
||||
},
|
||||
.probe = i2c_au1550_probe,
|
||||
.remove = __devexit_p(i2c_au1550_remove),
|
||||
.remove = i2c_au1550_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(au1xpsc_smbus_driver);
|
||||
|
|
|
@ -426,7 +426,7 @@ static const struct i2c_adapter cpm_ops = {
|
|||
.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;
|
||||
const u32 *data;
|
||||
|
@ -634,7 +634,7 @@ static void cpm_i2c_shutdown(struct cpm_i2c *cpm)
|
|||
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;
|
||||
struct cpm_i2c *cpm;
|
||||
|
@ -688,7 +688,7 @@ out_free:
|
|||
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);
|
||||
|
||||
|
@ -716,7 +716,7 @@ MODULE_DEVICE_TABLE(of, cpm_i2c_match);
|
|||
|
||||
static struct platform_driver cpm_i2c_driver = {
|
||||
.probe = cpm_i2c_probe,
|
||||
.remove = __devexit_p(cpm_i2c_remove),
|
||||
.remove = cpm_i2c_remove,
|
||||
.driver = {
|
||||
.name = "fsl-i2c-cpm",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
|
@ -207,7 +207,7 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
|
|||
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)
|
||||
{
|
||||
struct dw_i2c_dev *dev;
|
||||
|
@ -328,7 +328,7 @@ exit:
|
|||
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);
|
||||
|
||||
|
@ -368,7 +368,7 @@ static struct pci_driver dw_i2c_driver = {
|
|||
.name = DRIVER_NAME,
|
||||
.id_table = i2_designware_pci_ids,
|
||||
.probe = i2c_dw_pci_probe,
|
||||
.remove = __devexit_p(i2c_dw_pci_remove),
|
||||
.remove = i2c_dw_pci_remove,
|
||||
.driver = {
|
||||
.pm = &i2c_dw_pm_ops,
|
||||
},
|
||||
|
|
|
@ -50,7 +50,7 @@ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
|
|||
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 i2c_adapter *adap;
|
||||
|
@ -169,7 +169,7 @@ err_release_region:
|
|||
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 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");
|
||||
|
||||
static struct platform_driver dw_i2c_driver = {
|
||||
.remove = __devexit_p(dw_i2c_remove),
|
||||
.remove = dw_i2c_remove,
|
||||
.driver = {
|
||||
.name = "i2c_designware",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
|
@ -758,7 +758,7 @@ static void pch_i2c_disbl_int(struct i2c_algo_pch_data *adap)
|
|||
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)
|
||||
{
|
||||
void __iomem *base_addr;
|
||||
|
@ -851,7 +851,7 @@ err_pci_enable:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __devexit pch_i2c_remove(struct pci_dev *pdev)
|
||||
static void pch_i2c_remove(struct pci_dev *pdev)
|
||||
{
|
||||
int i;
|
||||
struct adapter_info *adap_info = pci_get_drvdata(pdev);
|
||||
|
@ -948,7 +948,7 @@ static struct pci_driver pch_pcidriver = {
|
|||
.name = KBUILD_MODNAME,
|
||||
.id_table = pch_pcidev_id,
|
||||
.probe = pch_i2c_probe,
|
||||
.remove = __devexit_p(pch_i2c_remove),
|
||||
.remove = pch_i2c_remove,
|
||||
.suspend = pch_i2c_suspend,
|
||||
.resume = pch_i2c_resume
|
||||
};
|
||||
|
|
|
@ -205,7 +205,7 @@ static struct i2c_adapter pcf_isa_ops = {
|
|||
.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__
|
||||
/* 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;
|
||||
}
|
||||
|
||||
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);
|
||||
if (pcf_isa_init())
|
||||
|
@ -293,7 +293,7 @@ static int __devinit elektor_probe(struct device *dev, unsigned int id)
|
|||
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);
|
||||
|
||||
|
@ -316,7 +316,7 @@ static int __devexit elektor_remove(struct device *dev, unsigned int id)
|
|||
static struct isa_driver i2c_elektor_driver = {
|
||||
.match = elektor_match,
|
||||
.probe = elektor_probe,
|
||||
.remove = __devexit_p(elektor_remove),
|
||||
.remove = elektor_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "i2c-elektor",
|
||||
|
|
|
@ -85,7 +85,7 @@ static int i2c_gpio_getscl(void *data)
|
|||
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)
|
||||
{
|
||||
u32 reg;
|
||||
|
@ -117,7 +117,7 @@ static int __devinit of_i2c_gpio_probe(struct device_node *np,
|
|||
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_platform_data *pdata;
|
||||
|
@ -218,7 +218,7 @@ err_request_sda:
|
|||
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_platform_data *pdata;
|
||||
|
@ -251,7 +251,7 @@ static struct platform_driver i2c_gpio_driver = {
|
|||
.of_match_table = of_match_ptr(i2c_gpio_dt_ids),
|
||||
},
|
||||
.probe = i2c_gpio_probe,
|
||||
.remove = __devexit_p(i2c_gpio_remove),
|
||||
.remove = i2c_gpio_remove,
|
||||
};
|
||||
|
||||
static int __init i2c_gpio_init(void)
|
||||
|
|
|
@ -356,7 +356,7 @@ static const struct i2c_algorithm highlander_i2c_algo = {
|
|||
.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 i2c_adapter *adap;
|
||||
|
@ -441,7 +441,7 @@ err:
|
|||
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);
|
||||
|
||||
|
@ -465,7 +465,7 @@ static struct platform_driver highlander_i2c_driver = {
|
|||
},
|
||||
|
||||
.probe = highlander_i2c_probe,
|
||||
.remove = __devexit_p(highlander_i2c_remove),
|
||||
.remove = highlander_i2c_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(highlander_i2c_driver);
|
||||
|
|
|
@ -112,7 +112,7 @@ static DEFINE_PCI_DEVICE_TABLE(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)
|
||||
{
|
||||
unsigned long base = pci_resource_start(dev, 0);
|
||||
|
@ -139,7 +139,7 @@ static int __devinit hydra_probe(struct pci_dev *dev,
|
|||
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 */
|
||||
i2c_del_adapter(&hydra_adap);
|
||||
|
@ -153,7 +153,7 @@ static struct pci_driver hydra_driver = {
|
|||
.name = "hydra_smbus",
|
||||
.id_table = hydra_ids,
|
||||
.probe = hydra_probe,
|
||||
.remove = __devexit_p(hydra_remove),
|
||||
.remove = hydra_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(hydra_driver);
|
||||
|
|
|
@ -841,14 +841,14 @@ struct dmi_onboard_device_info {
|
|||
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" },
|
||||
{ "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
|
||||
{ "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
|
||||
};
|
||||
|
||||
static void __devinit dmi_check_onboard_device(u8 type, const char *name,
|
||||
struct i2c_adapter *adap)
|
||||
static void dmi_check_onboard_device(u8 type, const char *name,
|
||||
struct i2c_adapter *adap)
|
||||
{
|
||||
int i;
|
||||
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
|
||||
dmi_find_device() as some buggy BIOS's have the devices we are interested
|
||||
in marked as disabled */
|
||||
static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
|
||||
void *adap)
|
||||
static void dmi_check_onboard_devices(const struct dmi_header *dm, void *adap)
|
||||
{
|
||||
int i, count;
|
||||
|
||||
|
@ -901,7 +900,7 @@ static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
|
|||
}
|
||||
|
||||
/* 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 */
|
||||
if (priv->features & FEATURE_IDF)
|
||||
|
@ -921,7 +920,7 @@ static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
|
|||
}
|
||||
#else
|
||||
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 */
|
||||
|
||||
#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,
|
||||
};
|
||||
|
||||
static struct dmi_system_id __devinitdata mux_dmi_table[] = {
|
||||
static const struct dmi_system_id mux_dmi_table[] = {
|
||||
{
|
||||
.matches = {
|
||||
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 */
|
||||
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;
|
||||
const struct i801_mux_config *mux_config;
|
||||
|
@ -1048,13 +1047,13 @@ static int __devinit i801_add_mux(struct i801_priv *priv)
|
|||
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)
|
||||
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 i801_mux_config *mux_config;
|
||||
|
@ -1084,8 +1083,7 @@ static inline unsigned int i801_get_adapter_class(struct i801_priv *priv)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int __devinit i801_probe(struct pci_dev *dev,
|
||||
const struct pci_device_id *id)
|
||||
static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
unsigned char temp;
|
||||
int err, i;
|
||||
|
@ -1226,7 +1224,7 @@ exit:
|
|||
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);
|
||||
|
||||
|
@ -1272,7 +1270,7 @@ static struct pci_driver i801_driver = {
|
|||
.name = "i801_smbus",
|
||||
.id_table = i801_ids,
|
||||
.probe = i801_probe,
|
||||
.remove = __devexit_p(i801_remove),
|
||||
.remove = i801_remove,
|
||||
.suspend = i801_suspend,
|
||||
.resume = i801_resume,
|
||||
};
|
||||
|
|
|
@ -660,7 +660,7 @@ static inline u8 iic_clckdiv(unsigned int opb)
|
|||
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 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
|
||||
*/
|
||||
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 ibm_iic_private *dev;
|
||||
|
@ -781,7 +781,7 @@ error_cleanup:
|
|||
/*
|
||||
* 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);
|
||||
|
||||
|
@ -812,7 +812,7 @@ static struct platform_driver ibm_iic_driver = {
|
|||
.of_match_table = ibm_iic_match,
|
||||
},
|
||||
.probe = iic_probe,
|
||||
.remove = __devexit_p(iic_remove),
|
||||
.remove = iic_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(ibm_iic_driver);
|
||||
|
|
|
@ -947,7 +947,7 @@ static const struct dev_pm_ops intel_mid_i2c_pm_ops = {
|
|||
* 5. Call intel_mid_i2c_hwinit() for hardware initialization
|
||||
* 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)
|
||||
{
|
||||
struct intel_mid_i2c_private *mrst;
|
||||
|
@ -1079,7 +1079,7 @@ exit:
|
|||
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);
|
||||
intel_mid_i2c_disable(&mrst->adap);
|
||||
|
@ -1113,7 +1113,7 @@ static struct pci_driver intel_mid_i2c_driver = {
|
|||
.name = DRIVER_NAME,
|
||||
.id_table = intel_mid_i2c_ids,
|
||||
.probe = intel_mid_i2c_probe,
|
||||
.remove = __devexit_p(intel_mid_i2c_remove),
|
||||
.remove = intel_mid_i2c_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(intel_mid_i2c_driver);
|
||||
|
|
|
@ -249,7 +249,7 @@ static struct i2c_adapter sch_adapter = {
|
|||
.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;
|
||||
int retval;
|
||||
|
@ -284,7 +284,7 @@ static int __devinit smbus_sch_probe(struct platform_device *dev)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int __devexit smbus_sch_remove(struct platform_device *pdev)
|
||||
static int smbus_sch_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
if (sch_smba) {
|
||||
|
@ -303,7 +303,7 @@ static struct platform_driver smbus_sch_driver = {
|
|||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = smbus_sch_probe,
|
||||
.remove = __devexit_p(smbus_sch_remove),
|
||||
.remove = smbus_sch_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(smbus_sch_driver);
|
||||
|
|
|
@ -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)
|
||||
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},
|
||||
{28, 0x24}, {30, 0x01}, {32, 0x25}, {34, 0x02},
|
||||
{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}
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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,
|
||||
u32 clock, u32 prescaler)
|
||||
{
|
||||
|
@ -252,7 +252,7 @@ static void __devinit mpc_i2c_setup_52xx(struct device_node *node,
|
|||
fdr);
|
||||
}
|
||||
#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,
|
||||
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 */
|
||||
|
||||
#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,
|
||||
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);
|
||||
}
|
||||
#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,
|
||||
u32 clock, u32 prescaler)
|
||||
{
|
||||
|
@ -296,7 +296,7 @@ static void __devinit mpc_i2c_setup_512x(struct device_node *node,
|
|||
#endif /* CONFIG_PPC_MPC512x */
|
||||
|
||||
#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},
|
||||
{288, 0x0100}, {320, 0x0101}, {352, 0x0601}, {384, 0x0102},
|
||||
{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}
|
||||
};
|
||||
|
||||
static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void)
|
||||
static u32 mpc_i2c_get_sec_cfg_8xxx(void)
|
||||
{
|
||||
struct device_node *node = NULL;
|
||||
u32 __iomem *reg;
|
||||
|
@ -345,7 +345,7 @@ static u32 __devinit mpc_i2c_get_sec_cfg_8xxx(void)
|
|||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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,
|
||||
u32 clock, u32 prescaler)
|
||||
{
|
||||
|
@ -408,7 +408,7 @@ static void __devinit mpc_i2c_setup_8xxx(struct device_node *node,
|
|||
}
|
||||
|
||||
#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,
|
||||
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 int __devinit fsl_i2c_probe(struct platform_device *op)
|
||||
static int fsl_i2c_probe(struct platform_device *op)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct mpc_i2c *i2c;
|
||||
|
@ -706,7 +706,7 @@ static int __devinit fsl_i2c_probe(struct platform_device *op)
|
|||
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);
|
||||
|
||||
|
@ -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);
|
||||
#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,
|
||||
};
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
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,
|
||||
.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,
|
||||
.prescaler = 3,
|
||||
};
|
||||
|
@ -785,7 +785,7 @@ MODULE_DEVICE_TABLE(of, mpc_i2c_of_match);
|
|||
/* Structure for a device driver */
|
||||
static struct platform_driver mpc_i2c_driver = {
|
||||
.probe = fsl_i2c_probe,
|
||||
.remove = __devexit_p(fsl_i2c_remove),
|
||||
.remove = fsl_i2c_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = DRV_NAME,
|
||||
|
|
|
@ -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,
|
||||
struct mv64xxx_i2c_data *drv_data)
|
||||
{
|
||||
|
@ -530,13 +530,13 @@ mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static int __devinit
|
||||
static int
|
||||
mv64xxx_calc_freq(const int tclk, const int n, const int m)
|
||||
{
|
||||
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,
|
||||
u32 *best_m)
|
||||
{
|
||||
|
@ -560,7 +560,7 @@ mv64xxx_find_baud_factors(const u32 req_freq, const u32 tclk, u32 *best_n,
|
|||
return true;
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
static int
|
||||
mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
|
||||
struct device_node *np)
|
||||
{
|
||||
|
@ -597,7 +597,7 @@ out:
|
|||
#endif
|
||||
}
|
||||
#else /* CONFIG_OF */
|
||||
static int __devinit
|
||||
static int
|
||||
mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
|
||||
struct device_node *np)
|
||||
{
|
||||
|
@ -605,7 +605,7 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
|
|||
}
|
||||
#endif /* CONFIG_OF */
|
||||
|
||||
static int __devinit
|
||||
static int
|
||||
mv64xxx_i2c_probe(struct platform_device *pd)
|
||||
{
|
||||
struct mv64xxx_i2c_data *drv_data;
|
||||
|
@ -697,7 +697,7 @@ mv64xxx_i2c_probe(struct platform_device *pd)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int __devexit
|
||||
static int
|
||||
mv64xxx_i2c_remove(struct platform_device *dev)
|
||||
{
|
||||
struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(dev);
|
||||
|
@ -718,7 +718,7 @@ mv64xxx_i2c_remove(struct platform_device *dev)
|
|||
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", },
|
||||
{}
|
||||
};
|
||||
|
@ -726,7 +726,7 @@ MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table);
|
|||
|
||||
static struct platform_driver mv64xxx_i2c_driver = {
|
||||
.probe = mv64xxx_i2c_probe,
|
||||
.remove = __devexit_p(mv64xxx_i2c_remove),
|
||||
.remove = mv64xxx_i2c_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = MV64XXX_I2C_CTLR_NAME,
|
||||
|
|
|
@ -432,7 +432,7 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c)
|
|||
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 mxs_i2c_dev *i2c;
|
||||
|
@ -515,7 +515,7 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
|
|||
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);
|
||||
int ret;
|
||||
|
@ -546,7 +546,7 @@ static struct platform_driver mxs_i2c_driver = {
|
|||
.owner = THIS_MODULE,
|
||||
.of_match_table = mxs_i2c_dt_ids,
|
||||
},
|
||||
.remove = __devexit_p(mxs_i2c_remove),
|
||||
.remove = mxs_i2c_remove,
|
||||
};
|
||||
|
||||
static int __init mxs_i2c_init(void)
|
||||
|
|
|
@ -117,7 +117,7 @@ struct nforce2_smbus {
|
|||
#define MAX_TIMEOUT 100
|
||||
|
||||
/* 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",
|
||||
.matches = {
|
||||
|
@ -330,8 +330,8 @@ static DEFINE_PCI_DEVICE_TABLE(nforce2_ids) = {
|
|||
MODULE_DEVICE_TABLE (pci, nforce2_ids);
|
||||
|
||||
|
||||
static int __devinit nforce2_probe_smb (struct pci_dev *dev, int bar,
|
||||
int alt_reg, struct nforce2_smbus *smbus, const char *name)
|
||||
static int nforce2_probe_smb(struct pci_dev *dev, int bar, int alt_reg,
|
||||
struct nforce2_smbus *smbus, const char *name)
|
||||
{
|
||||
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;
|
||||
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);
|
||||
|
||||
|
@ -450,7 +450,7 @@ static struct pci_driver nforce2_driver = {
|
|||
.name = "nForce2_smbus",
|
||||
.id_table = nforce2_ids,
|
||||
.probe = nforce2_probe,
|
||||
.remove = __devexit_p(nforce2_remove),
|
||||
.remove = nforce2_remove,
|
||||
};
|
||||
|
||||
module_pci_driver(nforce2_driver);
|
||||
|
|
|
@ -518,7 +518,7 @@ static const struct i2c_algorithm nuc900_i2c_algorithm = {
|
|||
* 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_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
|
||||
*/
|
||||
|
||||
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);
|
||||
|
||||
|
@ -684,7 +684,7 @@ static int __devexit nuc900_i2c_remove(struct platform_device *pdev)
|
|||
|
||||
static struct platform_driver nuc900_i2c_driver = {
|
||||
.probe = nuc900_i2c_probe,
|
||||
.remove = __devexit_p(nuc900_i2c_remove),
|
||||
.remove = nuc900_i2c_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "nuc900-i2c0",
|
||||
|
|
|
@ -343,7 +343,7 @@ static int ocores_i2c_of_probe(struct platform_device *pdev,
|
|||
#define ocores_i2c_of_probe(pdev,i2c) -ENODEV
|
||||
#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_platform_data *pdata;
|
||||
|
@ -441,7 +441,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
|
|||
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);
|
||||
|
||||
|
@ -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 = {
|
||||
.probe = ocores_i2c_probe,
|
||||
.remove = __devexit_p(ocores_i2c_remove),
|
||||
.remove = ocores_i2c_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "ocores-i2c",
|
||||
|
|
|
@ -446,7 +446,7 @@ static struct i2c_adapter octeon_i2c_ops = {
|
|||
/**
|
||||
* 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 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;
|
||||
}
|
||||
|
||||
static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
static int octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
||||
{
|
||||
u8 status;
|
||||
int tries;
|
||||
|
@ -510,7 +510,7 @@ static int __devinit octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
|
|||
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;
|
||||
struct octeon_i2c *i2c;
|
||||
|
@ -609,7 +609,7 @@ out:
|
|||
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);
|
||||
|
||||
|
@ -628,7 +628,7 @@ MODULE_DEVICE_TABLE(of, octeon_i2c_match);
|
|||
|
||||
static struct platform_driver octeon_i2c_driver = {
|
||||
.probe = octeon_i2c_probe,
|
||||
.remove = __devexit_p(octeon_i2c_remove),
|
||||
.remove = octeon_i2c_remove,
|
||||
.driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = DRV_NAME,
|
||||
|
|
|
@ -1069,7 +1069,7 @@ MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
|
|||
#define OMAP_I2C_SCHEME_0 0
|
||||
#define OMAP_I2C_SCHEME_1 1
|
||||
|
||||
static int __devinit
|
||||
static int
|
||||
omap_i2c_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct omap_i2c_dev *dev;
|
||||
|
@ -1267,7 +1267,7 @@ err_free_mem:
|
|||
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);
|
||||
int ret;
|
||||
|
@ -1333,7 +1333,7 @@ static struct dev_pm_ops omap_i2c_pm_ops = {
|
|||
|
||||
static struct platform_driver omap_i2c_driver = {
|
||||
.probe = omap_i2c_probe,
|
||||
.remove = __devexit_p(omap_i2c_remove),
|
||||
.remove = omap_i2c_remove,
|
||||
.driver = {
|
||||
.name = "omap_i2c",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue