2929#include <linux/stddef.h>
3030#include <linux/ioport.h>
3131#include <linux/i2c.h>
32+ #include <linux/i2c-smbus.h>
3233#include <linux/slab.h>
3334#include <linux/dmi.h>
3435#include <linux/acpi.h>
3536#include <linux/io.h>
37+ #include <asm/amd/fch.h>
3638
37-
38- /* PIIX4 SMBus address offsets */
39- #define SMBHSTSTS (0 + piix4_smba)
40- #define SMBHSLVSTS (1 + piix4_smba)
41- #define SMBHSTCNT (2 + piix4_smba)
42- #define SMBHSTCMD (3 + piix4_smba)
43- #define SMBHSTADD (4 + piix4_smba)
44- #define SMBHSTDAT0 (5 + piix4_smba)
45- #define SMBHSTDAT1 (6 + piix4_smba)
46- #define SMBBLKDAT (7 + piix4_smba)
47- #define SMBSLVCNT (8 + piix4_smba)
48- #define SMBSHDWCMD (9 + piix4_smba)
49- #define SMBSLVEVT (0xA + piix4_smba)
50- #define SMBSLVDAT (0xC + piix4_smba)
39+ #include "i2c-piix4.h"
5140
5241/* count for request_region */
5342#define SMBIOSIZE 9
6958#define PIIX4_BYTE 0x04
7059#define PIIX4_BYTE_DATA 0x08
7160#define PIIX4_WORD_DATA 0x0C
72- #define PIIX4_BLOCK_DATA 0x14
7361
7462/* Multi-port constants */
7563#define PIIX4_MAX_ADAPTERS 4
9381#define SB800_PIIX4_PORT_IDX_MASK 0x06
9482#define SB800_PIIX4_PORT_IDX_SHIFT 1
9583
96- /* On kerncz and Hudson2, SmBus0Sel is at bit 20:19 of PMx00 DecodeEn */
97- #define SB800_PIIX4_PORT_IDX_KERNCZ 0x02
98- #define SB800_PIIX4_PORT_IDX_MASK_KERNCZ 0x18
84+ /* SmBus0Sel is at bit 20:19 of PMx00 DecodeEn */
85+ #define SB800_PIIX4_PORT_IDX_KERNCZ (FCH_PM_DECODEEN + 0x02)
86+ #define SB800_PIIX4_PORT_IDX_MASK_KERNCZ (FCH_PM_DECODEEN_SMBUS0SEL >> 16)
9987#define SB800_PIIX4_PORT_IDX_SHIFT_KERNCZ 3
10088
101- #define SB800_PIIX4_FCH_PM_ADDR 0xFED80300
10289#define SB800_PIIX4_FCH_PM_SIZE 8
10390
10491/* insmod parameters */
@@ -145,7 +132,7 @@ static const struct dmi_system_id piix4_dmi_ibm[] = {
145132 .ident = "IBM" ,
146133 .matches = { DMI_MATCH (DMI_SYS_VENDOR , "IBM" ), },
147134 },
148- { },
135+ { }
149136};
150137
151138/*
@@ -159,11 +146,6 @@ static const char *piix4_main_port_names_sb800[PIIX4_MAX_ADAPTERS] = {
159146};
160147static const char * piix4_aux_port_name_sb800 = " port 1" ;
161148
162- struct sb800_mmio_cfg {
163- void __iomem * addr ;
164- bool use_mmio ;
165- };
166-
167149struct i2c_piix4_adapdata {
168150 unsigned short smba ;
169151
@@ -174,25 +156,24 @@ struct i2c_piix4_adapdata {
174156 struct sb800_mmio_cfg mmio_cfg ;
175157};
176158
177- static int piix4_sb800_region_request (struct device * dev ,
178- struct sb800_mmio_cfg * mmio_cfg )
159+ int piix4_sb800_region_request (struct device * dev , struct sb800_mmio_cfg * mmio_cfg )
179160{
180161 if (mmio_cfg -> use_mmio ) {
181162 void __iomem * addr ;
182163
183- if (!request_mem_region_muxed (SB800_PIIX4_FCH_PM_ADDR ,
164+ if (!request_mem_region_muxed (FCH_PM_BASE ,
184165 SB800_PIIX4_FCH_PM_SIZE ,
185166 "sb800_piix4_smb" )) {
186167 dev_err (dev ,
187168 "SMBus base address memory region 0x%x already in use.\n" ,
188- SB800_PIIX4_FCH_PM_ADDR );
169+ FCH_PM_BASE );
189170 return - EBUSY ;
190171 }
191172
192- addr = ioremap (SB800_PIIX4_FCH_PM_ADDR ,
173+ addr = ioremap (FCH_PM_BASE ,
193174 SB800_PIIX4_FCH_PM_SIZE );
194175 if (!addr ) {
195- release_mem_region (SB800_PIIX4_FCH_PM_ADDR ,
176+ release_mem_region (FCH_PM_BASE ,
196177 SB800_PIIX4_FCH_PM_SIZE );
197178 dev_err (dev , "SMBus base address mapping failed.\n" );
198179 return - ENOMEM ;
@@ -213,19 +194,20 @@ static int piix4_sb800_region_request(struct device *dev,
213194
214195 return 0 ;
215196}
197+ EXPORT_SYMBOL_NS_GPL (piix4_sb800_region_request , PIIX4_SMBUS );
216198
217- static void piix4_sb800_region_release (struct device * dev ,
218- struct sb800_mmio_cfg * mmio_cfg )
199+ void piix4_sb800_region_release (struct device * dev , struct sb800_mmio_cfg * mmio_cfg )
219200{
220201 if (mmio_cfg -> use_mmio ) {
221202 iounmap (mmio_cfg -> addr );
222- release_mem_region (SB800_PIIX4_FCH_PM_ADDR ,
203+ release_mem_region (FCH_PM_BASE ,
223204 SB800_PIIX4_FCH_PM_SIZE );
224205 return ;
225206 }
226207
227208 release_region (SB800_PIIX4_SMB_IDX , SB800_PIIX4_SMB_MAP_SIZE );
228209}
210+ EXPORT_SYMBOL_NS_GPL (piix4_sb800_region_release , PIIX4_SMBUS );
229211
230212static bool piix4_sb800_use_mmio (struct pci_dev * PIIX4_dev )
231213{
@@ -535,10 +517,8 @@ static int piix4_setup_aux(struct pci_dev *PIIX4_dev,
535517 return piix4_smba ;
536518}
537519
538- static int piix4_transaction (struct i2c_adapter * piix4_adapter )
520+ int piix4_transaction (struct i2c_adapter * piix4_adapter , unsigned short piix4_smba )
539521{
540- struct i2c_piix4_adapdata * adapdata = i2c_get_adapdata (piix4_adapter );
541- unsigned short piix4_smba = adapdata -> smba ;
542522 int temp ;
543523 int result = 0 ;
544524 int timeout = 0 ;
@@ -589,7 +569,7 @@ static int piix4_transaction(struct i2c_adapter *piix4_adapter)
589569 result = - EIO ;
590570 dev_dbg (& piix4_adapter -> dev , "Bus collision! SMBus may be "
591571 "locked until next hard reset. (sorry!)\n" );
592- /* Clock stops and slave is stuck in mid-transmission */
572+ /* Clock stops and target is stuck in mid-transmission */
593573 }
594574
595575 if (temp & 0x04 ) {
@@ -610,6 +590,7 @@ static int piix4_transaction(struct i2c_adapter *piix4_adapter)
610590 inb_p (SMBHSTDAT1 ));
611591 return result ;
612592}
593+ EXPORT_SYMBOL_NS_GPL (piix4_transaction , PIIX4_SMBUS );
613594
614595/* Return negative errno on error. */
615596static s32 piix4_access (struct i2c_adapter * adap , u16 addr ,
@@ -674,7 +655,7 @@ static s32 piix4_access(struct i2c_adapter * adap, u16 addr,
674655
675656 outb_p ((size & 0x1C ) + (ENABLE_INT9 & 1 ), SMBHSTCNT );
676657
677- status = piix4_transaction (adap );
658+ status = piix4_transaction (adap , piix4_smba );
678659 if (status )
679660 return status ;
680661
@@ -763,7 +744,7 @@ static void piix4_imc_wakeup(void)
763744 release_region (KERNCZ_IMC_IDX , 2 );
764745}
765746
766- static int piix4_sb800_port_sel (u8 port , struct sb800_mmio_cfg * mmio_cfg )
747+ int piix4_sb800_port_sel (u8 port , struct sb800_mmio_cfg * mmio_cfg )
767748{
768749 u8 smba_en_lo , val ;
769750
@@ -785,6 +766,7 @@ static int piix4_sb800_port_sel(u8 port, struct sb800_mmio_cfg *mmio_cfg)
785766
786767 return (smba_en_lo & piix4_port_mask_sb800 );
787768}
769+ EXPORT_SYMBOL_NS_GPL (piix4_sb800_port_sel , PIIX4_SMBUS );
788770
789771/*
790772 * Handles access to multiple SMBus ports on the SB800.
@@ -982,6 +964,14 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,
982964 return retval ;
983965 }
984966
967+ /*
968+ * The AUX bus can not be probed as on some platforms it reports all
969+ * devices present and all reads return "0".
970+ * This would allow the ee1004 to be probed incorrectly.
971+ */
972+ if (port == 0 )
973+ i2c_register_spd (adap );
974+
985975 * padap = adap ;
986976 return 0 ;
987977}
@@ -1080,6 +1070,7 @@ static int piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
10801070 "" , & piix4_main_adapters [0 ]);
10811071 if (retval < 0 )
10821072 return retval ;
1073+ piix4_adapter_count = 1 ;
10831074 }
10841075
10851076 /* Check for auxiliary SMBus on some AMD chipsets */
0 commit comments