|
@@ -202,3 +202,68 @@ static void __init am200_presetup_fb(void)
|
|
|
int padding_size;
|
|
|
int totalsize;
|
|
|
|
|
|
+ switch (panel_type) {
|
|
|
+ case 6:
|
|
|
+ am200_fb_info.modes = &am200_fb_mode_6inch;
|
|
|
+ break;
|
|
|
+ case 8:
|
|
|
+ am200_fb_info.modes = &am200_fb_mode_8inch;
|
|
|
+ break;
|
|
|
+ case 97:
|
|
|
+ am200_fb_info.modes = &am200_fb_mode_9inch7;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ dev_err(&am200_device->dev, "invalid panel_type selection,"
|
|
|
+ " setting to 6\n");
|
|
|
+ am200_fb_info.modes = &am200_fb_mode_6inch;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* the frame buffer is divided as follows:
|
|
|
+ command | CRC | padding
|
|
|
+ 16kb waveform data | CRC | padding
|
|
|
+ image data | CRC
|
|
|
+ */
|
|
|
+
|
|
|
+ fw = am200_fb_info.modes->xres;
|
|
|
+ fh = am200_fb_info.modes->yres;
|
|
|
+
|
|
|
+ /* waveform must be 16k + 2 for checksum */
|
|
|
+ am200_board.wfm_size = roundup(16*1024 + 2, fw);
|
|
|
+
|
|
|
+ padding_size = PAGE_SIZE + (4 * fw);
|
|
|
+
|
|
|
+ /* total is 1 cmd , 1 wfm, padding and image */
|
|
|
+ totalsize = fw + am200_board.wfm_size + padding_size + (fw*fh);
|
|
|
+
|
|
|
+ /* save this off because we're manipulating fw after this and
|
|
|
+ * we'll need it when we're ready to setup the framebuffer */
|
|
|
+ am200_board.fw = fw;
|
|
|
+ am200_board.fh = fh;
|
|
|
+
|
|
|
+ /* the reason we do this adjustment is because we want to acquire
|
|
|
+ * more framebuffer memory without imposing custom awareness on the
|
|
|
+ * underlying pxafb driver */
|
|
|
+ am200_fb_info.modes->yres = DIV_ROUND_UP(totalsize, fw);
|
|
|
+
|
|
|
+ /* we divide since we told the LCD controller we're 16bpp */
|
|
|
+ am200_fb_info.modes->xres /= 2;
|
|
|
+
|
|
|
+ pxa_set_fb_info(NULL, &am200_fb_info);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/* this gets called by metronomefb as part of its init, in our case, we
|
|
|
+ * have already completed initial framebuffer init in presetup_fb so we
|
|
|
+ * can just setup the fb access pointers */
|
|
|
+static int am200_setup_fb(struct metronomefb_par *par)
|
|
|
+{
|
|
|
+ int fw;
|
|
|
+ int fh;
|
|
|
+
|
|
|
+ fw = am200_board.fw;
|
|
|
+ fh = am200_board.fh;
|
|
|
+
|
|
|
+ /* metromem was set up by the notifier in share_video_mem so now
|
|
|
+ * we can use its value to calculate the other entries */
|
|
|
+ par->metromem_cmd = (struct metromem_cmd *) am200_board.metromem;
|