Lines Matching refs:smbus

60 static inline void reg_write(struct pasemi_smbus *smbus, int reg, int val)  in reg_write()  argument
62 dev_dbg(&smbus->dev->dev, "smbus write reg %lx val %08x\n", in reg_write()
63 smbus->base + reg, val); in reg_write()
64 outl(val, smbus->base + reg); in reg_write()
67 static inline int reg_read(struct pasemi_smbus *smbus, int reg) in reg_read() argument
70 ret = inl(smbus->base + reg); in reg_read()
71 dev_dbg(&smbus->dev->dev, "smbus read reg %lx val %08x\n", in reg_read()
72 smbus->base + reg, ret); in reg_read()
76 #define TXFIFO_WR(smbus, reg) reg_write((smbus), REG_MTXFIFO, (reg)) argument
77 #define RXFIFO_RD(smbus) reg_read((smbus), REG_MRXFIFO) argument
79 static void pasemi_smb_clear(struct pasemi_smbus *smbus) in pasemi_smb_clear() argument
83 status = reg_read(smbus, REG_SMSTA); in pasemi_smb_clear()
84 reg_write(smbus, REG_SMSTA, status); in pasemi_smb_clear()
87 static int pasemi_smb_waitready(struct pasemi_smbus *smbus) in pasemi_smb_waitready() argument
92 status = reg_read(smbus, REG_SMSTA); in pasemi_smb_waitready()
96 status = reg_read(smbus, REG_SMSTA); in pasemi_smb_waitready()
104 dev_warn(&smbus->dev->dev, "Timeout, status 0x%08x\n", status); in pasemi_smb_waitready()
105 reg_write(smbus, REG_SMSTA, status); in pasemi_smb_waitready()
110 reg_write(smbus, REG_SMSTA, SMSTA_XEN); in pasemi_smb_waitready()
118 struct pasemi_smbus *smbus = adapter->algo_data; in pasemi_i2c_xfer_msg() local
124 TXFIFO_WR(smbus, MTXFIFO_START | (msg->addr << 1) | read); in pasemi_i2c_xfer_msg()
127 TXFIFO_WR(smbus, msg->len | MTXFIFO_READ | in pasemi_i2c_xfer_msg()
130 err = pasemi_smb_waitready(smbus); in pasemi_i2c_xfer_msg()
135 rd = RXFIFO_RD(smbus); in pasemi_i2c_xfer_msg()
144 TXFIFO_WR(smbus, msg->buf[i]); in pasemi_i2c_xfer_msg()
146 TXFIFO_WR(smbus, msg->buf[msg->len-1] | in pasemi_i2c_xfer_msg()
153 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR | in pasemi_i2c_xfer_msg()
161 struct pasemi_smbus *smbus = adapter->algo_data; in pasemi_i2c_xfer() local
164 pasemi_smb_clear(smbus); in pasemi_i2c_xfer()
178 struct pasemi_smbus *smbus = adapter->algo_data; in pasemi_smb_xfer() local
187 pasemi_smb_clear(smbus); in pasemi_smb_xfer()
191 TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START | in pasemi_smb_xfer()
195 TXFIFO_WR(smbus, addr | read_flag | MTXFIFO_START); in pasemi_smb_xfer()
197 TXFIFO_WR(smbus, 1 | MTXFIFO_STOP | MTXFIFO_READ); in pasemi_smb_xfer()
199 TXFIFO_WR(smbus, MTXFIFO_STOP | command); in pasemi_smb_xfer()
202 TXFIFO_WR(smbus, addr | MTXFIFO_START); in pasemi_smb_xfer()
203 TXFIFO_WR(smbus, command); in pasemi_smb_xfer()
205 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START); in pasemi_smb_xfer()
206 TXFIFO_WR(smbus, 1 | MTXFIFO_READ | MTXFIFO_STOP); in pasemi_smb_xfer()
208 TXFIFO_WR(smbus, MTXFIFO_STOP | data->byte); in pasemi_smb_xfer()
212 TXFIFO_WR(smbus, addr | MTXFIFO_START); in pasemi_smb_xfer()
213 TXFIFO_WR(smbus, command); in pasemi_smb_xfer()
215 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START); in pasemi_smb_xfer()
216 TXFIFO_WR(smbus, 2 | MTXFIFO_READ | MTXFIFO_STOP); in pasemi_smb_xfer()
218 TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M); in pasemi_smb_xfer()
219 TXFIFO_WR(smbus, MTXFIFO_STOP | (data->word >> 8)); in pasemi_smb_xfer()
223 TXFIFO_WR(smbus, addr | MTXFIFO_START); in pasemi_smb_xfer()
224 TXFIFO_WR(smbus, command); in pasemi_smb_xfer()
226 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START); in pasemi_smb_xfer()
227 TXFIFO_WR(smbus, 1 | MTXFIFO_READ); in pasemi_smb_xfer()
228 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
231 TXFIFO_WR(smbus, len | MTXFIFO_READ | in pasemi_smb_xfer()
235 TXFIFO_WR(smbus, len); in pasemi_smb_xfer()
237 TXFIFO_WR(smbus, data->block[i]); in pasemi_smb_xfer()
238 TXFIFO_WR(smbus, data->block[len] | MTXFIFO_STOP); in pasemi_smb_xfer()
243 TXFIFO_WR(smbus, addr | MTXFIFO_START); in pasemi_smb_xfer()
244 TXFIFO_WR(smbus, command); in pasemi_smb_xfer()
245 TXFIFO_WR(smbus, data->word & MTXFIFO_DATA_M); in pasemi_smb_xfer()
246 TXFIFO_WR(smbus, (data->word >> 8) & MTXFIFO_DATA_M); in pasemi_smb_xfer()
247 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ | MTXFIFO_START); in pasemi_smb_xfer()
248 TXFIFO_WR(smbus, 2 | MTXFIFO_STOP | MTXFIFO_READ); in pasemi_smb_xfer()
253 TXFIFO_WR(smbus, addr | MTXFIFO_START); in pasemi_smb_xfer()
254 TXFIFO_WR(smbus, command); in pasemi_smb_xfer()
255 TXFIFO_WR(smbus, len); in pasemi_smb_xfer()
257 TXFIFO_WR(smbus, data->block[i]); in pasemi_smb_xfer()
258 TXFIFO_WR(smbus, addr | I2C_SMBUS_READ); in pasemi_smb_xfer()
259 TXFIFO_WR(smbus, MTXFIFO_READ | 1); in pasemi_smb_xfer()
260 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
263 TXFIFO_WR(smbus, len | MTXFIFO_READ | MTXFIFO_STOP); in pasemi_smb_xfer()
271 err = pasemi_smb_waitready(smbus); in pasemi_smb_xfer()
281 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
290 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
296 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
307 rd = RXFIFO_RD(smbus); in pasemi_smb_xfer()
320 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR | in pasemi_smb_xfer()
342 struct pasemi_smbus *smbus; in pasemi_smb_probe() local
348 smbus = kzalloc(sizeof(struct pasemi_smbus), GFP_KERNEL); in pasemi_smb_probe()
349 if (!smbus) in pasemi_smb_probe()
352 smbus->dev = dev; in pasemi_smb_probe()
353 smbus->base = pci_resource_start(dev, 0); in pasemi_smb_probe()
354 smbus->size = pci_resource_len(dev, 0); in pasemi_smb_probe()
356 if (!request_region(smbus->base, smbus->size, in pasemi_smb_probe()
362 smbus->adapter.owner = THIS_MODULE; in pasemi_smb_probe()
363 snprintf(smbus->adapter.name, sizeof(smbus->adapter.name), in pasemi_smb_probe()
364 "PA Semi SMBus adapter at 0x%lx", smbus->base); in pasemi_smb_probe()
365 smbus->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD; in pasemi_smb_probe()
366 smbus->adapter.algo = &smbus_algorithm; in pasemi_smb_probe()
367 smbus->adapter.algo_data = smbus; in pasemi_smb_probe()
368 smbus->adapter.nr = PCI_FUNC(dev->devfn); in pasemi_smb_probe()
371 smbus->adapter.dev.parent = &dev->dev; in pasemi_smb_probe()
373 reg_write(smbus, REG_CTL, (CTL_MTR | CTL_MRR | in pasemi_smb_probe()
376 error = i2c_add_numbered_adapter(&smbus->adapter); in pasemi_smb_probe()
380 pci_set_drvdata(dev, smbus); in pasemi_smb_probe()
385 release_region(smbus->base, smbus->size); in pasemi_smb_probe()
387 kfree(smbus); in pasemi_smb_probe()
393 struct pasemi_smbus *smbus = pci_get_drvdata(dev); in pasemi_smb_remove() local
395 i2c_del_adapter(&smbus->adapter); in pasemi_smb_remove()
396 release_region(smbus->base, smbus->size); in pasemi_smb_remove()
397 kfree(smbus); in pasemi_smb_remove()