1/*- 2 * Copyright (c) 2001 Alcove - Nicolas Souchu 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/pci/viapm.c 162234 2006-09-11 20:52:41Z jhb $"); |
29 30#include "opt_isa.h" 31 32#include <sys/param.h> 33#include <sys/kernel.h> 34#include <sys/systm.h> 35#include <sys/module.h> 36#include <sys/bus.h> --- 598 unchanged lines hidden (view full) --- 635static int 636viasmb_quick(device_t dev, u_char slave, int how) 637{ 638 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 639 int error; 640 641 viapm_clear(viapm); 642 if (viapm_busy(viapm)) |
643 return (SMB_EBUSY); |
644 645 switch (how) { 646 case SMB_QWRITE: 647 VIAPM_DEBUG(printf("viapm: QWRITE to 0x%x", slave)); 648 VIAPM_OUTB(SMBHADDR, slave & ~LSB); 649 break; 650 case SMB_QREAD: 651 VIAPM_DEBUG(printf("viapm: QREAD to 0x%x", slave)); --- 13 unchanged lines hidden (view full) --- 665static int 666viasmb_sendb(device_t dev, u_char slave, char byte) 667{ 668 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 669 int error; 670 671 viapm_clear(viapm); 672 if (viapm_busy(viapm)) |
673 return (SMB_EBUSY); |
674 675 VIAPM_OUTB(SMBHADDR, slave & ~ LSB); 676 VIAPM_OUTB(SMBHCMD, byte); 677 678 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_SENDRECV); 679 680 error = viapm_wait(viapm); 681 --- 5 unchanged lines hidden (view full) --- 687static int 688viasmb_recvb(device_t dev, u_char slave, char *byte) 689{ 690 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 691 int error; 692 693 viapm_clear(viapm); 694 if (viapm_busy(viapm)) |
695 return (SMB_EBUSY); |
696 697 VIAPM_OUTB(SMBHADDR, slave | LSB); 698 699 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_SENDRECV); 700 701 if ((error = viapm_wait(viapm)) == SMB_ENOERR) 702 *byte = VIAPM_INB(SMBHDATA0); 703 --- 5 unchanged lines hidden (view full) --- 709static int 710viasmb_writeb(device_t dev, u_char slave, char cmd, char byte) 711{ 712 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 713 int error; 714 715 viapm_clear(viapm); 716 if (viapm_busy(viapm)) |
717 return (SMB_EBUSY); |
718 719 VIAPM_OUTB(SMBHADDR, slave & ~ LSB); 720 VIAPM_OUTB(SMBHCMD, cmd); 721 VIAPM_OUTB(SMBHDATA0, byte); 722 723 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BYTE); 724 725 error = viapm_wait(viapm); --- 6 unchanged lines hidden (view full) --- 732static int 733viasmb_readb(device_t dev, u_char slave, char cmd, char *byte) 734{ 735 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 736 int error; 737 738 viapm_clear(viapm); 739 if (viapm_busy(viapm)) |
740 return (SMB_EBUSY); |
741 742 VIAPM_OUTB(SMBHADDR, slave | LSB); 743 VIAPM_OUTB(SMBHCMD, cmd); 744 745 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BYTE); 746 747 if ((error = viapm_wait(viapm)) == SMB_ENOERR) 748 *byte = VIAPM_INB(SMBHDATA0); --- 6 unchanged lines hidden (view full) --- 755static int 756viasmb_writew(device_t dev, u_char slave, char cmd, short word) 757{ 758 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 759 int error; 760 761 viapm_clear(viapm); 762 if (viapm_busy(viapm)) |
763 return (SMB_EBUSY); |
764 765 VIAPM_OUTB(SMBHADDR, slave & ~ LSB); 766 VIAPM_OUTB(SMBHCMD, cmd); 767 VIAPM_OUTB(SMBHDATA0, word & 0x00ff); 768 VIAPM_OUTB(SMBHDATA1, (word & 0xff00) >> 8); 769 770 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_WORD); 771 --- 8 unchanged lines hidden (view full) --- 780viasmb_readw(device_t dev, u_char slave, char cmd, short *word) 781{ 782 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); 783 int error; 784 u_char high, low; 785 786 viapm_clear(viapm); 787 if (viapm_busy(viapm)) |
788 return (SMB_EBUSY); |
789 790 VIAPM_OUTB(SMBHADDR, slave | LSB); 791 VIAPM_OUTB(SMBHCMD, cmd); 792 793 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_WORD); 794 795 if ((error = viapm_wait(viapm)) == SMB_ENOERR) { 796 low = VIAPM_INB(SMBHDATA0); --- 6 unchanged lines hidden (view full) --- 803 804 return (error); 805} 806 807static int 808viasmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf) 809{ 810 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); |
811 u_char i; 812 int error; |
813 |
814 if (count < 1 || count > 32) 815 return (SMB_EINVAL); 816 |
817 viapm_clear(viapm); 818 if (viapm_busy(viapm)) |
819 return (SMB_EBUSY); |
820 |
821 VIAPM_OUTB(SMBHADDR, slave & ~LSB); 822 VIAPM_OUTB(SMBHCMD, cmd); 823 VIAPM_OUTB(SMBHDATA0, count); 824 i = VIAPM_INB(SMBHCTRL); |
825 |
826 /* fill the 32-byte internal buffer */ 827 for (i = 0; i < count; i++) { 828 VIAPM_OUTB(SMBHBLOCK, buf[i]); 829 DELAY(2); |
830 } |
831 VIAPM_OUTB(SMBHCMD, cmd); 832 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK); |
833 |
834 error = viapm_wait(viapm); 835 |
836 VIAPM_DEBUG(printf("viapm: WRITEBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, count, cmd, error)); 837 838 return (error); 839 840} 841 842static int |
843viasmb_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf) |
844{ 845 struct viapm_softc *viapm = (struct viapm_softc *)device_get_softc(dev); |
846 u_char data, len, i; 847 int error; |
848 |
849 if (*count < 1 || *count > 32) 850 return (SMB_EINVAL); 851 |
852 viapm_clear(viapm); 853 if (viapm_busy(viapm)) |
854 return (SMB_EBUSY); |
855 |
856 VIAPM_OUTB(SMBHADDR, slave | LSB); 857 VIAPM_OUTB(SMBHCMD, cmd); 858 VIAPM_OUTB(SMBHCTRL, SMBHCTRL_START | SMBHCTRL_BLOCK); |
859 |
860 if ((error = viapm_wait(viapm)) != SMB_ENOERR) 861 goto error; |
862 |
863 len = VIAPM_INB(SMBHDATA0); 864 i = VIAPM_INB(SMBHCTRL); /* reset counter */ |
865 |
866 /* read the 32-byte internal buffer */ 867 for (i = 0; i < len; i++) { 868 data = VIAPM_INB(SMBHBLOCK); 869 if (i < *count) 870 buf[i] = data; 871 DELAY(2); |
872 } |
873 *count = len; 874 |
875error: |
876 VIAPM_DEBUG(printf("viapm: READBLK to 0x%x, count=0x%x, cmd=0x%x, error=0x%x", slave, *count, cmd, error)); |
877 878 return (error); 879} 880 881static device_method_t viapm_methods[] = { 882 /* device interface */ 883 DEVMETHOD(device_probe, viapm_586b_probe), 884 DEVMETHOD(device_attach, viapm_586b_attach), --- 58 unchanged lines hidden (view full) --- 943static driver_t viapropm_driver = { 944 "viapropm", 945 viapropm_methods, 946 sizeof(struct viapm_softc), 947}; 948 949DRIVER_MODULE(viapm, pci, viapm_driver, viapm_devclass, 0, 0); 950DRIVER_MODULE(viapropm, pci, viapropm_driver, viapropm_devclass, 0, 0); |
951DRIVER_MODULE(smbus, viapropm, smbus_driver, smbus_devclass, 0, 0); |
952 953MODULE_DEPEND(viapm, pci, 1, 1, 1); 954MODULE_DEPEND(viapropm, pci, 1, 1, 1); 955MODULE_DEPEND(viapm, iicbb, IICBB_MINVER, IICBB_PREFVER, IICBB_MAXVER); 956MODULE_DEPEND(viapropm, smbus, SMBUS_MINVER, SMBUS_PREFVER, SMBUS_MAXVER); 957MODULE_VERSION(viapm, 1); 958 959#ifdef DEV_ISA 960DRIVER_MODULE(isa, viapm, isa_driver, isa_devclass, 0, 0); 961DRIVER_MODULE(isa, viapropm, isa_driver, isa_devclass, 0, 0); 962MODULE_DEPEND(viapm, isa, 1, 1, 1); 963MODULE_DEPEND(viapropm, isa, 1, 1, 1); 964#endif |