xref: /netbsd-src/sys/dev/usb/auvitek_board.c (revision ce779416c505dd88fec3d719c9b0dae9d46220e6)
1*ce779416Sjmcneill /* $NetBSD: auvitek_board.c,v 1.3 2011/07/09 15:00:44 jmcneill Exp $ */
233ca440fSjmcneill 
333ca440fSjmcneill /*-
433ca440fSjmcneill  * Copyright (c) 2010 Jared D. McNeill <jmcneill@invisible.ca>
533ca440fSjmcneill  * All rights reserved.
633ca440fSjmcneill  *
733ca440fSjmcneill  * Redistribution and use in source and binary forms, with or without
833ca440fSjmcneill  * modification, are permitted provided that the following conditions
933ca440fSjmcneill  * are met:
1033ca440fSjmcneill  * 1. Redistributions of source code must retain the above copyright
1133ca440fSjmcneill  *    notice, this list of conditions and the following disclaimer.
1233ca440fSjmcneill  * 2. Redistributions in binary form must reproduce the above copyright
1333ca440fSjmcneill  *    notice, this list of conditions and the following disclaimer in the
1433ca440fSjmcneill  *    documentation and/or other materials provided with the distribution.
1533ca440fSjmcneill  *
1633ca440fSjmcneill  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
1733ca440fSjmcneill  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
1833ca440fSjmcneill  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1933ca440fSjmcneill  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2033ca440fSjmcneill  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2133ca440fSjmcneill  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2233ca440fSjmcneill  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2333ca440fSjmcneill  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2433ca440fSjmcneill  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2533ca440fSjmcneill  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2633ca440fSjmcneill  * POSSIBILITY OF SUCH DAMAGE.
2733ca440fSjmcneill  */
2833ca440fSjmcneill 
2933ca440fSjmcneill /*
3033ca440fSjmcneill  * Auvitek AU0828 USB controller - board specific initialization
3133ca440fSjmcneill  */
3233ca440fSjmcneill 
3333ca440fSjmcneill #include <sys/cdefs.h>
34*ce779416Sjmcneill __KERNEL_RCSID(0, "$NetBSD: auvitek_board.c,v 1.3 2011/07/09 15:00:44 jmcneill Exp $");
3533ca440fSjmcneill 
3633ca440fSjmcneill #include <sys/param.h>
3733ca440fSjmcneill #include <sys/systm.h>
3833ca440fSjmcneill #include <sys/device.h>
3933ca440fSjmcneill #include <sys/conf.h>
4033ca440fSjmcneill #include <sys/bus.h>
4133ca440fSjmcneill #include <sys/module.h>
4233ca440fSjmcneill 
4333ca440fSjmcneill #include <dev/usb/usb.h>
4433ca440fSjmcneill #include <dev/usb/usbdi.h>
4533ca440fSjmcneill #include <dev/usb/usbdi_util.h>
4633ca440fSjmcneill #include <dev/usb/usbdevs.h>
4733ca440fSjmcneill 
4833ca440fSjmcneill #include <dev/usb/auvitekreg.h>
4933ca440fSjmcneill #include <dev/usb/auvitekvar.h>
5033ca440fSjmcneill 
5133ca440fSjmcneill static const struct auvitek_board_config {
5233ca440fSjmcneill 	uint16_t	reset;
5333ca440fSjmcneill 	uint16_t	enable;
5433ca440fSjmcneill 	uint8_t		clkdiv;
5533ca440fSjmcneill } auvitek_board_config[] = {
560fa8fefbSjmcneill 	[AUVITEK_BOARD_HVR_850] = {
570fa8fefbSjmcneill 		.reset = 0x02b0,
580fa8fefbSjmcneill 		.enable = 0x02f0,
590fa8fefbSjmcneill 		.clkdiv = AU0828_I2C_CLKDIV_30,
600fa8fefbSjmcneill 	},
6133ca440fSjmcneill 	[AUVITEK_BOARD_HVR_950Q] = {
6233ca440fSjmcneill 		.reset = 0x02b0,
6333ca440fSjmcneill 		.enable = 0x02f0,
6433ca440fSjmcneill 		.clkdiv = AU0828_I2C_CLKDIV_30,
6533ca440fSjmcneill 	},
6633ca440fSjmcneill };
6733ca440fSjmcneill 
6833ca440fSjmcneill void
auvitek_board_init(struct auvitek_softc * sc)6933ca440fSjmcneill auvitek_board_init(struct auvitek_softc *sc)
7033ca440fSjmcneill {
7133ca440fSjmcneill 	uint16_t reset, enable;
7233ca440fSjmcneill 
7333ca440fSjmcneill 	/* power up device */
7433ca440fSjmcneill 	auvitek_write_1(sc, AU0828_REG_POWER_CTL, AU0828_POWER_EN);
7533ca440fSjmcneill 
7633ca440fSjmcneill 	reset = auvitek_board_config[sc->sc_board].reset;
7733ca440fSjmcneill 	enable = auvitek_board_config[sc->sc_board].enable;
7833ca440fSjmcneill 
7933ca440fSjmcneill 	/* stash i2c clock divider in softc */
8033ca440fSjmcneill 	sc->sc_i2c_clkdiv = auvitek_board_config[sc->sc_board].clkdiv;
8133ca440fSjmcneill 
8233ca440fSjmcneill 	/* configure gpio, if requested */
8333ca440fSjmcneill 	if (reset) {
8433ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_PINDIR, reset >> 8);
8533ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO1_PINDIR, reset & 0xff);
8633ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_OUTEN, 0);
8733ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO1_OUTEN, 0);
8833ca440fSjmcneill 		delay(100000);
8933ca440fSjmcneill 	}
9033ca440fSjmcneill 	if (enable) {
9133ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_PINDIR, enable >> 8);
9233ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO1_PINDIR, enable & 0xff);
9333ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_OUTEN, enable >> 8);
9433ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO1_OUTEN, enable & 0xff);
9533ca440fSjmcneill 		delay(250000);
9633ca440fSjmcneill 	}
9733ca440fSjmcneill }
9833ca440fSjmcneill 
9933ca440fSjmcneill int
auvitek_board_tuner_reset(void * priv)100*ce779416Sjmcneill auvitek_board_tuner_reset(void *priv)
10133ca440fSjmcneill {
102*ce779416Sjmcneill 	struct auvitek_softc *sc = priv;
10333ca440fSjmcneill 	uint8_t val;
10433ca440fSjmcneill 
10533ca440fSjmcneill 	switch (sc->sc_board) {
1060fa8fefbSjmcneill 	case AUVITEK_BOARD_HVR_850:
10733ca440fSjmcneill 	case AUVITEK_BOARD_HVR_950Q:
10833ca440fSjmcneill 		val = auvitek_read_1(sc, AU0828_REG_GPIO2_OUTEN);
10933ca440fSjmcneill 		val &= ~2;
11033ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_OUTEN, val);
11133ca440fSjmcneill 		delay(10000);
11233ca440fSjmcneill 		val = auvitek_read_1(sc, AU0828_REG_GPIO2_OUTEN);
11333ca440fSjmcneill 		val |= 2;
11433ca440fSjmcneill 		auvitek_write_1(sc, AU0828_REG_GPIO2_OUTEN, val);
11533ca440fSjmcneill 		delay(10000);
11633ca440fSjmcneill 		break;
11733ca440fSjmcneill 	}
11833ca440fSjmcneill 
11933ca440fSjmcneill 	return 0;
12033ca440fSjmcneill }
121*ce779416Sjmcneill 
122*ce779416Sjmcneill unsigned int
auvitek_board_get_if_frequency(struct auvitek_softc * sc)123*ce779416Sjmcneill auvitek_board_get_if_frequency(struct auvitek_softc *sc)
124*ce779416Sjmcneill {
125*ce779416Sjmcneill 	return 6000000;	/* 6MHz */
126*ce779416Sjmcneill }
127