******************************************************************************/
+#include <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
-#include <linux/backlight.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include "ati_ids.h"
#ifdef __powerpc__
-#include <asm/machdep.h>
#include <asm/prom.h>
#include "../macmodes.h"
#endif
static int pll;
static int mclk;
static int xclk;
-static int comp_sync __devinitdata = -1;
+static int comp_sync __initdata = -1;
static char *mode;
#ifdef CONFIG_PPC
-static int default_vmode __devinitdata = VMODE_CHOOSE;
-static int default_cmode __devinitdata = CMODE_CHOOSE;
+static int default_vmode __initdata = VMODE_CHOOSE;
+static int default_cmode __initdata = CMODE_CHOOSE;
module_param_named(vmode, default_vmode, int, 0);
MODULE_PARM_DESC(vmode, "int: video mode for mac");
#endif
#ifdef CONFIG_ATARI
-static unsigned int mach64_count __devinitdata = 0;
-static unsigned long phys_vmembase[FB_MAX] __devinitdata = { 0, };
-static unsigned long phys_size[FB_MAX] __devinitdata = { 0, };
-static unsigned long phys_guiregbase[FB_MAX] __devinitdata = { 0, };
+static unsigned int mach64_count __initdata = 0;
+static unsigned long phys_vmembase[FB_MAX] __initdata = { 0, };
+static unsigned long phys_size[FB_MAX] __initdata = { 0, };
+static unsigned long phys_guiregbase[FB_MAX] __initdata = { 0, };
#endif
/* top -> down is an evolution of mach64 chipset, any corrections? */
const char *name;
int i;
- for (i = ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
+ for (i = sizeof(aty_chips) / sizeof(*aty_chips) - 1; i >= 0; i--)
if (par->pci_id == aty_chips[i].pci_id)
break;
* Apple monitor sense
*/
-static int __devinit read_aty_sense(const struct atyfb_par *par)
+static int __init read_aty_sense(const struct atyfb_par *par)
{
int sense, i;
par->accel_flags = var->accel_flags; /* hack */
- if (var->accel_flags) {
- info->fbops->fb_sync = atyfb_sync;
- info->flags &= ~FBINFO_HWACCEL_DISABLED;
- } else {
- info->fbops->fb_sync = NULL;
- info->flags |= FBINFO_HWACCEL_DISABLED;
- }
-
if (par->blitter_may_be_busy)
wait_for_idle(par);
u32 int_cntl;
if (!test_and_set_bit(0, &par->irq_flags)) {
- if (request_irq(par->irq, aty_irq, IRQF_SHARED, "atyfb", par)) {
+ if (request_irq(par->irq, aty_irq, SA_SHIRQ, "atyfb", par)) {
clear_bit(0, &par->irq_flags);
return -EINVAL;
}
#endif /* defined(CONFIG_PM) && defined(CONFIG_PCI) */
-/* Backlight */
-#ifdef CONFIG_FB_ATY_BACKLIGHT
-#define MAX_LEVEL 0xFF
-
-static struct backlight_properties aty_bl_data;
-
-/* Call with fb_info->bl_mutex held */
-static int aty_bl_get_level_brightness(struct atyfb_par *par, int level)
-{
- struct fb_info *info = pci_get_drvdata(par->pdev);
- int atylevel;
-
- /* Get and convert the value */
- atylevel = info->bl_curve[level] * FB_BACKLIGHT_MAX / MAX_LEVEL;
+#ifdef CONFIG_PMAC_BACKLIGHT
- if (atylevel < 0)
- atylevel = 0;
- else if (atylevel > MAX_LEVEL)
- atylevel = MAX_LEVEL;
+ /*
+ * LCD backlight control
+ */
- return atylevel;
-}
+static int backlight_conv[] = {
+ 0x00, 0x3f, 0x4c, 0x59, 0x66, 0x73, 0x80, 0x8d,
+ 0x9a, 0xa7, 0xb4, 0xc1, 0xcf, 0xdc, 0xe9, 0xff
+};
-/* Call with fb_info->bl_mutex held */
-static int __aty_bl_update_status(struct backlight_device *bd)
+static int aty_set_backlight_enable(int on, int level, void *data)
{
- struct atyfb_par *par = class_get_devdata(&bd->class_dev);
+ struct fb_info *info = (struct fb_info *) data;
+ struct atyfb_par *par = (struct atyfb_par *) info->par;
unsigned int reg = aty_ld_lcd(LCD_MISC_CNTL, par);
- int level;
-
- if (bd->props->power != FB_BLANK_UNBLANK ||
- bd->props->fb_blank != FB_BLANK_UNBLANK)
- level = 0;
- else
- level = bd->props->brightness;
reg |= (BLMOD_EN | BIASMOD_EN);
- if (level > 0) {
+ if (on && level > BACKLIGHT_OFF) {
reg &= ~BIAS_MOD_LEVEL_MASK;
- reg |= (aty_bl_get_level_brightness(par, level) << BIAS_MOD_LEVEL_SHIFT);
+ reg |= (backlight_conv[level] << BIAS_MOD_LEVEL_SHIFT);
} else {
reg &= ~BIAS_MOD_LEVEL_MASK;
- reg |= (aty_bl_get_level_brightness(par, 0) << BIAS_MOD_LEVEL_SHIFT);
+ reg |= (backlight_conv[0] << BIAS_MOD_LEVEL_SHIFT);
}
aty_st_lcd(LCD_MISC_CNTL, reg, par);
-
return 0;
}
-static int aty_bl_update_status(struct backlight_device *bd)
-{
- struct atyfb_par *par = class_get_devdata(&bd->class_dev);
- struct fb_info *info = pci_get_drvdata(par->pdev);
- int ret;
-
- mutex_lock(&info->bl_mutex);
- ret = __aty_bl_update_status(bd);
- mutex_unlock(&info->bl_mutex);
-
- return ret;
-}
-
-static int aty_bl_get_brightness(struct backlight_device *bd)
+static int aty_set_backlight_level(int level, void *data)
{
- return bd->props->brightness;
+ return aty_set_backlight_enable(1, level, data);
}
-static struct backlight_properties aty_bl_data = {
- .owner = THIS_MODULE,
- .get_brightness = aty_bl_get_brightness,
- .update_status = aty_bl_update_status,
- .max_brightness = (FB_BACKLIGHT_LEVELS - 1),
+static struct backlight_controller aty_backlight_controller = {
+ aty_set_backlight_enable,
+ aty_set_backlight_level
};
+#endif /* CONFIG_PMAC_BACKLIGHT */
-static void aty_bl_set_power(struct fb_info *info, int power)
-{
- mutex_lock(&info->bl_mutex);
-
- if (info->bl_dev) {
- down(&info->bl_dev->sem);
- info->bl_dev->props->power = power;
- __aty_bl_update_status(info->bl_dev);
- up(&info->bl_dev->sem);
- }
-
- mutex_unlock(&info->bl_mutex);
-}
-
-static void aty_bl_init(struct atyfb_par *par)
-{
- struct fb_info *info = pci_get_drvdata(par->pdev);
- struct backlight_device *bd;
- char name[12];
-
-#ifdef CONFIG_PMAC_BACKLIGHT
- if (!pmac_has_backlight_type("ati"))
- return;
-#endif
-
- snprintf(name, sizeof(name), "atybl%d", info->node);
-
- bd = backlight_device_register(name, par, &aty_bl_data);
- if (IS_ERR(bd)) {
- info->bl_dev = NULL;
- printk(KERN_WARNING "aty: Backlight registration failed\n");
- goto error;
- }
-
- mutex_lock(&info->bl_mutex);
- info->bl_dev = bd;
- fb_bl_default_curve(info, 0,
- 0x3F * FB_BACKLIGHT_MAX / MAX_LEVEL,
- 0xFF * FB_BACKLIGHT_MAX / MAX_LEVEL);
- mutex_unlock(&info->bl_mutex);
-
- down(&bd->sem);
- bd->props->brightness = aty_bl_data.max_brightness;
- bd->props->power = FB_BLANK_UNBLANK;
- bd->props->update_status(bd);
- up(&bd->sem);
-
-#ifdef CONFIG_PMAC_BACKLIGHT
- mutex_lock(&pmac_backlight_mutex);
- if (!pmac_backlight)
- pmac_backlight = bd;
- mutex_unlock(&pmac_backlight_mutex);
-#endif
-
- printk("aty: Backlight initialized (%s)\n", name);
-
- return;
-
-error:
- return;
-}
-
-static void aty_bl_exit(struct atyfb_par *par)
-{
- struct fb_info *info = pci_get_drvdata(par->pdev);
-
-#ifdef CONFIG_PMAC_BACKLIGHT
- mutex_lock(&pmac_backlight_mutex);
-#endif
-
- mutex_lock(&info->bl_mutex);
- if (info->bl_dev) {
-#ifdef CONFIG_PMAC_BACKLIGHT
- if (pmac_backlight == info->bl_dev)
- pmac_backlight = NULL;
-#endif
-
- backlight_device_unregister(info->bl_dev);
-
- printk("aty: Backlight unloaded\n");
- }
- mutex_unlock(&info->bl_mutex);
-
-#ifdef CONFIG_PMAC_BACKLIGHT
- mutex_unlock(&pmac_backlight_mutex);
-#endif
-}
-
-#endif /* CONFIG_FB_ATY_BACKLIGHT */
-
-static void __devinit aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
+static void __init aty_calc_mem_refresh(struct atyfb_par *par, int xclk)
{
const int ragepro_tbl[] = {
44, 50, 55, 66, 75, 80, 100
if (IS_XL(par->pci_id) || IS_MOBILITY(par->pci_id)) {
refresh_tbl = ragexl_tbl;
- size = ARRAY_SIZE(ragexl_tbl);
+ size = sizeof(ragexl_tbl)/sizeof(int);
} else {
refresh_tbl = ragepro_tbl;
- size = ARRAY_SIZE(ragepro_tbl);
+ size = sizeof(ragepro_tbl)/sizeof(int);
}
for (i=0; i < size; i++) {
}
#endif /* defined(__i386__) && defined(CONFIG_FB_ATY_GENERIC_LCD) */
-static int __devinit aty_init(struct fb_info *info, const char *name)
+static int __init aty_init(struct fb_info *info, const char *name)
{
struct atyfb_par *par = (struct atyfb_par *) info->par;
const char *ramname = NULL, *xtal;
break;
}
switch (clk_type) {
-#ifdef CONFIG_ATARI
case CLK_ATI18818_1:
par->pll_ops = &aty_pll_ati18818_1;
break;
-#else
- case CLK_IBMRGB514:
- par->pll_ops = &aty_pll_ibm514;
- break;
-#endif
-#if 0 /* dead code */
case CLK_STG1703:
par->pll_ops = &aty_pll_stg1703;
break;
case CLK_ATT20C408:
par->pll_ops = &aty_pll_att20c408;
break;
-#endif
+ case CLK_IBMRGB514:
+ par->pll_ops = &aty_pll_ibm514;
+ break;
default:
PRINTKI("aty_init: CLK type not implemented yet!");
par->pll_ops = &aty_pll_unsupported;
info->fbops = &atyfb_ops;
info->pseudo_palette = pseudo_palette;
- info->flags = FBINFO_DEFAULT |
- FBINFO_HWACCEL_IMAGEBLIT |
- FBINFO_HWACCEL_FILLRECT |
- FBINFO_HWACCEL_COPYAREA |
- FBINFO_HWACCEL_YPAN;
+ info->flags = FBINFO_FLAG_DEFAULT;
#ifdef CONFIG_PMAC_BACKLIGHT
if (M64_HAS(G3_PB_1_1) && machine_is_compatible("PowerBook1,1")) {
/* these bits let the 101 powerbook wake up from sleep -- paulus */
aty_st_lcd(POWER_MANAGEMENT, aty_ld_lcd(POWER_MANAGEMENT, par)
| (USE_F32KHZ | TRISTATE_MEM_EN), par);
- } else
-#endif
- if (M64_HAS(MOBIL_BUS)) {
-#ifdef CONFIG_FB_ATY_BACKLIGHT
- aty_bl_init (par);
-#endif
- }
+ } else if (M64_HAS(MOBIL_BUS))
+ register_backlight_controller(&aty_backlight_controller, info, "ati");
+#endif /* CONFIG_PMAC_BACKLIGHT */
memset(&var, 0, sizeof(var));
#ifdef CONFIG_PPC
- if (machine_is(powermac)) {
+ if (_machine == _MACH_Pmac) {
/*
* FIXME: The NVRAM stuff should be put in a Mac-specific file, as it
* applies to all Mac video cards
}
#ifdef CONFIG_ATARI
-static int __devinit store_video_par(char *video_str, unsigned char m64_num)
+static int __init store_video_par(char *video_str, unsigned char m64_num)
{
char *p;
unsigned long vmembase, size, guiregbase;
if (par->lock_blank || par->asleep)
return 0;
-#ifdef CONFIG_FB_ATY_BACKLIGHT
- if (machine_is(powermac) && blank > FB_BLANK_NORMAL)
- aty_bl_set_power(info, FB_BLANK_POWERDOWN);
+#ifdef CONFIG_PMAC_BACKLIGHT
+ if ((_machine == _MACH_Pmac) && blank > FB_BLANK_NORMAL)
+ set_backlight_enable(0);
#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
if (par->lcd_table && blank > FB_BLANK_NORMAL &&
(aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
}
aty_st_le32(CRTC_GEN_CNTL, gen_cntl, par);
-#ifdef CONFIG_FB_ATY_BACKLIGHT
- if (machine_is(powermac) && blank <= FB_BLANK_NORMAL)
- aty_bl_set_power(info, FB_BLANK_UNBLANK);
+#ifdef CONFIG_PMAC_BACKLIGHT
+ if ((_machine == _MACH_Pmac) && blank <= FB_BLANK_NORMAL)
+ set_backlight_enable(1);
#elif defined(CONFIG_FB_ATY_GENERIC_LCD)
if (par->lcd_table && blank <= FB_BLANK_NORMAL &&
(aty_ld_lcd(LCD_GEN_CNTL, par) & LCD_ON)) {
}
pcp = pdev->sysdata;
- if (node == pcp->prom_node->node) {
+ if (node == pcp->prom_node) {
struct fb_var_screeninfo *var = &default_var;
unsigned int N, P, Q, M, T, R;
u32 v_total, h_total;
struct atyfb_par *par;
int i, rc = -ENOMEM;
- for (i = ARRAY_SIZE(aty_chips) - 1; i >= 0; i--)
+ for (i = sizeof(aty_chips) / sizeof(*aty_chips) - 1; i >= 0; i--)
if (pdev->device == aty_chips[i].pci_id)
break;
par->res_start = res_start;
par->res_size = res_size;
par->irq = pdev->irq;
- par->pdev = pdev;
/* Setup "info" structure */
#ifdef __sparc__
aty_set_crtc(par, &saved_crtc);
par->pll_ops->set_pll(info, &saved_pll);
-#ifdef CONFIG_FB_ATY_BACKLIGHT
- if (M64_HAS(MOBIL_BUS))
- aty_bl_exit(par);
-#endif
-
unregister_framebuffer(info);
#ifdef CONFIG_MTRR
#endif /* CONFIG_PCI */
#ifndef MODULE
-static int __devinit atyfb_setup(char *options)
+static int __init atyfb_setup(char *options)
{
char *this_opt;
}
#endif /* MODULE */
-static int __devinit atyfb_init(void)
+static int __init atyfb_init(void)
{
#ifndef MODULE
char *option = NULL;
atyfb_setup(option);
#endif
-#ifdef CONFIG_PCI
pci_register_driver(&atyfb_driver);
-#endif
#ifdef CONFIG_ATARI
atyfb_atari_probe();
#endif
static void __exit atyfb_exit(void)
{
-#ifdef CONFIG_PCI
pci_unregister_driver(&atyfb_driver);
-#endif
}
module_init(atyfb_init);