1
|
/*
|
2
|
* i2c.c
|
3
|
*
|
4
|
* Created on: Apr 20, 2010
|
5
|
* Author: Mike Williamson
|
6
|
*/
|
7
|
|
8
|
#include "common/fpga/fpga_i2c.h"
|
9
|
#include "common/fpga/core_ids.h"
|
10
|
#include "fpga.h"
|
11
|
|
12
|
#include <linux/kernel.h>
|
13
|
#include <linux/delay.h>
|
14
|
#include <linux/module.h>
|
15
|
#include <linux/slab.h>
|
16
|
#include <linux/device.h>
|
17
|
#include <linux/i2c.h>
|
18
|
|
19
|
MODULE_LICENSE("GPL");
|
20
|
MODULE_AUTHOR("Mike Williamson <michael.williamson@criticallink.com");
|
21
|
MODULE_DESCRIPTION("Driver for MityDSP-L138 FPGA Based I2C Interface");
|
22
|
|
23
|
/**
|
24
|
* this is the device driver specific parameters tied to each i2c device in the system
|
25
|
* (the object data)
|
26
|
*/
|
27
|
struct fpga_i2c {
|
28
|
struct i2c_adapter adapter;
|
29
|
};
|
30
|
|
31
|
/*
|
32
|
* Low level master read/write transaction. This function is called
|
33
|
* from i2c_xfer.
|
34
|
*
|
35
|
* \param[in] adap pointer to our adaptor device
|
36
|
* \param[in] msg message to send
|
37
|
* \param[in] stop true if this is the last message in a set
|
38
|
*
|
39
|
* \return number of bytes transmitted, or < 0 error condition
|
40
|
*/
|
41
|
static int
|
42
|
fpga_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop)
|
43
|
{
|
44
|
int i, slp_cnt;
|
45
|
tuI2cCSR CSR;
|
46
|
tuI2cSAR SAR;
|
47
|
unsigned short *lpBaseReg;
|
48
|
struct device *dev;
|
49
|
struct fpga_i2c *driver_data;
|
50
|
struct fpga_device* fpgadev;
|
51
|
|
52
|
dev = i2c_get_adapdata(adap);
|
53
|
fpgadev = to_fpga_device(dev);
|
54
|
driver_data = dev_get_drvdata(dev);
|
55
|
lpBaseReg = (unsigned short*)fpgadev->baseaddr;
|
56
|
|
57
|
dev_dbg(dev, "Msg Transfer - R/W = %d, len = %d\n", msg->flags & I2C_M_RD ? 1 : 0, msg->len);
|
58
|
|
59
|
/* Can't handle 10 bit addresses yet */
|
60
|
if (msg->flags & I2C_M_TEN)
|
61
|
{
|
62
|
dev_err(dev, "Msg Transfer 10 Bit Address Requested\n");
|
63
|
return -EIO;
|
64
|
}
|
65
|
|
66
|
if (msg->len > FPGA_I2C_FIFO_DEPTH)
|
67
|
{
|
68
|
dev_err(dev, "Msg Transfer Message Length too big, %d\n", msg->len);
|
69
|
return -EIO;
|
70
|
}
|
71
|
|
72
|
SAR.mnWord = 0;
|
73
|
SAR.msBits.mnSlaveAddr = msg->addr;
|
74
|
|
75
|
lpBaseReg[gnSAR_OFFSET] = SAR.mnWord;
|
76
|
|
77
|
lpBaseReg[gnCNT_OFFSET] = msg->len;
|
78
|
|
79
|
slp_cnt = 0;
|
80
|
|
81
|
/** TODO - if transfer length is > 32 we need to
|
82
|
* loop in multiples of 32 (without setting stop)
|
83
|
* until we're done...
|
84
|
*/
|
85
|
if (msg->flags & I2C_M_RD)
|
86
|
{
|
87
|
/* Handle Bus Read */
|
88
|
CSR.mnWord = 0;
|
89
|
CSR.msBits.mbFifoReset = 1;
|
90
|
lpBaseReg[gnCSR_OFFSET] = CSR.mnWord;
|
91
|
wmb();
|
92
|
|
93
|
CSR.mnWord = 0;
|
94
|
CSR.msBits.mb10Bit = 0;
|
95
|
CSR.msBits.mbRnW = 1;
|
96
|
CSR.msBits.mbStop = stop;
|
97
|
CSR.msBits.mbDone = 1;
|
98
|
CSR.msBits.mbGo = 1;
|
99
|
lpBaseReg[gnCSR_OFFSET] = CSR.mnWord;
|
100
|
wmb();
|
101
|
|
102
|
/* wait until done */
|
103
|
CSR.mnWord = lpBaseReg[gnCSR_OFFSET];
|
104
|
|
105
|
while (!CSR.msBits.mbDone) {
|
106
|
msleep(1);
|
107
|
rmb();
|
108
|
CSR.mnWord = lpBaseReg[gnCSR_OFFSET];
|
109
|
if (++slp_cnt > 250)
|
110
|
break;
|
111
|
};
|
112
|
|
113
|
if (slp_cnt > 250) {
|
114
|
dev_dbg(dev, "Timeout on write request\n");
|
115
|
return -EIO;
|
116
|
}
|
117
|
|
118
|
/* go fetch the data */
|
119
|
for (i = 0; i < msg->len; i++)
|
120
|
{
|
121
|
tuI2cFDR DataReg;
|
122
|
DataReg.mnWord = lpBaseReg[gnFDR_OFFSET];
|
123
|
msg->buf[i] = DataReg.msBits.mnData;
|
124
|
rmb();
|
125
|
}
|
126
|
|
127
|
}
|
128
|
else
|
129
|
{
|
130
|
/* clear the buffers */
|
131
|
dev_dbg(dev, "Loading buffer with %d bytes\n", msg->len);
|
132
|
|
133
|
CSR.mnWord = 0;
|
134
|
CSR.msBits.mbFifoReset = 1;
|
135
|
lpBaseReg[gnCSR_OFFSET] = CSR.mnWord;
|
136
|
wmb();
|
137
|
|
138
|
CSR.msBits.mbFifoReset = 0;
|
139
|
lpBaseReg[gnCSR_OFFSET] = CSR.mnWord;
|
140
|
wmb();
|
141
|
|
142
|
/* load the buffer */
|
143
|
for (i = 0; i < msg->len; i++)
|
144
|
{
|
145
|
tuI2cFDR DataReg;
|
146
|
DataReg.mnWord = 0;
|
147
|
DataReg.msBits.mnData = msg->buf[i];
|
148
|
lpBaseReg[gnFDR_OFFSET] = DataReg.mnWord;
|
149
|
wmb();
|
150
|
}
|
151
|
|
152
|
/* Handle Bus Write */
|
153
|
CSR.mnWord = 0;
|
154
|
CSR.msBits.mb10Bit = 0;
|
155
|
CSR.msBits.mbRnW = 0;
|
156
|
CSR.msBits.mbStop = stop;
|
157
|
CSR.msBits.mbDone = 1;
|
158
|
CSR.msBits.mbGo = 1;
|
159
|
lpBaseReg[gnCSR_OFFSET] = CSR.mnWord;
|
160
|
wmb();
|
161
|
|
162
|
/* wait until done */
|
163
|
CSR.mnWord = lpBaseReg[gnCSR_OFFSET];
|
164
|
|
165
|
while (!CSR.msBits.mbDone) {
|
166
|
msleep(1);
|
167
|
rmb();
|
168
|
CSR.mnWord = lpBaseReg[gnCSR_OFFSET];
|
169
|
if (++slp_cnt > 250)
|
170
|
break;
|
171
|
};
|
172
|
|
173
|
if (slp_cnt > 250) {
|
174
|
dev_dbg(dev, "Timeout on write request\n");
|
175
|
return -EIO;
|
176
|
}
|
177
|
}
|
178
|
|
179
|
/** check status for ack errors, etc. */
|
180
|
CSR.mnWord = lpBaseReg[gnCSR_OFFSET];
|
181
|
if (CSR.msBits.mbAckErr) {
|
182
|
dev_dbg(dev, "Ack Error\n");
|
183
|
return -EIO;
|
184
|
}
|
185
|
|
186
|
dev_dbg(dev, "transfer returning %d\n", msg->len);
|
187
|
return msg->len;
|
188
|
}
|
189
|
|
190
|
/*
|
191
|
* Prepare controller for a transaction and call i2c_davinci_xfer_msg
|
192
|
*
|
193
|
* \param[in] adap pointer to our adaptor device
|
194
|
* \param[in] msgs pointer to a list of messages to send
|
195
|
* \param[in] num number of messages to transfer
|
196
|
*/
|
197
|
static int
|
198
|
fpga_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
|
199
|
{
|
200
|
struct device *dev = i2c_get_adapdata(adap);
|
201
|
int i;
|
202
|
int ret;
|
203
|
|
204
|
dev_dbg(dev, "%s: msgs: %d\n", __func__, num);
|
205
|
|
206
|
/*
|
207
|
ret = i2c_wait_bus_not_busy(dev, 1);
|
208
|
if (ret < 0) {
|
209
|
dev_warn(dev->dev, "timeout waiting for bus ready\n");
|
210
|
return ret;
|
211
|
}
|
212
|
*/
|
213
|
|
214
|
for (i = 0; i < num; i++) {
|
215
|
ret = fpga_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1)));
|
216
|
dev_dbg(dev, "%s [%d/%d] ret: %d\n", __func__, i + 1, num, ret);
|
217
|
if (ret < 0)
|
218
|
{
|
219
|
dev_dbg(dev, "Failed to transfer message : %d\n", ret);
|
220
|
return ret;
|
221
|
}
|
222
|
}
|
223
|
|
224
|
return num;
|
225
|
}
|
226
|
|
227
|
static u32 fpga_i2c_func(struct i2c_adapter *adap)
|
228
|
{
|
229
|
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
230
|
}
|
231
|
|
232
|
static struct i2c_algorithm i2c_algo = {
|
233
|
.master_xfer = fpga_i2c_xfer,
|
234
|
.functionality = fpga_i2c_func,
|
235
|
};
|
236
|
|
237
|
static struct attribute *fpga_i2c_attributes[] = {
|
238
|
/* &dev_attr_pen_down.attr, */
|
239
|
NULL,
|
240
|
};
|
241
|
|
242
|
static struct attribute_group fpga_i2c_attr_group = {
|
243
|
.attrs = fpga_i2c_attributes,
|
244
|
};
|
245
|
|
246
|
/**
|
247
|
* IRQ handler called when an ADS7843 core is asserting an interrupt
|
248
|
* condition. This method is called within the context of an ISR, and
|
249
|
* must be atomic.
|
250
|
*
|
251
|
* \param[in] dev the device issuing the interrupt.
|
252
|
* \return 0
|
253
|
*/
|
254
|
static int fpga_i2c_IrqHandler(struct fpga_device* dev)
|
255
|
{
|
256
|
struct i2c *driver_data;
|
257
|
unsigned short *lpBaseReg;
|
258
|
|
259
|
driver_data = dev_get_drvdata(&dev->dev);
|
260
|
lpBaseReg = (unsigned short*)dev->baseaddr;
|
261
|
|
262
|
/* TODO - interrupts not yet designed into core */
|
263
|
|
264
|
return 0;
|
265
|
}
|
266
|
|
267
|
/**
|
268
|
* This routine is called when a device is removed from the FPGA bus.
|
269
|
*
|
270
|
* \param[in] dev pointer to the device being removed.
|
271
|
*/
|
272
|
static int fpga_i2c_remove(struct device *dev)
|
273
|
{
|
274
|
int rv = 0;
|
275
|
struct fpga_i2c *driver_data;
|
276
|
struct fpga_device* fpgadev = to_fpga_device(dev);
|
277
|
driver_data = dev_get_drvdata(dev);
|
278
|
|
279
|
dev_dbg(dev, "i2c_remove entered\n");
|
280
|
|
281
|
i2c_del_adapter(&driver_data->adapter);
|
282
|
|
283
|
sysfs_remove_group(&dev->kobj, &fpga_i2c_attr_group);
|
284
|
|
285
|
/* make sure IRQ is disabled */
|
286
|
enable_irq_vec(fpgadev->coreversion.ver0.bits.level,
|
287
|
fpgadev->coreversion.ver0.bits.vector,
|
288
|
0);
|
289
|
|
290
|
kfree(driver_data);
|
291
|
|
292
|
dev_dbg(dev, "i2c_remove completed\n");
|
293
|
return rv;
|
294
|
}
|
295
|
|
296
|
static int fpga_i2c_probe(struct device *dev);
|
297
|
|
298
|
/**
|
299
|
* The driver object. The information here must be common for
|
300
|
* all of the potential drivers in the system.
|
301
|
*/
|
302
|
static struct fpga_driver fpga_i2c_driver = {
|
303
|
.id = CORE_ID_I2C, /** must match value in core_ids.h */
|
304
|
.version = "I2C Driver 1.0",
|
305
|
.IrqHandler = fpga_i2c_IrqHandler,
|
306
|
.probe = fpga_i2c_probe,
|
307
|
.remove = fpga_i2c_remove,
|
308
|
.driver = {
|
309
|
.name = "fpga_i2c",
|
310
|
.owner = THIS_MODULE,
|
311
|
},
|
312
|
};
|
313
|
|
314
|
int adapter_number = 2;
|
315
|
module_param (adapter_number, int, S_IRUSR | S_IRGRP | S_IROTH);
|
316
|
MODULE_PARM_DESC (adapter_number, "The base adaptor number for "
|
317
|
"new I2C busses (default 2)");
|
318
|
|
319
|
/**
|
320
|
* The i2c_probe routine is called after the i2c driver is successfully
|
321
|
* matched to an FPGA core with the same core ID.
|
322
|
*
|
323
|
* \param[in] dev device within an fpga_device structure.
|
324
|
* return 0 on successful probe / initialization.
|
325
|
*/
|
326
|
static int fpga_i2c_probe(struct device *dev)
|
327
|
{
|
328
|
int rv = 0;
|
329
|
struct i2c_adapter* adap;
|
330
|
struct fpga_i2c *driver_data = NULL;
|
331
|
unsigned short *lpBaseReg = NULL;
|
332
|
|
333
|
struct fpga_device* fpgadev = to_fpga_device(dev);
|
334
|
|
335
|
lpBaseReg = (unsigned short*)fpgadev->baseaddr;
|
336
|
|
337
|
dev_dbg(dev, "i2c_probe() entered\n");
|
338
|
|
339
|
driver_data = kzalloc(sizeof(struct fpga_i2c), GFP_KERNEL);
|
340
|
if (!driver_data)
|
341
|
{
|
342
|
rv = -ENOMEM;
|
343
|
goto probe_bail;
|
344
|
}
|
345
|
|
346
|
rv = sysfs_create_group(&dev->kobj, &fpga_i2c_attr_group);
|
347
|
if (rv)
|
348
|
{
|
349
|
dev_err(dev, "i2c_probe() failed to add attributes group - %d\n", rv);
|
350
|
goto probe_bail_free_driver;
|
351
|
}
|
352
|
|
353
|
dev_set_drvdata(dev, driver_data);
|
354
|
|
355
|
adap = &driver_data->adapter;
|
356
|
i2c_set_adapdata(adap, dev);
|
357
|
adap->owner = THIS_MODULE;
|
358
|
adap->class = I2C_CLASS_HWMON;
|
359
|
strlcpy(adap->name, "MityDSP FPGA I2C adapter", sizeof(adap->name));
|
360
|
adap->algo = &i2c_algo;
|
361
|
adap->dev.parent = dev;
|
362
|
adap->timeout = FPGA_I2C_TIMEOUT;
|
363
|
|
364
|
adap->nr = adapter_number++;
|
365
|
rv = i2c_add_numbered_adapter(adap);
|
366
|
if (rv) {
|
367
|
dev_err(dev, "failure adding adapter\n");
|
368
|
goto probe_bail_free_adapt;
|
369
|
}
|
370
|
|
371
|
/* Set the frequency */
|
372
|
lpBaseReg[gnDIV_OFFSET] = 0xFF; /* TODO! */
|
373
|
wmb();
|
374
|
|
375
|
enable_irq_vec(fpgadev->coreversion.ver0.bits.level,
|
376
|
fpgadev->coreversion.ver0.bits.vector,
|
377
|
1);
|
378
|
|
379
|
return rv;
|
380
|
|
381
|
probe_bail_free_adapt:
|
382
|
|
383
|
|
384
|
probe_bail_free_driver:
|
385
|
kfree(driver_data);
|
386
|
|
387
|
probe_bail:
|
388
|
return rv;
|
389
|
}
|
390
|
|
391
|
/**
|
392
|
* Called when the module containing this driver is loaded.
|
393
|
*/
|
394
|
static int __init fpga_i2c_init(void)
|
395
|
{
|
396
|
int ret;
|
397
|
|
398
|
ret = register_fpga_driver(&fpga_i2c_driver);
|
399
|
if (ret)
|
400
|
{
|
401
|
printk(KERN_ALERT "Unable to register i2c_driver\n");
|
402
|
goto exit_bail;
|
403
|
}
|
404
|
|
405
|
return 0;
|
406
|
|
407
|
exit_bail: /* Uh-Oh */
|
408
|
return -1;
|
409
|
}
|
410
|
|
411
|
/**
|
412
|
* Called when the module containing this driver is unloaded from kernel.
|
413
|
*/
|
414
|
static void fpga_i2c_exit(void)
|
415
|
{
|
416
|
driver_unregister(&fpga_i2c_driver.driver);
|
417
|
}
|
418
|
|
419
|
module_init(fpga_i2c_init);
|
420
|
module_exit(fpga_i2c_exit);
|
421
|
|
422
|
|