At present, drivers/video/chipsfb.c can only be used on PPC, and it
doesn't compile even on PPC. The patch below makes it compile, and by
changing it to use the generic inb/outb, means that there is at least
a chance it can be used on other platforms. The patch is against
2.4.3-pre7, could you apply it please?
Paul.
diff -urN linux/drivers/video/chipsfb.c pmac/drivers/video/chipsfb.c
--- linux/drivers/video/chipsfb.c Thu Feb 22 14:25:27 2001
+++ pmac/drivers/video/chipsfb.c Sat Mar 3 21:17:19 2001
@@ -29,17 +29,19 @@
#include <linux/selection.h>
#include <linux/init.h>
#include <linux/pci.h>
+#include <asm/io.h>
+
#ifdef CONFIG_FB_COMPAT_XPMAC
#include <asm/vc_ioctl.h>
-#endif
-#include <asm/io.h>
-#include <asm/prom.h>
#include <asm/pci-bridge.h>
+#endif
#ifdef CONFIG_PMAC_BACKLIGHT
#include <asm/backlight.h>
#endif
+#ifdef CONFIG_PMAC_PBOOK
#include <linux/adb.h>
#include <linux/pmu.h>
+#endif
#include <video/fbcon.h>
#include <video/fbcon-cfb8.h>
@@ -56,14 +58,13 @@
struct {
__u8 red, green, blue;
} palette[256];
+ struct pci_dev *pdev;
unsigned long frame_buffer_phys;
__u8 *frame_buffer;
unsigned long blitter_regs_phys;
__u32 *blitter_regs;
unsigned long blitter_data_phys;
__u8 *blitter_data;
- unsigned long io_base_phys;
- __u8 *io_base;
struct fb_info_chips *next;
#ifdef CONFIG_PMAC_PBOOK
unsigned char *save_framebuffer;
@@ -74,10 +75,10 @@
};
#define write_ind(num, val, ap, dp) do { \
- out_8(p->io_base + (ap), (num)); out_8(p->io_base + (dp), (val)); \
+ outb((num), (ap)); outb((val), (dp)); \
} while (0)
#define read_ind(num, var, ap, dp) do { \
- out_8(p->io_base + (ap), (num)); var = in_8(p->io_base + (dp)); \
+ outb((num), (ap)); var = inb((dp)); \
} while (0);
/* extension registers */
@@ -97,10 +98,10 @@
#define read_sr(num, var) read_ind(num, var, 0x3c4, 0x3c5)
/* attribute registers - slightly strange */
#define write_ar(num, val) do { \
- in_8(p->io_base + 0x3da); write_ind(num, val, 0x3c0, 0x3c0); \
+ inb(0x3da); write_ind(num, val, 0x3c0, 0x3c0); \
} while (0)
#define read_ar(num, var) do { \
- in_8(p->io_base + 0x3da); read_ind(num, var, 0x3c0, 0x3c1); \
+ inb(0x3da); read_ind(num, var, 0x3c0, 0x3c1); \
} while (0)
static struct fb_info_chips *all_chips;
@@ -117,7 +118,7 @@
*/
int chips_init(void);
-static void chips_of_init(struct device_node *dp);
+static void chips_pci_init(struct pci_dev *dp);
static int chips_get_fix(struct fb_fix_screeninfo *fix, int con,
struct fb_info *info);
static int chips_get_var(struct fb_var_screeninfo *var, int con,
@@ -253,29 +254,29 @@
#endif /* CONFIG_PMAC_BACKLIGHT */
/* get the palette from the chip */
for (i = 0; i < 256; ++i) {
- out_8(p->io_base + 0x3c7, i);
+ outb(i, 0x3c7);
udelay(1);
- p->palette[i].red = in_8(p->io_base + 0x3c9);
- p->palette[i].green = in_8(p->io_base + 0x3c9);
- p->palette[i].blue = in_8(p->io_base + 0x3c9);
+ p->palette[i].red = inb(0x3c9);
+ p->palette[i].green = inb(0x3c9);
+ p->palette[i].blue = inb(0x3c9);
}
for (i = 0; i < 256; ++i) {
- out_8(p->io_base + 0x3c8, i);
+ outb(i, 0x3c8);
udelay(1);
- out_8(p->io_base + 0x3c9, 0);
- out_8(p->io_base + 0x3c9, 0);
- out_8(p->io_base + 0x3c9, 0);
+ outb(0, 0x3c9);
+ outb(0, 0x3c9);
+ outb(0, 0x3c9);
}
} else {
#ifdef CONFIG_PMAC_BACKLIGHT
set_backlight_enable(1);
#endif /* CONFIG_PMAC_BACKLIGHT */
for (i = 0; i < 256; ++i) {
- out_8(p->io_base + 0x3c8, i);
+ outb(i, 0x3c8);
udelay(1);
- out_8(p->io_base + 0x3c9, p->palette[i].red);
- out_8(p->io_base + 0x3c9, p->palette[i].green);
- out_8(p->io_base + 0x3c9, p->palette[i].blue);
+ outb(p->palette[i].red, 0x3c9);
+ outb(p->palette[i].green, 0x3c9);
+ outb(p->palette[i].blue, 0x3c9);
}
}
}
@@ -307,11 +308,11 @@
p->palette[regno].red = red;
p->palette[regno].green = green;
p->palette[regno].blue = blue;
- out_8(p->io_base + 0x3c8, regno);
+ outb(regno, 0x3c8);
udelay(1);
- out_8(p->io_base + 0x3c9, red);
- out_8(p->io_base + 0x3c9, green);
- out_8(p->io_base + 0x3c9, blue);
+ outb(red, 0x3c9);
+ outb(green, 0x3c9);
+ outb(blue, 0x3c9);
#ifdef FBCON_HAS_CFB16
if (regno < 16)
@@ -388,7 +389,7 @@
disp->visual = fix->visual;
disp->var = *var;
-#if (defined(CONFIG_PMAC_PBOOK) || defined(CONFIG_FB_COMPAT_XPMAC))
+#ifdef CONFIG_FB_COMPAT_XPMAC
display_info.depth = bpp;
display_info.pitch = fix->line_length;
#endif
@@ -517,7 +518,7 @@
for (i = 0; i < N_ELTS(chips_init_xr); ++i)
write_xr(chips_init_xr[i].addr, chips_init_xr[i].data);
- out_8(p->io_base + 0x3c2, 0x29); /* set misc output reg */
+ outb(0x29, 0x3c2); /* set misc output reg */
for (i = 0; i < N_ELTS(chips_init_sr); ++i)
write_sr(chips_init_sr[i].addr, chips_init_sr[i].data);
for (i = 0; i < N_ELTS(chips_init_gr); ++i)
@@ -545,7 +546,6 @@
// * 3400 has 1MB (I think). Don't know if it's expandable.
// -- Tim Seufert
p->fix.smem_len = 0x100000; // 1MB
- p->fix.mmio_start = p->io_base_phys;
p->fix.type = FB_TYPE_PACKED_PIXELS;
p->fix.visual = FB_VISUAL_PSEUDOCOLOR;
p->fix.line_length = 800;
@@ -607,6 +607,8 @@
#ifdef CONFIG_FB_COMPAT_XPMAC
if (!console_fb_info) {
+ unsigned long iobase;
+
display_info.height = p->var.yres;
display_info.width = p->var.xres;
display_info.depth = 8;
@@ -615,8 +617,9 @@
strncpy(display_info.name, "chips65550",
sizeof(display_info.name));
display_info.fb_address = p->frame_buffer_phys;
- display_info.cmap_adr_address = p->io_base_phys + 0x3c8;
- display_info.cmap_data_address = p->io_base_phys + 0x3c9;
+ iobase = pci_bus_io_base_phys(p->pdev->bus->number);
+ display_info.cmap_adr_address = iobase + 0x3c8;
+ display_info.cmap_data_address = iobase + 0x3c9;
display_info.disp_reg_address = p->blitter_regs_phys;
console_fb_info = &p->info;
}
@@ -632,35 +635,39 @@
int __init chips_init(void)
{
- struct device_node *dp;
+ struct pci_dev *dp = NULL;
- dp = find_devices("chips65550");
- if (dp != 0)
- chips_of_init(dp);
- return 0;
+ while ((dp = pci_find_device(PCI_VENDOR_ID_CT,
+ PCI_DEVICE_ID_CT_65550, dp)) != NULL)
+ if ((dp->class >> 16) == PCI_BASE_CLASS_DISPLAY)
+ chips_pci_init(dp);
+ return all_chips? 0: -ENODEV;
}
-static void __init chips_of_init(struct device_node *dp)
+static void __init chips_pci_init(struct pci_dev *dp)
{
struct fb_info_chips *p;
- unsigned long addr;
- unsigned char bus, devfn;
+ unsigned long addr, size;
unsigned short cmd;
- if (dp->n_addrs == 0)
+ if ((dp->resource[0].flags & IORESOURCE_MEM) == 0)
+ return;
+ addr = dp->resource[0].start;
+ size = dp->resource[0].end + 1 - addr;
+ if (addr == 0)
return;
p = kmalloc(sizeof(*p), GFP_ATOMIC);
if (p == 0)
return;
memset(p, 0, sizeof(*p));
- addr = dp->addrs[0].address;
- if (!request_mem_region(addr, dp->addrs[0].size, "chipsfb")) {
+ if (!request_mem_region(addr, size, "chipsfb")) {
kfree(p);
return;
}
#ifdef __BIG_ENDIAN
addr += 0x800000; // Use big-endian aperture
#endif
+ p->pdev = dp;
p->frame_buffer_phys = addr;
p->frame_buffer = __ioremap(addr, 0x200000, _PAGE_NO_CACHE);
p->blitter_regs_phys = addr + 0x400000;
@@ -668,14 +675,12 @@
p->blitter_data_phys = addr + 0x410000;
p->blitter_data = ioremap(addr + 0x410000, 0x10000);
- if (pci_device_loc(dp, &bus, &devfn) == 0) {
- pcibios_read_config_word(bus, devfn, PCI_COMMAND, &cmd);
- cmd |= 3; /* enable memory and IO space */
- pcibios_write_config_word(bus, devfn, PCI_COMMAND, cmd);
- p->io_base = (__u8 *) pci_io_base(bus);
- /* XXX really want the physical address here */
- p->io_base_phys = (unsigned long) pci_io_base(bus);
- }
+ /* we should use pci_enable_device here, but,
+ the device doesn't declare its I/O ports in its BARs
+ so pci_enable_device won't turn on I/O responses */
+ pci_read_config_word(dp, PCI_COMMAND, &cmd);
+ cmd |= 3; /* enable memory and IO space */
+ pci_write_config_word(dp, PCI_COMMAND, cmd);
/* Clear the entire framebuffer */
memset(p->frame_buffer, 0, 0x100000);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/