1*0f9e9ec2Sjsg /* $OpenBSD: omdisplay.c,v 1.11 2024/05/13 01:15:50 jsg Exp $ */
28eda2d14Spatrick /*
38eda2d14Spatrick * Copyright (c) 2007 Dale Rahn <drahn@openbsd.org>
48eda2d14Spatrick *
58eda2d14Spatrick * Permission to use, copy, modify, and distribute this software for any
68eda2d14Spatrick * purpose with or without fee is hereby granted, provided that the above
78eda2d14Spatrick * copyright notice and this permission notice appear in all copies.
88eda2d14Spatrick *
98eda2d14Spatrick * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
108eda2d14Spatrick * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
118eda2d14Spatrick * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
128eda2d14Spatrick * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
138eda2d14Spatrick * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
148eda2d14Spatrick * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
158eda2d14Spatrick * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
168eda2d14Spatrick */
178eda2d14Spatrick
188eda2d14Spatrick #include <sys/param.h>
198eda2d14Spatrick #include <sys/systm.h>
208eda2d14Spatrick #include <sys/queue.h>
218eda2d14Spatrick #include <sys/malloc.h>
228eda2d14Spatrick #include <sys/device.h>
238eda2d14Spatrick #include <sys/evcount.h>
248eda2d14Spatrick #include <sys/conf.h>
258eda2d14Spatrick #include <sys/uio.h>
268eda2d14Spatrick #include <machine/bus.h>
278eda2d14Spatrick #include <armv7/omap/omgpiovar.h>
288eda2d14Spatrick
298eda2d14Spatrick #include <dev/cons.h>
308eda2d14Spatrick #include <dev/wscons/wsconsio.h>
318eda2d14Spatrick #include <dev/wscons/wsdisplayvar.h>
328eda2d14Spatrick #include <dev/wscons/wscons_callbacks.h>
338eda2d14Spatrick
348eda2d14Spatrick #include <dev/rasops/rasops.h>
358eda2d14Spatrick
368eda2d14Spatrick #include "splash16.h"
378eda2d14Spatrick
388eda2d14Spatrick #define OMDISPLAY_SIZE 0x1000
398eda2d14Spatrick /* registers */
408eda2d14Spatrick /* DSS */
418eda2d14Spatrick #define DSS_REVISIONNUMBER 0x00
428eda2d14Spatrick #define DSS_CONTROL 0x40
438eda2d14Spatrick #define DSS_PSA_LCD_REG_1 0x50
448eda2d14Spatrick #define DSS_PSA_LCD_REG_2 0x54
458eda2d14Spatrick #define DSS_PSA_VIDEO_REG 0x58
468eda2d14Spatrick #define DSS_STATUS 0x5C
478eda2d14Spatrick
488eda2d14Spatrick /* DCR */
498eda2d14Spatrick #define DISPC_REVISION 0x0000
508eda2d14Spatrick #define DISPC_SYSCONFIG 0x0010
518eda2d14Spatrick #define DISPC_SYSCONFIG_AUTOIDLE 0x00000001
528eda2d14Spatrick #define DISPC_SYSCONFIG_SOFTRESET 0x00000002
538eda2d14Spatrick #define DISPC_SYSCONFIG_SIDLEMODE_FORCE 0x00000000
548eda2d14Spatrick #define DISPC_SYSCONFIG_SIDLEMODE_NONE 0x00000008
558eda2d14Spatrick #define DISPC_SYSCONFIG_SIDLEMODE_SMART 0x00000010
568eda2d14Spatrick #define DISPC_SYSCONFIG_MIDLEMODE_FORCE 0x00000000
578eda2d14Spatrick #define DISPC_SYSCONFIG_MIDLEMODE_NONE 0x00001000
588eda2d14Spatrick #define DISPC_SYSCONFIG_MIDLEMODE_SMART 0x00002000
598eda2d14Spatrick #define DISPC_SYSSTATUS 0x0014
608eda2d14Spatrick #define DISPC_SYSTATUS_RESETDONE 0x00000001
618eda2d14Spatrick #define DISPC_IRQSTATUS 0x0018
628eda2d14Spatrick #define DISPC_IRQSTATUS_FRAMEDONE 0x00000001
638eda2d14Spatrick #define DISPC_IRQSTATUS_VSYNC 0x00000002
648eda2d14Spatrick #define DISPC_IRQSTATUS_EVSYNCEVEN 0x00000004
658eda2d14Spatrick #define DISPC_IRQSTATUS_EVSYNCODD 0x00000008
668eda2d14Spatrick #define DISPC_IRQSTATUS_ACBIASCOUNT 0x00000010
678eda2d14Spatrick #define DISPC_IRQSTATUS_PROGLINENUM 0x00000020
688eda2d14Spatrick #define DISPC_IRQSTATUS_GFXFIFOUNDER 0x00000040
698eda2d14Spatrick #define DISPC_IRQSTATUS_GFXENDWINDOW 0x00000080
708eda2d14Spatrick #define DISPC_IRQSTATUS_PALGAMMA 0x00000100
718eda2d14Spatrick #define DISPC_IRQSTATUS_OCPERROR 0x00000200
728eda2d14Spatrick #define DISPC_IRQSTATUS_VID1FIFOUNDER 0x00000400
738eda2d14Spatrick #define DISPC_IRQSTATUS_VID1ENDWIND 0x00000800
748eda2d14Spatrick #define DISPC_IRQSTATUS_VID2FIFOUNDER 0x00001000
758eda2d14Spatrick #define DISPC_IRQSTATUS_VID2ENDWIND 0x00002000
768eda2d14Spatrick #define DISPC_IRQSTATUS_SYNCLOST 0x00004000
778eda2d14Spatrick #define DISPC_IRQENABLE 0x001C
788eda2d14Spatrick #define DISPC_IRQENABLE_FRAMEDONE 0x00000001
798eda2d14Spatrick #define DISPC_IRQENABLE_VSYNC 0x00000002
808eda2d14Spatrick #define DISPC_IRQENABLE_EVSYNCEVEN 0x00000004
818eda2d14Spatrick #define DISPC_IRQENABLE_EVSYNCODD 0x00000008
828eda2d14Spatrick #define DISPC_IRQENABLE_ACBIASCOUNT 0x00000010
838eda2d14Spatrick #define DISPC_IRQENABLE_PROGLINENUM 0x00000020
848eda2d14Spatrick #define DISPC_IRQENABLE_GFXFIFOUNDER 0x00000040
858eda2d14Spatrick #define DISPC_IRQENABLE_GFXENDWINDOW 0x00000080
868eda2d14Spatrick #define DISPC_IRQENABLE_PALGAMMA 0x00000100
878eda2d14Spatrick #define DISPC_IRQENABLE_OCPERROR 0x00000200
888eda2d14Spatrick #define DISPC_IRQENABLE_VID1FIFOUNDER 0x00000400
898eda2d14Spatrick #define DISPC_IRQENABLE_VID1ENDWIND 0x00000800
908eda2d14Spatrick #define DISPC_IRQENABLE_VID2FIFOUNDER 0x00001000
918eda2d14Spatrick #define DISPC_IRQENABLE_VID2ENDWIND 0x00002000
928eda2d14Spatrick #define DISPC_IRQENABLE_SYNCLOST 0x00004000
938eda2d14Spatrick #define DISPC_CONTROL 0x0040
948eda2d14Spatrick #define DISPC_CONTROL_LCDENABLE 0x00000001
958eda2d14Spatrick #define DISPC_CONTROL_DIGITALENABLE 0x00000002
968eda2d14Spatrick #define DISPC_CONTROL_MONOCOLOR 0x00000004
978eda2d14Spatrick #define DISPC_CONTROL_STNTFT 0x00000008
988eda2d14Spatrick #define DISPC_CONTROL_M8B 0x00000010
998eda2d14Spatrick #define DISPC_CONTROL_GOLCD 0x00000020
1008eda2d14Spatrick #define DISPC_CONTROL_GODIGITAL 0x00000040
1018eda2d14Spatrick #define DISPC_CONTROL_TFTDITHEREN 0x00000080
1028eda2d14Spatrick #define DISPC_CONTROL_TFTDATALINES_12 0x00000000
1038eda2d14Spatrick #define DISPC_CONTROL_TFTDATALINES_16 0x00000100
1048eda2d14Spatrick #define DISPC_CONTROL_TFTDATALINES_18 0x00000200
1058eda2d14Spatrick #define DISPC_CONTROL_TFTDATALINES_24 0x00000300
1068eda2d14Spatrick #define DISPC_CONTROL_SECURE 0x00000400
1078eda2d14Spatrick #define DISPC_CONTROL_RFBIMODE 0x00000800
1088eda2d14Spatrick #define DISPC_CONTROL_OVERLAYOPT 0x00001000
1098eda2d14Spatrick #define DISPC_CONTROL_GPIN0 0x00002000
1108eda2d14Spatrick #define DISPC_CONTROL_GPIN1 0x00004000
1118eda2d14Spatrick #define DISPC_CONTROL_GPOUT0 0x00008000
1128eda2d14Spatrick #define DISPC_CONTROL_GPOUT1 0x00010000
1138eda2d14Spatrick #define DISPC_CONTROL_HT 0x00070000
1148eda2d14Spatrick #define DISPC_CONTROL_HT_s(x) ((x) << 17)
1158eda2d14Spatrick #define DISPC_CONTROL_TDMENABLE 0x00100000
1168eda2d14Spatrick #define DISPC_CONTROL_TDMPARALLEL_8 0x00000000
1178eda2d14Spatrick #define DISPC_CONTROL_TDMPARALLEL_9 0x00200000
1188eda2d14Spatrick #define DISPC_CONTROL_TDMPARALLEL_12 0x00400000
1198eda2d14Spatrick #define DISPC_CONTROL_TDMPARALLEL_16 0x00600000
1208eda2d14Spatrick #define DISPC_CONTROL_TDMCYCLE_1 0x00000000
1218eda2d14Spatrick #define DISPC_CONTROL_TDMCYCLE_2 0x00800000
1228eda2d14Spatrick #define DISPC_CONTROL_TDMCYCLE_3 0x00000000
1238eda2d14Spatrick #define DISPC_CONTROL_TDMCYCLE_3_2 0x01800000
1248eda2d14Spatrick #define DISPC_CONTROL_TDMUNUSED_0 0x00000000
1258eda2d14Spatrick #define DISPC_CONTROL_TDMUNUSED_1 0x02000000
1268eda2d14Spatrick #define DISPC_CONTROL_TDMUNUSED_M 0x04000000
1278eda2d14Spatrick #define DISPC_CONFIG 0x0044
1288eda2d14Spatrick #define DISPC_CONFIG_PIXELGATED 0x00000001
1298eda2d14Spatrick #define DISPC_CONFIG_LOADMODE_PGE 0x00000000
1308eda2d14Spatrick #define DISPC_CONFIG_LOADMODE_PG 0x00000002
1318eda2d14Spatrick #define DISPC_CONFIG_LOADMODE_DATA 0x00000004
1328eda2d14Spatrick #define DISPC_CONFIG_LOADMODE_DATA_PG 0x00000006
1338eda2d14Spatrick #define DISPC_CONFIG_PALETTEGAMMA 0x00000008
1348eda2d14Spatrick #define DISPC_CONFIG_PIXELDATAGATED 0x00000010
1358eda2d14Spatrick #define DISPC_CONFIG_PIXELCLOCKGATED 0x00000020
1368eda2d14Spatrick #define DISPC_CONFIG_HSYNCGATED 0x00000040
1378eda2d14Spatrick #define DISPC_CONFIG_VSYNCGATED 0x00000080
1388eda2d14Spatrick #define DISPC_CONFIG_ACBIAGATED 0x00000100
1398eda2d14Spatrick #define DISPC_CONFIG_FUNCGATED 0x00000200
1408eda2d14Spatrick #define DISPC_CONFIG_TCKLCDEN 0x00000400
1418eda2d14Spatrick #define DISPC_CONFIG_TCKLCDSEL 0x00000800
1428eda2d14Spatrick #define DISPC_CONFIG_TCKDIGEN 0x00001000
1438eda2d14Spatrick #define DISPC_CONFIG_TCKDIGSEL 0x00002000
1448eda2d14Spatrick #define DISPC_CAPABLE 0x0048
1458eda2d14Spatrick #define DISPC_DEFAULT_COLOR0 0x004C
1468eda2d14Spatrick #define DISPC_DEFAULT_COLOR1 0x0050
1478eda2d14Spatrick #define DISPC_TRANS_COLOR0 0x0054
1488eda2d14Spatrick #define DISPC_TRANS_COLOR1 0x0058
1498eda2d14Spatrick #define DISPC_LINE_STATUS 0x005C
1508eda2d14Spatrick #define DISPC_LINE_NUMBER 0x0060
1518eda2d14Spatrick #define DISPC_TIMING_H 0x0064
1528eda2d14Spatrick #define DISPC_TIMING_H_HSW_s(x) ((x) << 0)
1538eda2d14Spatrick #define DISPC_TIMING_H_HFP_s(x) ((x) << 8)
1548eda2d14Spatrick #define DISPC_TIMING_H_HBP_s(x) ((x) << 20)
1558eda2d14Spatrick #define DISPC_TIMING_V 0x0068
1568eda2d14Spatrick #define DISPC_TIMING_V_VSW_s(x) ((x) << 0)
1578eda2d14Spatrick #define DISPC_TIMING_V_VFP_s(x) ((x) << 8)
1588eda2d14Spatrick #define DISPC_TIMING_V_VBP_s(x) ((x) << 20)
1598eda2d14Spatrick #define DISPC_POL_FREQ 0x006C
1608eda2d14Spatrick #define DISPC_POL_FREQ_ACB_s(x) ((x) << 0)
1618eda2d14Spatrick #define DISPC_POL_FREQ_ACBI_s(x) ((x) << 8)
1628eda2d14Spatrick #define DISPC_POL_FREQ_IVS 0x00001000
1638eda2d14Spatrick #define DISPC_POL_FREQ_IHS 0x00002000
1648eda2d14Spatrick #define DISPC_POL_FREQ_IPC 0x00004000
1658eda2d14Spatrick #define DISPC_POL_FREQ_IEO 0x00008000
1668eda2d14Spatrick #define DISPC_POL_FREQ_RF 0x00010000
1678eda2d14Spatrick #define DISPC_POL_FREQ_ONOFF 0x00020000
1688eda2d14Spatrick #define DISPC_DIVISOR 0x0070
1698eda2d14Spatrick #define DISPC_DIVISOR_PCD_s(x) ((x) << 0)
1708eda2d14Spatrick #define DISPC_DIVISOR_LCD_s(x) ((x) << 16)
1718eda2d14Spatrick #define DISPC_SIZE_DIG 0x0078
1728eda2d14Spatrick #define DISPC_SIZE_DIG_PPL_s(x) ((x) << 0)
1738eda2d14Spatrick #define DISPC_SIZE_DIG_LPP_s(x) ((x) << 16)
1748eda2d14Spatrick #define DISPC_SIZE_LCD 0x007C
1758eda2d14Spatrick #define DISPC_SIZE_LCD_PPL_s(x) ((x) << 0)
1768eda2d14Spatrick #define DISPC_SIZE_LCD_LPP_s(x) ((x) << 16)
1778eda2d14Spatrick #define DISPC_GFX_BA0 0x0080
1788eda2d14Spatrick #define DISPC_GFX_BA1 0x0084
1798eda2d14Spatrick #define DISPC_GFX_POSITION 0x0088
1808eda2d14Spatrick #define DISPC_GFX_SIZE 0x008C
1818eda2d14Spatrick #define DISPC_GFX_SIZE_X_s(x) ((x) << 0)
1828eda2d14Spatrick #define DISPC_GFX_SIZE_Y_s(x) ((x) << 16)
1838eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES 0x00A0
1848eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXENABLE 0x001
1858eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_1 0x000
1868eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_2 0x002
1878eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_4 0x004
1888eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_8 0x006
1898eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_12 0x008
1908eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_16 0x00c
1918eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXFMT_24 0x010
1928eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXREPLICATE 0x020
1938eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_BURST_4 0x000
1948eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_BURST_8 0x040
1958eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_BURST_16 0x080
1968eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_GFXCHANNELOUT 0x100
1978eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_NIBBLEMODE 0x200
1988eda2d14Spatrick #define DISPC_GFX_ATTRIBUTES_ENDIAN 0x400
1998eda2d14Spatrick #define DISPC_GFX_FIFO_THRESHOLD 0x00A4
2008eda2d14Spatrick #define DISPC_GFX_FIFO_THRESHOLD_HIGH_SHIFT 16
2018eda2d14Spatrick #define DISPC_GFX_FIFO_THRESHOLD_LOW_SHIFT 0
2028eda2d14Spatrick #define DISPC_GFX_FIFO_SIZE_STATUS 0x00A8
2038eda2d14Spatrick #define DISPC_GFX_ROW_INC 0x00AC
2048eda2d14Spatrick #define DISPC_GFX_PIXEL_INC 0x00B0
2058eda2d14Spatrick #define DISPC_GFX_WINDOW_SKIP 0x00B4
2068eda2d14Spatrick #define DISPC_GFX_TABLE_BA 0x00B8
2078eda2d14Spatrick #define DISPC_VID1_BA0 0x00BC
2088eda2d14Spatrick #define DISPC_VID1_BA1 0x00C0
2098eda2d14Spatrick #define DISPC_VID1_POSITION 0x00C4
2108eda2d14Spatrick #define DISPC_VID1_SIZE 0x00C8
2118eda2d14Spatrick #define DISPC_VID1_ATTRIBUTES 0x00CC
2128eda2d14Spatrick #define DISPC_VID1_FIFO_THRESHOLD 0x00D0
2138eda2d14Spatrick #define DISPC_VID1_FIFO_SIZE_STATUS 0x00D4
2148eda2d14Spatrick #define DISPC_VID1_ROW_INC 0x00D8
2158eda2d14Spatrick #define DISPC_VID1_PIXEL_INC 0x00DC
2168eda2d14Spatrick #define DISPC_VID1_FIR 0x00E0
2178eda2d14Spatrick #define DISPC_VID1_PICTURE_SIZE 0x00E4
2188eda2d14Spatrick #define DISPC_VID1_ACCU0 0x00E8
2198eda2d14Spatrick #define DISPC_VID1_ACCU1 0x00EC
2208eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H0 0x00F0
2218eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H1 0x00F8
2228eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H2 0x0100
2238eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H3 0x0108
2248eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H4 0x0110
2258eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H5 0x0118
2268eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H6 0x0120
2278eda2d14Spatrick #define DISPC_VID1_FIR_COEF_H7 0x0128
2288eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV0 0x00F4
2298eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV1 0x00FC
2308eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV2 0x0104
2318eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV3 0x010C
2328eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV4 0x0114
2338eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV5 0x011C
2348eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV6 0x0124
2358eda2d14Spatrick #define DISPC_VID1_FIR_COEF_HV7 0x012C
2368eda2d14Spatrick #define DISPC_VID1_CONV_COEF0 0x0130
2378eda2d14Spatrick #define DISPC_VID1_CONV_COEF1 0x0134
2388eda2d14Spatrick #define DISPC_VID1_CONV_COEF2 0x0138
2398eda2d14Spatrick #define DISPC_VID1_CONV_COEF3 0x013C
2408eda2d14Spatrick #define DISPC_VID1_CONV_COEF4 0x0140
2418eda2d14Spatrick #define DISPC_VID2_BA0 0x014C
2428eda2d14Spatrick #define DISPC_VID2_BA1 0x0150
2438eda2d14Spatrick #define DISPC_VID2_POSITION 0x0154
2448eda2d14Spatrick #define DISPC_VID2_SIZE 0x0158
2458eda2d14Spatrick #define DISPC_VID2_ATTRIBUTES 0x015C
2468eda2d14Spatrick #define DISPC_VID2_FIFO_THRESHOLD 0x0160
2478eda2d14Spatrick #define DISPC_VID2_FIFO_SIZE_STATUS 0x0164
2488eda2d14Spatrick #define DISPC_VID2_ROW_INC 0x0168
2498eda2d14Spatrick #define DISPC_VID2_PIXEL_INC 0x016C
2508eda2d14Spatrick #define DISPC_VID2_FIR 0x0170
2518eda2d14Spatrick #define DISPC_VID2_PICTURE_SIZE 0x0174
2528eda2d14Spatrick #define DISPC_VID2_ACCU0 0x0178
2538eda2d14Spatrick #define DISPC_VID2_ACCU1 0x017C
2548eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H0 0x0180
2558eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H1 0x0188
2568eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H2 0x0190
2578eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H3 0x0198
2588eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H4 0x01A0
2598eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H5 0x01A8
2608eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H6 0x01B0
2618eda2d14Spatrick #define DISPC_VID2_FIR_COEF_H7 0x01B8
2628eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV0 0x0184
2638eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV1 0x018C
2648eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV2 0x0194
2658eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV3 0x019C
2668eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV4 0x01A4
2678eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV5 0x01AC
2688eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV6 0x01B4
2698eda2d14Spatrick #define DISPC_VID2_FIR_COEF_HV7 0x01BC
2708eda2d14Spatrick #define DISPC_VID2_CONV_COEF0 0x01C0
2718eda2d14Spatrick #define DISPC_VID2_CONV_COEF1 0x01C4
2728eda2d14Spatrick #define DISPC_VID2_CONV_COEF2 0x01C8
2738eda2d14Spatrick #define DISPC_VID2_CONV_COEF3 0x01CC
2748eda2d14Spatrick #define DISPC_VID2_CONV_COEF4 0x01D0
2758eda2d14Spatrick #define DISPC_DATA_CYCLE1 0x01D4
2768eda2d14Spatrick #define DISPC_DATA_CYCLE2 0x01D8
2778eda2d14Spatrick #define DISPC_DATA_CYCLE3 0x01DC
2788eda2d14Spatrick #define DISPC_SIZE 0x0200
2798eda2d14Spatrick
2808eda2d14Spatrick /* RFBI */
2818eda2d14Spatrick #define RFBI_REVISION 0x0000
2828eda2d14Spatrick #define RFBI_SYSCONFIG 0x0010
2838eda2d14Spatrick #define RFBI_SYSSTATUS 0x0014
2848eda2d14Spatrick #define RFBI_CONTROL 0x0040
2858eda2d14Spatrick #define RFBI_PIXEL_CNT 0x0044
2868eda2d14Spatrick #define RFBI_LINE_NUMBER 0x0048
2878eda2d14Spatrick #define RFBI_CMD 0x004C
2888eda2d14Spatrick #define RFBI_PARAM 0x0050
2898eda2d14Spatrick #define RFBI_DATA 0x0054
2908eda2d14Spatrick #define RFBI_READ 0x0058
2918eda2d14Spatrick #define RFBI_STATUS 0x005C
2928eda2d14Spatrick #define RFBI_CONFIG0 0x0060
2938eda2d14Spatrick #define RFBI_CONFIG1 0x0078
2948eda2d14Spatrick #define RFBI_ONOFF_TIME0 0x0064
2958eda2d14Spatrick #define RFBI_ONOFF_TIME1 0x007C
2968eda2d14Spatrick #define RFBI_CYCLE_TIME0 0x0068
2978eda2d14Spatrick #define RFBI_CYCLE_TIME1 0x0080
2988eda2d14Spatrick #define RFBI_DATA_CYCLE1_0 0x006C
2998eda2d14Spatrick #define RFBI_DATA_CYCLE1_1 0x0084
3008eda2d14Spatrick #define RFBI_DATA_CYCLE2_0 0x0070
3018eda2d14Spatrick #define RFBI_DATA_CYCLE2_1 0x0088
3028eda2d14Spatrick #define RFBI_DATA_CYCLE3_0 0x0074
3038eda2d14Spatrick #define RFBI_DATA_CYCLE3_1 0x008C
3048eda2d14Spatrick #define RFBI_VSYNC_WIDTH 0x0090
3058eda2d14Spatrick #define RFBI_HSYNC_WIDTH 0x0094
3068eda2d14Spatrick
3078eda2d14Spatrick /* VENC1 */
3088eda2d14Spatrick #define REV_ID 0x0000
3098eda2d14Spatrick #define STATUS 0x0004
3108eda2d14Spatrick #define F_CONTROL 0x0008
3118eda2d14Spatrick #define VIDOUT_CTRL 0x0010
3128eda2d14Spatrick #define SYNC_CTRL 0x0014
3138eda2d14Spatrick #define LLEN 0x001C
3148eda2d14Spatrick #define FLENS 0x0020
3158eda2d14Spatrick #define HFLTR_CTRL 0x0024
3168eda2d14Spatrick #define CC_CARR_WSS_CARR 0x0028
3178eda2d14Spatrick #define C_PHASE 0x002C
3188eda2d14Spatrick #define GAIN_U 0x0030
3198eda2d14Spatrick #define GAIN_V 0x0034
3208eda2d14Spatrick #define GAIN_Y 0x0038
3218eda2d14Spatrick #define BLACK_LEVEL 0x003C
3228eda2d14Spatrick #define BLANK_LEVEL 0x0040
3238eda2d14Spatrick #define X_COLOR 0x0044
3248eda2d14Spatrick #define M_CONTROL 0x0048
3258eda2d14Spatrick #define BSTAMP_WSS_DATA 0x004C
3268eda2d14Spatrick #define S_CARR 0x0050
3278eda2d14Spatrick #define LINE21 0x0054
3288eda2d14Spatrick #define LN_SEL 0x0058
3298eda2d14Spatrick #define L21_WC_CTL 0x005C
3308eda2d14Spatrick #define HTRIGGER_VTRIGGER 0x0060
3318eda2d14Spatrick #define SAVID_EAVID 0x0064
3328eda2d14Spatrick #define FLEN_FAL 0x0068
3338eda2d14Spatrick #define LAL_PHASE_RESET 0x006C
3348eda2d14Spatrick #define HS_INT_START_STOP_X 0x0070
3358eda2d14Spatrick #define HS_EXT_START_STOP_X 0x0074
3368eda2d14Spatrick #define VS_INT_START_X 0x0078
3378eda2d14Spatrick #define VS_INT_STOP_X_VS_INT_START_Y 0x007C
3388eda2d14Spatrick #define VS_INT_STOP_Y_VS_EXT_START_X 0x0080
3398eda2d14Spatrick #define VS_EXT_STOP_X_VS_EXT_START_Y 0x0084
3408eda2d14Spatrick #define VS_EXT_STOP_Y 0x0088
3418eda2d14Spatrick #define AVID_START_STOP_X 0x0090
3428eda2d14Spatrick #define AVID_START_STOP_Y 0x0094
3438eda2d14Spatrick #define FID_INT_START_X_FID_INT_START_Y 0x00A0
3448eda2d14Spatrick #define FID_INT_OFFSET_Y_FID_EXT_START_X 0x00A4
3458eda2d14Spatrick #define FID_EXT_START_Y_FID_EXT_OFFSET_Y 0x00A8
3468eda2d14Spatrick #define TVDETGP_INT_START_STOP_X 0x00B0
3478eda2d14Spatrick #define TVDETGP_INT_START_STOP_Y 0x00B4
3488eda2d14Spatrick #define GEN_CTRL 0x00B8
3498eda2d14Spatrick #define DAC_TST_DAC_A 0x00C4
3508eda2d14Spatrick #define DAC_B_DAC_C 0x00C8
3518eda2d14Spatrick
3528eda2d14Spatrick
3538eda2d14Spatrick /* NO CONSOLE SUPPORT */
3548eda2d14Spatrick
3558eda2d14Spatrick
3568eda2d14Spatrick /* assumes 565 panel. */
3578eda2d14Spatrick struct omdisplay_panel_data {
3588eda2d14Spatrick int width;
3598eda2d14Spatrick int height;
3608eda2d14Spatrick int horiz_sync_width;
3618eda2d14Spatrick int horiz_front_porch;
3628eda2d14Spatrick int horiz_back_porch;
3638eda2d14Spatrick int vert_sync_width;
3648eda2d14Spatrick int vert_front_porch;
3658eda2d14Spatrick int vert_back_porch;
3668eda2d14Spatrick int panel_flags;
3678eda2d14Spatrick int sync;
3688eda2d14Spatrick int depth;
3698eda2d14Spatrick #define PANEL_SYNC_H_ACTIVE_HIGH 1
3708eda2d14Spatrick #define PANEL_SYNC_V_ACTIVE_HIGH 2
3718eda2d14Spatrick int linebytes;
3728eda2d14Spatrick };
3738eda2d14Spatrick
3748eda2d14Spatrick #define PIXELDEPTH 16
3758eda2d14Spatrick #define PIXELWIDTH 2
3768eda2d14Spatrick
3778eda2d14Spatrick struct omdisplay_panel_data default_panel = {
3788eda2d14Spatrick 240, /* Width */
3798eda2d14Spatrick 322, /* Height */
3808eda2d14Spatrick 9, 9, 19, /* horiz sync, fp, bp */
3818eda2d14Spatrick 1, 2, 2, /* vert sync, fp, bp */
3828eda2d14Spatrick 0, /* flags */
3838eda2d14Spatrick 0, /* sync */
3848eda2d14Spatrick PIXELDEPTH,
3858eda2d14Spatrick 240*PIXELWIDTH
3868eda2d14Spatrick };
3878eda2d14Spatrick
3888eda2d14Spatrick struct omdisplay_screen {
3898eda2d14Spatrick LIST_ENTRY(omdisplay_screen) link;
3908eda2d14Spatrick
3918eda2d14Spatrick /* Frame buffer */
3928eda2d14Spatrick bus_dmamap_t dma;
3938eda2d14Spatrick bus_dma_segment_t segs[1];
3948eda2d14Spatrick int nsegs;
3958eda2d14Spatrick size_t buf_size;
3968eda2d14Spatrick size_t map_size;
3978eda2d14Spatrick void *buf_va;
3988eda2d14Spatrick int depth;
3998eda2d14Spatrick
4008eda2d14Spatrick /* rasterop */
4018eda2d14Spatrick struct rasops_info rinfo;
4028eda2d14Spatrick };
4038eda2d14Spatrick
4048eda2d14Spatrick struct omdisplay_softc {
4058eda2d14Spatrick struct device sc_dev;
4068eda2d14Spatrick bus_space_tag_t sc_iot;
4078eda2d14Spatrick bus_space_handle_t sc_dsioh;
4088eda2d14Spatrick bus_space_handle_t sc_dcioh;
4098eda2d14Spatrick bus_space_handle_t sc_rfbioh;
4108eda2d14Spatrick bus_space_handle_t sc_venioh;
4118eda2d14Spatrick bus_dma_tag_t sc_dma_tag;
4128eda2d14Spatrick
4138eda2d14Spatrick void *sc_ih;
4148eda2d14Spatrick
4158eda2d14Spatrick int sc_nscreens;
4168eda2d14Spatrick LIST_HEAD(,omdisplay_screen) sc_screens;
4178eda2d14Spatrick
4188eda2d14Spatrick struct omdisplay_panel_data *sc_geometry;
4198eda2d14Spatrick struct omdisplay_screen *sc_active;
4208eda2d14Spatrick };
4218eda2d14Spatrick
4228eda2d14Spatrick int omdisplay_match(struct device *parent, void *v, void *aux);
4238eda2d14Spatrick void omdisplay_attach(struct device *parent, struct device *self, void *args);
4248eda2d14Spatrick int omdisplay_activate(struct device *, int);
4258eda2d14Spatrick int omdisplay_ioctl(void *v, u_long cmd, caddr_t data, int flag,
4268eda2d14Spatrick struct proc *p);
4278eda2d14Spatrick void omdisplay_burner(void *v, u_int on, u_int flags);
4288eda2d14Spatrick int omdisplay_show_screen(void *v, void *cookie, int waitok,
4298eda2d14Spatrick void (*cb)(void *, int, int), void *cbarg);
4308eda2d14Spatrick int omdisplay_param(struct omdisplay_softc *sc, ulong cmd,
4318eda2d14Spatrick struct wsdisplay_param *dp);
4328eda2d14Spatrick int omdisplay_max_brightness(void);
4338eda2d14Spatrick int omdisplay_get_brightness(void);
4348eda2d14Spatrick void omdisplay_set_brightness(int newval);
4358eda2d14Spatrick void omdisplay_set_brightness_internal(int newval);
4368eda2d14Spatrick int omdisplay_get_backlight(void);
4378eda2d14Spatrick void omdisplay_set_backlight(int on);
4388eda2d14Spatrick void omdisplay_blank(int blank);
4398eda2d14Spatrick void omdisplay_suspend(struct omdisplay_softc *sc);
4408eda2d14Spatrick void omdisplay_resume(struct omdisplay_softc *sc);
4418eda2d14Spatrick void omdisplay_initialize(struct omdisplay_softc *sc,
4428eda2d14Spatrick struct omdisplay_panel_data *geom);
4438eda2d14Spatrick void omdisplay_setup_rasops(struct omdisplay_softc *sc,
4448eda2d14Spatrick struct rasops_info *rinfo);
4458eda2d14Spatrick int omdisplay_alloc_screen(void *v, const struct wsscreen_descr *_type,
446e0c3e559Sjsg void **cookiep, int *curxp, int *curyp, uint32_t *attrp);
4478eda2d14Spatrick int omdisplay_new_screen(struct omdisplay_softc *sc,
4488eda2d14Spatrick struct omdisplay_screen *scr, int depth);
4498eda2d14Spatrick paddr_t omdisplay_mmap(void *v, off_t offset, int prot);
45083275742Smiod int omdisplay_load_font(void *, void *, struct wsdisplay_font *);
45183275742Smiod int omdisplay_list_font(void *, struct wsdisplay_font *);
4528eda2d14Spatrick void omdisplay_free_screen(void *v, void *cookie);
4538eda2d14Spatrick void omdisplay_start(struct omdisplay_softc *sc);
4548eda2d14Spatrick void omdisplay_stop(struct omdisplay_softc *sc);
4558eda2d14Spatrick int omdisplay_intr(void *v);
4568eda2d14Spatrick
4579fdf0c62Smpi const struct cfattach omdisplay_ca = {
4588eda2d14Spatrick sizeof (struct omdisplay_softc), omdisplay_match, omdisplay_attach,
4598eda2d14Spatrick NULL, omdisplay_activate
4608eda2d14Spatrick };
4618eda2d14Spatrick
4628eda2d14Spatrick struct cfdriver omdisplay_cd = {
4638eda2d14Spatrick NULL, "omdisplay", DV_DULL
4648eda2d14Spatrick };
4658eda2d14Spatrick
4668eda2d14Spatrick struct wsdisplay_accessops omdisplay_accessops = {
46787eec248Smiod .ioctl = omdisplay_ioctl,
46887eec248Smiod .mmap = omdisplay_mmap,
46987eec248Smiod .alloc_screen = omdisplay_alloc_screen,
47087eec248Smiod .free_screen = omdisplay_free_screen,
47187eec248Smiod .show_screen = omdisplay_show_screen,
47283275742Smiod .load_font = omdisplay_load_font,
47383275742Smiod .list_font = omdisplay_list_font,
47487eec248Smiod .burn_screen = omdisplay_burner
4758eda2d14Spatrick
4768eda2d14Spatrick };
4778eda2d14Spatrick
4788eda2d14Spatrick struct omdisplay_wsscreen_descr {
4798eda2d14Spatrick struct wsscreen_descr c; /* standard descriptor */
4808eda2d14Spatrick int depth; /* bits per pixel */
4818eda2d14Spatrick int flags; /* rasops flags */
4828eda2d14Spatrick };
4838eda2d14Spatrick
4848eda2d14Spatrick struct omdisplay_wsscreen_descr omdisplay_screen = {
4858eda2d14Spatrick {
4868eda2d14Spatrick "std"
4878eda2d14Spatrick },
4888eda2d14Spatrick 16, /* bits per pixel */
4898eda2d14Spatrick 0 /* rotate */
4908eda2d14Spatrick };
4918eda2d14Spatrick
4928eda2d14Spatrick const struct wsscreen_descr *omdisplay_scr_descr[] = {
4938eda2d14Spatrick &omdisplay_screen.c
4948eda2d14Spatrick };
4958eda2d14Spatrick
4968eda2d14Spatrick /* XXX - what about flip phones with CLI */
4978eda2d14Spatrick const struct wsscreen_list omdisplay_screen_list = {
4988eda2d14Spatrick sizeof omdisplay_scr_descr / sizeof omdisplay_scr_descr[0],
4998eda2d14Spatrick omdisplay_scr_descr
5008eda2d14Spatrick };
5018eda2d14Spatrick
5028eda2d14Spatrick
5038eda2d14Spatrick int
omdisplay_match(struct device * parent,void * v,void * aux)5048eda2d14Spatrick omdisplay_match(struct device *parent, void *v, void *aux)
5058eda2d14Spatrick {
5068eda2d14Spatrick /* XXX */
5078eda2d14Spatrick return (1);
5088eda2d14Spatrick }
5098eda2d14Spatrick
5108eda2d14Spatrick void
omdisplay_attach(struct device * parent,struct device * self,void * args)5118eda2d14Spatrick omdisplay_attach(struct device *parent, struct device *self, void *args)
5128eda2d14Spatrick {
5138eda2d14Spatrick struct ahb_attach_args *aa = args;
5148eda2d14Spatrick struct omdisplay_softc *sc = (struct omdisplay_softc *) self;
5158eda2d14Spatrick struct wsemuldisplaydev_attach_args wsaa;
5168eda2d14Spatrick
5178eda2d14Spatrick
5188eda2d14Spatrick sc->sc_iot = aa->aa_iot;
5198eda2d14Spatrick
5208eda2d14Spatrick if (bus_space_map(sc->sc_iot, aa->aa_addr, OMDISPLAY_SIZE, 0,
5218eda2d14Spatrick &sc->sc_dsioh))
5228eda2d14Spatrick panic("omdisplay_attach: bus_space_map failed!");
5238eda2d14Spatrick
5248eda2d14Spatrick if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0x400, 1024,
5258eda2d14Spatrick &sc->sc_dcioh))
5268eda2d14Spatrick panic("omdisplay_attach: bus_space_submap failed!");
5278eda2d14Spatrick
5288eda2d14Spatrick if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0x800, 1024,
5298eda2d14Spatrick &sc->sc_rfbioh))
5308eda2d14Spatrick panic("omdisplay_attach: bus_space_submap failed!");
5318eda2d14Spatrick
5328eda2d14Spatrick if (bus_space_subregion(sc->sc_iot, sc->sc_dsioh, 0xc00, 1024,
5338eda2d14Spatrick &sc->sc_venioh))
5348eda2d14Spatrick panic("omdisplay_attach: bus_space_submap failed!");
5358eda2d14Spatrick
5368eda2d14Spatrick
5378eda2d14Spatrick sc->sc_nscreens = 0;
5388eda2d14Spatrick LIST_INIT(&sc->sc_screens);
5398eda2d14Spatrick
5408eda2d14Spatrick sc->sc_dma_tag = aa->aa_dmat;
5418eda2d14Spatrick
5428eda2d14Spatrick sc->sc_ih = arm_intr_establish(aa->aa_intr, IPL_BIO /* XXX */,
5438eda2d14Spatrick omdisplay_intr, sc, sc->sc_dev.dv_xname);
5448eda2d14Spatrick
5458eda2d14Spatrick printf ("\n");
5468eda2d14Spatrick
5478eda2d14Spatrick sc->sc_geometry = &default_panel;
5488eda2d14Spatrick
5498eda2d14Spatrick {
5508eda2d14Spatrick /* XXX - dummy? */
5518eda2d14Spatrick struct rasops_info dummy;
5528eda2d14Spatrick
5538eda2d14Spatrick omdisplay_initialize(sc, sc->sc_geometry);
5548eda2d14Spatrick
5558eda2d14Spatrick /*
5568eda2d14Spatrick * Initialize a dummy rasops_info to compute fontsize and
5578eda2d14Spatrick * the screen size in chars.
5588eda2d14Spatrick */
5598eda2d14Spatrick bzero(&dummy, sizeof(dummy));
5608eda2d14Spatrick omdisplay_setup_rasops(sc, &dummy);
5618eda2d14Spatrick }
5628eda2d14Spatrick
5638eda2d14Spatrick wsaa.console = 0;
5648eda2d14Spatrick wsaa.scrdata = &omdisplay_screen_list;
5658eda2d14Spatrick wsaa.accessops = &omdisplay_accessops;
5668eda2d14Spatrick wsaa.accesscookie = sc;
5678eda2d14Spatrick wsaa.defaultscreens = 0;
5688eda2d14Spatrick
5698eda2d14Spatrick (void)config_found(self, &wsaa, wsemuldisplaydevprint);
5708eda2d14Spatrick
5718eda2d14Spatrick /* backlight? */
5728eda2d14Spatrick }
5738eda2d14Spatrick
5748eda2d14Spatrick
5758eda2d14Spatrick int
omdisplay_ioctl(void * v,u_long cmd,caddr_t data,int flag,struct proc * p)5768eda2d14Spatrick omdisplay_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
5778eda2d14Spatrick {
5788eda2d14Spatrick struct omdisplay_softc *sc = v;
5798eda2d14Spatrick struct wsdisplay_fbinfo *wsdisp_info;
5808eda2d14Spatrick struct omdisplay_screen *scr = sc->sc_active;
5818eda2d14Spatrick int res = EINVAL;
5828eda2d14Spatrick
5838eda2d14Spatrick switch (cmd) {
5848eda2d14Spatrick case WSDISPLAYIO_GETPARAM:
5858eda2d14Spatrick case WSDISPLAYIO_SETPARAM:
5868eda2d14Spatrick res = omdisplay_param(sc, cmd, (struct wsdisplay_param *)data);
5878eda2d14Spatrick break;
5888eda2d14Spatrick case WSDISPLAYIO_GTYPE:
5898eda2d14Spatrick *(u_int *)data = WSDISPLAY_TYPE_PXALCD; /* XXX */
5908eda2d14Spatrick break;
5918eda2d14Spatrick
5928eda2d14Spatrick case WSDISPLAYIO_GINFO:
5938eda2d14Spatrick wsdisp_info = (struct wsdisplay_fbinfo *)data;
5948eda2d14Spatrick
5958eda2d14Spatrick wsdisp_info->height = sc->sc_geometry->height;
5968eda2d14Spatrick wsdisp_info->width = sc->sc_geometry->width;
5978eda2d14Spatrick wsdisp_info->depth = 16; /* XXX */
59863294167Skettenis if (scr != NULL)
59963294167Skettenis wsdisp_info->stride = scr->rinfo.r_stride;
60063294167Skettenis else
60163294167Skettenis wsdisp_info->stride = 0;
60263294167Skettenis wsdisp_info->offset = 0;
6038eda2d14Spatrick wsdisp_info->cmsize = 0;
6048eda2d14Spatrick break;
6058eda2d14Spatrick
6068eda2d14Spatrick case WSDISPLAYIO_GETCMAP:
6078eda2d14Spatrick case WSDISPLAYIO_PUTCMAP:
6088eda2d14Spatrick return EINVAL; /* XXX Colormap */
6098eda2d14Spatrick
6108eda2d14Spatrick case WSDISPLAYIO_SVIDEO:
6118eda2d14Spatrick case WSDISPLAYIO_GVIDEO:
6128eda2d14Spatrick break;
6138eda2d14Spatrick
6148eda2d14Spatrick case WSDISPLAYIO_GCURPOS:
6158eda2d14Spatrick case WSDISPLAYIO_SCURPOS:
6168eda2d14Spatrick case WSDISPLAYIO_GCURMAX:
6178eda2d14Spatrick case WSDISPLAYIO_GCURSOR:
6188eda2d14Spatrick case WSDISPLAYIO_SCURSOR:
6198eda2d14Spatrick default:
6208eda2d14Spatrick return -1; /* not implemented */
6218eda2d14Spatrick
6228eda2d14Spatrick case WSDISPLAYIO_LINEBYTES:
6238eda2d14Spatrick if (scr != NULL)
6248eda2d14Spatrick *(u_int *)data = scr->rinfo.ri_stride;
6258eda2d14Spatrick else
6268eda2d14Spatrick *(u_int *)data = 0;
6278eda2d14Spatrick break;
6288eda2d14Spatrick
6298eda2d14Spatrick }
6308eda2d14Spatrick
6318eda2d14Spatrick if (res == EINVAL)
6328eda2d14Spatrick res = omdisplay_ioctl(v, cmd, data, flag, p);
6338eda2d14Spatrick
6348eda2d14Spatrick return res;
6358eda2d14Spatrick }
6368eda2d14Spatrick
6378eda2d14Spatrick void
omdisplay_burner(void * v,u_int on,u_int flags)6388eda2d14Spatrick omdisplay_burner(void *v, u_int on, u_int flags)
6398eda2d14Spatrick {
6408eda2d14Spatrick
6418eda2d14Spatrick omdisplay_set_brightness(on ? omdisplay_get_brightness() : 0);
6428eda2d14Spatrick
6438eda2d14Spatrick /* GPIO controls for appsliver */
6448eda2d14Spatrick if (on) {
6458eda2d14Spatrick omgpio_set_bit(93); /* 1 enable backlight */
6468eda2d14Spatrick omgpio_set_dir(93, OMGPIO_DIR_OUT);
6478eda2d14Spatrick omgpio_clear_bit(26); /* 0 enable LCD */
6488eda2d14Spatrick omgpio_set_dir(26, OMGPIO_DIR_OUT);
6498eda2d14Spatrick } else {
6508eda2d14Spatrick omgpio_clear_bit(93); /* 0 disable backlt */
6518eda2d14Spatrick omgpio_set_dir(93, OMGPIO_DIR_OUT);
6528eda2d14Spatrick omgpio_set_bit(26); /* 1 disable LCD */
6538eda2d14Spatrick omgpio_set_dir(26, OMGPIO_DIR_OUT);
6548eda2d14Spatrick }
6558eda2d14Spatrick }
6568eda2d14Spatrick
6578eda2d14Spatrick int
omdisplay_show_screen(void * v,void * cookie,int waitok,void (* cb)(void *,int,int),void * cbarg)6588eda2d14Spatrick omdisplay_show_screen(void *v, void *cookie, int waitok,
6598eda2d14Spatrick void (*cb)(void *, int, int), void *cbarg)
6608eda2d14Spatrick {
6618eda2d14Spatrick struct omdisplay_softc *sc = v;
6628eda2d14Spatrick struct rasops_info *ri = cookie;
6638eda2d14Spatrick struct omdisplay_screen *scr = ri->ri_hw, *old;
6648eda2d14Spatrick
6658eda2d14Spatrick old = sc->sc_active;
6668eda2d14Spatrick if (old == scr)
6678eda2d14Spatrick return 0;
6688eda2d14Spatrick
6698eda2d14Spatrick if (old != NULL)
6708eda2d14Spatrick ; /* Stop old screen */
6718eda2d14Spatrick
6728eda2d14Spatrick sc->sc_active = scr;
6738eda2d14Spatrick omdisplay_initialize(sc, sc->sc_geometry);
6748eda2d14Spatrick
6758eda2d14Spatrick /* Turn on LCD */
6768eda2d14Spatrick omdisplay_burner(v, 1, 0);
6778eda2d14Spatrick
6788eda2d14Spatrick return (0);
6798eda2d14Spatrick }
6808eda2d14Spatrick
6818eda2d14Spatrick
6828eda2d14Spatrick
6838eda2d14Spatrick /*
6848eda2d14Spatrick * wsdisplay I/O controls
6858eda2d14Spatrick */
6868eda2d14Spatrick int
omdisplay_param(struct omdisplay_softc * sc,ulong cmd,struct wsdisplay_param * dp)6878eda2d14Spatrick omdisplay_param(struct omdisplay_softc *sc, ulong cmd,
6888eda2d14Spatrick struct wsdisplay_param *dp)
6898eda2d14Spatrick {
6908eda2d14Spatrick int res = EINVAL;
6918eda2d14Spatrick
6928eda2d14Spatrick switch (dp->param) {
6938eda2d14Spatrick case WSDISPLAYIO_PARAM_BACKLIGHT:
6948eda2d14Spatrick if (cmd == WSDISPLAYIO_GETPARAM) {
6958eda2d14Spatrick dp->min = 0;
6968eda2d14Spatrick dp->max = 1;
6978eda2d14Spatrick dp->curval = omdisplay_get_backlight();
6988eda2d14Spatrick res = 0;
6998eda2d14Spatrick } else if (cmd == WSDISPLAYIO_SETPARAM) {
7008eda2d14Spatrick /* XXX */
7018eda2d14Spatrick // omdisplay_set_backlight(dp->curval);
7028eda2d14Spatrick res = 0;
7038eda2d14Spatrick }
7048eda2d14Spatrick break;
7058eda2d14Spatrick
7068eda2d14Spatrick case WSDISPLAYIO_PARAM_CONTRAST:
7078eda2d14Spatrick /* unsupported */
7088eda2d14Spatrick res = ENOTTY;
7098eda2d14Spatrick break;
7108eda2d14Spatrick
7118eda2d14Spatrick case WSDISPLAYIO_PARAM_BRIGHTNESS:
7128eda2d14Spatrick if (cmd == WSDISPLAYIO_GETPARAM) {
7138eda2d14Spatrick dp->min = 1;
7148eda2d14Spatrick dp->max = omdisplay_max_brightness();
7158eda2d14Spatrick dp->curval = omdisplay_get_brightness();
7168eda2d14Spatrick res = 0;
7178eda2d14Spatrick } else if (cmd == WSDISPLAYIO_SETPARAM) {
7188eda2d14Spatrick /* XXX */
7198eda2d14Spatrick // omdisplay_set_brightness(dp->curval);
7208eda2d14Spatrick res = 0;
7218eda2d14Spatrick }
7228eda2d14Spatrick break;
7238eda2d14Spatrick }
7248eda2d14Spatrick
7258eda2d14Spatrick return res;
7268eda2d14Spatrick }
7278eda2d14Spatrick
7288eda2d14Spatrick
7298eda2d14Spatrick /*
7308eda2d14Spatrick * LCD backlight
7318eda2d14Spatrick */
7328eda2d14Spatrick
7338eda2d14Spatrick static int lcdbrightnesscurval = 1;
7348eda2d14Spatrick static int lcdislit = 1;
7358eda2d14Spatrick static int lcdisblank = 0;
7368eda2d14Spatrick
7378eda2d14Spatrick struct lcd_backlight {
7388eda2d14Spatrick int duty; /* LZ9JG18 DAC value */
7398eda2d14Spatrick int cont; /* BACKLIGHT_CONT signal */
7408eda2d14Spatrick int on; /* BACKLIGHT_ON signal */
7418eda2d14Spatrick };
7428eda2d14Spatrick
7438eda2d14Spatrick const struct lcd_backlight lcd_bl[] = {
7448eda2d14Spatrick { 0x00, 0, 0 }, /* 0: Off */
7458eda2d14Spatrick { 0x00, 0, 1 }, /* 1: 0% */
7468eda2d14Spatrick { 0x01, 0, 1 }, /* 2: 20% */
7478eda2d14Spatrick { 0x07, 0, 1 }, /* 3: 40% */
7488eda2d14Spatrick { 0x01, 1, 1 }, /* 4: 60% */
7498eda2d14Spatrick { 0x07, 1, 1 }, /* 5: 80% */
7508eda2d14Spatrick { 0x11, 1, 1 }, /* 6: 100% */
7518eda2d14Spatrick { -1, -1, -1 } /* 7: Invalid */
7528eda2d14Spatrick };
7538eda2d14Spatrick #define CURRENT_BACKLIGHT lcd_bl
7548eda2d14Spatrick
7558eda2d14Spatrick int
omdisplay_max_brightness(void)7568eda2d14Spatrick omdisplay_max_brightness(void)
7578eda2d14Spatrick {
7588eda2d14Spatrick int i;
7598eda2d14Spatrick
7608eda2d14Spatrick for (i = 0; CURRENT_BACKLIGHT[i].duty != -1; i++)
7618eda2d14Spatrick ;
7628eda2d14Spatrick return i - 1;
7638eda2d14Spatrick }
7648eda2d14Spatrick
7658eda2d14Spatrick int
omdisplay_get_brightness(void)7668eda2d14Spatrick omdisplay_get_brightness(void)
7678eda2d14Spatrick {
7688eda2d14Spatrick
7698eda2d14Spatrick return lcdbrightnesscurval;
7708eda2d14Spatrick }
7718eda2d14Spatrick
7728eda2d14Spatrick void
omdisplay_set_brightness(int newval)7738eda2d14Spatrick omdisplay_set_brightness(int newval)
7748eda2d14Spatrick {
7758eda2d14Spatrick int max;
7768eda2d14Spatrick
7778eda2d14Spatrick max = omdisplay_max_brightness();
7788eda2d14Spatrick if (newval < 0)
7798eda2d14Spatrick newval = 0;
7808eda2d14Spatrick else if (newval > max)
7818eda2d14Spatrick newval = max;
7828eda2d14Spatrick
7838eda2d14Spatrick if (omdisplay_get_backlight() && !lcdisblank)
7848eda2d14Spatrick omdisplay_set_brightness_internal(newval);
7858eda2d14Spatrick
7868eda2d14Spatrick if (newval > 0)
7878eda2d14Spatrick lcdbrightnesscurval = newval;
7888eda2d14Spatrick }
7898eda2d14Spatrick
7908eda2d14Spatrick void
omdisplay_set_brightness_internal(int newval)7918eda2d14Spatrick omdisplay_set_brightness_internal(int newval)
7928eda2d14Spatrick {
7938eda2d14Spatrick static int curval = 1;
7948eda2d14Spatrick int i;
7958eda2d14Spatrick
7968eda2d14Spatrick /*
7978eda2d14Spatrick * It appears that the C3000 backlight can draw too much power if we
7988eda2d14Spatrick * switch it from a low to a high brightness. Increasing brightness
7998eda2d14Spatrick * in steps avoids this issue.
8008eda2d14Spatrick */
8018eda2d14Spatrick if (newval > curval) {
8028eda2d14Spatrick for (i = curval + 1; i <= newval; i++) {
8038eda2d14Spatrick /* atlas controls */
8048eda2d14Spatrick /* CURRENT_BACKLIGHT[newval].duty); */
8058eda2d14Spatrick }
8068eda2d14Spatrick } else {
8078eda2d14Spatrick /* atlas controls */
8088eda2d14Spatrick /* CURRENT_BACKLIGHT[newval].duty); */
8098eda2d14Spatrick }
8108eda2d14Spatrick
8118eda2d14Spatrick curval = newval;
8128eda2d14Spatrick }
8138eda2d14Spatrick
8148eda2d14Spatrick int
omdisplay_get_backlight(void)8158eda2d14Spatrick omdisplay_get_backlight(void)
8168eda2d14Spatrick {
8178eda2d14Spatrick
8188eda2d14Spatrick return lcdislit;
8198eda2d14Spatrick }
8208eda2d14Spatrick
8218eda2d14Spatrick void
omdisplay_set_backlight(int on)8228eda2d14Spatrick omdisplay_set_backlight(int on)
8238eda2d14Spatrick {
8248eda2d14Spatrick
8258eda2d14Spatrick if (!on) {
8268eda2d14Spatrick omdisplay_set_brightness(0);
8278eda2d14Spatrick lcdislit = 0;
8288eda2d14Spatrick } else {
8298eda2d14Spatrick lcdislit = 1;
8308eda2d14Spatrick omdisplay_set_brightness(omdisplay_get_brightness());
8318eda2d14Spatrick }
8328eda2d14Spatrick }
8338eda2d14Spatrick
8348eda2d14Spatrick void
omdisplay_blank(int blank)8358eda2d14Spatrick omdisplay_blank(int blank)
8368eda2d14Spatrick {
8378eda2d14Spatrick
8388eda2d14Spatrick if (blank) {
8398eda2d14Spatrick omdisplay_set_brightness(0);
8408eda2d14Spatrick lcdisblank = 1;
8418eda2d14Spatrick } else {
8428eda2d14Spatrick lcdisblank = 0;
8438eda2d14Spatrick omdisplay_set_brightness(omdisplay_get_brightness());
8448eda2d14Spatrick }
8458eda2d14Spatrick }
8468eda2d14Spatrick
8478eda2d14Spatrick void
omdisplay_suspend(struct omdisplay_softc * sc)8488eda2d14Spatrick omdisplay_suspend(struct omdisplay_softc *sc)
8498eda2d14Spatrick {
8508eda2d14Spatrick if (sc->sc_active != NULL) {
8518eda2d14Spatrick omdisplay_stop(sc);
8528eda2d14Spatrick /* XXX disable clocks */
8538eda2d14Spatrick }
8548eda2d14Spatrick }
8558eda2d14Spatrick
8568eda2d14Spatrick void
omdisplay_resume(struct omdisplay_softc * sc)8578eda2d14Spatrick omdisplay_resume(struct omdisplay_softc *sc)
8588eda2d14Spatrick {
8598eda2d14Spatrick if (sc->sc_active != NULL) {
8608eda2d14Spatrick /* XXX - clocks? */
8618eda2d14Spatrick omdisplay_initialize(sc, sc->sc_geometry);
8628eda2d14Spatrick omdisplay_start(sc);
8638eda2d14Spatrick }
8648eda2d14Spatrick }
8658eda2d14Spatrick
8668eda2d14Spatrick void
omdisplay_activate(struct device * self,int act)8678eda2d14Spatrick omdisplay_activate(struct device *self, int act)
8688eda2d14Spatrick {
8698eda2d14Spatrick struct omdisplay_softc *sc = (struct omdisplay_softc *)self;
8708eda2d14Spatrick
8718eda2d14Spatrick switch (act) {
8728eda2d14Spatrick case DVACT_SUSPEND:
8738eda2d14Spatrick omdisplay_set_brightness(0);
8748eda2d14Spatrick omdisplay_suspend(sc);
8758eda2d14Spatrick break;
8768eda2d14Spatrick case DVACT_RESUME:
8778eda2d14Spatrick omdisplay_resume(sc);
8788eda2d14Spatrick omdisplay_set_brightness(omdisplay_get_brightness());
8798eda2d14Spatrick break;
8808eda2d14Spatrick }
8818eda2d14Spatrick return 0;
8828eda2d14Spatrick }
8838eda2d14Spatrick
8848eda2d14Spatrick void
omdisplay_initialize(struct omdisplay_softc * sc,struct omdisplay_panel_data * geom)8858eda2d14Spatrick omdisplay_initialize(struct omdisplay_softc *sc,
8868eda2d14Spatrick struct omdisplay_panel_data *geom)
8878eda2d14Spatrick {
8888eda2d14Spatrick struct omdisplay_screen *scr;
8898eda2d14Spatrick u_int32_t reg;
8908eda2d14Spatrick u_int32_t mode;
8918eda2d14Spatrick #if 0
8928eda2d14Spatrick int den, nom; /* pixel rate */
8938eda2d14Spatrick #endif
8948eda2d14Spatrick
8958eda2d14Spatrick
8968eda2d14Spatrick reg = bus_space_read_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL);
8978eda2d14Spatrick
8988eda2d14Spatrick scr = sc->sc_active;
8998eda2d14Spatrick
9008eda2d14Spatrick if (reg & (DISPC_CONTROL_LCDENABLE|DISPC_CONTROL_DIGITALENABLE)) {
9018eda2d14Spatrick omdisplay_stop(sc);
9028eda2d14Spatrick }
9038eda2d14Spatrick
9048eda2d14Spatrick /* XXX - enable clocks */
9058eda2d14Spatrick
9068eda2d14Spatrick /* disable all interrupts */
9078eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_IRQENABLE, 0);
9088eda2d14Spatrick
9098eda2d14Spatrick /* GPIOs ? */
9108eda2d14Spatrick
9118eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONFIG,
9128eda2d14Spatrick DISPC_CONFIG_LOADMODE_PG|DISPC_CONFIG_LOADMODE_DATA);
9138eda2d14Spatrick
9148eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DEFAULT_COLOR0, 0);
9158eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DEFAULT_COLOR1, 0);
9168eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TRANS_COLOR0, 0);
9178eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TRANS_COLOR1, 0);
9188eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_LINE_NUMBER, 0);
9198eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE1, 0);
9208eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE2, 0);
9218eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DATA_CYCLE3, 0);
9228eda2d14Spatrick
9238eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SYSCONFIG,
9248eda2d14Spatrick DISPC_SYSCONFIG_SIDLEMODE_NONE|
9258eda2d14Spatrick DISPC_SYSCONFIG_MIDLEMODE_NONE);
9268eda2d14Spatrick
9278eda2d14Spatrick #if 0
9288eda2d14Spatrick if (geom->panel_flags & LCDPANEL_TDM) {
9298eda2d14Spatrick nom = tdmflags >>8 & 0x3;
9308eda2d14Spatrick den = tdmflags & 0x3;
9318eda2d14Spatrick } else {
9328eda2d14Spatrick nom = 1;
9338eda2d14Spatrick den = 1;
9348eda2d14Spatrick }
9358eda2d14Spatrick hsync = geom->width*den/nom + geom->horiz_sync_width +
9368eda2d14Spatrick geom->horiz_front_porch + geom->horiz_back_porch;
9378eda2d14Spatrick #endif
9388eda2d14Spatrick
9398eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TIMING_H,
9408eda2d14Spatrick DISPC_TIMING_H_HSW_s(geom->horiz_sync_width) |
9418eda2d14Spatrick DISPC_TIMING_H_HFP_s(geom->horiz_front_porch) |
9428eda2d14Spatrick DISPC_TIMING_H_HBP_s(geom->horiz_back_porch));
9438eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_TIMING_V,
9448eda2d14Spatrick DISPC_TIMING_V_VSW_s(geom->vert_sync_width) |
9458eda2d14Spatrick DISPC_TIMING_V_VFP_s(geom->vert_front_porch) |
9468eda2d14Spatrick DISPC_TIMING_V_VBP_s(geom->vert_back_porch));
9478eda2d14Spatrick
9488eda2d14Spatrick reg = 0;
9498eda2d14Spatrick if (geom->sync & PANEL_SYNC_H_ACTIVE_HIGH)
9508eda2d14Spatrick reg |= DISPC_POL_FREQ_IHS;
9518eda2d14Spatrick if (geom->sync & PANEL_SYNC_V_ACTIVE_HIGH)
9528eda2d14Spatrick reg |= DISPC_POL_FREQ_IVS;
9538eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_POL_FREQ, reg);
9548eda2d14Spatrick
9558eda2d14Spatrick
9568eda2d14Spatrick /* clkdiv = pixclock/period; */
9578eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SIZE_LCD,
9588eda2d14Spatrick DISPC_SIZE_LCD_PPL_s(geom->width-1) |
9598eda2d14Spatrick DISPC_SIZE_LCD_LPP_s(geom->height-1));
9608eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_SIZE_DIG,
9618eda2d14Spatrick DISPC_SIZE_LCD_PPL_s(geom->width-1) |
9628eda2d14Spatrick DISPC_SIZE_LCD_LPP_s(geom->height-1));
9638eda2d14Spatrick
9648eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_SIZE,
9658eda2d14Spatrick DISPC_GFX_SIZE_X_s(geom->width-1) |
9668eda2d14Spatrick DISPC_GFX_SIZE_Y_s(geom->height-1));
9678eda2d14Spatrick
9688eda2d14Spatrick
9698eda2d14Spatrick /* XXX!!! */
9708eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_DIVISOR,
9718eda2d14Spatrick DISPC_DIVISOR_LCD_s(1) | DISPC_DIVISOR_PCD_s(6));
9728eda2d14Spatrick
9738eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_BA0,
9748eda2d14Spatrick scr->segs[0].ds_addr);
9758eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_BA1,
9768eda2d14Spatrick scr->segs[0].ds_addr);
9778eda2d14Spatrick
9788eda2d14Spatrick /* non-rotated */
9798eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_PIXEL_INC, 1);
9808eda2d14Spatrick
9818eda2d14Spatrick
9828eda2d14Spatrick /* XXX 24bit -> 32 pixels */
9838eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ROW_INC,
9848eda2d14Spatrick 1 + scr->rinfo.ri_stride -
9858eda2d14Spatrick (scr->rinfo.ri_width * scr->rinfo.ri_depth / 8));
9868eda2d14Spatrick
9878eda2d14Spatrick switch (geom->depth) {
9888eda2d14Spatrick case 1:
9898eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_1;
9908eda2d14Spatrick break;
9918eda2d14Spatrick case 2:
9928eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_2;
9938eda2d14Spatrick break;
9948eda2d14Spatrick case 4:
9958eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_4;
9968eda2d14Spatrick break;
9978eda2d14Spatrick case 8:
9988eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_8;
9998eda2d14Spatrick break;
10008eda2d14Spatrick case 12:
10018eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_12;
10028eda2d14Spatrick break;
10038eda2d14Spatrick case 16:
10048eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_16;
10058eda2d14Spatrick break;
10068eda2d14Spatrick case 24:
10078eda2d14Spatrick mode = DISPC_GFX_ATTRIBUTES_GFXFMT_24;
10088eda2d14Spatrick break;
10098eda2d14Spatrick default:
10108eda2d14Spatrick panic("invalid depth %d", geom->depth);
10118eda2d14Spatrick }
10128eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ATTRIBUTES,
10138eda2d14Spatrick DISPC_GFX_ATTRIBUTES_GFXENABLE | mode |
10148eda2d14Spatrick DISPC_GFX_ATTRIBUTES_BURST_8);
10158eda2d14Spatrick
10168eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_POSITION, 0);
10178eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_WINDOW_SKIP, 0);
10188eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_FIFO_THRESHOLD,
10198eda2d14Spatrick (0xfc << DISPC_GFX_FIFO_THRESHOLD_HIGH_SHIFT) |
10208eda2d14Spatrick (0xc0 << DISPC_GFX_FIFO_THRESHOLD_LOW_SHIFT));
10218eda2d14Spatrick
10228eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_ROW_INC, 1);
10238eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_PIXEL_INC, 1);
10248eda2d14Spatrick
10258eda2d14Spatrick /* DISPC_CONFIG_PALETTEGAMMA not enabled */
10268eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_GFX_TABLE_BA,
10278eda2d14Spatrick scr->segs[0].ds_addr);
10288eda2d14Spatrick
10298eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_BA0, 0);
10308eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_BA1, 0);
10318eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_SIZE, 0);
10328eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ATTRIBUTES, 0);
10338eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIFO_THRESHOLD,
10348eda2d14Spatrick 0xc00040); /* XXX */
10358eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIFO_SIZE_STATUS,
10368eda2d14Spatrick 0);
10378eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ROW_INC, 1);
10388eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_PIXEL_INC, 1);
10398eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR, 0);
10408eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_PICTURE_SIZE, 0);
10418eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ACCU0, 0);
10428eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_ACCU1, 0);
10438eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H0, 0);
10448eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H1, 0);
10458eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H2, 0);
10468eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H3, 0);
10478eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H4, 0);
10488eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H5, 0);
10498eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H6, 0);
10508eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_H7, 0);
10518eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV0, 0);
10528eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV1, 0);
10538eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV2, 0);
10548eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV3, 0);
10558eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV4, 0);
10568eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV5, 0);
10578eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV6, 0);
10588eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_FIR_COEF_HV7, 0);
10598eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF0, 0);
10608eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF1, 0);
10618eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF2, 0);
10628eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF3, 0);
10638eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID1_CONV_COEF4, 0);
10648eda2d14Spatrick
10658eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_BA0, 0);
10668eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_BA1, 0);
10678eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_SIZE, 0);
10688eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ATTRIBUTES, 0);
10698eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIFO_THRESHOLD,
10708eda2d14Spatrick 0xc00040); /* XXX */
10718eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIFO_SIZE_STATUS,
10728eda2d14Spatrick 0);
10738eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ROW_INC, 1);
10748eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_PIXEL_INC, 1);
10758eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR, 0);
10768eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_PICTURE_SIZE, 0);
10778eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ACCU0, 0);
10788eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_ACCU1, 0);
10798eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H0, 0);
10808eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H1, 0);
10818eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H2, 0);
10828eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H3, 0);
10838eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H4, 0);
10848eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H5, 0);
10858eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H6, 0);
10868eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_H7, 0);
10878eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV0, 0);
10888eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV1, 0);
10898eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV2, 0);
10908eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV3, 0);
10918eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV4, 0);
10928eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV5, 0);
10938eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV6, 0);
10948eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_FIR_COEF_HV7, 0);
10958eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF0, 0);
10968eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF1, 0);
10978eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF2, 0);
10988eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF3, 0);
10998eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_VID2_CONV_COEF4, 0);
11008eda2d14Spatrick
11018eda2d14Spatrick omdisplay_start(sc);
11028eda2d14Spatrick }
11038eda2d14Spatrick
11048eda2d14Spatrick void
omdisplay_setup_rasops(struct omdisplay_softc * sc,struct rasops_info * rinfo)11058eda2d14Spatrick omdisplay_setup_rasops(struct omdisplay_softc *sc, struct rasops_info *rinfo)
11068eda2d14Spatrick {
11078eda2d14Spatrick struct omdisplay_wsscreen_descr *descr;
11088eda2d14Spatrick struct omdisplay_panel_data *geom;
11098eda2d14Spatrick
11108eda2d14Spatrick descr = &omdisplay_screen;
11118eda2d14Spatrick geom = sc->sc_geometry;
11128eda2d14Spatrick
11138eda2d14Spatrick rinfo->ri_flg = descr->flags;
11148eda2d14Spatrick rinfo->ri_depth = descr->depth;
11158eda2d14Spatrick rinfo->ri_width = geom->width;
11168eda2d14Spatrick rinfo->ri_height = geom->height;
11178eda2d14Spatrick rinfo->ri_stride = geom->linebytes;
11188eda2d14Spatrick
11198eda2d14Spatrick /* pixel position */
11208eda2d14Spatrick if (descr->depth == 16) {
11218eda2d14Spatrick rinfo->ri_rnum = 5;
11228eda2d14Spatrick rinfo->ri_rpos = 11;
11238eda2d14Spatrick rinfo->ri_gnum = 6;
11248eda2d14Spatrick rinfo->ri_gpos = 5;
11258eda2d14Spatrick rinfo->ri_bnum = 5;
11268eda2d14Spatrick rinfo->ri_bpos = 0;
11278eda2d14Spatrick }
11288eda2d14Spatrick
11298eda2d14Spatrick if (descr->c.nrows == 0) {
11308eda2d14Spatrick /* get rasops to compute screen size the first time */
11318eda2d14Spatrick rasops_init(rinfo, 100, 100);
11328eda2d14Spatrick } else {
11338eda2d14Spatrick if (descr->flags != 0) /* rotate */
11348eda2d14Spatrick rasops_init(rinfo, descr->c.ncols, descr->c.nrows);
11358eda2d14Spatrick else
11368eda2d14Spatrick rasops_init(rinfo, descr->c.nrows, descr->c.ncols);
11378eda2d14Spatrick }
11388eda2d14Spatrick
11398eda2d14Spatrick descr->c.nrows = rinfo->ri_rows;
11408eda2d14Spatrick descr->c.ncols = rinfo->ri_cols;
11418eda2d14Spatrick descr->c.capabilities = rinfo->ri_caps;
11428eda2d14Spatrick descr->c.textops = &rinfo->ri_ops;
11438eda2d14Spatrick
11448eda2d14Spatrick }
11458eda2d14Spatrick
11468eda2d14Spatrick
11478eda2d14Spatrick int
omdisplay_alloc_screen(void * v,const struct wsscreen_descr * _type,void ** cookiep,int * curxp,int * curyp,uint32_t * attrp)11488eda2d14Spatrick omdisplay_alloc_screen(void *v, const struct wsscreen_descr *_type,
1149e0c3e559Sjsg void **cookiep, int *curxp, int *curyp, uint32_t *attrp)
11508eda2d14Spatrick {
11518eda2d14Spatrick struct omdisplay_softc *sc = v;
11528eda2d14Spatrick struct omdisplay_screen *scr;
11538eda2d14Spatrick struct rasops_info *ri;
11548eda2d14Spatrick struct omdisplay_wsscreen_descr *type =
11558eda2d14Spatrick (struct omdisplay_wsscreen_descr *)_type;
11568eda2d14Spatrick int error;
11578eda2d14Spatrick
11588eda2d14Spatrick scr = malloc(sizeof *scr, M_DEVBUF, (cold ? M_NOWAIT : M_WAITOK));
11598eda2d14Spatrick if (scr == NULL)
11608eda2d14Spatrick return (ENOMEM);
11618eda2d14Spatrick
11628eda2d14Spatrick error = omdisplay_new_screen(sc, scr, type->depth);
11638eda2d14Spatrick if (error != 0) {
1164f8e6c425Stedu free(scr, M_DEVBUF, 0);
11658eda2d14Spatrick return (error);
11668eda2d14Spatrick }
11678eda2d14Spatrick
11688eda2d14Spatrick /*
11698eda2d14Spatrick * initialize raster operation for this screen.
11708eda2d14Spatrick */
11718eda2d14Spatrick ri = &scr->rinfo;
11728eda2d14Spatrick ri->ri_hw = (void *)scr;
11738eda2d14Spatrick ri->ri_bits = scr->buf_va;
11748eda2d14Spatrick omdisplay_setup_rasops(sc, ri);
11758eda2d14Spatrick
11768eda2d14Spatrick /* assumes 16 bpp */
1177fc223b23Sjsg ri->ri_ops.pack_attr(ri, 0, 0, 0, attrp);
11788eda2d14Spatrick
11798eda2d14Spatrick *cookiep = ri;
11808eda2d14Spatrick *curxp = 0;
11818eda2d14Spatrick *curyp = 0;
11828eda2d14Spatrick
11838eda2d14Spatrick return 0;
11848eda2d14Spatrick }
11858eda2d14Spatrick
11868eda2d14Spatrick /*
11878eda2d14Spatrick * Create and initialize a new screen buffer.
11888eda2d14Spatrick */
11898eda2d14Spatrick int
omdisplay_new_screen(struct omdisplay_softc * sc,struct omdisplay_screen * scr,int depth)11908eda2d14Spatrick omdisplay_new_screen(struct omdisplay_softc *sc,
11918eda2d14Spatrick struct omdisplay_screen *scr, int depth)
11928eda2d14Spatrick {
11938eda2d14Spatrick bus_space_tag_t iot;
11948eda2d14Spatrick bus_space_handle_t ioh;
11958eda2d14Spatrick bus_dma_tag_t dma_tag;
11968eda2d14Spatrick struct omdisplay_panel_data *geometry;
11978eda2d14Spatrick int width, height;
11988eda2d14Spatrick bus_size_t size;
11998eda2d14Spatrick int error, palette_size;
12008eda2d14Spatrick int busdma_flag = (cold ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK);
12018eda2d14Spatrick
12028eda2d14Spatrick if (sc != NULL) {
12038eda2d14Spatrick iot = sc->sc_iot;
12048eda2d14Spatrick ioh = sc->sc_dcioh;
12058eda2d14Spatrick dma_tag = sc->sc_dma_tag;
12068eda2d14Spatrick geometry = sc->sc_geometry;
12078eda2d14Spatrick } else {
12088eda2d14Spatrick /* We are creating the console screen. */
12098eda2d14Spatrick #if 0
12108eda2d14Spatrick iot = omdisplay_console.iot;
12118eda2d14Spatrick ioh = omdisplay_console.ioh;
12128eda2d14Spatrick dma_tag = omdisplay_console.dma_tag;
12138eda2d14Spatrick geometry = omdisplay_console.geometry;
12148eda2d14Spatrick #endif
12158eda2d14Spatrick }
12168eda2d14Spatrick
12178eda2d14Spatrick width = geometry->width;
12188eda2d14Spatrick height = geometry->height;
12198eda2d14Spatrick palette_size = 0;
12208eda2d14Spatrick
12218eda2d14Spatrick switch (depth) {
12228eda2d14Spatrick case 1:
12238eda2d14Spatrick case 2:
12248eda2d14Spatrick case 4:
12258eda2d14Spatrick case 8:
12268eda2d14Spatrick palette_size = (1 << depth) * sizeof (uint16_t);
12278eda2d14Spatrick /* FALLTHROUGH */
12288eda2d14Spatrick case 16:
12298eda2d14Spatrick case 24:
12308eda2d14Spatrick size = geometry->height * geometry->linebytes;
12318eda2d14Spatrick break;
12328eda2d14Spatrick default:
12338eda2d14Spatrick printf("%s: Unknown depth (%d)\n",
12348eda2d14Spatrick sc != NULL ? sc->sc_dev.dv_xname : "console", depth);
12358eda2d14Spatrick return (EINVAL);
12368eda2d14Spatrick }
12378eda2d14Spatrick
12388eda2d14Spatrick bzero(scr, sizeof *scr);
12398eda2d14Spatrick
12408eda2d14Spatrick scr->nsegs = 0;
12418eda2d14Spatrick scr->depth = depth;
12428eda2d14Spatrick scr->buf_size = size;
12438eda2d14Spatrick scr->buf_va = NULL;
12448eda2d14Spatrick size = roundup(size, 16);
12458eda2d14Spatrick #if 0
12468eda2d14Spatrick + 3 * sizeof (struct lcd_dma_descriptor)
12478eda2d14Spatrick + palette_size;
12488eda2d14Spatrick #endif
12498eda2d14Spatrick
12508eda2d14Spatrick error = bus_dmamem_alloc(dma_tag, size, 0x100000, 0,
12518eda2d14Spatrick scr->segs, 1, &(scr->nsegs), busdma_flag);
12528eda2d14Spatrick if (error != 0 || scr->nsegs != 1) {
12538eda2d14Spatrick /* XXX: Actually we can handle nsegs > 1 case by means
12548eda2d14Spatrick of multiple DMA descriptors for a panel. It would
12558eda2d14Spatrick make code here a bit hairy */
12568eda2d14Spatrick if (error == 0)
12578eda2d14Spatrick error = E2BIG;
12588eda2d14Spatrick goto bad;
12598eda2d14Spatrick }
12608eda2d14Spatrick
12618eda2d14Spatrick error = bus_dmamem_map(dma_tag, scr->segs, scr->nsegs,
12628eda2d14Spatrick size, (caddr_t *)&(scr->buf_va), busdma_flag | BUS_DMA_COHERENT);
12638eda2d14Spatrick if (error != 0)
12648eda2d14Spatrick goto bad;
12658eda2d14Spatrick
12668eda2d14Spatrick memset(scr->buf_va, 0, scr->buf_size);
12678eda2d14Spatrick bcopy(splash, scr->buf_va,
12688eda2d14Spatrick sizeof (splash) > scr->buf_size ? scr->buf_size : sizeof (splash));
12698eda2d14Spatrick
12708eda2d14Spatrick /* map memory for DMA */
12718eda2d14Spatrick if (bus_dmamap_create(dma_tag, 1024 * 1024 * 2, 1,
12728eda2d14Spatrick 1024 * 1024 * 2, 0, busdma_flag, &scr->dma))
12738eda2d14Spatrick goto bad;
12748eda2d14Spatrick error = bus_dmamap_load(dma_tag, scr->dma,
12758eda2d14Spatrick scr->buf_va, size, NULL, busdma_flag);
12768eda2d14Spatrick if (error != 0) {
12778eda2d14Spatrick goto bad;
12788eda2d14Spatrick }
12798eda2d14Spatrick
12808eda2d14Spatrick scr->map_size = size; /* used when unmap this. */
12818eda2d14Spatrick
12828eda2d14Spatrick if (sc != NULL) {
12838eda2d14Spatrick LIST_INSERT_HEAD(&(sc->sc_screens), scr, link);
12848eda2d14Spatrick sc->sc_nscreens++;
12858eda2d14Spatrick }
12868eda2d14Spatrick
12878eda2d14Spatrick omdisplay_initialize(sc, geometry);
12888eda2d14Spatrick
12898eda2d14Spatrick return (0);
12908eda2d14Spatrick
12918eda2d14Spatrick bad:
12928eda2d14Spatrick if (scr->buf_va)
12938eda2d14Spatrick bus_dmamem_unmap(dma_tag, scr->buf_va, size);
12948eda2d14Spatrick if (scr->nsegs)
12958eda2d14Spatrick bus_dmamem_free(dma_tag, scr->segs, scr->nsegs);
12968eda2d14Spatrick return (error);
12978eda2d14Spatrick }
12988eda2d14Spatrick paddr_t
omdisplay_mmap(void * v,off_t offset,int prot)12998eda2d14Spatrick omdisplay_mmap(void *v, off_t offset, int prot)
13008eda2d14Spatrick {
13018eda2d14Spatrick struct omdisplay_softc *sc = v;
13028eda2d14Spatrick struct omdisplay_screen *screen = sc->sc_active; /* ??? */
13038eda2d14Spatrick
13048eda2d14Spatrick if ((offset & PAGE_MASK) != 0)
13058eda2d14Spatrick return (-1);
13068eda2d14Spatrick
13078eda2d14Spatrick if (screen == NULL)
13088eda2d14Spatrick return (-1);
13098eda2d14Spatrick
13108eda2d14Spatrick if (offset < 0 ||
13118eda2d14Spatrick offset >= screen->rinfo.ri_stride * screen->rinfo.ri_height)
13128eda2d14Spatrick return (-1);
13138eda2d14Spatrick
13148eda2d14Spatrick return (bus_dmamem_mmap(sc->sc_dma_tag, screen->segs, screen->nsegs,
13158eda2d14Spatrick offset, prot, BUS_DMA_WAITOK | BUS_DMA_COHERENT));
13168eda2d14Spatrick }
13178eda2d14Spatrick
13188eda2d14Spatrick void
omdisplay_free_screen(void * v,void * cookie)13198eda2d14Spatrick omdisplay_free_screen(void *v, void *cookie)
13208eda2d14Spatrick {
13218eda2d14Spatrick struct omdisplay_softc *sc = v;
13228eda2d14Spatrick struct rasops_info *ri = cookie;
13238eda2d14Spatrick struct omdisplay_screen *scr = ri->ri_hw;
13248eda2d14Spatrick
13258eda2d14Spatrick LIST_REMOVE(scr, link);
13268eda2d14Spatrick sc->sc_nscreens--;
13278eda2d14Spatrick if (scr == sc->sc_active) {
13288eda2d14Spatrick /* at first, we need to stop LCD DMA */
13298eda2d14Spatrick sc->sc_active = NULL;
13308eda2d14Spatrick
13318eda2d14Spatrick #ifdef DEBUG
13328eda2d14Spatrick printf("lcd_free on active screen\n");
13338eda2d14Spatrick #endif
13348eda2d14Spatrick
13358eda2d14Spatrick omdisplay_stop(sc);
13368eda2d14Spatrick }
13378eda2d14Spatrick
13388eda2d14Spatrick if (scr->buf_va)
13398eda2d14Spatrick bus_dmamem_unmap(sc->sc_dma_tag, scr->buf_va, scr->map_size);
13408eda2d14Spatrick
13418eda2d14Spatrick if (scr->nsegs > 0)
13428eda2d14Spatrick bus_dmamem_free(sc->sc_dma_tag, scr->segs, scr->nsegs);
13438eda2d14Spatrick
1344f8e6c425Stedu free(scr, M_DEVBUF, 0);
13458eda2d14Spatrick }
13468eda2d14Spatrick
134783275742Smiod int
omdisplay_load_font(void * v,void * emulcookie,struct wsdisplay_font * font)134883275742Smiod omdisplay_load_font(void *v, void *emulcookie, struct wsdisplay_font *font)
134983275742Smiod {
135083275742Smiod struct omdisplay_softc *sc = v;
135183275742Smiod struct omdisplay_screen *scr = sc->sc_active;
135283275742Smiod
135383275742Smiod if (scr == NULL)
135483275742Smiod return ENXIO;
135583275742Smiod
135683275742Smiod return rasops_load_font(scr->rinfo, emulcookie, font);
135783275742Smiod }
135883275742Smiod
135983275742Smiod int
omdisplay_list_font(void * v,struct wsdisplay_font * font)136083275742Smiod omdisplay_list_font(void *v, struct wsdisplay_font *font)
136183275742Smiod {
136283275742Smiod struct omdisplay_softc *sc = v;
136383275742Smiod struct omdisplay_screen *scr = sc->sc_active;
136483275742Smiod
136583275742Smiod if (scr == NULL)
136683275742Smiod return ENXIO;
136783275742Smiod
136883275742Smiod return rasops_list_font(scr->rinfo, font);
136983275742Smiod }
137083275742Smiod
13718eda2d14Spatrick void
omdisplay_start(struct omdisplay_softc * sc)13728eda2d14Spatrick omdisplay_start(struct omdisplay_softc *sc)
13738eda2d14Spatrick {
13748eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL,
13758eda2d14Spatrick DISPC_CONTROL_GPOUT0 | DISPC_CONTROL_GPOUT1 |
13768eda2d14Spatrick DISPC_CONTROL_TFTDATALINES_18 /*XXX 18? */ |
13778eda2d14Spatrick DISPC_CONTROL_STNTFT |
13788eda2d14Spatrick DISPC_CONTROL_GOLCD |
13798eda2d14Spatrick DISPC_CONTROL_LCDENABLE);
13808eda2d14Spatrick }
13818eda2d14Spatrick
13828eda2d14Spatrick void
omdisplay_stop(struct omdisplay_softc * sc)13838eda2d14Spatrick omdisplay_stop(struct omdisplay_softc *sc)
13848eda2d14Spatrick {
13858eda2d14Spatrick bus_space_write_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL,
13868eda2d14Spatrick bus_space_read_4(sc->sc_iot, sc->sc_dcioh, DISPC_CONTROL) &
13878eda2d14Spatrick ~(DISPC_CONTROL_DIGITALENABLE|DISPC_CONTROL_LCDENABLE));
13888eda2d14Spatrick
13898eda2d14Spatrick /* XXX - wait for end of frame? */
13908eda2d14Spatrick }
13918eda2d14Spatrick
13928eda2d14Spatrick int
omdisplay_intr(void * v)13938eda2d14Spatrick omdisplay_intr(void *v)
13948eda2d14Spatrick {
13958eda2d14Spatrick /* XXX */
13968eda2d14Spatrick return 1;
13978eda2d14Spatrick }
13988eda2d14Spatrick
1399