omap24xxfb.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 1,697 行 · 第 1/4 页

C
1,697
字号
	return (ctrl & mask);}/* Enable the display controller */static voidomap24xxfb_enable(const struct omap24xxfb_info *oinfo, 		const struct omap24xx_dispc_regs *dispc, 		unsigned long timeout_ticks){	unsigned long dispc_control;	dispc_control = dispc->control;	if (dispc_control & DISPC_CONTROL_DIGITALENABLE)		dispc_control |= DISPC_CONTROL_GODIGITAL;	if (dispc_control & DISPC_CONTROL_LCDENABLE)		dispc_control |= DISPC_CONTROL_GOLCD;	dispc_reg_out(oinfo, DISPC_CONTROL, dispc_control);	wait_for_go(oinfo, timeout_ticks);		return;}/* Disable the display controller */static voidomap24xxfb_disable(const struct omap24xxfb_info *oinfo, 		unsigned long timeout_ticks){	unsigned long timeout;	if (dispc_reg_in(oinfo, DISPC_CONTROL) 		& (DISPC_CONTROL_DIGITALENABLE | DISPC_CONTROL_LCDENABLE))	{		/* disable the display controller */		dispc_reg_merge(oinfo, DISPC_CONTROL, 0, 			DISPC_CONTROL_DIGITALENABLE | DISPC_CONTROL_LCDENABLE);		/* wait for any frame in progress to complete */		dispc_reg_out(oinfo, DISPC_IRQSTATUS, 				DISPC_IRQSTATUS_FRAMEDONE);		timeout = jiffies + timeout_ticks;		while(!(dispc_reg_in(oinfo, DISPC_IRQSTATUS) 				& DISPC_IRQSTATUS_FRAMEDONE)			&& time_before(jiffies, timeout))		{			if (!in_atomic()) {				set_current_state(TASK_INTERRUPTIBLE);				schedule_timeout(1);			} else				udelay(100);		}	}	return;}/* Reset the display controller */static voidomap24xxfb_reset(const struct omap24xxfb_info *oinfo, 		unsigned long timeout_ticks){	unsigned long timeout;	/* disable the display controller */	omap24xxfb_disable(oinfo, timeout_ticks);		/* reset the display controller */	dispc_reg_out(oinfo, DISPC_SYSCONFIG, DISPC_SYSCONFIG_SOFTRESET);	/* wait for reset to complete */	timeout = jiffies + timeout_ticks;	while (!(dispc_reg_in(oinfo, DISPC_SYSSTATUS) 			& DISPC_SYSSTATUS_RESETDONE)		&& time_before(jiffies, timeout))	{		if (!in_atomic()) {			set_current_state(TASK_INTERRUPTIBLE);			schedule_timeout(1);		} else			udelay(100);	}	if (!(dispc_reg_in(oinfo, DISPC_SYSSTATUS) & DISPC_SYSSTATUS_RESETDONE))	{		printk(KERN_WARNING FB_NAME 			": timeout waiting for display controller reset\n");	}	/* remove the reset */	dispc_reg_merge(oinfo, DISPC_SYSCONFIG, 0, DISPC_SYSCONFIG_SOFTRESET);	return;}static void omap24xxfb_write_state(struct omap24xxfb_info *oinfo, 		struct omap24xx_dispc_regs *dispc, unsigned long timeout_ticks){	/* set the state of bits that are dynamically managed by the driver */	dispc->sysconfig &= ~DISPC_SYSCONFIG_SOFTRESET;	dispc->control &= ~(DISPC_CONTROL_GODIGITAL | DISPC_CONTROL_GOLCD);	dispc->config |= (DISPC_CONFIG_LOADMODE_PGTABUSETB 				| DISPC_CONFIG_LOADMODE_FRDATLEFR);	/* enable vsync interrupts */	dispc->irqenable = DISPC_IRQENABLE_EVSYNC_ODD 		| DISPC_IRQENABLE_EVSYNC_EVEN | DISPC_IRQENABLE_VSYNC;	/* This driver doesn't currently support the video windows, so 	 * we force the palette/gamma table to be a palette table and 	 * force both video windows to be disabled.	 */	dispc->config &= ~DISPC_CONFIG_PALETTEGAMMATABLE;	/* disable the display controller */	omap24xxfb_disable(oinfo, timeout_ticks);		/*	 * Update the state of the display controller.	 */		dispc_reg_out(oinfo, DISPC_SYSCONFIG, dispc->sysconfig);	dispc_reg_out(oinfo, DISPC_IRQENABLE, dispc->irqenable);	dispc_reg_out(oinfo, DISPC_CONFIG, dispc->config);	dispc_reg_out(oinfo, DISPC_DEFAULT_COLOR0, dispc->default_color0);	dispc_reg_out(oinfo, DISPC_DEFAULT_COLOR1, dispc->default_color1);	dispc_reg_out(oinfo, DISPC_TRANS_COLOR0, dispc->trans_color0);	dispc_reg_out(oinfo, DISPC_TRANS_COLOR1, dispc->trans_color1);	dispc_reg_out(oinfo, DISPC_LINE_NUMBER, dispc->line_number);	dispc_reg_out(oinfo, DISPC_DATA_CYCLE1, dispc->data_cycle1);	dispc_reg_out(oinfo, DISPC_DATA_CYCLE2, dispc->data_cycle2);	dispc_reg_out(oinfo, DISPC_DATA_CYCLE3, dispc->data_cycle3);	dispc_reg_out(oinfo, DISPC_TIMING_H, dispc->timing_h);	dispc_reg_out(oinfo, DISPC_TIMING_V, dispc->timing_v);	dispc_reg_out(oinfo, DISPC_POL_FREQ, dispc->pol_freq);	dispc_reg_out(oinfo, DISPC_DIVISOR, dispc->divisor);	dispc_reg_out(oinfo, DISPC_SIZE_LCD, dispc->size_lcd);	dispc_reg_out(oinfo, DISPC_SIZE_DIG, dispc->size_dig);	dispc_reg_out(oinfo, DISPC_GFX_BA0, dispc->gfx_ba0);	dispc_reg_out(oinfo, DISPC_GFX_BA1, dispc->gfx_ba1);	dispc_reg_out(oinfo, DISPC_GFX_POSITION, dispc->gfx_position);	dispc_reg_out(oinfo, DISPC_GFX_SIZE, dispc->gfx_size);	dispc_reg_out(oinfo, DISPC_GFX_ATTRIBUTES, dispc->gfx_attributes);	dispc_reg_out(oinfo, DISPC_GFX_FIFO_THRESHOLD, 			dispc->gfx_fifo_threshold);	dispc_reg_out(oinfo, DISPC_GFX_ROW_INC, dispc->gfx_row_inc);	dispc_reg_out(oinfo, DISPC_GFX_PIXEL_INC, dispc->gfx_pixel_inc);	dispc_reg_out(oinfo, DISPC_GFX_WINDOW_SKIP, dispc->gfx_window_skip);	dispc_reg_out(oinfo, DISPC_GFX_TABLE_BA, dispc->gfx_table_ba);	dispc_reg_out(oinfo, DISPC_VID1_BA0, dispc->vid1_ba0);	dispc_reg_out(oinfo, DISPC_VID1_BA1, dispc->vid1_ba1);	dispc_reg_out(oinfo, DISPC_VID2_BA0, dispc->vid2_ba0);	dispc_reg_out(oinfo, DISPC_VID2_BA1, dispc->vid2_ba1);	dispc_reg_out(oinfo, DISPC_VID1_POSITION, dispc->vid1_position);	dispc_reg_out(oinfo, DISPC_VID2_POSITION, dispc->vid2_position);	dispc_reg_out(oinfo, DISPC_VID1_SIZE, dispc->vid1_size);	dispc_reg_out(oinfo, DISPC_VID2_SIZE, dispc->vid2_size);	dispc_reg_out(oinfo, DISPC_VID1_ATTRIBUTES, dispc->vid1_attributes);	dispc_reg_out(oinfo, DISPC_VID2_ATTRIBUTES, dispc->vid2_attributes);	dispc_reg_out(oinfo, DISPC_VID1_FIFO_THRESHOLD, 			dispc->vid1_fifo_threshold);	dispc_reg_out(oinfo, DISPC_VID2_FIFO_THRESHOLD, 			dispc->vid2_fifo_threshold);	dispc_reg_out(oinfo, DISPC_VID1_ROW_INC, dispc->vid1_row_inc);	dispc_reg_out(oinfo, DISPC_VID2_ROW_INC, dispc->vid2_row_inc);	dispc_reg_out(oinfo, DISPC_VID1_PIXEL_INC, dispc->vid1_pixel_inc);	dispc_reg_out(oinfo, DISPC_VID2_PIXEL_INC, dispc->vid2_pixel_inc);	dispc_reg_out(oinfo, DISPC_VID1_FIR, dispc->vid1_fir);	dispc_reg_out(oinfo, DISPC_VID2_FIR, dispc->vid2_fir);	dispc_reg_out(oinfo, DISPC_VID1_ACCU0, dispc->vid1_accu0);	dispc_reg_out(oinfo, DISPC_VID1_ACCU1, dispc->vid1_accu1);	dispc_reg_out(oinfo, DISPC_VID2_ACCU0, dispc->vid2_accu0);	dispc_reg_out(oinfo, DISPC_VID2_ACCU1, dispc->vid2_accu1);	dispc_reg_out(oinfo, DISPC_VID1_PICTURE_SIZE, 			dispc->vid1_picture_size);	dispc_reg_out(oinfo, DISPC_VID2_PICTURE_SIZE, 			dispc->vid2_picture_size);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H0, dispc->vid1_fir_coef_h0);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H1, dispc->vid1_fir_coef_h1);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H2, dispc->vid1_fir_coef_h2);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H3, dispc->vid1_fir_coef_h3);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H4, dispc->vid1_fir_coef_h4);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H5, dispc->vid1_fir_coef_h5);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H6, dispc->vid1_fir_coef_h6);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_H7, dispc->vid1_fir_coef_h7);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H0, dispc->vid2_fir_coef_h0);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H1, dispc->vid2_fir_coef_h1);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H2, dispc->vid2_fir_coef_h2);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H3, dispc->vid2_fir_coef_h3);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H4, dispc->vid2_fir_coef_h4);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H5, dispc->vid2_fir_coef_h5);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H6, dispc->vid2_fir_coef_h6);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_H7, dispc->vid2_fir_coef_h7);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV0, dispc->vid1_fir_coef_hv0);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV1, dispc->vid1_fir_coef_hv1);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV2, dispc->vid1_fir_coef_hv2);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV3, dispc->vid1_fir_coef_hv3);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV4, dispc->vid1_fir_coef_hv4);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV5, dispc->vid1_fir_coef_hv5);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV6, dispc->vid1_fir_coef_hv6);	dispc_reg_out(oinfo, DISPC_VID1_FIR_COEF_HV7, dispc->vid1_fir_coef_hv7);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV0, dispc->vid2_fir_coef_hv0);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV1, dispc->vid2_fir_coef_hv1);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV2, dispc->vid2_fir_coef_hv2);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV3, dispc->vid2_fir_coef_hv3);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV4, dispc->vid2_fir_coef_hv4);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV5, dispc->vid2_fir_coef_hv5);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV6, dispc->vid2_fir_coef_hv6);	dispc_reg_out(oinfo, DISPC_VID2_FIR_COEF_HV7, dispc->vid2_fir_coef_hv7);	dispc_reg_out(oinfo, DISPC_VID1_CONV_COEF0, dispc->vid1_conv_coef0);	dispc_reg_out(oinfo, DISPC_VID2_CONV_COEF0, dispc->vid2_conv_coef0);	dispc_reg_out(oinfo, DISPC_VID1_CONV_COEF1, dispc->vid1_conv_coef1);	dispc_reg_out(oinfo, DISPC_VID2_CONV_COEF1, dispc->vid2_conv_coef1);	dispc_reg_out(oinfo, DISPC_VID1_CONV_COEF2, dispc->vid1_conv_coef2);	dispc_reg_out(oinfo, DISPC_VID2_CONV_COEF2, dispc->vid2_conv_coef2);	dispc_reg_out(oinfo, DISPC_VID1_CONV_COEF3, dispc->vid1_conv_coef3);	dispc_reg_out(oinfo, DISPC_VID2_CONV_COEF3, dispc->vid2_conv_coef3);	dispc_reg_out(oinfo, DISPC_VID1_CONV_COEF4, dispc->vid1_conv_coef4);	dispc_reg_out(oinfo, DISPC_VID2_CONV_COEF4, dispc->vid2_conv_coef4);	/* enable the display controller */	omap24xxfb_enable(oinfo, dispc, timeout_ticks);	return;}static void omap24xxfb_save_state(struct omap24xxfb_info *oinfo, 			struct omap24xx_dispc_regs *dispc){	dispc->revision = dispc_reg_in(oinfo, DISPC_REVISION);	dispc->sysconfig = dispc_reg_in(oinfo, DISPC_SYSCONFIG);	dispc->sysstatus = dispc_reg_in(oinfo, DISPC_SYSSTATUS);	dispc->irqstatus = dispc_reg_in(oinfo, DISPC_IRQSTATUS);	dispc->irqenable = dispc_reg_in(oinfo, DISPC_IRQENABLE);	dispc->control = dispc_reg_in(oinfo, DISPC_CONTROL);	dispc->config = dispc_reg_in(oinfo, DISPC_CONFIG);	dispc->capable = dispc_reg_in(oinfo, DISPC_CAPABLE);	dispc->default_color0 = dispc_reg_in(oinfo, DISPC_DEFAULT_COLOR0);	dispc->default_color1 = dispc_reg_in(oinfo, DISPC_DEFAULT_COLOR1);	dispc->trans_color0 = dispc_reg_in(oinfo, DISPC_TRANS_COLOR0);	dispc->trans_color1 = dispc_reg_in(oinfo, DISPC_TRANS_COLOR1);	dispc->line_status = dispc_reg_in(oinfo, DISPC_LINE_STATUS);	dispc->line_number = dispc_reg_in(oinfo, DISPC_LINE_NUMBER);	dispc->data_cycle1 = dispc_reg_in(oinfo, DISPC_DATA_CYCLE1);	dispc->data_cycle2 = dispc_reg_in(oinfo, DISPC_DATA_CYCLE2);	dispc->data_cycle3 = dispc_reg_in(oinfo, DISPC_DATA_CYCLE3);	dispc->timing_h = dispc_reg_in(oinfo, DISPC_TIMING_H);	dispc->timing_v = dispc_reg_in(oinfo, DISPC_TIMING_V);	dispc->pol_freq = dispc_reg_in(oinfo, DISPC_POL_FREQ);	dispc->divisor = dispc_reg_in(oinfo, DISPC_DIVISOR);	dispc->size_lcd = dispc_reg_in(oinfo, DISPC_SIZE_LCD);	dispc->size_dig = dispc_reg_in(oinfo, DISPC_SIZE_DIG);	dispc->gfx_ba0 = dispc_reg_in(oinfo, DISPC_GFX_BA0);	dispc->gfx_ba1 = dispc_reg_in(oinfo, DISPC_GFX_BA1);	dispc->gfx_position = dispc_reg_in(oinfo, DISPC_GFX_POSITION);	dispc->gfx_size = dispc_reg_in(oinfo, DISPC_GFX_SIZE);	dispc->gfx_attributes = dispc_reg_in(oinfo, DISPC_GFX_ATTRIBUTES);	dispc->gfx_fifo_size = dispc_reg_in(oinfo, DISPC_GFX_FIFO_SIZE);	dispc->gfx_fifo_threshold = 		dispc_reg_in(oinfo, DISPC_GFX_FIFO_THRESHOLD);	dispc->gfx_row_inc = dispc_reg_in(oinfo, DISPC_GFX_ROW_INC);	dispc->gfx_pixel_inc = dispc_reg_in(oinfo, DISPC_GFX_PIXEL_INC);	dispc->gfx_window_skip = dispc_reg_in(oinfo, DISPC_GFX_WINDOW_SKIP);	dispc->gfx_table_ba = dispc_reg_in(oinfo, DISPC_GFX_TABLE_BA);	dispc->vid1_ba0 = dispc_reg_in(oinfo, DISPC_VID1_BA0);	dispc->vid1_ba1 = dispc_reg_in(oinfo, DISPC_VID1_BA1);	dispc->vid2_ba0 = dispc_reg_in(oinfo, DISPC_VID2_BA0);	dispc->vid2_ba1 = dispc_reg_in(oinfo, DISPC_VID2_BA1);	dispc->vid1_position = dispc_reg_in(oinfo, DISPC_VID1_POSITION);	dispc->vid2_position = dispc_reg_in(oinfo, DISPC_VID2_POSITION);	dispc->vid1_size = dispc_reg_in(oinfo, DISPC_VID1_SIZE);	dispc->vid2_size = dispc_reg_in(oinfo, DISPC_VID2_SIZE);	dispc->vid1_attributes = dispc_reg_in(oinfo, DISPC_VID1_ATTRIBUTES);	dispc->vid2_attributes = dispc_reg_in(oinfo, DISPC_VID2_ATTRIBUTES);	dispc->vid1_fifo_size = dispc_reg_in(oinfo, DISPC_VID1_FIFO_SIZE);	dispc->vid2_fifo_size = dispc_reg_in(oinfo, DISPC_VID2_FIFO_SIZE);	dispc->vid1_fifo_threshold = 		dispc_reg_in(oinfo, DISPC_VID1_FIFO_THRESHOLD);	dispc->vid2_fifo_threshold = 		dispc_reg_in(oinfo, DISPC_VID2_FIFO_THRESHOLD);	dispc->vid1_row_inc = dispc_reg_in(oinfo, DISPC_VID1_ROW_INC);	dispc->vid2_row_inc = dispc_reg_in(oinfo, DISPC_VID2_ROW_INC);	dispc->vid1_pixel_inc = dispc_reg_in(oinfo, DISPC_VID1_PIXEL_INC);	dispc->vid2_pixel_inc = dispc_reg_in(oinfo, DISPC_VID2_PIXEL_INC);	dispc->vid1_fir = dispc_reg_in(oinfo, DISPC_VID1_FIR);	dispc->vid2_fir = dispc_reg_in(oinfo, DISPC_VID2_FIR);	dispc->vid1_accu0 = dispc_reg_in(oinfo, DISPC_VID1_ACCU0);	dispc->vid1_accu1 = dispc_reg_in(oinfo, DISPC_VID1_ACCU1);	dispc->vid2_accu0 = dispc_reg_in(oinfo, DISPC_VID2_ACCU0);	dispc->vid2_accu1 = dispc_reg_in(oinfo, DISPC_VID2_ACCU1);	dispc->vid1_picture_size = dispc_reg_in(oinfo, DISPC_VID1_PICTURE_SIZE);	dispc->vid2_picture_size = dispc_reg_in(oinfo, DISPC_VID2_PICTURE_SIZE);	dispc->vid1_fir_coef_h0 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H0);	dispc->vid1_fir_coef_h1 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H1);	dispc->vid1_fir_coef_h2 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H2);	dispc->vid1_fir_coef_h3 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H3);	dispc->vid1_fir_coef_h4 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H4);	dispc->vid1_fir_coef_h5 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H5);	dispc->vid1_fir_coef_h6 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H6);	dispc->vid1_fir_coef_h7 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_H7);	dispc->vid2_fir_coef_h0 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H0);	dispc->vid2_fir_coef_h1 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H1);	dispc->vid2_fir_coef_h2 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H2);	dispc->vid2_fir_coef_h3 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H3);	dispc->vid2_fir_coef_h4 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H4);	dispc->vid2_fir_coef_h5 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H5);	dispc->vid2_fir_coef_h6 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H6);	dispc->vid2_fir_coef_h7 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_H7);	dispc->vid1_fir_coef_hv0 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV0);	dispc->vid1_fir_coef_hv1 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV1);	dispc->vid1_fir_coef_hv2 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV2);	dispc->vid1_fir_coef_hv3 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV3);	dispc->vid1_fir_coef_hv4 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV4);	dispc->vid1_fir_coef_hv5 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV5);	dispc->vid1_fir_coef_hv6 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV6);	dispc->vid1_fir_coef_hv7 = dispc_reg_in(oinfo, DISPC_VID1_FIR_COEF_HV7);	dispc->vid2_fir_coef_hv0 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV0);	dispc->vid2_fir_coef_hv1 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV1);	dispc->vid2_fir_coef_hv2 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV2);	dispc->vid2_fir_coef_hv3 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV3);	dispc->vid2_fir_coef_hv4 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV4);	dispc->vid2_fir_coef_hv5 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV5);	dispc->vid2_fir_coef_hv6 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV6);	dispc->vid2_fir_coef_hv7 = dispc_reg_in(oinfo, DISPC_VID2_FIR_COEF_HV7);	dispc->vid1_conv_coef0 = dispc_reg_in(oinfo, DISPC_VID1_CONV_COEF0);	dispc->vid2_conv_coef0 = dispc_reg_in(oinfo, DISPC_VID2_CONV_COEF0);	dispc->vid1_conv_coef1 = dispc_reg_in(oinfo, DISPC_VID1_CONV_COEF1);	dispc->vid2_conv_coef1 = dispc_reg_in(oinfo, DISPC_VID2_CONV_COEF1);	dispc->vid1_conv_coef2 = dispc_reg_in(oinfo, DISPC_VID1_CONV_COEF2);	dispc->vid2_conv_coef2 = dispc_reg_in(oinfo, DISPC_VID2_CONV_COEF2);	dispc->vid1_conv_coef3 = dispc_reg_in(oinfo, DISPC_VID1_CONV_COEF3);	dispc->vid2_conv_coef3 = dispc_reg_in(oinfo, DISPC_VID2_CONV_COEF3);	dispc->vid1_conv_coef4 = dispc_reg_in(oinfo, DISPC_VID1_CONV_COEF4);	dispc->vid2_conv_coef4 = dispc_reg_in(oinfo, DISPC_VID2_CONV_COEF4);	return;}/* Wait for a vsync interrupt.  This routine sleeps so it can only be called  * from process context. */static intomap24xxfb_wait_for_vsync(struct omap24xxfb_info *oinfo){	wait_queue_t wq;	unsigned long cnt;	int ret;	init_waitqueue_entry(&wq, current);	cnt = oinfo->vsync_cnt;	ret = wait_event_interruptible_timeout(oinfo->vsync_wait, 		cnt != oinfo->vsync_cnt, oinfo->timeout);	if (ret < 0)		return ret;	if (ret == 0)		return -ETIMEDOUT;	return 0;}/* Interrupt service routine. */static irqreturn_tomap24xxfb_isr(int irq, void *arg, struct pt_regs *regs){	struct omap24xxfb_info *oinfo = (struct omap24xxfb_info *) arg;	unsigned long dispc_irqstatus;	dispc_irqstatus = dispc_reg_in(oinfo, DISPC_IRQSTATUS);	/* ack the interrupt */	dispc_reg_out(oinfo, DISPC_IRQSTATUS, dispc_irqstatus);	if (dispc_irqstatus & 		(DISPC_IRQSTATUS_EVSYNC_ODD | DISPC_IRQSTATUS_EVSYNC_EVEN 		| DISPC_IRQSTATUS_VSYNC))	{		++oinfo->vsync_cnt;		wake_up_interruptible(&oinfo->vsync_wait);	}	return IRQ_HANDLED;}	/*	 * fbops functions	 *//* *	omap24xxfb_check_var - Validates a var passed in.  *	@var: frame buffer variable screen structure *	@info: frame buffer structure that represents a single frame buffer  * *	Returns negative errno on error, or zero on success.  The var info on  *	exit may be different than the var info on entry. * *	This function accepts any bits-per-pixel value in the range 0 to 32  *	(0 to 8 for monochrome displays).  If the specified number of  *	bits-per-pixel isn't supported, then the next greater number of  *	bits-per-pixel will be substituted.  This function differentiates  *	between color depths of 12 and 16 (which both have 16 bits-per-pixel)  *	by checking to see if the sum of the lengths of the RGB fields is 12,  *	in which case the color depth is assumed to be 12.  Except for  *	differentiating between 12-bit and 16-bit color depths, the values  *	passed in var->red, var->green, and var->blue are ignored and replaced  *	with the correct values for the specified color depth. * *	The xres/yres variables in the var screeninfo specify the size of the  *	graphics window.  The graphics window size must not be larger than the  *	physical display size nor larger than the size of the framebuffer. *	The xres_virtual/yres_virtual values in the var screeninfo specify the  *	size of the framebuffer in memory.   The framebuffer must not be smaller *	than the size of the graphics window.  The display_xres/display_yres  *	values in the private info structure specify the size of the display.   *	The display must not be smaller than the graphics window.  The display  *	size is a compile-time (or perhaps initialization time) configuration  *	option and cannot be changed by the user.  The xoffset/yoffset variables  *	in the var screeninfo specify the offset of the graphics window within  *	the framebuffer.  There is no means for the user to specify the offset  *	of the graphics window on the display, so that offset will always be  *	zero unless the board-specific mode changing function implements some  *	other behavior, such as centering. */static intomap24xxfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info){	const struct omap24xxfb_info *oinfo = 				(const struct omap24xxfb_info *) info->par;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?