Commit cf0841ac authored by Paul Mackerras's avatar Paul Mackerras

Merge samba.org:/stuff/paulus/kernel/linux-2.5

into samba.org:/stuff/paulus/kernel/for-linus-ppc
parents f525f3d4 71290d21
...@@ -508,6 +508,15 @@ debug_stack_correct: ...@@ -508,6 +508,15 @@ debug_stack_correct:
ENTRY(nmi) ENTRY(nmi)
cmpl $sysenter_entry,(%esp) cmpl $sysenter_entry,(%esp)
je nmi_stack_fixup je nmi_stack_fixup
pushl %eax
movl %esp,%eax
/* Do not access memory above the end of our stack page,
* it might not exist.
*/
andl $0x1fff,%eax
cmpl $0x1fec,%eax
popl %eax
jae nmi_stack_correct
cmpl $sysenter_entry,12(%esp) cmpl $sysenter_entry,12(%esp)
je nmi_debug_stack_check je nmi_debug_stack_check
nmi_stack_correct: nmi_stack_correct:
......
...@@ -316,8 +316,9 @@ int inflateReset( ...@@ -316,8 +316,9 @@ int inflateReset(
} }
int inflateEnd(z) int inflateEnd(
z_stream *z; z_stream *z
)
{ {
uLong c; uLong c;
...@@ -332,9 +333,10 @@ z_stream *z; ...@@ -332,9 +333,10 @@ z_stream *z;
} }
int inflateInit2(z, w) int inflateInit2(
z_stream *z; z_stream *z,
int w; int w
)
{ {
/* initialize state */ /* initialize state */
if (z == Z_NULL) if (z == Z_NULL)
...@@ -378,8 +380,9 @@ int w; ...@@ -378,8 +380,9 @@ int w;
} }
int inflateInit(z) int inflateInit(
z_stream *z; z_stream *z
)
{ {
return inflateInit2(z, DEF_WBITS); return inflateInit2(z, DEF_WBITS);
} }
...@@ -1128,8 +1131,9 @@ local int inflate_addhistory( ...@@ -1128,8 +1131,9 @@ local int inflate_addhistory(
* At the end of a Deflate-compressed PPP packet, we expect to have seen * At the end of a Deflate-compressed PPP packet, we expect to have seen
* a `stored' block type value but not the (zero) length bytes. * a `stored' block type value but not the (zero) length bytes.
*/ */
local int inflate_packet_flush(s) local int inflate_packet_flush(
inflate_blocks_statef *s; inflate_blocks_statef *s
)
{ {
if (s->mode != LENS) if (s->mode != LENS)
return Z_DATA_ERROR; return Z_DATA_ERROR;
...@@ -1592,9 +1596,10 @@ local int inflate_trees_fixed( ...@@ -1592,9 +1596,10 @@ local int inflate_trees_fixed(
} }
local int inflate_trees_free(t, z) local int inflate_trees_free(
inflate_huft *t; /* table to free */ inflate_huft *t, /* table to free */
z_stream *z; /* for zfree function */ z_stream *z /* for zfree function */
)
/* Free the malloc'ed tables built by huft_build(), which makes a linked /* Free the malloc'ed tables built by huft_build(), which makes a linked
list of the tables it made, with the links in a dummy first entry of list of the tables it made, with the links in a dummy first entry of
each table. */ each table. */
......
...@@ -339,8 +339,9 @@ int inflateReset( ...@@ -339,8 +339,9 @@ int inflateReset(
} }
int inflateEnd(z) int inflateEnd(
z_stream *z; z_stream *z
)
{ {
uLong c; uLong c;
...@@ -355,9 +356,10 @@ z_stream *z; ...@@ -355,9 +356,10 @@ z_stream *z;
} }
int inflateInit2(z, w) int inflateInit2(
z_stream *z; z_stream *z,
int w; int w
)
{ {
/* initialize state */ /* initialize state */
if (z == Z_NULL) if (z == Z_NULL)
...@@ -401,8 +403,9 @@ int w; ...@@ -401,8 +403,9 @@ int w;
} }
int inflateInit(z) int inflateInit(
z_stream *z; z_stream *z
)
{ {
return inflateInit2(z, DEF_WBITS); return inflateInit2(z, DEF_WBITS);
} }
...@@ -1151,8 +1154,9 @@ local int inflate_addhistory( ...@@ -1151,8 +1154,9 @@ local int inflate_addhistory(
* At the end of a Deflate-compressed PPP packet, we expect to have seen * At the end of a Deflate-compressed PPP packet, we expect to have seen
* a `stored' block type value but not the (zero) length bytes. * a `stored' block type value but not the (zero) length bytes.
*/ */
local int inflate_packet_flush(s) local int inflate_packet_flush(
inflate_blocks_statef *s; inflate_blocks_statef *s
)
{ {
if (s->mode != LENS) if (s->mode != LENS)
return Z_DATA_ERROR; return Z_DATA_ERROR;
...@@ -1615,9 +1619,10 @@ local int inflate_trees_fixed( ...@@ -1615,9 +1619,10 @@ local int inflate_trees_fixed(
} }
local int inflate_trees_free(t, z) local int inflate_trees_free(
inflate_huft *t; /* table to free */ inflate_huft *t, /* table to free */
z_stream *z; /* for zfree function */ z_stream *z /* for zfree function */
)
/* Free the malloc'ed tables built by huft_build(), which makes a linked /* Free the malloc'ed tables built by huft_build(), which makes a linked
list of the tables it made, with the links in a dummy first entry of list of the tables it made, with the links in a dummy first entry of
each table. */ each table. */
......
...@@ -223,9 +223,15 @@ asmlinkage int sys_ipc (unsigned call, int first, int second, unsigned long thir ...@@ -223,9 +223,15 @@ asmlinkage int sys_ipc (unsigned call, int first, int second, unsigned long thir
} }
if (call <= SHMCTL) if (call <= SHMCTL)
switch (call) { switch (call) {
case SHMAT: case SHMAT: {
err = sys_shmat (first, (char *) ptr, second, (ulong *) third); ulong raddr;
err = sys_shmat (first, (char *) ptr, second, &raddr);
if (!err) {
if (put_user(raddr, (ulong __user *) third))
err = -EFAULT;
}
goto out; goto out;
}
case SHMDT: case SHMDT:
err = sys_shmdt ((char *)ptr); err = sys_shmdt ((char *)ptr);
goto out; goto out;
......
...@@ -55,7 +55,7 @@ obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o cfbfillrect.o cfbcopyarea.o cf ...@@ -55,7 +55,7 @@ obj-$(CONFIG_FB_PMAGB_B) += pmagb-b-fb.o cfbfillrect.o cfbcopyarea.o cf
obj-$(CONFIG_FB_MAXINE) += maxinefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_MAXINE) += maxinefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_TX3912) += tx3912fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_TX3912) += tx3912fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_MATROX) += matrox/ obj-$(CONFIG_FB_MATROX) += matrox/ cfbfillrect.o cfbcopyarea.o cfbimgblt.o
obj-$(CONFIG_FB_RIVA) += riva/ cfbimgblt.o vgastate.o obj-$(CONFIG_FB_RIVA) += riva/ cfbimgblt.o vgastate.o
obj-$(CONFIG_FB_SIS) += sis/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_SIS) += sis/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o
obj-$(CONFIG_FB_ATY) += aty/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_ATY) += aty/ cfbcopyarea.o cfbfillrect.o cfbimgblt.o
......
...@@ -113,7 +113,7 @@ static int i2c_bus_reg(struct i2c_bit_adapter* b, struct matrox_fb_info* minfo, ...@@ -113,7 +113,7 @@ static int i2c_bus_reg(struct i2c_bit_adapter* b, struct matrox_fb_info* minfo,
b->adapter = matrox_i2c_adapter_template; b->adapter = matrox_i2c_adapter_template;
snprintf(b->adapter.dev.name, DEVICE_NAME_SIZE, name, snprintf(b->adapter.dev.name, DEVICE_NAME_SIZE, name,
minfo->fbcon.node); minfo->fbcon.node);
b->adapter.data = b; i2c_set_adapdata(&b->adapter, b);
b->adapter.algo_data = &b->bac; b->adapter.algo_data = &b->bac;
b->bac = matrox_i2c_algo_template; b->bac = matrox_i2c_algo_template;
b->bac.data = b; b->bac.data = b;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -3,9 +3,6 @@ ...@@ -3,9 +3,6 @@
#include "matroxfb_base.h" #include "matroxfb_base.h"
void matrox_init_putc(WPMINFO struct display* p, void (*)(WPMINFO struct display *p));
void matrox_cfbX_init(WPMINFO2); void matrox_cfbX_init(WPMINFO2);
void matrox_text_round(CPMINFO struct fb_var_screeninfo* var, struct display* p);
void initMatrox(WPMINFO struct display* p);
#endif #endif
This diff is collapsed.
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/kd.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
...@@ -49,12 +50,7 @@ ...@@ -49,12 +50,7 @@
#include <asm/mtrr.h> #include <asm/mtrr.h>
#endif #endif
#include <video/fbcon.h> #include "../console/fbcon.h"
#include <video/fbcon-cfb4.h>
#include <video/fbcon-cfb8.h>
#include <video/fbcon-cfb16.h>
#include <video/fbcon-cfb24.h>
#include <video/fbcon-cfb32.h>
#if defined(CONFIG_PPC) #if defined(CONFIG_PPC)
#include <asm/prom.h> #include <asm/prom.h>
...@@ -65,8 +61,6 @@ ...@@ -65,8 +61,6 @@
/* always compile support for 32MB... It cost almost nothing */ /* always compile support for 32MB... It cost almost nothing */
#define CONFIG_FB_MATROX_32MB #define CONFIG_FB_MATROX_32MB
#define FBCON_HAS_VGATEXT
#ifdef MATROXFB_DEBUG #ifdef MATROXFB_DEBUG
#define DEBUG #define DEBUG
...@@ -338,8 +332,6 @@ struct matroxfb_par ...@@ -338,8 +332,6 @@ struct matroxfb_par
unsigned int pixels; unsigned int pixels;
unsigned int chunks; unsigned int chunks;
} ydstorg; } ydstorg;
void (*putc)(u_int32_t, u_int32_t, struct display*, int, int, int);
void (*putcs)(u_int32_t, u_int32_t, struct display*, const unsigned short*, int, int, int);
}; };
struct matrox_fb_info; struct matrox_fb_info;
...@@ -347,7 +339,6 @@ struct matrox_fb_info; ...@@ -347,7 +339,6 @@ struct matrox_fb_info;
struct matrox_DAC1064_features { struct matrox_DAC1064_features {
u_int8_t xvrefctrl; u_int8_t xvrefctrl;
u_int8_t xmiscctrl; u_int8_t xmiscctrl;
unsigned int cursorimage;
}; };
struct matrox_accel_features { struct matrox_accel_features {
...@@ -398,12 +389,21 @@ struct matrox_accel_data { ...@@ -398,12 +389,21 @@ struct matrox_accel_data {
u_int32_t m_opmode; u_int32_t m_opmode;
}; };
struct v4l2_queryctrl;
struct v4l2_control;
struct matrox_altout { struct matrox_altout {
const char *name; const char *name;
int (*compute)(void* altout_dev, struct my_timming* input); int (*compute)(void* altout_dev, struct my_timming* input);
int (*program)(void* altout_dev); int (*program)(void* altout_dev);
int (*start)(void* altout_dev); int (*start)(void* altout_dev);
int (*verifymode)(void* altout_dev, u_int32_t mode); int (*verifymode)(void* altout_dev, u_int32_t mode);
int (*getqueryctrl)(void* altout_dev,
struct v4l2_queryctrl* ctrl);
int (*getctrl)(void* altout_dev,
struct v4l2_control* ctrl);
int (*setctrl)(void* altout_dev,
struct v4l2_control* ctrl);
}; };
#define MATROXFB_SRC_NONE 0 #define MATROXFB_SRC_NONE 0
...@@ -424,10 +424,17 @@ struct matrox_bios { ...@@ -424,10 +424,17 @@ struct matrox_bios {
} output; } output;
}; };
extern struct display fb_display[];
struct matrox_switch; struct matrox_switch;
struct matroxfb_driver; struct matroxfb_driver;
struct matroxfb_dh_fb_info; struct matroxfb_dh_fb_info;
struct matrox_vsync {
wait_queue_head_t wait;
unsigned int cnt;
};
struct matrox_fb_info { struct matrox_fb_info {
struct fb_info fbcon; struct fb_info fbcon;
...@@ -436,6 +443,9 @@ struct matrox_fb_info { ...@@ -436,6 +443,9 @@ struct matrox_fb_info {
int dead; int dead;
unsigned int usecount; unsigned int usecount;
unsigned int userusecount;
unsigned long irq_flags;
struct matroxfb_par curr; struct matroxfb_par curr;
struct matrox_hw_state hw; struct matrox_hw_state hw;
...@@ -444,10 +454,12 @@ struct matrox_fb_info { ...@@ -444,10 +454,12 @@ struct matrox_fb_info {
struct pci_dev* pcidev; struct pci_dev* pcidev;
struct { struct {
struct matrox_vsync vsync;
unsigned int pixclock; unsigned int pixclock;
int mnp; int mnp;
} crtc1; } crtc1;
struct { struct {
struct matrox_vsync vsync;
unsigned int pixclock; unsigned int pixclock;
int mnp; int mnp;
struct matroxfb_dh_fb_info* info; struct matroxfb_dh_fb_info* info;
...@@ -455,6 +467,10 @@ struct matrox_fb_info { ...@@ -455,6 +467,10 @@ struct matrox_fb_info {
} crtc2; } crtc2;
struct { struct {
struct rw_semaphore lock; struct rw_semaphore lock;
struct {
int brightness, contrast, saturation, hue, gamma;
int testout, deflicker;
} tvo_params;
} altout; } altout;
#define MATROXFB_MAX_OUTPUTS 3 #define MATROXFB_MAX_OUTPUTS 3
struct { struct {
...@@ -486,7 +502,6 @@ struct matrox_fb_info { ...@@ -486,7 +502,6 @@ struct matrox_fb_info {
unsigned int max_pixel_clock; unsigned int max_pixel_clock;
struct matrox_switch* hw_switch; struct matrox_switch* hw_switch;
struct display* currcon_display;
struct { struct {
struct matrox_pll_features pll; struct matrox_pll_features pll;
...@@ -511,11 +526,6 @@ struct matrox_fb_info { ...@@ -511,11 +526,6 @@ struct matrox_fb_info {
int plnwt; int plnwt;
int srcorg; int srcorg;
} capable; } capable;
struct {
unsigned int size;
unsigned int mgabase;
vaddr_t vbase;
} fastfont;
#ifdef CONFIG_MTRR #ifdef CONFIG_MTRR
struct { struct {
int vram; int vram;
...@@ -529,9 +539,6 @@ struct matrox_fb_info { ...@@ -529,9 +539,6 @@ struct matrox_fb_info {
int nobios; int nobios;
int nopciretry; int nopciretry;
int noinit; int noinit;
int inverse;
int hwcursor;
int blink;
int sgram; int sgram;
#ifdef CONFIG_FB_MATROX_32MB #ifdef CONFIG_FB_MATROX_32MB
int support32MB; int support32MB;
...@@ -555,18 +562,7 @@ struct matrox_fb_info { ...@@ -555,18 +562,7 @@ struct matrox_fb_info {
int dualhead; int dualhead;
unsigned int fbResource; unsigned int fbResource;
} devflags; } devflags;
struct display_switch dispsw; struct fb_ops fbops;
struct {
int x;
int y;
unsigned int w;
unsigned int u;
unsigned int d;
unsigned int type;
int state;
int redraw;
struct timer_list timer;
} cursor;
struct matrox_bios bios; struct matrox_bios bios;
struct { struct {
struct matrox_pll_limits pixel; struct matrox_pll_limits pixel;
...@@ -600,22 +596,11 @@ struct matrox_fb_info { ...@@ -600,22 +596,11 @@ struct matrox_fb_info {
} memory; } memory;
} values; } values;
struct { unsigned red, green, blue, transp; } palette[256]; struct { unsigned red, green, blue, transp; } palette[256];
/* These ifdefs must be last! They differ for module & non-module compiles */ u_int32_t cmap[17];
#if defined(FBCON_HAS_CFB16) || defined(FBCON_HAS_CFB24) || defined(FBCON_HAS_CFB32)
union {
#ifdef FBCON_HAS_CFB16
u_int16_t cfb16[16];
#endif
#ifdef FBCON_HAS_CFB24
u_int32_t cfb24[16];
#endif
#ifdef FBCON_HAS_CFB32
u_int32_t cfb32[16];
#endif
} cmap;
#endif
}; };
#define info2minfo(info) container_of(info, struct matrox_fb_info, fbcon)
#ifdef CONFIG_FB_MATROX_MULTIHEAD #ifdef CONFIG_FB_MATROX_MULTIHEAD
#define ACCESS_FBINFO2(info, x) (info->x) #define ACCESS_FBINFO2(info, x) (info->x)
#define ACCESS_FBINFO(x) ACCESS_FBINFO2(minfo,x) #define ACCESS_FBINFO(x) ACCESS_FBINFO2(minfo,x)
...@@ -629,14 +614,7 @@ struct matrox_fb_info { ...@@ -629,14 +614,7 @@ struct matrox_fb_info {
#define PMINFO2 minfo #define PMINFO2 minfo
#define PMINFO PMINFO2 , #define PMINFO PMINFO2 ,
static inline struct matrox_fb_info* mxinfo(const struct display* p) {
return container_of(p->fb_info, struct matrox_fb_info, fbcon);
}
#define PMXINFO(p) mxinfo(p),
#define MINFO_FROM(x) struct matrox_fb_info* minfo = x #define MINFO_FROM(x) struct matrox_fb_info* minfo = x
#define MINFO_FROM_DISP(x) MINFO_FROM(mxinfo(x))
#else #else
extern struct matrox_fb_info matroxfb_global_mxinfo; extern struct matrox_fb_info matroxfb_global_mxinfo;
...@@ -653,24 +631,17 @@ extern struct matrox_fb_info matroxfb_global_mxinfo; ...@@ -653,24 +631,17 @@ extern struct matrox_fb_info matroxfb_global_mxinfo;
#define PMINFO2 #define PMINFO2
#define PMINFO #define PMINFO
#if 0
static inline struct matrox_fb_info* mxinfo(const struct display* p) {
return &matroxfb_global_mxinfo;
}
#endif
#define PMXINFO(p)
#define MINFO_FROM(x) #define MINFO_FROM(x)
#define MINFO_FROM_DISP(x)
#endif #endif
#define MINFO_FROM_INFO(x) MINFO_FROM(info2minfo(x))
struct matrox_switch { struct matrox_switch {
int (*preinit)(WPMINFO2); int (*preinit)(WPMINFO2);
void (*reset)(WPMINFO2); void (*reset)(WPMINFO2);
int (*init)(WPMINFO struct my_timming*, struct display*); int (*init)(WPMINFO struct my_timming*);
void (*restore)(WPMINFO struct display*); void (*restore)(WPMINFO2);
int (*selhwcursor)(WPMINFO2);
}; };
struct matroxfb_driver { struct matroxfb_driver {
...@@ -746,7 +717,7 @@ void matroxfb_unregister_driver(struct matroxfb_driver* drv); ...@@ -746,7 +717,7 @@ void matroxfb_unregister_driver(struct matroxfb_driver* drv);
#define M_FIFOSTATUS 0x1E10 #define M_FIFOSTATUS 0x1E10
#define M_STATUS 0x1E14 #define M_STATUS 0x1E14
#define M_ICLEAR 0x1E18
#define M_IEN 0x1E1C #define M_IEN 0x1E1C
#define M_VCOUNT 0x1E20 #define M_VCOUNT 0x1E20
...@@ -868,7 +839,8 @@ extern void matroxfb_DAC_out(CPMINFO int reg, int val); ...@@ -868,7 +839,8 @@ extern void matroxfb_DAC_out(CPMINFO int reg, int val);
extern int matroxfb_DAC_in(CPMINFO int reg); extern int matroxfb_DAC_in(CPMINFO int reg);
extern struct list_head matroxfb_list; extern struct list_head matroxfb_list;
extern void matroxfb_var2my(struct fb_var_screeninfo* fvsi, struct my_timming* mt); extern void matroxfb_var2my(struct fb_var_screeninfo* fvsi, struct my_timming* mt);
extern int matroxfb_switch(int con, struct fb_info *); extern int matroxfb_wait_for_sync(WPMINFO u_int32_t crtc);
extern int matroxfb_enable_irq(WPMINFO int reenable);
#ifdef MATROXFB_USE_SPINLOCKS #ifdef MATROXFB_USE_SPINLOCKS
#define CRITBEGIN spin_lock_irqsave(&ACCESS_FBINFO(lock.accel), critflags); #define CRITBEGIN spin_lock_irqsave(&ACCESS_FBINFO(lock.accel), critflags);
......
This diff is collapsed.
...@@ -27,19 +27,10 @@ struct matroxfb_dh_fb_info { ...@@ -27,19 +27,10 @@ struct matroxfb_dh_fb_info {
unsigned int len; unsigned int len;
} mmio; } mmio;
struct display* currcon_display;
int interlaced:1; int interlaced:1;
union { u_int32_t cmap[17];
#ifdef FBCON_HAS_CFB16 struct { unsigned red, green, blue, transp; } palette[17];
u_int16_t cfb16[16];
#endif
#ifdef FBCON_HAS_CFB32
u_int32_t cfb32[16];
#endif
} cmap;
struct { unsigned red, green, blue, transp; } palette[16];
}; };
#endif /* __MATROXFB_CRTC2_H__ */ #endif /* __MATROXFB_CRTC2_H__ */
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Portions Copyright (c) 2001 Matrox Graphics Inc. * Portions Copyright (c) 2001 Matrox Graphics Inc.
* *
* Version: 1.64 2002/06/02 * Version: 1.65 2002/08/14
* *
* See matroxfb_base.c for contributors. * See matroxfb_base.c for contributors.
* *
...@@ -20,6 +20,88 @@ ...@@ -20,6 +20,88 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/div64.h> #include <asm/div64.h>
/* Definition of the various controls */
struct mctl {
struct v4l2_queryctrl desc;
size_t control;
};
#define BLMIN 0xF3
#define WLMAX 0x3FF
static const struct mctl g450_controls[] =
{ { { V4L2_CID_BRIGHTNESS, V4L2_CTRL_TYPE_INTEGER,
"brightness",
0, WLMAX-BLMIN, 1, 370-BLMIN,
0,
}, offsetof(struct matrox_fb_info, altout.tvo_params.brightness) },
{ { V4L2_CID_CONTRAST, V4L2_CTRL_TYPE_INTEGER,
"contrast",
0, 1023, 1, 127,
0,
}, offsetof(struct matrox_fb_info, altout.tvo_params.contrast) },
{ { V4L2_CID_SATURATION, V4L2_CTRL_TYPE_INTEGER,
"saturation",
0, 255, 1, 165,
0,
}, offsetof(struct matrox_fb_info, altout.tvo_params.saturation) },
{ { V4L2_CID_HUE, V4L2_CTRL_TYPE_INTEGER,
"hue",
0, 255, 1, 0,
0,
}, offsetof(struct matrox_fb_info, altout.tvo_params.hue) },
{ { MATROXFB_CID_TESTOUT, V4L2_CTRL_TYPE_BOOLEAN,
"test output",
0, 1, 1, 0,
0,
}, offsetof(struct matrox_fb_info, altout.tvo_params.testout) },
};
#define G450CTRLS (sizeof(g450_controls)/sizeof(g450_controls[0]))
/* Return: positive number: id found
-EINVAL: id not found, return failure
-ENOENT: id not found, create fake disabled control */
static int get_ctrl_id(__u32 v4l2_id) {
int i;
for (i = 0; i < G450CTRLS; i++) {
if (v4l2_id < g450_controls[i].desc.id) {
if (g450_controls[i].desc.id == 0x08000000) {
return -EINVAL;
}
return -ENOENT;
}
if (v4l2_id == g450_controls[i].desc.id) {
return i;
}
}
return -EINVAL;
}
static inline int* get_ctrl_ptr(WPMINFO unsigned int idx) {
return (int*)((char*)MINFO + g450_controls[idx].control);
}
static void tvo_fill_defaults(WPMINFO2) {
unsigned int i;
for (i = 0; i < G450CTRLS; i++) {
*get_ctrl_ptr(PMINFO i) = g450_controls[i].desc.default_value;
}
}
static int cve2_get_reg(WPMINFO int reg) {
unsigned long flags;
int val;
matroxfb_DAC_lock_irqsave(flags);
matroxfb_DAC_out(PMINFO 0x87, reg);
val = matroxfb_DAC_in(PMINFO 0x88);
matroxfb_DAC_unlock_irqrestore(flags);
return val;
}
static void cve2_set_reg(WPMINFO int reg, int val) { static void cve2_set_reg(WPMINFO int reg, int val) {
unsigned long flags; unsigned long flags;
...@@ -29,6 +111,110 @@ static void cve2_set_reg(WPMINFO int reg, int val) { ...@@ -29,6 +111,110 @@ static void cve2_set_reg(WPMINFO int reg, int val) {
matroxfb_DAC_unlock_irqrestore(flags); matroxfb_DAC_unlock_irqrestore(flags);
} }
static void cve2_set_reg10(WPMINFO int reg, int val) {
unsigned long flags;
matroxfb_DAC_lock_irqsave(flags);
matroxfb_DAC_out(PMINFO 0x87, reg);
matroxfb_DAC_out(PMINFO 0x88, val >> 2);
matroxfb_DAC_out(PMINFO 0x87, reg + 1);
matroxfb_DAC_out(PMINFO 0x88, val & 3);
matroxfb_DAC_unlock_irqrestore(flags);
}
static void g450_compute_bwlevel(CPMINFO int *bl, int *wl) {
const int b = ACCESS_FBINFO(altout.tvo_params.brightness) + BLMIN;
const int c = ACCESS_FBINFO(altout.tvo_params.contrast);
*bl = max(b - c, BLMIN);
*wl = min(b + c, WLMAX);
}
static int g450_query_ctrl(void* md, struct v4l2_queryctrl *p) {
int i;
i = get_ctrl_id(p->id);
if (i >= 0) {
*p = g450_controls[i].desc;
return 0;
}
if (i == -ENOENT) {
static const struct v4l2_queryctrl disctrl =
{ .flags = V4L2_CTRL_FLAG_DISABLED };
i = p->id;
*p = disctrl;
p->id = i;
sprintf(p->name, "Ctrl #%08X", i);
return 0;
}
return -EINVAL;
}
static int g450_set_ctrl(void* md, struct v4l2_control *p) {
int i;
MINFO_FROM(md);
i = get_ctrl_id(p->id);
if (i < 0) return -EINVAL;
/*
* Check if changed.
*/
if (p->value == *get_ctrl_ptr(PMINFO i)) return 0;
/*
* Check limits.
*/
if (p->value > g450_controls[i].desc.maximum) return -EINVAL;
if (p->value < g450_controls[i].desc.minimum) return -EINVAL;
/*
* Store new value.
*/
*get_ctrl_ptr(PMINFO i) = p->value;
switch (p->id) {
case V4L2_CID_BRIGHTNESS:
case V4L2_CID_CONTRAST:
{
int blacklevel, whitelevel;
g450_compute_bwlevel(PMINFO &blacklevel, &whitelevel);
cve2_set_reg10(PMINFO 0x0e, blacklevel);
cve2_set_reg10(PMINFO 0x1e, whitelevel);
}
break;
case V4L2_CID_SATURATION:
cve2_set_reg(PMINFO 0x20, p->value);
cve2_set_reg(PMINFO 0x22, p->value);
break;
case V4L2_CID_HUE:
cve2_set_reg(PMINFO 0x25, p->value);
break;
case MATROXFB_CID_TESTOUT:
{
unsigned char val = cve2_get_reg (PMINFO 0x05);
if (p->value) val |= 0x02;
else val &= ~0x02;
cve2_set_reg(PMINFO 0x05, val);
}
break;
}
return 0;
}
static int g450_get_ctrl(void* md, struct v4l2_control *p) {
int i;
MINFO_FROM(md);
i = get_ctrl_id(p->id);
if (i < 0) return -EINVAL;
p->value = *get_ctrl_ptr(PMINFO i);
return 0;
}
struct output_desc { struct output_desc {
unsigned int h_vis; unsigned int h_vis;
unsigned int h_f_porch; unsigned int h_f_porch;
...@@ -329,6 +515,23 @@ static int matroxfb_g450_compute(void* md, struct my_timming* mt) { ...@@ -329,6 +515,23 @@ static int matroxfb_g450_compute(void* md, struct my_timming* mt) {
const struct output_desc* outd; const struct output_desc* outd;
cve2_init_TVdata(ACCESS_FBINFO(outputs[1]).mode, &ACCESS_FBINFO(hw).maven, &outd); cve2_init_TVdata(ACCESS_FBINFO(outputs[1]).mode, &ACCESS_FBINFO(hw).maven, &outd);
{
int blacklevel, whitelevel;
g450_compute_bwlevel(PMINFO &blacklevel, &whitelevel);
ACCESS_FBINFO(hw).maven.regs[0x0E] = blacklevel >> 2;
ACCESS_FBINFO(hw).maven.regs[0x0F] = blacklevel & 3;
ACCESS_FBINFO(hw).maven.regs[0x1E] = whitelevel >> 2;
ACCESS_FBINFO(hw).maven.regs[0x1F] = whitelevel & 3;
ACCESS_FBINFO(hw).maven.regs[0x20] =
ACCESS_FBINFO(hw).maven.regs[0x22] = ACCESS_FBINFO(altout.tvo_params.saturation);
ACCESS_FBINFO(hw).maven.regs[0x25] = ACCESS_FBINFO(altout.tvo_params.hue);
if (ACCESS_FBINFO(altout.tvo_params.testout)) {
ACCESS_FBINFO(hw).maven.regs[0x05] |= 0x02;
}
}
computeRegs(PMINFO &ACCESS_FBINFO(hw).maven, mt, outd); computeRegs(PMINFO &ACCESS_FBINFO(hw).maven, mt, outd);
} else if (mt->mnp < 0) { } else if (mt->mnp < 0) {
/* We must program clocks before CRTC2, otherwise interlaced mode /* We must program clocks before CRTC2, otherwise interlaced mode
...@@ -374,6 +577,9 @@ static struct matrox_altout matroxfb_g450_altout = { ...@@ -374,6 +577,9 @@ static struct matrox_altout matroxfb_g450_altout = {
.compute = matroxfb_g450_compute, .compute = matroxfb_g450_compute,
.program = matroxfb_g450_program, .program = matroxfb_g450_program,
.verifymode = matroxfb_g450_verify_mode, .verifymode = matroxfb_g450_verify_mode,
.getqueryctrl = g450_query_ctrl,
.getctrl = g450_get_ctrl,
.setctrl = g450_set_ctrl,
}; };
static struct matrox_altout matroxfb_g450_dvi = { static struct matrox_altout matroxfb_g450_dvi = {
...@@ -384,6 +590,7 @@ static struct matrox_altout matroxfb_g450_dvi = { ...@@ -384,6 +590,7 @@ static struct matrox_altout matroxfb_g450_dvi = {
void matroxfb_g450_connect(WPMINFO2) { void matroxfb_g450_connect(WPMINFO2) {
if (ACCESS_FBINFO(devflags.g450dac)) { if (ACCESS_FBINFO(devflags.g450dac)) {
down_write(&ACCESS_FBINFO(altout.lock)); down_write(&ACCESS_FBINFO(altout.lock));
tvo_fill_defaults(PMINFO2);
ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_CRTC1; ACCESS_FBINFO(outputs[1]).src = MATROXFB_SRC_CRTC1;
ACCESS_FBINFO(outputs[1]).data = MINFO; ACCESS_FBINFO(outputs[1]).data = MINFO;
ACCESS_FBINFO(outputs[1]).output = &matroxfb_g450_altout; ACCESS_FBINFO(outputs[1]).output = &matroxfb_g450_altout;
......
This diff is collapsed.
This diff is collapsed.
...@@ -11,12 +11,8 @@ static inline int PLL_calcclock(CPMINFO unsigned int freq, unsigned int fmax, ...@@ -11,12 +11,8 @@ static inline int PLL_calcclock(CPMINFO unsigned int freq, unsigned int fmax,
return matroxfb_PLL_calcclock(&ACCESS_FBINFO(features.pll), freq, fmax, in, feed, post); return matroxfb_PLL_calcclock(&ACCESS_FBINFO(features.pll), freq, fmax, in, feed, post);
} }
void matroxfb_createcursorshape(WPMINFO struct display* p, int vmode); int matroxfb_vgaHWinit(WPMINFO struct my_timming* m);
int matroxfb_vgaHWinit(WPMINFO struct my_timming* m, struct display* p);
void matroxfb_vgaHWrestore(WPMINFO2); void matroxfb_vgaHWrestore(WPMINFO2);
void matroxfb_fastfont_init(struct matrox_fb_info* minfo);
int matrox_text_loadfont(WPMINFO struct display* p);
int matroxfb_fastfont_tryset(WPMINFO struct display* p);
void matroxfb_read_pins(WPMINFO2); void matroxfb_read_pins(WPMINFO2);
#endif /* __MATROXFB_MISC_H__ */ #endif /* __MATROXFB_MISC_H__ */
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include <asm/ioctl.h> #include <asm/ioctl.h>
#include <asm/types.h> #include <asm/types.h>
#include <linux/videodev2.h>
struct matroxioc_output_mode { struct matroxioc_output_mode {
__u32 output; /* which output */ __u32 output; /* which output */
...@@ -30,5 +31,13 @@ struct matroxioc_output_mode { ...@@ -30,5 +31,13 @@ struct matroxioc_output_mode {
/* which outputs exist on this framebuffer */ /* which outputs exist on this framebuffer */
#define MATROXFB_GET_ALL_OUTPUTS _IOR('n',0xFB,sizeof(__u32)) #define MATROXFB_GET_ALL_OUTPUTS _IOR('n',0xFB,sizeof(__u32))
enum matroxfb_ctrl_id {
MATROXFB_CID_TESTOUT = V4L2_CID_PRIVATE_BASE,
MATROXFB_CID_DEFLICKER,
MATROXFB_CID_LAST
};
#define FBIO_WAITFORVSYNC _IOW('F', 0x20, u_int32_t)
#endif #endif
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment