lubbock_pcic.c revision 1.5
11.5Srjs/* $NetBSD: lubbock_pcic.c,v 1.5 2009/05/29 14:15:44 rjs Exp $ */ 21.1Sbsh 31.1Sbsh/*- 41.1Sbsh * Copyright (c) 2001 The NetBSD Foundation, Inc. 51.1Sbsh * All rights reserved. 61.1Sbsh * 71.1Sbsh * This code is derived from software contributed to The NetBSD Foundation 81.1Sbsh * by IWAMOTO Toshihiro. 91.1Sbsh * 101.1Sbsh * Redistribution and use in source and binary forms, with or without 111.1Sbsh * modification, are permitted provided that the following conditions 121.1Sbsh * are met: 131.1Sbsh * 1. Redistributions of source code must retain the above copyright 141.1Sbsh * notice, this list of conditions and the following disclaimer. 151.1Sbsh * 2. Redistributions in binary form must reproduce the above copyright 161.1Sbsh * notice, this list of conditions and the following disclaimer in the 171.1Sbsh * documentation and/or other materials provided with the distribution. 181.1Sbsh * 191.1Sbsh * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 201.1Sbsh * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 211.1Sbsh * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221.1Sbsh * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 231.1Sbsh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 241.1Sbsh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 251.1Sbsh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 261.1Sbsh * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 271.1Sbsh * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 281.1Sbsh * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 291.1Sbsh * POSSIBILITY OF SUCH DAMAGE. 301.1Sbsh */ 311.1Sbsh 321.1Sbsh#include <sys/cdefs.h> 331.5Srjs__KERNEL_RCSID(0, "$NetBSD: lubbock_pcic.c,v 1.5 2009/05/29 14:15:44 rjs Exp $"); 341.1Sbsh 351.1Sbsh#include <sys/param.h> 361.1Sbsh#include <sys/systm.h> 371.1Sbsh#include <sys/types.h> 381.1Sbsh#include <sys/conf.h> 391.1Sbsh#include <sys/file.h> 401.1Sbsh#include <sys/device.h> 411.1Sbsh#include <sys/kernel.h> 421.1Sbsh#include <sys/kthread.h> 431.1Sbsh#include <sys/malloc.h> 441.1Sbsh 451.1Sbsh#include <machine/bus.h> 461.1Sbsh 471.1Sbsh#include <dev/pcmcia/pcmciachip.h> 481.1Sbsh#include <dev/pcmcia/pcmciavar.h> 491.1Sbsh#include <arm/sa11x0/sa11x0_reg.h> 501.1Sbsh#include <arm/sa11x0/sa11x0_var.h> 511.1Sbsh#include <arm/sa11x0/sa1111_reg.h> 521.1Sbsh#include <arm/sa11x0/sa1111_var.h> 531.1Sbsh#include <arm/sa11x0/sa11x1_pcicreg.h> 541.1Sbsh#include <arm/sa11x0/sa11xx_pcicvar.h> 551.1Sbsh#include <arm/sa11x0/sa11x1_pcicvar.h> 561.1Sbsh 571.1Sbsh#include <evbarm/lubbock/lubbock_reg.h> 581.1Sbsh#include <evbarm/lubbock/lubbock_var.h> 591.1Sbsh 601.5Srjsstatic int sacpcic_match(device_t, cfdata_t, void *); 611.5Srjsstatic void sacpcic_attach(device_t, device_t, void *); 621.1Sbshstatic void lubbock_set_power(struct sapcic_socket *so, int arg); 631.1Sbshstatic void lubbock_socket_setup(struct sapcic_socket *sp); 641.1Sbsh 651.1Sbshstatic struct sapcic_tag lubbock_sacpcic_functions = { 661.1Sbsh sacpcic_read, 671.1Sbsh sacpcic_write, 681.1Sbsh lubbock_set_power, 691.1Sbsh sacpcic_clear_intr, 701.1Sbsh sacpcic_intr_establish, 711.1Sbsh sacpcic_intr_disestablish 721.1Sbsh}; 731.1Sbsh 741.5SrjsCFATTACH_DECL_NEW(sacpcic, sizeof(struct sacpcic_softc), 751.1Sbsh sacpcic_match, sacpcic_attach, NULL, NULL); 761.1Sbsh 771.1Sbshstatic int 781.5Srjssacpcic_match(device_t parent, cfdata_t cf, void *aux) 791.1Sbsh{ 801.1Sbsh return (1); 811.1Sbsh} 821.1Sbsh 831.1Sbshstatic void 841.1Sbshlubbock_socket_setup(struct sapcic_socket *sp) 851.1Sbsh{ 861.1Sbsh sp->power_capability = SAPCIC_POWER_5V | SAPCIC_POWER_3V; 871.1Sbsh sp->pcictag = &lubbock_sacpcic_functions; 881.1Sbsh} 891.1Sbsh 901.1Sbshstatic void 911.5Srjssacpcic_attach(device_t parent, device_t self, void *aux) 921.1Sbsh{ 931.5Srjs sacpcic_attach_common(device_private(parent), 941.5Srjs device_private(self), aux, lubbock_socket_setup); 951.1Sbsh} 961.1Sbsh 971.1Sbsh 981.1Sbshstatic void 991.1Sbshlubbock_set_power(struct sapcic_socket *so, int arg) 1001.1Sbsh{ 1011.1Sbsh struct sacc_softc *sc = so->pcictag_cookie; 1021.5Srjs struct obio_softc *bsc = device_private(device_parent(sc->sc_dev)); 1031.1Sbsh int s; 1041.1Sbsh uint16_t tmp; 1051.1Sbsh 1061.1Sbsh static const uint8_t vval_socket0[] = { 1071.1Sbsh /* for socket0 (pcmcia) */ 1081.1Sbsh 0x00, /* OFF */ 1091.1Sbsh 0x08, /* 3.3V */ 1101.1Sbsh 0x05, /* 5V */ 1111.1Sbsh }; 1121.1Sbsh static const uint16_t vval_socket1[] = { 1131.1Sbsh /* for socket1 (CF) */ 1141.1Sbsh 0x0000, /* OFF */ 1151.1Sbsh 0x8000, /* 3.3V */ 1161.1Sbsh 0x4000, /* 5V */ 1171.1Sbsh }; 1181.1Sbsh 1191.1Sbsh if( arg < 0 || SAPCIC_POWER_5V < arg ) 1201.1Sbsh panic("sacpcic_set_power: bogus arg\n"); 1211.1Sbsh 1221.1Sbsh switch( so->socket ){ 1231.1Sbsh case 0: 1241.1Sbsh bus_space_write_4(sc->sc_iot, sc->sc_ioh, SACCGPIOA_DVR, 1251.1Sbsh vval_socket0[arg]); 1261.1Sbsh break; 1271.1Sbsh case 1: 1281.1Sbsh s = splhigh(); 1291.1Sbsh tmp = bus_space_read_2(bsc->sc_iot, bsc->sc_obioreg_ioh, 1301.1Sbsh LUBBOCK_MISCWR); 1311.1Sbsh bus_space_write_2(bsc->sc_iot, bsc->sc_obioreg_ioh, 1321.1Sbsh LUBBOCK_MISCWR, (tmp & 0x3fff) | vval_socket1[arg] ); 1331.1Sbsh splx(s); 1341.1Sbsh break; 1351.1Sbsh default: 1361.5Srjs aprint_normal("unknown socket number: %d\n", so->socket); 1371.1Sbsh } 1381.1Sbsh} 139