Lines Matching refs:smbus
52 static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)
54 dev_dbg(&smbus->dev->dev, "smbus write reg %lx val %08x\n",
55 smbus->base + reg, val);
56 outl(val, smbus->base + reg);
59 static inline int reg_read(struct pasemi_smbus *smbus, int reg)
62 ret = inl(smbus->base + reg);
63 dev_dbg(&smbus->dev->dev, "smbus read reg %lx val %08x\n",
64 smbus->base + reg, ret);
68 #define TXFIFO_WR(smbus, reg) reg_write((smbus), REG_MTXFIFO, (reg))
69 #define RXFIFO_RD(smbus) reg_read((smbus), REG_MRXFIFO)
71 static void pasemi_smb_clear(struct pasemi_smbus *smbus)
75 status = reg_read(smbus, REG_SMSTA);
76 reg_write(smbus, REG_SMSTA, status);
79 static int pasemi_smb_waitready(struct pasemi_smbus *smbus)
84 status = reg_read(smbus, REG_SMSTA);
88 status = reg_read(smbus, REG_SMSTA);
96 dev_warn(&smbus->dev->dev, "Timeout, status 0x%08x\n", status);
97 reg_write(smbus, REG_SMSTA, status);
102 reg_write(smbus, REG_SMSTA, SMSTA_XEN);
110 struct pasemi_smbus *smbus = adapter->algo_data;
116 TXFIFO_WR(smbus, MTXFIFO_START | i2c_8bit_addr_from_msg(msg));
119 TXFIFO_WR(smbus, msg->len | MTXFIFO_READ |
122 err = pasemi_smb_waitready(smbus);
127 rd = RXFIFO_RD(smbus);
136 TXFIFO_WR(smbus, msg->buf[i]);
138 TXFIFO_WR(smbus, msg->buf[msg->len-1] |
142 err = pasemi_smb_waitready(smbus);
151 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
159 struct pasemi_smbus *smbus = adapter->algo_data;
162 pasemi_smb_clear(smbus);
176 struct pasemi_smbus *smbus = adapter->algo_data;
185 pasemi_smb_clear(smbus);
189 TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START |
193 TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START);
195 TXFIFO_WR(smbus, 1 | MTXFIFO_STOP | MTXFIFO_READ);
197 TXFIFO_WR(smbus, MTXFIFO_STOP | command);
200 TXFIFO_WR(smbus, addr | MTXFIFO_START);
201 TXFIFO_WR(smbus, command);
203 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
204 TXFIFO_WR(smbus, 1 | MTXFIFO_READ | MTXFIFO_STOP);
206 TXFIFO_WR(smbus, MTXFIFO_STOP | data->byte);
210 TXFIFO_WR(smbus, addr | MTXFIFO_START);
211 TXFIFO_WR(smbus, command);
213 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
214 TXFIFO_WR(smbus, 2 | MTXFIFO_READ | MTXFIFO_STOP);
216 TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M);
217 TXFIFO_WR(smbus, MTXFIFO_STOP | (data->word >> 8));
221 TXFIFO_WR(smbus, addr | MTXFIFO_START);
222 TXFIFO_WR(smbus, command);
224 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
225 TXFIFO_WR(smbus, 1 | MTXFIFO_READ);
226 rd = RXFIFO_RD(smbus);
229 TXFIFO_WR(smbus, len | MTXFIFO_READ |
233 TXFIFO_WR(smbus, len);
235 TXFIFO_WR(smbus, data->block[i]);
236 TXFIFO_WR(smbus, data->block[len] | MTXFIFO_STOP);
241 TXFIFO_WR(smbus, addr | MTXFIFO_START);
242 TXFIFO_WR(smbus, command);
243 TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M);
244 TXFIFO_WR(smbus, (data->word >> 8) & MTXFIFO_DATA_M);
245 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START);
246 TXFIFO_WR(smbus, 2 | MTXFIFO_STOP | MTXFIFO_READ);
251 TXFIFO_WR(smbus, addr | MTXFIFO_START);
252 TXFIFO_WR(smbus, command);
253 TXFIFO_WR(smbus, len);
255 TXFIFO_WR(smbus, data->block[i]);
256 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ);
257 TXFIFO_WR(smbus, MTXFIFO_READ | 1);
258 rd = RXFIFO_RD(smbus);
261 TXFIFO_WR(smbus, len | MTXFIFO_READ | MTXFIFO_STOP);
269 err = pasemi_smb_waitready(smbus);
279 rd = RXFIFO_RD(smbus);
288 rd = RXFIFO_RD(smbus);
294 rd = RXFIFO_RD(smbus);
305 rd = RXFIFO_RD(smbus);
318 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
340 struct pasemi_smbus *smbus;
346 smbus = kzalloc(sizeof(struct pasemi_smbus), GFP_KERNEL);
347 if (!smbus)
350 smbus->dev = dev;
351 smbus->base = pci_resource_start(dev, 0);
352 smbus->size = pci_resource_len(dev, 0);
354 if (!request_region(smbus->base, smbus->size,
360 smbus->adapter.owner = THIS_MODULE;
361 snprintf(smbus->adapter.name, sizeof(smbus->adapter.name),
362 "PA Semi SMBus adapter at 0x%lx", smbus->base);
363 smbus->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
364 smbus->adapter.algo = &smbus_algorithm;
365 smbus->adapter.algo_data = smbus;
368 smbus->adapter.dev.parent = &dev->dev;
370 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR |
373 error = i2c_add_adapter(&smbus->adapter);
377 pci_set_drvdata(dev, smbus);
382 release_region(smbus->base, smbus->size);
384 kfree(smbus);
390 struct pasemi_smbus *smbus = pci_get_drvdata(dev);
392 i2c_del_adapter(&smbus->adapter);
393 release_region(smbus->base, smbus->size);
394 kfree(smbus);