diff options
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/atmel_lcdfb.c | 13 | ||||
-rw-r--r-- | drivers/video/aty/radeon_accel.c | 8 | ||||
-rw-r--r-- | drivers/video/console/fbcon.c | 4 | ||||
-rw-r--r-- | drivers/video/console/fbcon.h | 2 | ||||
-rw-r--r-- | drivers/video/fsl-diu-fb.c | 32 | ||||
-rw-r--r-- | drivers/video/matrox/i2c-matroxfb.c | 21 | ||||
-rw-r--r-- | drivers/video/matrox/matroxfb_maven.c | 97 | ||||
-rw-r--r-- | drivers/video/pxafb.c | 68 |
8 files changed, 141 insertions, 104 deletions
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index e7018a2f56af..9c5925927ece 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -39,7 +39,9 @@ | |||
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | #if defined(CONFIG_ARCH_AT91) | 41 | #if defined(CONFIG_ARCH_AT91) |
42 | #define ATMEL_LCDFB_FBINFO_DEFAULT FBINFO_DEFAULT | 42 | #define ATMEL_LCDFB_FBINFO_DEFAULT (FBINFO_DEFAULT \ |
43 | | FBINFO_PARTIAL_PAN_OK \ | ||
44 | | FBINFO_HWACCEL_YPAN) | ||
43 | 45 | ||
44 | static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, | 46 | static inline void atmel_lcdfb_update_dma2d(struct atmel_lcdfb_info *sinfo, |
45 | struct fb_var_screeninfo *var) | 47 | struct fb_var_screeninfo *var) |
@@ -177,7 +179,7 @@ static struct fb_fix_screeninfo atmel_lcdfb_fix __initdata = { | |||
177 | .type = FB_TYPE_PACKED_PIXELS, | 179 | .type = FB_TYPE_PACKED_PIXELS, |
178 | .visual = FB_VISUAL_TRUECOLOR, | 180 | .visual = FB_VISUAL_TRUECOLOR, |
179 | .xpanstep = 0, | 181 | .xpanstep = 0, |
180 | .ypanstep = 0, | 182 | .ypanstep = 1, |
181 | .ywrapstep = 0, | 183 | .ywrapstep = 0, |
182 | .accel = FB_ACCEL_NONE, | 184 | .accel = FB_ACCEL_NONE, |
183 | }; | 185 | }; |
@@ -240,9 +242,11 @@ static int atmel_lcdfb_alloc_video_memory(struct atmel_lcdfb_info *sinfo) | |||
240 | { | 242 | { |
241 | struct fb_info *info = sinfo->info; | 243 | struct fb_info *info = sinfo->info; |
242 | struct fb_var_screeninfo *var = &info->var; | 244 | struct fb_var_screeninfo *var = &info->var; |
245 | unsigned int smem_len; | ||
243 | 246 | ||
244 | info->fix.smem_len = (var->xres_virtual * var->yres_virtual | 247 | smem_len = (var->xres_virtual * var->yres_virtual |
245 | * ((var->bits_per_pixel + 7) / 8)); | 248 | * ((var->bits_per_pixel + 7) / 8)); |
249 | info->fix.smem_len = max(smem_len, sinfo->smem_len); | ||
246 | 250 | ||
247 | info->screen_base = dma_alloc_writecombine(info->device, info->fix.smem_len, | 251 | info->screen_base = dma_alloc_writecombine(info->device, info->fix.smem_len, |
248 | (dma_addr_t *)&info->fix.smem_start, GFP_KERNEL); | 252 | (dma_addr_t *)&info->fix.smem_start, GFP_KERNEL); |
@@ -794,6 +798,7 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) | |||
794 | sinfo->default_monspecs = pdata_sinfo->default_monspecs; | 798 | sinfo->default_monspecs = pdata_sinfo->default_monspecs; |
795 | sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control; | 799 | sinfo->atmel_lcdfb_power_control = pdata_sinfo->atmel_lcdfb_power_control; |
796 | sinfo->guard_time = pdata_sinfo->guard_time; | 800 | sinfo->guard_time = pdata_sinfo->guard_time; |
801 | sinfo->smem_len = pdata_sinfo->smem_len; | ||
797 | sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; | 802 | sinfo->lcdcon_is_backlight = pdata_sinfo->lcdcon_is_backlight; |
798 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; | 803 | sinfo->lcd_wiring_mode = pdata_sinfo->lcd_wiring_mode; |
799 | } else { | 804 | } else { |
diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c index 4d13f68436e6..aa95f8350242 100644 --- a/drivers/video/aty/radeon_accel.c +++ b/drivers/video/aty/radeon_accel.c | |||
@@ -55,6 +55,10 @@ static void radeonfb_prim_fillrect(struct radeonfb_info *rinfo, | |||
55 | OUTREG(DP_WRITE_MSK, 0xffffffff); | 55 | OUTREG(DP_WRITE_MSK, 0xffffffff); |
56 | OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); | 56 | OUTREG(DP_CNTL, (DST_X_LEFT_TO_RIGHT | DST_Y_TOP_TO_BOTTOM)); |
57 | 57 | ||
58 | radeon_fifo_wait(2); | ||
59 | OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); | ||
60 | OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); | ||
61 | |||
58 | radeon_fifo_wait(2); | 62 | radeon_fifo_wait(2); |
59 | OUTREG(DST_Y_X, (region->dy << 16) | region->dx); | 63 | OUTREG(DST_Y_X, (region->dy << 16) | region->dx); |
60 | OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height); | 64 | OUTREG(DST_WIDTH_HEIGHT, (region->width << 16) | region->height); |
@@ -116,6 +120,10 @@ static void radeonfb_prim_copyarea(struct radeonfb_info *rinfo, | |||
116 | OUTREG(DP_CNTL, (xdir>=0 ? DST_X_LEFT_TO_RIGHT : 0) | 120 | OUTREG(DP_CNTL, (xdir>=0 ? DST_X_LEFT_TO_RIGHT : 0) |
117 | | (ydir>=0 ? DST_Y_TOP_TO_BOTTOM : 0)); | 121 | | (ydir>=0 ? DST_Y_TOP_TO_BOTTOM : 0)); |
118 | 122 | ||
123 | radeon_fifo_wait(2); | ||
124 | OUTREG(DSTCACHE_CTLSTAT, RB2D_DC_FLUSH_ALL); | ||
125 | OUTREG(WAIT_UNTIL, (WAIT_2D_IDLECLEAN | WAIT_DMA_GUI_IDLE)); | ||
126 | |||
119 | radeon_fifo_wait(3); | 127 | radeon_fifo_wait(3); |
120 | OUTREG(SRC_Y_X, (sy << 16) | sx); | 128 | OUTREG(SRC_Y_X, (sy << 16) | sx); |
121 | OUTREG(DST_Y_X, (dy << 16) | dx); | 129 | OUTREG(DST_Y_X, (dy << 16) | dx); |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 33859934a8e4..c6299e8a041d 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -2518,7 +2518,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | |||
2518 | c = vc->vc_video_erase_char; | 2518 | c = vc->vc_video_erase_char; |
2519 | vc->vc_video_erase_char = | 2519 | vc->vc_video_erase_char = |
2520 | ((c & 0xfe00) >> 1) | (c & 0xff); | 2520 | ((c & 0xfe00) >> 1) | (c & 0xff); |
2521 | c = vc->vc_def_color; | 2521 | c = vc->vc_scrl_erase_char; |
2522 | vc->vc_scrl_erase_char = | 2522 | vc->vc_scrl_erase_char = |
2523 | ((c & 0xFE00) >> 1) | (c & 0xFF); | 2523 | ((c & 0xFE00) >> 1) | (c & 0xFF); |
2524 | vc->vc_attr >>= 1; | 2524 | vc->vc_attr >>= 1; |
@@ -2551,7 +2551,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | |||
2551 | if (vc->vc_can_do_color) { | 2551 | if (vc->vc_can_do_color) { |
2552 | vc->vc_video_erase_char = | 2552 | vc->vc_video_erase_char = |
2553 | ((c & 0xff00) << 1) | (c & 0xff); | 2553 | ((c & 0xff00) << 1) | (c & 0xff); |
2554 | c = vc->vc_def_color; | 2554 | c = vc->vc_scrl_erase_char; |
2555 | vc->vc_scrl_erase_char = | 2555 | vc->vc_scrl_erase_char = |
2556 | ((c & 0xFF00) << 1) | (c & 0xFF); | 2556 | ((c & 0xFF00) << 1) | (c & 0xFF); |
2557 | vc->vc_attr <<= 1; | 2557 | vc->vc_attr <<= 1; |
diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index de1b1365279b..a6e38e9ea73f 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h | |||
@@ -92,7 +92,7 @@ struct fbcon_ops { | |||
92 | #define attr_fgcol(fgshift,s) \ | 92 | #define attr_fgcol(fgshift,s) \ |
93 | (((s) >> (fgshift)) & 0x0f) | 93 | (((s) >> (fgshift)) & 0x0f) |
94 | #define attr_bgcol(bgshift,s) \ | 94 | #define attr_bgcol(bgshift,s) \ |
95 | (((s) >> (bgshift)) & 0x07) | 95 | (((s) >> (bgshift)) & 0x0f) |
96 | 96 | ||
97 | /* Monochrome */ | 97 | /* Monochrome */ |
98 | #define attr_bold(s) \ | 98 | #define attr_bold(s) \ |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index bd320a2bfb7c..fb51197d1c98 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
@@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var, | |||
479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; | 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; |
480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; | 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; |
481 | 481 | ||
482 | if (mfbi->x_aoi_d < 0) | ||
483 | mfbi->x_aoi_d = 0; | ||
484 | if (mfbi->y_aoi_d < 0) | ||
485 | mfbi->y_aoi_d = 0; | ||
482 | switch (index) { | 486 | switch (index) { |
483 | case 0: | 487 | case 0: |
484 | if (mfbi->x_aoi_d != 0) | 488 | if (mfbi->x_aoi_d != 0) |
@@ -778,6 +782,22 @@ static void unmap_video_memory(struct fb_info *info) | |||
778 | } | 782 | } |
779 | 783 | ||
780 | /* | 784 | /* |
785 | * Using the fb_var_screeninfo in fb_info we set the aoi of this | ||
786 | * particular framebuffer. It is a light version of fsl_diu_set_par. | ||
787 | */ | ||
788 | static int fsl_diu_set_aoi(struct fb_info *info) | ||
789 | { | ||
790 | struct fb_var_screeninfo *var = &info->var; | ||
791 | struct mfb_info *mfbi = info->par; | ||
792 | struct diu_ad *ad = mfbi->ad; | ||
793 | |||
794 | /* AOI should not be greater than display size */ | ||
795 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); | ||
796 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | ||
797 | return 0; | ||
798 | } | ||
799 | |||
800 | /* | ||
781 | * Using the fb_var_screeninfo in fb_info we set the resolution of this | 801 | * Using the fb_var_screeninfo in fb_info we set the resolution of this |
782 | * particular framebuffer. This function alters the fb_fix_screeninfo stored | 802 | * particular framebuffer. This function alters the fb_fix_screeninfo stored |
783 | * in fb_info. It does not alter var in fb_info since we are using that | 803 | * in fb_info. It does not alter var in fb_info since we are using that |
@@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info) | |||
817 | diu_ops.get_pixel_format(var->bits_per_pixel, | 837 | diu_ops.get_pixel_format(var->bits_per_pixel, |
818 | machine_data->monitor_port); | 838 | machine_data->monitor_port); |
819 | ad->addr = cpu_to_le32(info->fix.smem_start); | 839 | ad->addr = cpu_to_le32(info->fix.smem_start); |
820 | ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) | | 840 | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) | |
821 | var->xres) | mfbi->g_alpha; | 841 | var->xres_virtual) | mfbi->g_alpha; |
822 | /* fix me. AOI should not be greater than display size */ | 842 | /* AOI should not be greater than display size */ |
823 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); | 843 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); |
824 | ad->offset_xyi = 0; | 844 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); |
825 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | 845 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); |
826 | 846 | ||
827 | /* Disable chroma keying function */ | 847 | /* Disable chroma keying function */ |
@@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var, | |||
921 | else | 941 | else |
922 | info->var.vmode &= ~FB_VMODE_YWRAP; | 942 | info->var.vmode &= ~FB_VMODE_YWRAP; |
923 | 943 | ||
944 | fsl_diu_set_aoi(info); | ||
945 | |||
924 | return 0; | 946 | return 0; |
925 | } | 947 | } |
926 | 948 | ||
@@ -989,7 +1011,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, | |||
989 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", | 1011 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", |
990 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); | 1012 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); |
991 | fsl_diu_check_var(&info->var, info); | 1013 | fsl_diu_check_var(&info->var, info); |
992 | fsl_diu_set_par(info); | 1014 | fsl_diu_set_aoi(info); |
993 | break; | 1015 | break; |
994 | case MFB_GET_AOID: | 1016 | case MFB_GET_AOID: |
995 | aoi_d.x_aoi_d = mfbi->x_aoi_d; | 1017 | aoi_d.x_aoi_d = mfbi->x_aoi_d; |
diff --git a/drivers/video/matrox/i2c-matroxfb.c b/drivers/video/matrox/i2c-matroxfb.c index 75ee5a12e549..c14e3e2212b3 100644 --- a/drivers/video/matrox/i2c-matroxfb.c +++ b/drivers/video/matrox/i2c-matroxfb.c | |||
@@ -87,13 +87,7 @@ static int matroxfb_gpio_getscl(void* data) { | |||
87 | return (matroxfb_read_gpio(b->minfo) & b->mask.clock) ? 1 : 0; | 87 | return (matroxfb_read_gpio(b->minfo) & b->mask.clock) ? 1 : 0; |
88 | } | 88 | } |
89 | 89 | ||
90 | static struct i2c_adapter matrox_i2c_adapter_template = | 90 | static const struct i2c_algo_bit_data matrox_i2c_algo_template = |
91 | { | ||
92 | .owner = THIS_MODULE, | ||
93 | .id = I2C_HW_B_G400, | ||
94 | }; | ||
95 | |||
96 | static struct i2c_algo_bit_data matrox_i2c_algo_template = | ||
97 | { | 91 | { |
98 | .setsda = matroxfb_gpio_setsda, | 92 | .setsda = matroxfb_gpio_setsda, |
99 | .setscl = matroxfb_gpio_setscl, | 93 | .setscl = matroxfb_gpio_setscl, |
@@ -112,7 +106,7 @@ static int i2c_bus_reg(struct i2c_bit_adapter* b, struct matrox_fb_info* minfo, | |||
112 | b->minfo = minfo; | 106 | b->minfo = minfo; |
113 | b->mask.data = data; | 107 | b->mask.data = data; |
114 | b->mask.clock = clock; | 108 | b->mask.clock = clock; |
115 | b->adapter = matrox_i2c_adapter_template; | 109 | b->adapter.owner = THIS_MODULE; |
116 | snprintf(b->adapter.name, sizeof(b->adapter.name), name, | 110 | snprintf(b->adapter.name, sizeof(b->adapter.name), name, |
117 | minfo->fbcon.node); | 111 | minfo->fbcon.node); |
118 | i2c_set_adapdata(&b->adapter, b); | 112 | i2c_set_adapdata(&b->adapter, b); |
@@ -187,6 +181,17 @@ static void* i2c_matroxfb_probe(struct matrox_fb_info* minfo) { | |||
187 | MAT_DATA, MAT_CLK, "MAVEN:fb%u", 0); | 181 | MAT_DATA, MAT_CLK, "MAVEN:fb%u", 0); |
188 | if (err) | 182 | if (err) |
189 | printk(KERN_INFO "i2c-matroxfb: Could not register Maven i2c bus. Continuing anyway.\n"); | 183 | printk(KERN_INFO "i2c-matroxfb: Could not register Maven i2c bus. Continuing anyway.\n"); |
184 | else { | ||
185 | struct i2c_board_info maven_info = { | ||
186 | I2C_BOARD_INFO("maven", 0x1b), | ||
187 | }; | ||
188 | unsigned short const addr_list[2] = { | ||
189 | 0x1b, I2C_CLIENT_END | ||
190 | }; | ||
191 | |||
192 | i2c_new_probed_device(&m2info->maven.adapter, | ||
193 | &maven_info, addr_list); | ||
194 | } | ||
190 | } | 195 | } |
191 | return m2info; | 196 | return m2info; |
192 | fail_ddc1:; | 197 | fail_ddc1:; |
diff --git a/drivers/video/matrox/matroxfb_maven.c b/drivers/video/matrox/matroxfb_maven.c index 89da27bd5c49..042408a8c631 100644 --- a/drivers/video/matrox/matroxfb_maven.c +++ b/drivers/video/matrox/matroxfb_maven.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #include <linux/matroxfb.h> | 19 | #include <linux/matroxfb.h> |
20 | #include <asm/div64.h> | 20 | #include <asm/div64.h> |
21 | 21 | ||
22 | #define MAVEN_I2CID (0x1B) | ||
23 | |||
24 | #define MGATVO_B 1 | 22 | #define MGATVO_B 1 |
25 | #define MGATVO_C 2 | 23 | #define MGATVO_C 2 |
26 | 24 | ||
@@ -128,7 +126,7 @@ static int get_ctrl_id(__u32 v4l2_id) { | |||
128 | 126 | ||
129 | struct maven_data { | 127 | struct maven_data { |
130 | struct matrox_fb_info* primary_head; | 128 | struct matrox_fb_info* primary_head; |
131 | struct i2c_client client; | 129 | struct i2c_client *client; |
132 | int version; | 130 | int version; |
133 | }; | 131 | }; |
134 | 132 | ||
@@ -974,7 +972,7 @@ static inline int maven_compute_timming(struct maven_data* md, | |||
974 | 972 | ||
975 | static int maven_program_timming(struct maven_data* md, | 973 | static int maven_program_timming(struct maven_data* md, |
976 | const struct mavenregs* m) { | 974 | const struct mavenregs* m) { |
977 | struct i2c_client* c = &md->client; | 975 | struct i2c_client *c = md->client; |
978 | 976 | ||
979 | if (m->mode == MATROXFB_OUTPUT_MODE_MONITOR) { | 977 | if (m->mode == MATROXFB_OUTPUT_MODE_MONITOR) { |
980 | LR(0x80); | 978 | LR(0x80); |
@@ -1011,7 +1009,7 @@ static int maven_program_timming(struct maven_data* md, | |||
1011 | } | 1009 | } |
1012 | 1010 | ||
1013 | static inline int maven_resync(struct maven_data* md) { | 1011 | static inline int maven_resync(struct maven_data* md) { |
1014 | struct i2c_client* c = &md->client; | 1012 | struct i2c_client *c = md->client; |
1015 | maven_set_reg(c, 0x95, 0x20); /* start whole thing */ | 1013 | maven_set_reg(c, 0x95, 0x20); /* start whole thing */ |
1016 | return 0; | 1014 | return 0; |
1017 | } | 1015 | } |
@@ -1069,48 +1067,48 @@ static int maven_set_control (struct maven_data* md, | |||
1069 | maven_compute_bwlevel(md, &blacklevel, &whitelevel); | 1067 | maven_compute_bwlevel(md, &blacklevel, &whitelevel); |
1070 | blacklevel = (blacklevel >> 2) | ((blacklevel & 3) << 8); | 1068 | blacklevel = (blacklevel >> 2) | ((blacklevel & 3) << 8); |
1071 | whitelevel = (whitelevel >> 2) | ((whitelevel & 3) << 8); | 1069 | whitelevel = (whitelevel >> 2) | ((whitelevel & 3) << 8); |
1072 | maven_set_reg_pair(&md->client, 0x0e, blacklevel); | 1070 | maven_set_reg_pair(md->client, 0x0e, blacklevel); |
1073 | maven_set_reg_pair(&md->client, 0x1e, whitelevel); | 1071 | maven_set_reg_pair(md->client, 0x1e, whitelevel); |
1074 | } | 1072 | } |
1075 | break; | 1073 | break; |
1076 | case V4L2_CID_SATURATION: | 1074 | case V4L2_CID_SATURATION: |
1077 | { | 1075 | { |
1078 | maven_set_reg(&md->client, 0x20, p->value); | 1076 | maven_set_reg(md->client, 0x20, p->value); |
1079 | maven_set_reg(&md->client, 0x22, p->value); | 1077 | maven_set_reg(md->client, 0x22, p->value); |
1080 | } | 1078 | } |
1081 | break; | 1079 | break; |
1082 | case V4L2_CID_HUE: | 1080 | case V4L2_CID_HUE: |
1083 | { | 1081 | { |
1084 | maven_set_reg(&md->client, 0x25, p->value); | 1082 | maven_set_reg(md->client, 0x25, p->value); |
1085 | } | 1083 | } |
1086 | break; | 1084 | break; |
1087 | case V4L2_CID_GAMMA: | 1085 | case V4L2_CID_GAMMA: |
1088 | { | 1086 | { |
1089 | const struct maven_gamma* g; | 1087 | const struct maven_gamma* g; |
1090 | g = maven_compute_gamma(md); | 1088 | g = maven_compute_gamma(md); |
1091 | maven_set_reg(&md->client, 0x83, g->reg83); | 1089 | maven_set_reg(md->client, 0x83, g->reg83); |
1092 | maven_set_reg(&md->client, 0x84, g->reg84); | 1090 | maven_set_reg(md->client, 0x84, g->reg84); |
1093 | maven_set_reg(&md->client, 0x85, g->reg85); | 1091 | maven_set_reg(md->client, 0x85, g->reg85); |
1094 | maven_set_reg(&md->client, 0x86, g->reg86); | 1092 | maven_set_reg(md->client, 0x86, g->reg86); |
1095 | maven_set_reg(&md->client, 0x87, g->reg87); | 1093 | maven_set_reg(md->client, 0x87, g->reg87); |
1096 | maven_set_reg(&md->client, 0x88, g->reg88); | 1094 | maven_set_reg(md->client, 0x88, g->reg88); |
1097 | maven_set_reg(&md->client, 0x89, g->reg89); | 1095 | maven_set_reg(md->client, 0x89, g->reg89); |
1098 | maven_set_reg(&md->client, 0x8a, g->reg8a); | 1096 | maven_set_reg(md->client, 0x8a, g->reg8a); |
1099 | maven_set_reg(&md->client, 0x8b, g->reg8b); | 1097 | maven_set_reg(md->client, 0x8b, g->reg8b); |
1100 | } | 1098 | } |
1101 | break; | 1099 | break; |
1102 | case MATROXFB_CID_TESTOUT: | 1100 | case MATROXFB_CID_TESTOUT: |
1103 | { | 1101 | { |
1104 | unsigned char val | 1102 | unsigned char val |
1105 | = maven_get_reg(&md->client,0x8d); | 1103 | = maven_get_reg(md->client, 0x8d); |
1106 | if (p->value) val |= 0x10; | 1104 | if (p->value) val |= 0x10; |
1107 | else val &= ~0x10; | 1105 | else val &= ~0x10; |
1108 | maven_set_reg(&md->client, 0x8d, val); | 1106 | maven_set_reg(md->client, 0x8d, val); |
1109 | } | 1107 | } |
1110 | break; | 1108 | break; |
1111 | case MATROXFB_CID_DEFLICKER: | 1109 | case MATROXFB_CID_DEFLICKER: |
1112 | { | 1110 | { |
1113 | maven_set_reg(&md->client, 0x93, maven_compute_deflicker(md)); | 1111 | maven_set_reg(md->client, 0x93, maven_compute_deflicker(md)); |
1114 | } | 1112 | } |
1115 | break; | 1113 | break; |
1116 | } | 1114 | } |
@@ -1189,6 +1187,7 @@ static int maven_init_client(struct i2c_client* clnt) { | |||
1189 | MINFO_FROM(container_of(clnt->adapter, struct i2c_bit_adapter, adapter)->minfo); | 1187 | MINFO_FROM(container_of(clnt->adapter, struct i2c_bit_adapter, adapter)->minfo); |
1190 | 1188 | ||
1191 | md->primary_head = MINFO; | 1189 | md->primary_head = MINFO; |
1190 | md->client = clnt; | ||
1192 | down_write(&ACCESS_FBINFO(altout.lock)); | 1191 | down_write(&ACCESS_FBINFO(altout.lock)); |
1193 | ACCESS_FBINFO(outputs[1]).output = &maven_altout; | 1192 | ACCESS_FBINFO(outputs[1]).output = &maven_altout; |
1194 | ACCESS_FBINFO(outputs[1]).src = ACCESS_FBINFO(outputs[1]).default_src; | 1193 | ACCESS_FBINFO(outputs[1]).src = ACCESS_FBINFO(outputs[1]).default_src; |
@@ -1232,14 +1231,11 @@ static int maven_shutdown_client(struct i2c_client* clnt) { | |||
1232 | return 0; | 1231 | return 0; |
1233 | } | 1232 | } |
1234 | 1233 | ||
1235 | static const unsigned short normal_i2c[] = { MAVEN_I2CID, I2C_CLIENT_END }; | 1234 | static int maven_probe(struct i2c_client *client, |
1236 | I2C_CLIENT_INSMOD; | 1235 | const struct i2c_device_id *id) |
1237 | 1236 | { | |
1238 | static struct i2c_driver maven_driver; | 1237 | struct i2c_adapter *adapter = client->adapter; |
1239 | 1238 | int err = -ENODEV; | |
1240 | static int maven_detect_client(struct i2c_adapter* adapter, int address, int kind) { | ||
1241 | int err = 0; | ||
1242 | struct i2c_client* new_client; | ||
1243 | struct maven_data* data; | 1239 | struct maven_data* data; |
1244 | 1240 | ||
1245 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_WORD_DATA | | 1241 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_WRITE_WORD_DATA | |
@@ -1250,50 +1246,37 @@ static int maven_detect_client(struct i2c_adapter* adapter, int address, int kin | |||
1250 | err = -ENOMEM; | 1246 | err = -ENOMEM; |
1251 | goto ERROR0; | 1247 | goto ERROR0; |
1252 | } | 1248 | } |
1253 | new_client = &data->client; | 1249 | i2c_set_clientdata(client, data); |
1254 | i2c_set_clientdata(new_client, data); | 1250 | err = maven_init_client(client); |
1255 | new_client->addr = address; | ||
1256 | new_client->adapter = adapter; | ||
1257 | new_client->driver = &maven_driver; | ||
1258 | new_client->flags = 0; | ||
1259 | strlcpy(new_client->name, "maven", I2C_NAME_SIZE); | ||
1260 | if ((err = i2c_attach_client(new_client))) | ||
1261 | goto ERROR3; | ||
1262 | err = maven_init_client(new_client); | ||
1263 | if (err) | 1251 | if (err) |
1264 | goto ERROR4; | 1252 | goto ERROR4; |
1265 | return 0; | 1253 | return 0; |
1266 | ERROR4:; | 1254 | ERROR4:; |
1267 | i2c_detach_client(new_client); | 1255 | kfree(data); |
1268 | ERROR3:; | ||
1269 | kfree(new_client); | ||
1270 | ERROR0:; | 1256 | ERROR0:; |
1271 | return err; | 1257 | return err; |
1272 | } | 1258 | } |
1273 | 1259 | ||
1274 | static int maven_attach_adapter(struct i2c_adapter* adapter) { | 1260 | static int maven_remove(struct i2c_client *client) |
1275 | if (adapter->id == I2C_HW_B_G400) | 1261 | { |
1276 | return i2c_probe(adapter, &addr_data, &maven_detect_client); | ||
1277 | return 0; | ||
1278 | } | ||
1279 | |||
1280 | static int maven_detach_client(struct i2c_client* client) { | ||
1281 | int err; | ||
1282 | |||
1283 | if ((err = i2c_detach_client(client))) | ||
1284 | return err; | ||
1285 | maven_shutdown_client(client); | 1262 | maven_shutdown_client(client); |
1286 | kfree(i2c_get_clientdata(client)); | 1263 | kfree(i2c_get_clientdata(client)); |
1287 | return 0; | 1264 | return 0; |
1288 | } | 1265 | } |
1289 | 1266 | ||
1267 | static const struct i2c_device_id maven_id[] = { | ||
1268 | { "maven", 0 }, | ||
1269 | { } | ||
1270 | }; | ||
1271 | MODULE_DEVICE_TABLE(i2c, maven_id); | ||
1272 | |||
1290 | static struct i2c_driver maven_driver={ | 1273 | static struct i2c_driver maven_driver={ |
1291 | .driver = { | 1274 | .driver = { |
1292 | .name = "maven", | 1275 | .name = "maven", |
1293 | }, | 1276 | }, |
1294 | .id = I2C_DRIVERID_MGATVO, | 1277 | .probe = maven_probe, |
1295 | .attach_adapter = maven_attach_adapter, | 1278 | .remove = maven_remove, |
1296 | .detach_client = maven_detach_client, | 1279 | .id_table = maven_id, |
1297 | }; | 1280 | }; |
1298 | 1281 | ||
1299 | static int __init matroxfb_maven_init(void) | 1282 | static int __init matroxfb_maven_init(void) |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index e7aa7ae8fca8..97204497d9f7 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -1031,7 +1031,9 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi) | |||
1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); | 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); |
1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); | 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); |
1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); | 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); |
1034 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | 1034 | |
1035 | if ((lccr0 & LCCR0_PAS) == 0) | ||
1036 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | ||
1035 | } | 1037 | } |
1036 | 1038 | ||
1037 | static void pxafb_enable_controller(struct pxafb_info *fbi) | 1039 | static void pxafb_enable_controller(struct pxafb_info *fbi) |
@@ -1400,6 +1402,8 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
1400 | if (lcd_conn == LCD_MONO_STN_8BPP) | 1402 | if (lcd_conn == LCD_MONO_STN_8BPP) |
1401 | fbi->lccr0 |= LCCR0_DPD; | 1403 | fbi->lccr0 |= LCCR0_DPD; |
1402 | 1404 | ||
1405 | fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; | ||
1406 | |||
1403 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); | 1407 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); |
1404 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; | 1408 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; |
1405 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; | 1409 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; |
@@ -1673,53 +1677,63 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
1673 | #define pxafb_setup_options() (0) | 1677 | #define pxafb_setup_options() (0) |
1674 | #endif | 1678 | #endif |
1675 | 1679 | ||
1676 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
1677 | { | ||
1678 | struct pxafb_info *fbi; | ||
1679 | struct pxafb_mach_info *inf; | ||
1680 | struct resource *r; | ||
1681 | int irq, ret; | ||
1682 | |||
1683 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
1684 | |||
1685 | inf = dev->dev.platform_data; | ||
1686 | ret = -ENOMEM; | ||
1687 | fbi = NULL; | ||
1688 | if (!inf) | ||
1689 | goto failed; | ||
1690 | |||
1691 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
1692 | if (ret < 0) | ||
1693 | goto failed; | ||
1694 | |||
1695 | #ifdef DEBUG_VAR | 1680 | #ifdef DEBUG_VAR |
1696 | /* Check for various illegal bit-combinations. Currently only | 1681 | /* Check for various illegal bit-combinations. Currently only |
1697 | * a warning is given. */ | 1682 | * a warning is given. */ |
1683 | static void __devinit pxafb_check_options(struct device *dev, | ||
1684 | struct pxafb_mach_info *inf) | ||
1685 | { | ||
1686 | if (inf->lcd_conn) | ||
1687 | return; | ||
1698 | 1688 | ||
1699 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) | 1689 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) |
1700 | dev_warn(&dev->dev, "machine LCCR0 setting contains " | 1690 | dev_warn(dev, "machine LCCR0 setting contains " |
1701 | "illegal bits: %08x\n", | 1691 | "illegal bits: %08x\n", |
1702 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); | 1692 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); |
1703 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | 1693 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) |
1704 | dev_warn(&dev->dev, "machine LCCR3 setting contains " | 1694 | dev_warn(dev, "machine LCCR3 setting contains " |
1705 | "illegal bits: %08x\n", | 1695 | "illegal bits: %08x\n", |
1706 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | 1696 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); |
1707 | if (inf->lccr0 & LCCR0_DPD && | 1697 | if (inf->lccr0 & LCCR0_DPD && |
1708 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || | 1698 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || |
1709 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || | 1699 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || |
1710 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) | 1700 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) |
1711 | dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is " | 1701 | dev_warn(dev, "Double Pixel Data (DPD) mode is " |
1712 | "only valid in passive mono" | 1702 | "only valid in passive mono" |
1713 | " single panel mode\n"); | 1703 | " single panel mode\n"); |
1714 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && | 1704 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && |
1715 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) | 1705 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) |
1716 | dev_warn(&dev->dev, "Dual panel only valid in passive mode\n"); | 1706 | dev_warn(dev, "Dual panel only valid in passive mode\n"); |
1717 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && | 1707 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && |
1718 | (inf->modes->upper_margin || inf->modes->lower_margin)) | 1708 | (inf->modes->upper_margin || inf->modes->lower_margin)) |
1719 | dev_warn(&dev->dev, "Upper and lower margins must be 0 in " | 1709 | dev_warn(dev, "Upper and lower margins must be 0 in " |
1720 | "passive mode\n"); | 1710 | "passive mode\n"); |
1711 | } | ||
1712 | #else | ||
1713 | #define pxafb_check_options(...) do {} while (0) | ||
1721 | #endif | 1714 | #endif |
1722 | 1715 | ||
1716 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
1717 | { | ||
1718 | struct pxafb_info *fbi; | ||
1719 | struct pxafb_mach_info *inf; | ||
1720 | struct resource *r; | ||
1721 | int irq, ret; | ||
1722 | |||
1723 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
1724 | |||
1725 | inf = dev->dev.platform_data; | ||
1726 | ret = -ENOMEM; | ||
1727 | fbi = NULL; | ||
1728 | if (!inf) | ||
1729 | goto failed; | ||
1730 | |||
1731 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
1732 | if (ret < 0) | ||
1733 | goto failed; | ||
1734 | |||
1735 | pxafb_check_options(&dev->dev, inf); | ||
1736 | |||
1723 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", | 1737 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", |
1724 | inf->modes->xres, | 1738 | inf->modes->xres, |
1725 | inf->modes->yres, | 1739 | inf->modes->yres, |