1/*
2 * Copyright 2010 Haiku, Inc.  All rights reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Gerald Zajac
7 */
8
9#include "accelerant.h"
10#include "3dfx.h"
11
12#include <string.h>
13#include <ddc.h>
14#include <edid.h>
15
16
17
18static status_t
19GetI2CSignals(void* cookie, int* _clock, int* data)
20{
21	(void)cookie;		// avoid compiler warning for unused arg
22
23	uint32 reg = INREG32(VIDEO_SERIAL_PARALLEL_PORT);
24	*_clock = (reg & VSP_SCL0_IN) ? 1 : 0;;
25	*data = (reg & VSP_SDA0_IN) ? 1 : 0;
26	return B_OK;
27}
28
29
30static status_t
31SetI2CSignals(void* cookie, int _clock, int data)
32{
33	(void)cookie;		// avoid compiler warning for unused arg
34
35	uint32 reg = (INREG32(VIDEO_SERIAL_PARALLEL_PORT)
36		& ~(VSP_SDA0_OUT | VSP_SCL0_OUT));
37	reg = (reg | (_clock ? VSP_SCL0_OUT : 0) | (data ? VSP_SDA0_OUT : 0));
38	OUTREG32(VIDEO_SERIAL_PARALLEL_PORT, reg);
39	return B_OK;
40}
41
42
43
44bool
45TDFX_GetEdidInfo(edid1_info& edidInfo)
46{
47	// Get the EDID info and return true if successful.
48
49	i2c_bus bus;
50
51	bus.cookie = (void*)NULL;
52	bus.set_signals = &SetI2CSignals;
53	bus.get_signals = &GetI2CSignals;
54	ddc2_init_timing(&bus);
55
56	uint32 reg = INREG32(VIDEO_SERIAL_PARALLEL_PORT);
57	OUTREG32(VIDEO_SERIAL_PARALLEL_PORT, reg | VSP_ENABLE_IIC0);
58
59	bool bResult = (ddc2_read_edid1(&bus, &edidInfo, NULL, NULL) == B_OK);
60
61	OUTREG32(VIDEO_SERIAL_PARALLEL_PORT, reg);
62
63	return bResult;
64}
65