root/drivers/video/fbdev/via/via_utility.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. viafb_get_device_support_state
  2. viafb_get_device_connect_state
  3. viafb_lcd_get_support_expand_state
  4. viafb_set_gamma_table
  5. viafb_get_gamma_table
  6. viafb_get_gamma_support_state

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
   4  * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
   5 
   6  */
   7 
   8 #include <linux/via-core.h>
   9 #include "global.h"
  10 
  11 void viafb_get_device_support_state(u32 *support_state)
  12 {
  13         *support_state = CRT_Device;
  14 
  15         if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name == VT1632_TMDS)
  16                 *support_state |= DVI_Device;
  17 
  18         if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name == VT1631_LVDS)
  19                 *support_state |= LCD_Device;
  20 }
  21 
  22 void viafb_get_device_connect_state(u32 *connect_state)
  23 {
  24         bool mobile = false;
  25 
  26         *connect_state = CRT_Device;
  27 
  28         if (viafb_dvi_sense())
  29                 *connect_state |= DVI_Device;
  30 
  31         viafb_lcd_get_mobile_state(&mobile);
  32         if (mobile)
  33                 *connect_state |= LCD_Device;
  34 }
  35 
  36 bool viafb_lcd_get_support_expand_state(u32 xres, u32 yres)
  37 {
  38         unsigned int support_state = 0;
  39 
  40         switch (viafb_lcd_panel_id) {
  41         case LCD_PANEL_ID0_640X480:
  42                 if ((xres < 640) && (yres < 480))
  43                         support_state = true;
  44                 break;
  45 
  46         case LCD_PANEL_ID1_800X600:
  47                 if ((xres < 800) && (yres < 600))
  48                         support_state = true;
  49                 break;
  50 
  51         case LCD_PANEL_ID2_1024X768:
  52                 if ((xres < 1024) && (yres < 768))
  53                         support_state = true;
  54                 break;
  55 
  56         case LCD_PANEL_ID3_1280X768:
  57                 if ((xres < 1280) && (yres < 768))
  58                         support_state = true;
  59                 break;
  60 
  61         case LCD_PANEL_ID4_1280X1024:
  62                 if ((xres < 1280) && (yres < 1024))
  63                         support_state = true;
  64                 break;
  65 
  66         case LCD_PANEL_ID5_1400X1050:
  67                 if ((xres < 1400) && (yres < 1050))
  68                         support_state = true;
  69                 break;
  70 
  71         case LCD_PANEL_ID6_1600X1200:
  72                 if ((xres < 1600) && (yres < 1200))
  73                         support_state = true;
  74                 break;
  75 
  76         case LCD_PANEL_ID7_1366X768:
  77                 if ((xres < 1366) && (yres < 768))
  78                         support_state = true;
  79                 break;
  80 
  81         case LCD_PANEL_ID8_1024X600:
  82                 if ((xres < 1024) && (yres < 600))
  83                         support_state = true;
  84                 break;
  85 
  86         case LCD_PANEL_ID9_1280X800:
  87                 if ((xres < 1280) && (yres < 800))
  88                         support_state = true;
  89                 break;
  90 
  91         case LCD_PANEL_IDA_800X480:
  92                 if ((xres < 800) && (yres < 480))
  93                         support_state = true;
  94                 break;
  95 
  96         case LCD_PANEL_IDB_1360X768:
  97                 if ((xres < 1360) && (yres < 768))
  98                         support_state = true;
  99                 break;
 100 
 101         case LCD_PANEL_IDC_480X640:
 102                 if ((xres < 480) && (yres < 640))
 103                         support_state = true;
 104                 break;
 105 
 106         default:
 107                 support_state = false;
 108                 break;
 109         }
 110 
 111         return support_state;
 112 }
 113 
 114 /*====================================================================*/
 115 /*                      Gamma Function Implementation*/
 116 /*====================================================================*/
 117 
 118 void viafb_set_gamma_table(int bpp, unsigned int *gamma_table)
 119 {
 120         int i, sr1a;
 121         int active_device_amount = 0;
 122         int device_status = viafb_DeviceStatus;
 123 
 124         for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) {
 125                 if (device_status & 1)
 126                         active_device_amount++;
 127                 device_status >>= 1;
 128         }
 129 
 130         /* 8 bpp mode can't adjust gamma */
 131         if (bpp == 8)
 132                 return ;
 133 
 134         /* Enable Gamma */
 135         switch (viaparinfo->chip_info->gfx_chip_name) {
 136         case UNICHROME_CLE266:
 137         case UNICHROME_K400:
 138                 viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
 139                 break;
 140 
 141         case UNICHROME_K800:
 142         case UNICHROME_PM800:
 143         case UNICHROME_CN700:
 144         case UNICHROME_CX700:
 145         case UNICHROME_K8M890:
 146         case UNICHROME_P4M890:
 147         case UNICHROME_P4M900:
 148                 viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
 149                 break;
 150         }
 151         sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A);
 152         viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
 153 
 154         /* Fill IGA1 Gamma Table */
 155         outb(0, LUT_INDEX_WRITE);
 156         for (i = 0; i < 256; i++) {
 157                 outb(gamma_table[i] >> 16, LUT_DATA);
 158                 outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
 159                 outb(gamma_table[i] & 0xFF, LUT_DATA);
 160         }
 161 
 162         /* If adjust Gamma value in SAMM, fill IGA1,
 163            IGA2 Gamma table simultaneous. */
 164         /* Switch to IGA2 Gamma Table */
 165         if ((active_device_amount > 1) &&
 166                 !((viaparinfo->chip_info->gfx_chip_name ==
 167                 UNICHROME_CLE266) &&
 168                 (viaparinfo->chip_info->gfx_chip_revision < 15))) {
 169                 viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0);
 170                 viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1);
 171 
 172                 /* Fill IGA2 Gamma Table */
 173                 outb(0, LUT_INDEX_WRITE);
 174                 for (i = 0; i < 256; i++) {
 175                         outb(gamma_table[i] >> 16, LUT_DATA);
 176                         outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
 177                         outb(gamma_table[i] & 0xFF, LUT_DATA);
 178                 }
 179         }
 180         viafb_write_reg(SR1A, VIASR, sr1a);
 181 }
 182 
 183 void viafb_get_gamma_table(unsigned int *gamma_table)
 184 {
 185         unsigned char color_r, color_g, color_b;
 186         unsigned char sr1a = 0;
 187         int i;
 188 
 189         /* Enable Gamma */
 190         switch (viaparinfo->chip_info->gfx_chip_name) {
 191         case UNICHROME_CLE266:
 192         case UNICHROME_K400:
 193                 viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
 194                 break;
 195 
 196         case UNICHROME_K800:
 197         case UNICHROME_PM800:
 198         case UNICHROME_CN700:
 199         case UNICHROME_CX700:
 200         case UNICHROME_K8M890:
 201         case UNICHROME_P4M890:
 202         case UNICHROME_P4M900:
 203                 viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
 204                 break;
 205         }
 206         sr1a = viafb_read_reg(VIASR, SR1A);
 207         viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
 208 
 209         /* Reading gamma table to get color value */
 210         outb(0, LUT_INDEX_READ);
 211         for (i = 0; i < 256; i++) {
 212                 color_r = inb(LUT_DATA);
 213                 color_g = inb(LUT_DATA);
 214                 color_b = inb(LUT_DATA);
 215                 gamma_table[i] =
 216                     ((((u32) color_r) << 16) |
 217                      (((u16) color_g) << 8)) | color_b;
 218         }
 219         viafb_write_reg(SR1A, VIASR, sr1a);
 220 }
 221 
 222 void viafb_get_gamma_support_state(int bpp, unsigned int *support_state)
 223 {
 224         if (bpp == 8)
 225                 *support_state = None_Device;
 226         else
 227                 *support_state = CRT_Device | DVI_Device | LCD_Device;
 228 }

/* [<][>][^][v][top][bottom][index][help] */