6473d160b4
I noticed that many source files include <linux/pci.h> while they do not appear to need it. Here is an attempt to clean it all up. In order to find all possibly affected files, I searched for all files including <linux/pci.h> but without any other occurence of "pci" or "PCI". I removed the include statement from all of these, then I compiled an allmodconfig kernel on both i386 and x86_64 and fixed the false positives manually. My tests covered 66% of the affected files, so there could be false positives remaining. Untested files are: arch/alpha/kernel/err_common.c arch/alpha/kernel/err_ev6.c arch/alpha/kernel/err_ev7.c arch/ia64/sn/kernel/huberror.c arch/ia64/sn/kernel/xpnet.c arch/m68knommu/kernel/dma.c arch/mips/lib/iomap.c arch/powerpc/platforms/pseries/ras.c arch/ppc/8260_io/enet.c arch/ppc/8260_io/fcc_enet.c arch/ppc/8xx_io/enet.c arch/ppc/syslib/ppc4xx_sgdma.c arch/sh64/mach-cayman/iomap.c arch/xtensa/kernel/xtensa_ksyms.c arch/xtensa/platform-iss/setup.c drivers/i2c/busses/i2c-at91.c drivers/i2c/busses/i2c-mpc.c drivers/media/video/saa711x.c drivers/misc/hdpuftrs/hdpu_cpustate.c drivers/misc/hdpuftrs/hdpu_nexus.c drivers/net/au1000_eth.c drivers/net/fec_8xx/fec_main.c drivers/net/fec_8xx/fec_mii.c drivers/net/fs_enet/fs_enet-main.c drivers/net/fs_enet/mac-fcc.c drivers/net/fs_enet/mac-fec.c drivers/net/fs_enet/mac-scc.c drivers/net/fs_enet/mii-bitbang.c drivers/net/fs_enet/mii-fec.c drivers/net/ibm_emac/ibm_emac_core.c drivers/net/lasi_82596.c drivers/parisc/hppb.c drivers/sbus/sbus.c drivers/video/g364fb.c drivers/video/platinumfb.c drivers/video/stifb.c drivers/video/valkyriefb.c include/asm-arm/arch-ixp4xx/dma.h sound/oss/au1550_ac97.c I would welcome test reports for these files. I am fine with removing the untested files from the patch if the general opinion is that these changes aren't safe. The tested part would still be nice to have. Note that this patch depends on another header fixup patch I submitted to LKML yesterday: [PATCH] scatterlist.h needs types.h http://lkml.org/lkml/2007/3/01/141 Signed-off-by: Jean Delvare <khali@linux-fr.org> Cc: Badari Pulavarty <pbadari@us.ibm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
168 lines
4 KiB
C
168 lines
4 KiB
C
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/fb.h>
|
|
|
|
|
|
#include <linux/i2c.h>
|
|
#include <linux/i2c-id.h>
|
|
#include <linux/i2c-algo-bit.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
#include <video/radeon.h>
|
|
#include "radeonfb.h"
|
|
#include "../edid.h"
|
|
|
|
static void radeon_gpio_setscl(void* data, int state)
|
|
{
|
|
struct radeon_i2c_chan *chan = data;
|
|
struct radeonfb_info *rinfo = chan->rinfo;
|
|
u32 val;
|
|
|
|
val = INREG(chan->ddc_reg) & ~(VGA_DDC_CLK_OUT_EN);
|
|
if (!state)
|
|
val |= VGA_DDC_CLK_OUT_EN;
|
|
|
|
OUTREG(chan->ddc_reg, val);
|
|
(void)INREG(chan->ddc_reg);
|
|
}
|
|
|
|
static void radeon_gpio_setsda(void* data, int state)
|
|
{
|
|
struct radeon_i2c_chan *chan = data;
|
|
struct radeonfb_info *rinfo = chan->rinfo;
|
|
u32 val;
|
|
|
|
val = INREG(chan->ddc_reg) & ~(VGA_DDC_DATA_OUT_EN);
|
|
if (!state)
|
|
val |= VGA_DDC_DATA_OUT_EN;
|
|
|
|
OUTREG(chan->ddc_reg, val);
|
|
(void)INREG(chan->ddc_reg);
|
|
}
|
|
|
|
static int radeon_gpio_getscl(void* data)
|
|
{
|
|
struct radeon_i2c_chan *chan = data;
|
|
struct radeonfb_info *rinfo = chan->rinfo;
|
|
u32 val;
|
|
|
|
val = INREG(chan->ddc_reg);
|
|
|
|
return (val & VGA_DDC_CLK_INPUT) ? 1 : 0;
|
|
}
|
|
|
|
static int radeon_gpio_getsda(void* data)
|
|
{
|
|
struct radeon_i2c_chan *chan = data;
|
|
struct radeonfb_info *rinfo = chan->rinfo;
|
|
u32 val;
|
|
|
|
val = INREG(chan->ddc_reg);
|
|
|
|
return (val & VGA_DDC_DATA_INPUT) ? 1 : 0;
|
|
}
|
|
|
|
static int radeon_setup_i2c_bus(struct radeon_i2c_chan *chan, const char *name)
|
|
{
|
|
int rc;
|
|
|
|
strcpy(chan->adapter.name, name);
|
|
chan->adapter.owner = THIS_MODULE;
|
|
chan->adapter.id = I2C_HW_B_RADEON;
|
|
chan->adapter.algo_data = &chan->algo;
|
|
chan->adapter.dev.parent = &chan->rinfo->pdev->dev;
|
|
chan->algo.setsda = radeon_gpio_setsda;
|
|
chan->algo.setscl = radeon_gpio_setscl;
|
|
chan->algo.getsda = radeon_gpio_getsda;
|
|
chan->algo.getscl = radeon_gpio_getscl;
|
|
chan->algo.udelay = 40;
|
|
chan->algo.timeout = 20;
|
|
chan->algo.data = chan;
|
|
|
|
i2c_set_adapdata(&chan->adapter, chan);
|
|
|
|
/* Raise SCL and SDA */
|
|
radeon_gpio_setsda(chan, 1);
|
|
radeon_gpio_setscl(chan, 1);
|
|
udelay(20);
|
|
|
|
rc = i2c_bit_add_bus(&chan->adapter);
|
|
if (rc == 0)
|
|
dev_dbg(&chan->rinfo->pdev->dev, "I2C bus %s registered.\n", name);
|
|
else
|
|
dev_warn(&chan->rinfo->pdev->dev, "Failed to register I2C bus %s.\n", name);
|
|
return rc;
|
|
}
|
|
|
|
void radeon_create_i2c_busses(struct radeonfb_info *rinfo)
|
|
{
|
|
rinfo->i2c[0].rinfo = rinfo;
|
|
rinfo->i2c[0].ddc_reg = GPIO_MONID;
|
|
radeon_setup_i2c_bus(&rinfo->i2c[0], "monid");
|
|
|
|
rinfo->i2c[1].rinfo = rinfo;
|
|
rinfo->i2c[1].ddc_reg = GPIO_DVI_DDC;
|
|
radeon_setup_i2c_bus(&rinfo->i2c[1], "dvi");
|
|
|
|
rinfo->i2c[2].rinfo = rinfo;
|
|
rinfo->i2c[2].ddc_reg = GPIO_VGA_DDC;
|
|
radeon_setup_i2c_bus(&rinfo->i2c[2], "vga");
|
|
|
|
rinfo->i2c[3].rinfo = rinfo;
|
|
rinfo->i2c[3].ddc_reg = GPIO_CRT2_DDC;
|
|
radeon_setup_i2c_bus(&rinfo->i2c[3], "crt2");
|
|
}
|
|
|
|
void radeon_delete_i2c_busses(struct radeonfb_info *rinfo)
|
|
{
|
|
if (rinfo->i2c[0].rinfo)
|
|
i2c_del_adapter(&rinfo->i2c[0].adapter);
|
|
rinfo->i2c[0].rinfo = NULL;
|
|
|
|
if (rinfo->i2c[1].rinfo)
|
|
i2c_del_adapter(&rinfo->i2c[1].adapter);
|
|
rinfo->i2c[1].rinfo = NULL;
|
|
|
|
if (rinfo->i2c[2].rinfo)
|
|
i2c_del_adapter(&rinfo->i2c[2].adapter);
|
|
rinfo->i2c[2].rinfo = NULL;
|
|
|
|
if (rinfo->i2c[3].rinfo)
|
|
i2c_del_adapter(&rinfo->i2c[3].adapter);
|
|
rinfo->i2c[3].rinfo = NULL;
|
|
}
|
|
|
|
int radeon_probe_i2c_connector(struct radeonfb_info *rinfo, int conn,
|
|
u8 **out_edid)
|
|
{
|
|
u32 reg = rinfo->i2c[conn-1].ddc_reg;
|
|
u8 *edid;
|
|
|
|
OUTREG(reg, INREG(reg) &
|
|
~(VGA_DDC_DATA_OUTPUT | VGA_DDC_CLK_OUTPUT));
|
|
|
|
edid = fb_ddc_read(&rinfo->i2c[conn-1].adapter);
|
|
|
|
if (out_edid)
|
|
*out_edid = edid;
|
|
if (!edid) {
|
|
RTRACE("radeonfb: I2C (port %d) ... not found\n", conn);
|
|
return MT_NONE;
|
|
}
|
|
if (edid[0x14] & 0x80) {
|
|
/* Fix detection using BIOS tables */
|
|
if (rinfo->is_mobility /*&& conn == ddc_dvi*/ &&
|
|
(INREG(LVDS_GEN_CNTL) & LVDS_ON)) {
|
|
RTRACE("radeonfb: I2C (port %d) ... found LVDS panel\n", conn);
|
|
return MT_LCD;
|
|
} else {
|
|
RTRACE("radeonfb: I2C (port %d) ... found TMDS panel\n", conn);
|
|
return MT_DFP;
|
|
}
|
|
}
|
|
RTRACE("radeonfb: I2C (port %d) ... found CRT display\n", conn);
|
|
return MT_CRT;
|
|
}
|
|
|