From: "Antonino A. Daplas" <adaplas@gmail.com>
To: linux-fbdev-devel@lists.sourceforge.net
Cc: Ralf Baechle <ralf@linux-mips.org>, Andrew Morton <akpm@osdl.org>
Subject: Re: Fw: [PATCH 2/3] DEC PMAG BA frame buffer update
Date: Sun, 07 Aug 2005 18:24:34 +0800 [thread overview]
Message-ID: <42F5E162.4070400@gmail.com> (raw)
In-Reply-To: <20050803215954.47d3cfc1.akpm@osdl.org>
Andrew Morton wrote:
> for reviewing pleasure (Ralf is shy)
Looks good.
Acked-by: Antonino Daplas <adaplas@pol.net>
PS: Is it possible to port this to the driver model?
>
> Begin forwarded message:
>
> Date: Tue, 2 Aug 2005 11:37:34 +0100
> From: Ralf Baechle <ralf@linux-mips.org>
> To: Andrew Morton <akpm@osdl.org>
> Subject: [PATCH 2/3] DEC PMAG BA frame buffer update
>
>
> Rewrite PMAG BA frame buffer driver for 2.6.
>
> diff -urN linux-2.6.13-rc4/drivers/video/pmag-ba-fb.c linux-cvs/drivers/video/pmag-ba-fb.c
> --- linux-2.6.13-rc4/drivers/video/pmag-ba-fb.c 2005-03-17 11:53:40.000000000 +0000
> +++ linux-cvs/drivers/video/pmag-ba-fb.c 2005-07-11 21:55:31.000000000 +0100
> @@ -1,57 +1,55 @@
> /*
> - * linux/drivers/video/pmag-ba-fb.c
> + * linux/drivers/video/pmag-ba-fb.c
> *
> - * PMAG-BA TurboChannel framebuffer card support ... derived from:
> + * PMAG-BA TURBOchannel Color Frame Buffer (CFB) card support,
> + * derived from:
> * "HP300 Topcat framebuffer support (derived from macfb of all things)
> * Phil Blundell <philb@gnu.org> 1998", the original code can be
> - * found in the file hpfb.c in the same directory.
> + * found in the file hpfb.c in the same directory.
> *
> * Based on digital document:
> * "PMAG-BA TURBOchannel Color Frame Buffer
> * Functional Specification", Revision 1.2, August 27, 1990
> *
> - * DECstation related code Copyright (C) 1999, 2000, 2001 by
> - * Michael Engel <engel@unix-ag.org>,
> - * Karsten Merker <merker@linuxtag.org> and
> + * DECstation related code Copyright (C) 1999, 2000, 2001 by
> + * Michael Engel <engel@unix-ag.org>,
> + * Karsten Merker <merker@linuxtag.org> and
> * Harald Koerfgen.
> - * This file is subject to the terms and conditions of the GNU General
> - * Public License. See the file COPYING in the main directory of this
> - * archive for more details.
> + * Copyright (c) 2005 Maciej W. Rozycki
> *
> + * This file is subject to the terms and conditions of the GNU General
> + * Public License. See the file COPYING in the main directory of this
> + * archive for more details.
> */
> -#include <linux/module.h>
> -#include <linux/kernel.h>
> -#include <linux/sched.h>
> +
> +#include <linux/compiler.h>
> #include <linux/errno.h>
> -#include <linux/string.h>
> -#include <linux/timer.h>
> -#include <linux/mm.h>
> -#include <linux/tty.h>
> -#include <linux/slab.h>
> -#include <linux/delay.h>
> -#include <linux/init.h>
> #include <linux/fb.h>
> -#include <asm/bootinfo.h>
> -#include <asm/dec/machtype.h>
> +#include <linux/init.h>
> +#include <linux/kernel.h>
> +#include <linux/module.h>
> +#include <linux/types.h>
> +
> +#include <asm/bug.h>
> +#include <asm/io.h>
> +#include <asm/system.h>
> +
> #include <asm/dec/tc.h>
> +
> #include <video/pmag-ba-fb.h>
>
> -struct pmag_ba_ramdac_regs {
> - unsigned char addr_low;
> - unsigned char pad0[3];
> - unsigned char addr_hi;
> - unsigned char pad1[3];
> - unsigned char data;
> - unsigned char pad2[3];
> - unsigned char cmap;
> +
> +struct pmagbafb_par {
> + struct fb_info *next;
> + volatile void __iomem *mmio;
> + volatile u32 __iomem *dac;
> + int slot;
> };
>
> -/*
> - * Max 3 TURBOchannel slots -> max 3 PMAG-BA :)
> - */
> -static struct fb_info pmagba_fb_info[3];
>
> -static struct fb_var_screeninfo pmagbafb_defined = {
> +static struct fb_info *root_pmagbafb_dev;
> +
> +static struct fb_var_screeninfo pmagbafb_defined __initdata = {
> .xres = 1024,
> .yres = 864,
> .xres_virtual = 1024,
> @@ -61,58 +59,71 @@
> .green.length = 8,
> .blue.length = 8,
> .activate = FB_ACTIVATE_NOW,
> - .height = 274,
> - .width = 195,
> - .accel = FB_ACCEL_NONE,
> + .height = -1,
> + .width = -1,
> + .accel_flags = FB_ACCEL_NONE,
> + .pixclock = 14452,
> + .left_margin = 116,
> + .right_margin = 12,
> + .upper_margin = 34,
> + .lower_margin = 12,
> + .hsync_len = 128,
> + .vsync_len = 3,
> + .sync = FB_SYNC_ON_GREEN,
> .vmode = FB_VMODE_NONINTERLACED,
> };
>
> -static struct fb_fix_screeninfo pmagbafb_fix = {
> +static struct fb_fix_screeninfo pmagbafb_fix __initdata = {
> .id = "PMAG-BA",
> - .smem_len = (1024 * 864),
> + .smem_len = (1024 * 1024),
> .type = FB_TYPE_PACKED_PIXELS,
> .visual = FB_VISUAL_PSEUDOCOLOR,
> .line_length = 1024,
> + .mmio_len = PMAG_BA_SIZE - PMAG_BA_BT459,
> };
>
> -/*
> - * Turn hardware cursor off
> - */
> -void pmagbafb_erase_cursor(struct pmag_ba_ramdac_regs *bt459_regs)
> +
> +static inline void dac_write(struct pmagbafb_par *par, unsigned int reg, u8 v)
> {
> - bt459_regs->addr_low = 0;
> - bt459_regs->addr_hi = 3;
> - bt459_regs->data = 0;
> + writeb(v, par->dac + reg / 4);
> }
>
> +static inline u8 dac_read(struct pmagbafb_par *par, unsigned int reg)
> +{
> + return readb(par->dac + reg / 4);
> +}
> +
> +
> /*
> - * Set the palette.
> + * Set the palette.
> */
> -static int pmagbafb_setcolreg(unsigned regno, unsigned red, unsigned green,
> - unsigned blue, unsigned transp,
> - struct fb_info *info)
> +static int pmagbafb_setcolreg(unsigned int regno, unsigned int red,
> + unsigned int green, unsigned int blue,
> + unsigned int transp, struct fb_info *info)
> {
> - struct pmag_ba_ramdac_regs *bt459_regs = (struct pmag_ba_ramdac_regs *) info->par;
> + struct pmagbafb_par *par = info->par;
>
> - if (regno >= info->cmap.len)
> - return 1;
> + BUG_ON(regno >= info->cmap.len);
>
> red >>= 8; /* The cmap fields are 16 bits */
> - green >>= 8; /* wide, but the harware colormap */
> + green >>= 8; /* wide, but the hardware colormap */
> blue >>= 8; /* registers are only 8 bits wide */
>
> - bt459_regs->addr_low = (__u8) regno;
> - bt459_regs->addr_hi = 0;
> - bt459_regs->cmap = red;
> - bt459_regs->cmap = green;
> - bt459_regs->cmap = blue;
> + mb();
> + dac_write(par, BT459_ADDR_LO, regno);
> + dac_write(par, BT459_ADDR_HI, 0x00);
> + wmb();
> + dac_write(par, BT459_CMAP, red);
> + wmb();
> + dac_write(par, BT459_CMAP, green);
> + wmb();
> + dac_write(par, BT459_CMAP, blue);
> +
> return 0;
> }
>
> static struct fb_ops pmagbafb_ops = {
> .owner = THIS_MODULE,
> - .fb_get_fix = gen_get_fix,
> - .fb_get_var = gen_get_var,
> .fb_setcolreg = pmagbafb_setcolreg,
> .fb_fillrect = cfb_fillrect,
> .fb_copyarea = cfb_copyarea,
> @@ -120,63 +131,133 @@
> .fb_cursor = soft_cursor,
> };
>
> -int __init pmagbafb_init_one(int slot)
> +
> +/*
> + * Turn the hardware cursor off.
> + */
> +static void __init pmagbafb_erase_cursor(struct fb_info *info)
> +{
> + struct pmagbafb_par *par = info->par;
> +
> + mb();
> + dac_write(par, BT459_ADDR_LO, 0x00);
> + dac_write(par, BT459_ADDR_HI, 0x03);
> + wmb();
> + dac_write(par, BT459_DATA, 0x00);
> +}
> +
> +
> +static int __init pmagbafb_init_one(int slot)
> {
> - unsigned long base_addr = get_tc_base_addr(slot);
> - struct fb_info *info = &pmagba_fb_info[slot];
> - struct display *disp = &pmagba_disp[slot];
> -
> - printk("PMAG-BA framebuffer in slot %d\n", slot);
> - /*
> - * Framebuffer display memory base address and friends
> - */
> - pmagbafb_fix.smem_start = base_addr + PMAG_BA_ONBOARD_FBMEM_OFFSET;
> - info->par = (base_addr + PMAG_BA_BT459_OFFSET);
> -
> - /*
> - * Configure the Bt459 RAM DAC
> - */
> - pmagbafb_erase_cursor((struct pmag_ba_ramdac_regs *) info->par);
> -
> - /*
> - * Let there be consoles..
> - */
> + struct fb_info *info;
> + struct pmagbafb_par *par;
> + unsigned long base_addr;
> +
> + info = framebuffer_alloc(sizeof(struct pmagbafb_par), NULL);
> + if (!info)
> + return -ENOMEM;
> +
> + par = info->par;
> + par->slot = slot;
> + claim_tc_card(par->slot);
> +
> + base_addr = get_tc_base_addr(par->slot);
> +
> + par->next = root_pmagbafb_dev;
> + root_pmagbafb_dev = info;
> +
> + if (fb_alloc_cmap(&info->cmap, 256, 0) < 0)
> + goto err_alloc;
> +
> info->fbops = &pmagbafb_ops;
> + info->fix = pmagbafb_fix;
> info->var = pmagbafb_defined;
> - info->fix = pmagbafb_fix;
> - info->screen_base = pmagbafb_fix.smem_start;
> info->flags = FBINFO_DEFAULT;
>
> - fb_alloc_cmap(&fb_info.cmap, 256, 0);
> + /* MMIO mapping setup. */
> + info->fix.mmio_start = base_addr;
> + par->mmio = ioremap_nocache(info->fix.mmio_start, info->fix.mmio_len);
> + if (!par->mmio)
> + goto err_cmap;
> + par->dac = par->mmio + PMAG_BA_BT459;
> +
> + /* Frame buffer mapping setup. */
> + info->fix.smem_start = base_addr + PMAG_BA_FBMEM;
> + info->screen_base = ioremap_nocache(info->fix.smem_start,
> + info->fix.smem_len);
> + if (!info->screen_base)
> + goto err_mmio_map;
> + info->screen_size = info->fix.smem_len;
> +
> + pmagbafb_erase_cursor(info);
>
> if (register_framebuffer(info) < 0)
> - return 1;
> + goto err_smem_map;
> +
> + pr_info("fb%d: %s frame buffer device in slot %d\n",
> + info->node, info->fix.id, par->slot);
> +
> return 0;
> +
> +
> +err_smem_map:
> + iounmap(info->screen_base);
> +
> +err_mmio_map:
> + iounmap(par->mmio);
> +
> +err_cmap:
> + fb_dealloc_cmap(&info->cmap);
> +
> +err_alloc:
> + root_pmagbafb_dev = par->next;
> + release_tc_card(par->slot);
> + framebuffer_release(info);
> + return -ENXIO;
> +}
> +
> +static void __exit pmagbafb_exit_one(void)
> +{
> + struct fb_info *info = root_pmagbafb_dev;
> + struct pmagbafb_par *par = info->par;
> +
> + unregister_framebuffer(info);
> + iounmap(info->screen_base);
> + iounmap(par->mmio);
> + fb_dealloc_cmap(&info->cmap);
> + root_pmagbafb_dev = par->next;
> + release_tc_card(par->slot);
> + framebuffer_release(info);
> }
>
> -/*
> - * Initialise the framebuffer
> - */
>
> -int __init pmagbafb_init(void)
> +/*
> + * Initialise the framebuffer.
> + */
> +static int __init pmagbafb_init(void)
> {
> - int sid;
> - int found = 0;
> + int count = 0;
> + int slot;
>
> if (fb_get_options("pmagbafb", NULL))
> - return -ENODEV;
> + return -ENXIO;
>
> - if (TURBOCHANNEL) {
> - while ((sid = search_tc_card("PMAG-BA")) >= 0) {
> - found = 1;
> - claim_tc_card(sid);
> - pmagbafb_init_one(sid);
> - }
> - return found ? 0 : -ENODEV;
> - } else {
> - return -ENODEV;
> + while ((slot = search_tc_card("PMAG-BA")) >= 0) {
> + if (pmagbafb_init_one(slot) < 0)
> + break;
> + count++;
> }
> + return (count > 0) ? 0 : -ENXIO;
> }
>
> +static void __exit pmagbafb_exit(void)
> +{
> + while (root_pmagbafb_dev)
> + pmagbafb_exit_one();
> +}
> +
> +
> module_init(pmagbafb_init);
> +module_exit(pmagbafb_exit);
> +
> MODULE_LICENSE("GPL");
> diff -urN linux-2.6.13-rc4/include/video/pmag-ba-fb.h linux-cvs/include/video/pmag-ba-fb.h
> --- linux-2.6.13-rc4/include/video/pmag-ba-fb.h 2004-12-24 21:34:48.000000000 +0000
> +++ linux-cvs/include/video/pmag-ba-fb.h 2005-07-11 21:56:17.000000000 +0100
> @@ -1,24 +1,27 @@
> /*
> - * linux/drivers/video/pmag-ba-fb.h
> + * linux/include/video/pmag-ba-fb.h
> *
> - * TurboChannel PMAG-BA framebuffer card support,
> - * Copyright (C) 1999,2000,2001 by
> - * Michael Engel <engel@unix-ag.org>,
> - * Karsten Merker <merker@linuxtag.org>
> - * This file is subject to the terms and conditions of the GNU General
> - * Public License. See the file COPYING in the main directory of this
> - * archive for more details.
> - */
> -
> -/*
> - * Bt459 RAM DAC register base offset (rel. to TC slot base address)
> + * TURBOchannel PMAG-BA Color Frame Buffer (CFB) card support,
> + * Copyright (C) 1999, 2000, 2001 by
> + * Michael Engel <engel@unix-ag.org>,
> + * Karsten Merker <merker@linuxtag.org>
> + * Copyright (c) 2005 Maciej W. Rozycki
> + *
> + * This file is subject to the terms and conditions of the GNU General
> + * Public License. See the file COPYING in the main directory of this
> + * archive for more details.
> */
>
> -#define PMAG_BA_BT459_OFFSET 0x00200000
> -
> -/*
> - * Begin of PMAG-BA framebuffer memory relative to TC slot address,
> - * resolution is 1024x864x8
> - */
> +/* IOmem resource offsets. */
> +#define PMAG_BA_FBMEM 0x000000 /* frame buffer */
> +#define PMAG_BA_BT459 0x200000 /* Bt459 RAMDAC */
> +#define PMAG_BA_IRQ 0x300000 /* IRQ acknowledge */
> +#define PMAG_BA_ROM 0x380000 /* REX option ROM */
> +#define PMAG_BA_BT438 0x380000 /* Bt438 clock chip reset */
> +#define PMAG_BA_SIZE 0x400000 /* address space size */
>
> -#define PMAG_BA_ONBOARD_FBMEM_OFFSET 0x00000000
> +/* Bt459 register offsets, byte-wide registers. */
> +#define BT459_ADDR_LO 0x0 /* address low */
> +#define BT459_ADDR_HI 0x4 /* address high */
> +#define BT459_DATA 0x8 /* data window register */
> +#define BT459_CMAP 0xc /* color map window register */
>
>
> -------------------------------------------------------
> SF.Net email is Sponsored by the Better Software Conference & EXPO
> September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
> Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
> Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
> _______________________________________________
> Linux-fbdev-devel mailing list
> Linux-fbdev-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel
>
-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
next prev parent reply other threads:[~2005-08-07 10:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-04 4:59 Fw: [PATCH 2/3] DEC PMAG BA frame buffer update Andrew Morton
2005-08-07 10:24 ` Antonino A. Daplas [this message]
2005-08-08 10:48 ` Ralf Baechle
2005-08-08 12:18 ` Maciej W. Rozycki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=42F5E162.4070400@gmail.com \
--to=adaplas@gmail.com \
--cc=akpm@osdl.org \
--cc=linux-fbdev-devel@lists.sourceforge.net \
--cc=ralf@linux-mips.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.