@ -49,11 +49,6 @@ char *viafb_active_dev;
char * viafb_lcd_port = " " ;
char * viafb_dvi_port = " " ;
static void viafb_set_device ( struct device_t active_dev ) ;
static int apply_device_setting ( struct viafb_ioctl_setting setting_info ,
struct fb_info * info ) ;
static void apply_second_mode_setting ( struct fb_var_screeninfo
* sec_var ) ;
static void retrieve_device_setting ( struct viafb_ioctl_setting
* setting_info ) ;
static int viafb_pan_display ( struct fb_var_screeninfo * var ,
@ -478,13 +473,6 @@ static int viafb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
if ( gpu32 & LCD_Device )
viafb_lcd_disable ( ) ;
break ;
case VIAFB_SET_DEVICE :
if ( copy_from_user ( & u . active_dev , ( void * ) argp ,
sizeof ( u . active_dev ) ) )
return - EFAULT ;
viafb_set_device ( u . active_dev ) ;
viafb_set_par ( info ) ;
break ;
case VIAFB_GET_DEVICE :
u . active_dev . crt = viafb_CRT_ON ;
u . active_dev . dvi = viafb_DVI_ON ;
@ -527,21 +515,6 @@ static int viafb_ioctl(struct fb_info *info, u_int cmd, u_long arg)
break ;
case VIAFB_SET_DEVICE_INFO :
if ( copy_from_user ( & u . viafb_setting ,
argp , sizeof ( u . viafb_setting ) ) )
return - EFAULT ;
if ( apply_device_setting ( u . viafb_setting , info ) < 0 )
return - EINVAL ;
break ;
case VIAFB_SET_SECOND_MODE :
if ( copy_from_user ( & u . sec_var , argp , sizeof ( u . sec_var ) ) )
return - EFAULT ;
apply_second_mode_setting ( & u . sec_var ) ;
break ;
case VIAFB_GET_DEVICE_INFO :
retrieve_device_setting ( & u . viafb_setting ) ;
@ -913,112 +886,6 @@ static int viafb_sync(struct fb_info *info)
return 0 ;
}
static void check_available_device_to_enable ( int device_id )
{
int device_num = 0 ;
/* Initialize: */
viafb_CRT_ON = STATE_OFF ;
viafb_DVI_ON = STATE_OFF ;
viafb_LCD_ON = STATE_OFF ;
viafb_LCD2_ON = STATE_OFF ;
viafb_DeviceStatus = None_Device ;
if ( ( device_id & CRT_Device ) & & ( device_num < MAX_ACTIVE_DEV_NUM ) ) {
viafb_CRT_ON = STATE_ON ;
device_num + + ;
viafb_DeviceStatus | = CRT_Device ;
}
if ( ( device_id & DVI_Device ) & & ( device_num < MAX_ACTIVE_DEV_NUM ) ) {
viafb_DVI_ON = STATE_ON ;
device_num + + ;
viafb_DeviceStatus | = DVI_Device ;
}
if ( ( device_id & LCD_Device ) & & ( device_num < MAX_ACTIVE_DEV_NUM ) ) {
viafb_LCD_ON = STATE_ON ;
device_num + + ;
viafb_DeviceStatus | = LCD_Device ;
}
if ( ( device_id & LCD2_Device ) & & ( device_num < MAX_ACTIVE_DEV_NUM ) ) {
viafb_LCD2_ON = STATE_ON ;
device_num + + ;
viafb_DeviceStatus | = LCD2_Device ;
}
if ( viafb_DeviceStatus = = None_Device ) {
/* Use CRT as default active device: */
viafb_CRT_ON = STATE_ON ;
viafb_DeviceStatus = CRT_Device ;
}
DEBUG_MSG ( KERN_INFO " Device Status:%x " , viafb_DeviceStatus ) ;
}
static void viafb_set_device ( struct device_t active_dev )
{
/* Check available device to enable: */
int device_id = None_Device ;
if ( active_dev . crt )
device_id | = CRT_Device ;
if ( active_dev . dvi )
device_id | = DVI_Device ;
if ( active_dev . lcd )
device_id | = LCD_Device ;
check_available_device_to_enable ( device_id ) ;
/* Check property of LCD: */
if ( viafb_LCD_ON ) {
if ( active_dev . lcd_dsp_cent ) {
viaparinfo - > lvds_setting_info - > display_method =
viafb_lcd_dsp_method = LCD_CENTERING ;
} else {
viaparinfo - > lvds_setting_info - > display_method =
viafb_lcd_dsp_method = LCD_EXPANDSION ;
}
if ( active_dev . lcd_mode = = LCD_SPWG ) {
viaparinfo - > lvds_setting_info - > lcd_mode =
viafb_lcd_mode = LCD_SPWG ;
} else {
viaparinfo - > lvds_setting_info - > lcd_mode =
viafb_lcd_mode = LCD_OPENLDI ;
}
if ( active_dev . lcd_panel_id < = LCD_PANEL_ID_MAXIMUM ) {
viafb_lcd_panel_id = active_dev . lcd_panel_id ;
viafb_init_lcd_size ( ) ;
}
}
/* Check property of mode: */
if ( ! active_dev . xres1 )
viafb_second_xres = 640 ;
else
viafb_second_xres = active_dev . xres1 ;
if ( ! active_dev . yres1 )
viafb_second_yres = 480 ;
else
viafb_second_yres = active_dev . yres1 ;
if ( active_dev . bpp ! = 0 )
viafb_bpp = active_dev . bpp ;
if ( active_dev . bpp1 ! = 0 )
viafb_bpp1 = active_dev . bpp1 ;
if ( active_dev . refresh ! = 0 )
viafb_refresh = active_dev . refresh ;
if ( active_dev . refresh1 ! = 0 )
viafb_refresh1 = active_dev . refresh1 ;
if ( ( active_dev . samm = = STATE_OFF ) | | ( active_dev . samm = = STATE_ON ) )
viafb_SAMM_ON = active_dev . samm ;
viafb_primary_dev = active_dev . primary_dev ;
via_set_primary_address ( 0 ) ;
via_set_secondary_address ( viafb_SAMM_ON ? viafb_second_offset : 0 ) ;
viafb_set_iga_path ( ) ;
}
static int get_primary_device ( void )
{
int primary_device = 0 ;
@ -1060,124 +927,6 @@ static int get_primary_device(void)
return primary_device ;
}
static void apply_second_mode_setting ( struct fb_var_screeninfo
* sec_var )
{
u32 htotal , vtotal , long_refresh ;
htotal = sec_var - > xres + sec_var - > left_margin +
sec_var - > right_margin + sec_var - > hsync_len ;
vtotal = sec_var - > yres + sec_var - > upper_margin +
sec_var - > lower_margin + sec_var - > vsync_len ;
if ( ( sec_var - > xres_virtual * ( sec_var - > bits_per_pixel > > 3 ) ) & 0x1F ) {
/*Is 32 bytes alignment? */
/*32 pixel alignment */
sec_var - > xres_virtual = ( sec_var - > xres_virtual + 31 ) & ~ 31 ;
}
htotal = sec_var - > xres + sec_var - > left_margin +
sec_var - > right_margin + sec_var - > hsync_len ;
vtotal = sec_var - > yres + sec_var - > upper_margin +
sec_var - > lower_margin + sec_var - > vsync_len ;
long_refresh = 1000000000UL / sec_var - > pixclock * 1000 ;
long_refresh / = ( htotal * vtotal ) ;
viafb_second_xres = sec_var - > xres ;
viafb_second_yres = sec_var - > yres ;
viafb_second_virtual_xres = sec_var - > xres_virtual ;
viafb_second_virtual_yres = sec_var - > yres_virtual ;
viafb_bpp1 = sec_var - > bits_per_pixel ;
viafb_refresh1 = viafb_get_refresh ( sec_var - > xres , sec_var - > yres ,
long_refresh ) ;
}
static int apply_device_setting ( struct viafb_ioctl_setting setting_info ,
struct fb_info * info )
{
int need_set_mode = 0 ;
DEBUG_MSG ( KERN_INFO " apply_device_setting \n " ) ;
if ( setting_info . device_flag ) {
need_set_mode = 1 ;
check_available_device_to_enable ( setting_info . device_status ) ;
}
/* Unlock LCD's operation according to LCD flag
and check if the setting value is valid . */
/* If the value is valid, apply the new setting value to the device. */
if ( viafb_LCD_ON ) {
if ( setting_info . lcd_operation_flag & OP_LCD_CENTERING ) {
need_set_mode = 1 ;
if ( setting_info . lcd_attributes . display_center ) {
/* Centering */
viaparinfo - > lvds_setting_info - > display_method =
LCD_CENTERING ;
viafb_lcd_dsp_method = LCD_CENTERING ;
viaparinfo - > lvds_setting_info2 - > display_method =
viafb_lcd_dsp_method = LCD_CENTERING ;
} else {
/* expandsion */
viaparinfo - > lvds_setting_info - > display_method =
LCD_EXPANDSION ;
viafb_lcd_dsp_method = LCD_EXPANDSION ;
viaparinfo - > lvds_setting_info2 - > display_method =
LCD_EXPANDSION ;
viafb_lcd_dsp_method = LCD_EXPANDSION ;
}
}
if ( setting_info . lcd_operation_flag & OP_LCD_MODE ) {
need_set_mode = 1 ;
if ( setting_info . lcd_attributes . lcd_mode = =
LCD_SPWG ) {
viaparinfo - > lvds_setting_info - > lcd_mode =
viafb_lcd_mode = LCD_SPWG ;
} else {
viaparinfo - > lvds_setting_info - > lcd_mode =
viafb_lcd_mode = LCD_OPENLDI ;
}
viaparinfo - > lvds_setting_info2 - > lcd_mode =
viaparinfo - > lvds_setting_info - > lcd_mode ;
}
if ( setting_info . lcd_operation_flag & OP_LCD_PANEL_ID ) {
need_set_mode = 1 ;
if ( setting_info . lcd_attributes . panel_id < =
LCD_PANEL_ID_MAXIMUM ) {
viafb_lcd_panel_id =
setting_info . lcd_attributes . panel_id ;
viafb_init_lcd_size ( ) ;
}
}
}
if ( 0 ! = ( setting_info . samm_status & OP_SAMM ) ) {
setting_info . samm_status =
setting_info . samm_status & ( ~ OP_SAMM ) ;
if ( setting_info . samm_status = = 0
| | setting_info . samm_status = = 1 ) {
viafb_SAMM_ON = setting_info . samm_status ;
if ( viafb_SAMM_ON )
viafb_primary_dev = setting_info . primary_device ;
via_set_primary_address ( 0 ) ;
via_set_secondary_address ( viafb_SAMM_ON ?
viafb_second_offset : 0 ) ;
viafb_set_iga_path ( ) ;
}
need_set_mode = 1 ;
}
if ( ! need_set_mode ) {
;
} else {
viafb_set_iga_path ( ) ;
viafb_set_par ( info ) ;
}
return true ;
}
static void retrieve_device_setting ( struct viafb_ioctl_setting
* setting_info )
{