summaryrefslogtreecommitdiff
path: root/src/mali_lcd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mali_lcd.c')
-rw-r--r--src/mali_lcd.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/src/mali_lcd.c b/src/mali_lcd.c
new file mode 100644
index 0000000..1aba1bd
--- /dev/null
+++ b/src/mali_lcd.c
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2010 ARM Limited. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/ioctl.h>
+#include "xf86.h"
+#include "xf86Crtc.h"
+
+#include "mali_fbdev.h"
+#define IGNORE(a) (a=a)
+
+static void fbdev_lcd_crtc_dpms(xf86CrtcPtr crtc, int mode)
+{
+ IGNORE(crtc);
+ IGNORE(mode);
+}
+
+static Bool fbdev_lcd_crtc_lock(xf86CrtcPtr crtc)
+{
+ IGNORE( crtc );
+
+ return TRUE;
+}
+
+static void fbdev_lcd_crtc_unlock(xf86CrtcPtr crtc)
+{
+ IGNORE( crtc );
+}
+
+static Bool fbdev_lcd_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode)
+{
+ IGNORE( crtc );
+ IGNORE( mode );
+ IGNORE( adjusted_mode );
+
+ return TRUE;
+}
+
+static void fbdev_lcd_crtc_prepare(xf86CrtcPtr crtc)
+{
+ IGNORE( crtc );
+}
+
+static void fbdev_lcd_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode, int x, int y)
+{
+ IGNORE( crtc );
+ IGNORE( mode );
+ IGNORE( adjusted_mode );
+ IGNORE( x );
+ IGNORE( y );
+}
+
+static void fbdev_lcd_crtc_commit(xf86CrtcPtr crtc)
+{
+ IGNORE( crtc );
+}
+
+static void fbdev_lcd_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, int size)
+{
+ IGNORE( crtc );
+ IGNORE( red );
+ IGNORE( green );
+ IGNORE( blue );
+ IGNORE( size );
+}
+
+static void fbdev_lcd_crtc_set_origin(xf86CrtcPtr crtc, int x, int y)
+{
+ IGNORE( crtc );
+ IGNORE( x );
+ IGNORE( y );
+}
+
+static const xf86CrtcFuncsRec fbdev_lcd_crtc_funcs =
+{
+ .dpms = fbdev_lcd_crtc_dpms,
+ .save = NULL,
+ .restore = NULL,
+ .lock = fbdev_lcd_crtc_lock,
+ .unlock = fbdev_lcd_crtc_unlock,
+ .mode_fixup = fbdev_lcd_crtc_mode_fixup,
+ .prepare = fbdev_lcd_crtc_prepare,
+ .mode_set = fbdev_lcd_crtc_mode_set,
+ .commit = fbdev_lcd_crtc_commit,
+ .gamma_set = fbdev_lcd_crtc_gamma_set,
+ .shadow_allocate = NULL,
+ .shadow_create = NULL,
+ .shadow_destroy = NULL,
+ .set_cursor_colors = NULL,
+ .set_cursor_position = NULL,
+ .show_cursor = NULL,
+ .hide_cursor = NULL,
+ .load_cursor_image = NULL,
+ .load_cursor_argb = NULL,
+ .destroy = NULL,
+ .set_mode_major = NULL,
+ .set_origin = fbdev_lcd_crtc_set_origin,
+};
+
+static void fbdev_lcd_output_dpms(xf86OutputPtr output, int mode)
+{
+ MaliPtr fPtr = MALIPTR(output->scrn);
+
+ if ( mode == DPMSModeOn )
+ {
+ ioctl(fPtr->fb_lcd_fd, FBIOBLANK, FB_BLANK_UNBLANK);
+ }
+ else if( mode == DPMSModeOff )
+ {
+ ioctl(fPtr->fb_lcd_fd, FBIOBLANK, FB_BLANK_POWERDOWN);
+ }
+}
+
+static void fbdev_lcd_output_save(xf86OutputPtr output)
+{
+ IGNORE( output );
+}
+
+static void fbdev_lcd_output_restore(xf86OutputPtr output)
+{
+ IGNORE( output );
+}
+
+static int fbdev_lcd_output_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
+{
+ MaliPtr fPtr = MALIPTR(output->scrn);
+
+ if( (pMode->HDisplay == (int)fPtr->fb_lcd_var.xres) && (pMode->VDisplay == (int)fPtr->fb_lcd_var.yres) ) return MODE_OK;
+
+ return MODE_ERROR;
+}
+
+static Bool fbdev_lcd_output_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode)
+{
+ IGNORE( output );
+ IGNORE( mode );
+ IGNORE( adjusted_mode );
+
+ return TRUE;
+}
+
+static void fbdev_lcd_output_prepare(xf86OutputPtr output)
+{
+ IGNORE( output );
+}
+
+static void fbdev_lcd_output_commit(xf86OutputPtr output)
+{
+ output->funcs->dpms(output, DPMSModeOn);
+}
+
+static void fbdev_lcd_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode)
+{
+ IGNORE( output );
+ IGNORE( mode );
+ IGNORE( adjusted_mode );
+}
+
+static xf86OutputStatus fbdev_lcd_output_detect(xf86OutputPtr output)
+{
+ IGNORE( output );
+
+ return XF86OutputStatusConnected;
+}
+
+static DisplayModePtr fbdev_lcd_output_get_modes(xf86OutputPtr output)
+{
+ MaliPtr fPtr = MALIPTR(output->scrn);
+ DisplayModePtr mode_ptr;
+
+ unsigned int hactive_s = fPtr->fb_lcd_var.xres;
+ unsigned int vactive_s = fPtr->fb_lcd_var.yres;
+
+ mode_ptr = xnfcalloc(1, sizeof(DisplayModeRec));
+
+ mode_ptr->HDisplay = hactive_s;
+ mode_ptr->HSyncStart = hactive_s + 20;
+ mode_ptr->HSyncEnd = hactive_s + 40;
+ mode_ptr->HTotal = hactive_s + 80;
+
+ mode_ptr->VDisplay = vactive_s;
+ mode_ptr->VSyncStart = vactive_s + 20;
+ mode_ptr->VSyncEnd = vactive_s + 40;
+ mode_ptr->VTotal = vactive_s + 80;
+
+ mode_ptr->VRefresh = 60.0;
+
+ mode_ptr->Clock = (int) (mode_ptr->VRefresh * mode_ptr->VTotal * mode_ptr->HTotal / 1000.0);
+
+ mode_ptr->type = M_T_DRIVER;
+
+ xf86SetModeDefaultName(mode_ptr);
+
+ mode_ptr->next = NULL;
+ mode_ptr->prev = NULL;
+
+ return mode_ptr;
+}
+
+#ifdef RANDR_GET_CRTC_INTERFACE
+static xf86CrtcPtr fbdev_lcd_output_get_crtc(xf86OutputPtr output)
+{
+ return output->crtc;
+}
+#endif
+
+static void fbdev_lcd_output_destroy(xf86OutputPtr output)
+{
+ IGNORE( output );
+}
+
+static const xf86OutputFuncsRec fbdev_lcd_output_funcs =
+{
+ .create_resources = NULL,
+ .dpms = fbdev_lcd_output_dpms,
+ .save = fbdev_lcd_output_save,
+ .restore = fbdev_lcd_output_restore,
+ .mode_valid = fbdev_lcd_output_mode_valid,
+ .mode_fixup = fbdev_lcd_output_mode_fixup,
+ .prepare = fbdev_lcd_output_prepare,
+ .commit = fbdev_lcd_output_commit,
+ .mode_set = fbdev_lcd_output_mode_set,
+ .detect = fbdev_lcd_output_detect,
+ .get_modes = fbdev_lcd_output_get_modes,
+#ifdef RANDR_12_INTERFACE
+ .set_property = NULL,
+#endif
+#ifdef RANDR_13_INTERFACE
+ .get_property = NULL,
+#endif
+#ifdef RANDR_GET_CRTC_INTERFACE
+ .get_crtc = fbdev_lcd_output_get_crtc,
+#endif
+ .destroy = fbdev_lcd_output_destroy,
+};
+
+
+Bool FBDEV_lcd_init(ScrnInfoPtr pScrn)
+{
+ xf86CrtcPtr crtc;
+ xf86OutputPtr output;
+
+ crtc = xf86CrtcCreate(pScrn, &fbdev_lcd_crtc_funcs);
+
+ if(crtc == NULL) return FALSE;
+
+ output = xf86OutputCreate(pScrn, &fbdev_lcd_output_funcs, "LCD");
+
+ if(output == NULL) return FALSE;
+
+ output->possible_crtcs = (1 << 0);
+
+ return TRUE;
+}