/*-
* Copyright (c) 2006 Itronix Inc.
* All rights reserved.
*
* Written by Garrett D'Amore for Itronix Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of Itronix Inc. may not be used to endorse
* or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* ATI Technologies Inc. ("ATI") has not assisted in the creation of, and
* does not endorse, this software. ATI will not be responsible or liable
* for any actual or alleged damage or loss caused by or in connection with
* the use of or reliance on this software.
*/
/*
* I2C support
*/
int
radeonfb_i2c_acquire_bus(void *cookie, int flags)
{
struct radeonfb_i2c *ric = (struct radeonfb_i2c *)cookie;
struct radeonfb_softc *sc = ric->ric_softc;
int i;
/*
* Some hardware seems to have hardware/software combined access
* to the DVI I2C. We want to use software.
*/
if (ric->ric_register == RADEON_GPIO_DVI_DDC) {
/* ask for software access to I2C bus */
SET32(sc, ric->ric_register, RADEON_GPIO_SW_USE);
/*
* wait for the chip to give up access. we don't make
* this a hard timeout, because some hardware might
* not implement this negotiation protocol
*/
for (i = RADEON_TIMEOUT; i; i--) {
if (GET32(sc, ric->ric_register) & RADEON_GPIO_SW_USE)
break;
}
}
/* enable the I2C clock */
SET32(sc, ric->ric_register, RADEON_GPIO_EN_1);
if (ric->ric_register == RADEON_GPIO_DVI_DDC) {
/* we no longer "want" I2C, and we're "done" with it */
CLR32(sc, ric->ric_register, RADEON_GPIO_SW_USE);
SET32(sc, ric->ric_register, RADEON_GPIO_SW_DONE);
}
}
int
radeonfb_i2c_send_start(void *cookie, int flags)
{