Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/i2c/busses/i2c-mv64xxx.c
15111 views
1
/*
2
* Driver for the i2c controller on the Marvell line of host bridges
3
* (e.g, gt642[46]0, mv643[46]0, mv644[46]0, and Orion SoC family).
4
*
5
* Author: Mark A. Greer <[email protected]>
6
*
7
* 2005 (c) MontaVista, Software, Inc. This file is licensed under
8
* the terms of the GNU General Public License version 2. This program
9
* is licensed "as is" without any warranty of any kind, whether express
10
* or implied.
11
*/
12
#include <linux/kernel.h>
13
#include <linux/slab.h>
14
#include <linux/module.h>
15
#include <linux/spinlock.h>
16
#include <linux/i2c.h>
17
#include <linux/interrupt.h>
18
#include <linux/mv643xx_i2c.h>
19
#include <linux/platform_device.h>
20
#include <linux/io.h>
21
22
/* Register defines */
23
#define MV64XXX_I2C_REG_SLAVE_ADDR 0x00
24
#define MV64XXX_I2C_REG_DATA 0x04
25
#define MV64XXX_I2C_REG_CONTROL 0x08
26
#define MV64XXX_I2C_REG_STATUS 0x0c
27
#define MV64XXX_I2C_REG_BAUD 0x0c
28
#define MV64XXX_I2C_REG_EXT_SLAVE_ADDR 0x10
29
#define MV64XXX_I2C_REG_SOFT_RESET 0x1c
30
31
#define MV64XXX_I2C_REG_CONTROL_ACK 0x00000004
32
#define MV64XXX_I2C_REG_CONTROL_IFLG 0x00000008
33
#define MV64XXX_I2C_REG_CONTROL_STOP 0x00000010
34
#define MV64XXX_I2C_REG_CONTROL_START 0x00000020
35
#define MV64XXX_I2C_REG_CONTROL_TWSIEN 0x00000040
36
#define MV64XXX_I2C_REG_CONTROL_INTEN 0x00000080
37
38
/* Ctlr status values */
39
#define MV64XXX_I2C_STATUS_BUS_ERR 0x00
40
#define MV64XXX_I2C_STATUS_MAST_START 0x08
41
#define MV64XXX_I2C_STATUS_MAST_REPEAT_START 0x10
42
#define MV64XXX_I2C_STATUS_MAST_WR_ADDR_ACK 0x18
43
#define MV64XXX_I2C_STATUS_MAST_WR_ADDR_NO_ACK 0x20
44
#define MV64XXX_I2C_STATUS_MAST_WR_ACK 0x28
45
#define MV64XXX_I2C_STATUS_MAST_WR_NO_ACK 0x30
46
#define MV64XXX_I2C_STATUS_MAST_LOST_ARB 0x38
47
#define MV64XXX_I2C_STATUS_MAST_RD_ADDR_ACK 0x40
48
#define MV64XXX_I2C_STATUS_MAST_RD_ADDR_NO_ACK 0x48
49
#define MV64XXX_I2C_STATUS_MAST_RD_DATA_ACK 0x50
50
#define MV64XXX_I2C_STATUS_MAST_RD_DATA_NO_ACK 0x58
51
#define MV64XXX_I2C_STATUS_MAST_WR_ADDR_2_ACK 0xd0
52
#define MV64XXX_I2C_STATUS_MAST_WR_ADDR_2_NO_ACK 0xd8
53
#define MV64XXX_I2C_STATUS_MAST_RD_ADDR_2_ACK 0xe0
54
#define MV64XXX_I2C_STATUS_MAST_RD_ADDR_2_NO_ACK 0xe8
55
#define MV64XXX_I2C_STATUS_NO_STATUS 0xf8
56
57
/* Driver states */
58
enum {
59
MV64XXX_I2C_STATE_INVALID,
60
MV64XXX_I2C_STATE_IDLE,
61
MV64XXX_I2C_STATE_WAITING_FOR_START_COND,
62
MV64XXX_I2C_STATE_WAITING_FOR_RESTART,
63
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK,
64
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK,
65
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK,
66
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA,
67
};
68
69
/* Driver actions */
70
enum {
71
MV64XXX_I2C_ACTION_INVALID,
72
MV64XXX_I2C_ACTION_CONTINUE,
73
MV64XXX_I2C_ACTION_SEND_START,
74
MV64XXX_I2C_ACTION_SEND_RESTART,
75
MV64XXX_I2C_ACTION_SEND_ADDR_1,
76
MV64XXX_I2C_ACTION_SEND_ADDR_2,
77
MV64XXX_I2C_ACTION_SEND_DATA,
78
MV64XXX_I2C_ACTION_RCV_DATA,
79
MV64XXX_I2C_ACTION_RCV_DATA_STOP,
80
MV64XXX_I2C_ACTION_SEND_STOP,
81
};
82
83
struct mv64xxx_i2c_data {
84
int irq;
85
u32 state;
86
u32 action;
87
u32 aborting;
88
u32 cntl_bits;
89
void __iomem *reg_base;
90
u32 reg_base_p;
91
u32 reg_size;
92
u32 addr1;
93
u32 addr2;
94
u32 bytes_left;
95
u32 byte_posn;
96
u32 send_stop;
97
u32 block;
98
int rc;
99
u32 freq_m;
100
u32 freq_n;
101
wait_queue_head_t waitq;
102
spinlock_t lock;
103
struct i2c_msg *msg;
104
struct i2c_adapter adapter;
105
};
106
107
/*
108
*****************************************************************************
109
*
110
* Finite State Machine & Interrupt Routines
111
*
112
*****************************************************************************
113
*/
114
115
/* Reset hardware and initialize FSM */
116
static void
117
mv64xxx_i2c_hw_init(struct mv64xxx_i2c_data *drv_data)
118
{
119
writel(0, drv_data->reg_base + MV64XXX_I2C_REG_SOFT_RESET);
120
writel((((drv_data->freq_m & 0xf) << 3) | (drv_data->freq_n & 0x7)),
121
drv_data->reg_base + MV64XXX_I2C_REG_BAUD);
122
writel(0, drv_data->reg_base + MV64XXX_I2C_REG_SLAVE_ADDR);
123
writel(0, drv_data->reg_base + MV64XXX_I2C_REG_EXT_SLAVE_ADDR);
124
writel(MV64XXX_I2C_REG_CONTROL_TWSIEN | MV64XXX_I2C_REG_CONTROL_STOP,
125
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
126
drv_data->state = MV64XXX_I2C_STATE_IDLE;
127
}
128
129
static void
130
mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status)
131
{
132
/*
133
* If state is idle, then this is likely the remnants of an old
134
* operation that driver has given up on or the user has killed.
135
* If so, issue the stop condition and go to idle.
136
*/
137
if (drv_data->state == MV64XXX_I2C_STATE_IDLE) {
138
drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
139
return;
140
}
141
142
/* The status from the ctlr [mostly] tells us what to do next */
143
switch (status) {
144
/* Start condition interrupt */
145
case MV64XXX_I2C_STATUS_MAST_START: /* 0x08 */
146
case MV64XXX_I2C_STATUS_MAST_REPEAT_START: /* 0x10 */
147
drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_1;
148
drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK;
149
break;
150
151
/* Performing a write */
152
case MV64XXX_I2C_STATUS_MAST_WR_ADDR_ACK: /* 0x18 */
153
if (drv_data->msg->flags & I2C_M_TEN) {
154
drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_2;
155
drv_data->state =
156
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK;
157
break;
158
}
159
/* FALLTHRU */
160
case MV64XXX_I2C_STATUS_MAST_WR_ADDR_2_ACK: /* 0xd0 */
161
case MV64XXX_I2C_STATUS_MAST_WR_ACK: /* 0x28 */
162
if ((drv_data->bytes_left == 0)
163
|| (drv_data->aborting
164
&& (drv_data->byte_posn != 0))) {
165
if (drv_data->send_stop) {
166
drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
167
drv_data->state = MV64XXX_I2C_STATE_IDLE;
168
} else {
169
drv_data->action =
170
MV64XXX_I2C_ACTION_SEND_RESTART;
171
drv_data->state =
172
MV64XXX_I2C_STATE_WAITING_FOR_RESTART;
173
}
174
} else {
175
drv_data->action = MV64XXX_I2C_ACTION_SEND_DATA;
176
drv_data->state =
177
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK;
178
drv_data->bytes_left--;
179
}
180
break;
181
182
/* Performing a read */
183
case MV64XXX_I2C_STATUS_MAST_RD_ADDR_ACK: /* 40 */
184
if (drv_data->msg->flags & I2C_M_TEN) {
185
drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_2;
186
drv_data->state =
187
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_2_ACK;
188
break;
189
}
190
/* FALLTHRU */
191
case MV64XXX_I2C_STATUS_MAST_RD_ADDR_2_ACK: /* 0xe0 */
192
if (drv_data->bytes_left == 0) {
193
drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
194
drv_data->state = MV64XXX_I2C_STATE_IDLE;
195
break;
196
}
197
/* FALLTHRU */
198
case MV64XXX_I2C_STATUS_MAST_RD_DATA_ACK: /* 0x50 */
199
if (status != MV64XXX_I2C_STATUS_MAST_RD_DATA_ACK)
200
drv_data->action = MV64XXX_I2C_ACTION_CONTINUE;
201
else {
202
drv_data->action = MV64XXX_I2C_ACTION_RCV_DATA;
203
drv_data->bytes_left--;
204
}
205
drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA;
206
207
if ((drv_data->bytes_left == 1) || drv_data->aborting)
208
drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_ACK;
209
break;
210
211
case MV64XXX_I2C_STATUS_MAST_RD_DATA_NO_ACK: /* 0x58 */
212
drv_data->action = MV64XXX_I2C_ACTION_RCV_DATA_STOP;
213
drv_data->state = MV64XXX_I2C_STATE_IDLE;
214
break;
215
216
case MV64XXX_I2C_STATUS_MAST_WR_ADDR_NO_ACK: /* 0x20 */
217
case MV64XXX_I2C_STATUS_MAST_WR_NO_ACK: /* 30 */
218
case MV64XXX_I2C_STATUS_MAST_RD_ADDR_NO_ACK: /* 48 */
219
/* Doesn't seem to be a device at other end */
220
drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
221
drv_data->state = MV64XXX_I2C_STATE_IDLE;
222
drv_data->rc = -ENODEV;
223
break;
224
225
default:
226
dev_err(&drv_data->adapter.dev,
227
"mv64xxx_i2c_fsm: Ctlr Error -- state: 0x%x, "
228
"status: 0x%x, addr: 0x%x, flags: 0x%x\n",
229
drv_data->state, status, drv_data->msg->addr,
230
drv_data->msg->flags);
231
drv_data->action = MV64XXX_I2C_ACTION_SEND_STOP;
232
mv64xxx_i2c_hw_init(drv_data);
233
drv_data->rc = -EIO;
234
}
235
}
236
237
static void
238
mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data)
239
{
240
switch(drv_data->action) {
241
case MV64XXX_I2C_ACTION_SEND_RESTART:
242
drv_data->cntl_bits |= MV64XXX_I2C_REG_CONTROL_START;
243
drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_INTEN;
244
writel(drv_data->cntl_bits,
245
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
246
drv_data->block = 0;
247
wake_up_interruptible(&drv_data->waitq);
248
break;
249
250
case MV64XXX_I2C_ACTION_CONTINUE:
251
writel(drv_data->cntl_bits,
252
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
253
break;
254
255
case MV64XXX_I2C_ACTION_SEND_START:
256
writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START,
257
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
258
break;
259
260
case MV64XXX_I2C_ACTION_SEND_ADDR_1:
261
writel(drv_data->addr1,
262
drv_data->reg_base + MV64XXX_I2C_REG_DATA);
263
writel(drv_data->cntl_bits,
264
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
265
break;
266
267
case MV64XXX_I2C_ACTION_SEND_ADDR_2:
268
writel(drv_data->addr2,
269
drv_data->reg_base + MV64XXX_I2C_REG_DATA);
270
writel(drv_data->cntl_bits,
271
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
272
break;
273
274
case MV64XXX_I2C_ACTION_SEND_DATA:
275
writel(drv_data->msg->buf[drv_data->byte_posn++],
276
drv_data->reg_base + MV64XXX_I2C_REG_DATA);
277
writel(drv_data->cntl_bits,
278
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
279
break;
280
281
case MV64XXX_I2C_ACTION_RCV_DATA:
282
drv_data->msg->buf[drv_data->byte_posn++] =
283
readl(drv_data->reg_base + MV64XXX_I2C_REG_DATA);
284
writel(drv_data->cntl_bits,
285
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
286
break;
287
288
case MV64XXX_I2C_ACTION_RCV_DATA_STOP:
289
drv_data->msg->buf[drv_data->byte_posn++] =
290
readl(drv_data->reg_base + MV64XXX_I2C_REG_DATA);
291
drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_INTEN;
292
writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,
293
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
294
drv_data->block = 0;
295
wake_up_interruptible(&drv_data->waitq);
296
break;
297
298
case MV64XXX_I2C_ACTION_INVALID:
299
default:
300
dev_err(&drv_data->adapter.dev,
301
"mv64xxx_i2c_do_action: Invalid action: %d\n",
302
drv_data->action);
303
drv_data->rc = -EIO;
304
/* FALLTHRU */
305
case MV64XXX_I2C_ACTION_SEND_STOP:
306
drv_data->cntl_bits &= ~MV64XXX_I2C_REG_CONTROL_INTEN;
307
writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_STOP,
308
drv_data->reg_base + MV64XXX_I2C_REG_CONTROL);
309
drv_data->block = 0;
310
wake_up_interruptible(&drv_data->waitq);
311
break;
312
}
313
}
314
315
static irqreturn_t
316
mv64xxx_i2c_intr(int irq, void *dev_id)
317
{
318
struct mv64xxx_i2c_data *drv_data = dev_id;
319
unsigned long flags;
320
u32 status;
321
irqreturn_t rc = IRQ_NONE;
322
323
spin_lock_irqsave(&drv_data->lock, flags);
324
while (readl(drv_data->reg_base + MV64XXX_I2C_REG_CONTROL) &
325
MV64XXX_I2C_REG_CONTROL_IFLG) {
326
status = readl(drv_data->reg_base + MV64XXX_I2C_REG_STATUS);
327
mv64xxx_i2c_fsm(drv_data, status);
328
mv64xxx_i2c_do_action(drv_data);
329
rc = IRQ_HANDLED;
330
}
331
spin_unlock_irqrestore(&drv_data->lock, flags);
332
333
return rc;
334
}
335
336
/*
337
*****************************************************************************
338
*
339
* I2C Msg Execution Routines
340
*
341
*****************************************************************************
342
*/
343
static void
344
mv64xxx_i2c_prepare_for_io(struct mv64xxx_i2c_data *drv_data,
345
struct i2c_msg *msg)
346
{
347
u32 dir = 0;
348
349
drv_data->msg = msg;
350
drv_data->byte_posn = 0;
351
drv_data->bytes_left = msg->len;
352
drv_data->aborting = 0;
353
drv_data->rc = 0;
354
drv_data->cntl_bits = MV64XXX_I2C_REG_CONTROL_ACK |
355
MV64XXX_I2C_REG_CONTROL_INTEN | MV64XXX_I2C_REG_CONTROL_TWSIEN;
356
357
if (msg->flags & I2C_M_RD)
358
dir = 1;
359
360
if (msg->flags & I2C_M_TEN) {
361
drv_data->addr1 = 0xf0 | (((u32)msg->addr & 0x300) >> 7) | dir;
362
drv_data->addr2 = (u32)msg->addr & 0xff;
363
} else {
364
drv_data->addr1 = ((u32)msg->addr & 0x7f) << 1 | dir;
365
drv_data->addr2 = 0;
366
}
367
}
368
369
static void
370
mv64xxx_i2c_wait_for_completion(struct mv64xxx_i2c_data *drv_data)
371
{
372
long time_left;
373
unsigned long flags;
374
char abort = 0;
375
376
time_left = wait_event_interruptible_timeout(drv_data->waitq,
377
!drv_data->block, drv_data->adapter.timeout);
378
379
spin_lock_irqsave(&drv_data->lock, flags);
380
if (!time_left) { /* Timed out */
381
drv_data->rc = -ETIMEDOUT;
382
abort = 1;
383
} else if (time_left < 0) { /* Interrupted/Error */
384
drv_data->rc = time_left; /* errno value */
385
abort = 1;
386
}
387
388
if (abort && drv_data->block) {
389
drv_data->aborting = 1;
390
spin_unlock_irqrestore(&drv_data->lock, flags);
391
392
time_left = wait_event_timeout(drv_data->waitq,
393
!drv_data->block, drv_data->adapter.timeout);
394
395
if ((time_left <= 0) && drv_data->block) {
396
drv_data->state = MV64XXX_I2C_STATE_IDLE;
397
dev_err(&drv_data->adapter.dev,
398
"mv64xxx: I2C bus locked, block: %d, "
399
"time_left: %d\n", drv_data->block,
400
(int)time_left);
401
mv64xxx_i2c_hw_init(drv_data);
402
}
403
} else
404
spin_unlock_irqrestore(&drv_data->lock, flags);
405
}
406
407
static int
408
mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg,
409
int is_first, int is_last)
410
{
411
unsigned long flags;
412
413
spin_lock_irqsave(&drv_data->lock, flags);
414
mv64xxx_i2c_prepare_for_io(drv_data, msg);
415
416
if (unlikely(msg->flags & I2C_M_NOSTART)) { /* Skip start/addr phases */
417
if (drv_data->msg->flags & I2C_M_RD) {
418
/* No action to do, wait for slave to send a byte */
419
drv_data->action = MV64XXX_I2C_ACTION_CONTINUE;
420
drv_data->state =
421
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_DATA;
422
} else {
423
drv_data->action = MV64XXX_I2C_ACTION_SEND_DATA;
424
drv_data->state =
425
MV64XXX_I2C_STATE_WAITING_FOR_SLAVE_ACK;
426
drv_data->bytes_left--;
427
}
428
} else {
429
if (is_first) {
430
drv_data->action = MV64XXX_I2C_ACTION_SEND_START;
431
drv_data->state =
432
MV64XXX_I2C_STATE_WAITING_FOR_START_COND;
433
} else {
434
drv_data->action = MV64XXX_I2C_ACTION_SEND_ADDR_1;
435
drv_data->state =
436
MV64XXX_I2C_STATE_WAITING_FOR_ADDR_1_ACK;
437
}
438
}
439
440
drv_data->send_stop = is_last;
441
drv_data->block = 1;
442
mv64xxx_i2c_do_action(drv_data);
443
spin_unlock_irqrestore(&drv_data->lock, flags);
444
445
mv64xxx_i2c_wait_for_completion(drv_data);
446
return drv_data->rc;
447
}
448
449
/*
450
*****************************************************************************
451
*
452
* I2C Core Support Routines (Interface to higher level I2C code)
453
*
454
*****************************************************************************
455
*/
456
static u32
457
mv64xxx_i2c_functionality(struct i2c_adapter *adap)
458
{
459
return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR | I2C_FUNC_SMBUS_EMUL;
460
}
461
462
static int
463
mv64xxx_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
464
{
465
struct mv64xxx_i2c_data *drv_data = i2c_get_adapdata(adap);
466
int i, rc;
467
468
for (i = 0; i < num; i++) {
469
rc = mv64xxx_i2c_execute_msg(drv_data, &msgs[i],
470
i == 0, i + 1 == num);
471
if (rc < 0)
472
return rc;
473
}
474
475
return num;
476
}
477
478
static const struct i2c_algorithm mv64xxx_i2c_algo = {
479
.master_xfer = mv64xxx_i2c_xfer,
480
.functionality = mv64xxx_i2c_functionality,
481
};
482
483
/*
484
*****************************************************************************
485
*
486
* Driver Interface & Early Init Routines
487
*
488
*****************************************************************************
489
*/
490
static int __devinit
491
mv64xxx_i2c_map_regs(struct platform_device *pd,
492
struct mv64xxx_i2c_data *drv_data)
493
{
494
int size;
495
struct resource *r = platform_get_resource(pd, IORESOURCE_MEM, 0);
496
497
if (!r)
498
return -ENODEV;
499
500
size = resource_size(r);
501
502
if (!request_mem_region(r->start, size, drv_data->adapter.name))
503
return -EBUSY;
504
505
drv_data->reg_base = ioremap(r->start, size);
506
drv_data->reg_base_p = r->start;
507
drv_data->reg_size = size;
508
509
return 0;
510
}
511
512
static void
513
mv64xxx_i2c_unmap_regs(struct mv64xxx_i2c_data *drv_data)
514
{
515
if (drv_data->reg_base) {
516
iounmap(drv_data->reg_base);
517
release_mem_region(drv_data->reg_base_p, drv_data->reg_size);
518
}
519
520
drv_data->reg_base = NULL;
521
drv_data->reg_base_p = 0;
522
}
523
524
static int __devinit
525
mv64xxx_i2c_probe(struct platform_device *pd)
526
{
527
struct mv64xxx_i2c_data *drv_data;
528
struct mv64xxx_i2c_pdata *pdata = pd->dev.platform_data;
529
int rc;
530
531
if ((pd->id != 0) || !pdata)
532
return -ENODEV;
533
534
drv_data = kzalloc(sizeof(struct mv64xxx_i2c_data), GFP_KERNEL);
535
if (!drv_data)
536
return -ENOMEM;
537
538
if (mv64xxx_i2c_map_regs(pd, drv_data)) {
539
rc = -ENODEV;
540
goto exit_kfree;
541
}
542
543
strlcpy(drv_data->adapter.name, MV64XXX_I2C_CTLR_NAME " adapter",
544
sizeof(drv_data->adapter.name));
545
546
init_waitqueue_head(&drv_data->waitq);
547
spin_lock_init(&drv_data->lock);
548
549
drv_data->freq_m = pdata->freq_m;
550
drv_data->freq_n = pdata->freq_n;
551
drv_data->irq = platform_get_irq(pd, 0);
552
if (drv_data->irq < 0) {
553
rc = -ENXIO;
554
goto exit_unmap_regs;
555
}
556
drv_data->adapter.dev.parent = &pd->dev;
557
drv_data->adapter.algo = &mv64xxx_i2c_algo;
558
drv_data->adapter.owner = THIS_MODULE;
559
drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
560
drv_data->adapter.timeout = msecs_to_jiffies(pdata->timeout);
561
drv_data->adapter.nr = pd->id;
562
platform_set_drvdata(pd, drv_data);
563
i2c_set_adapdata(&drv_data->adapter, drv_data);
564
565
mv64xxx_i2c_hw_init(drv_data);
566
567
if (request_irq(drv_data->irq, mv64xxx_i2c_intr, 0,
568
MV64XXX_I2C_CTLR_NAME, drv_data)) {
569
dev_err(&drv_data->adapter.dev,
570
"mv64xxx: Can't register intr handler irq: %d\n",
571
drv_data->irq);
572
rc = -EINVAL;
573
goto exit_unmap_regs;
574
} else if ((rc = i2c_add_numbered_adapter(&drv_data->adapter)) != 0) {
575
dev_err(&drv_data->adapter.dev,
576
"mv64xxx: Can't add i2c adapter, rc: %d\n", -rc);
577
goto exit_free_irq;
578
}
579
580
return 0;
581
582
exit_free_irq:
583
free_irq(drv_data->irq, drv_data);
584
exit_unmap_regs:
585
mv64xxx_i2c_unmap_regs(drv_data);
586
exit_kfree:
587
kfree(drv_data);
588
return rc;
589
}
590
591
static int __devexit
592
mv64xxx_i2c_remove(struct platform_device *dev)
593
{
594
struct mv64xxx_i2c_data *drv_data = platform_get_drvdata(dev);
595
int rc;
596
597
rc = i2c_del_adapter(&drv_data->adapter);
598
free_irq(drv_data->irq, drv_data);
599
mv64xxx_i2c_unmap_regs(drv_data);
600
kfree(drv_data);
601
602
return rc;
603
}
604
605
static struct platform_driver mv64xxx_i2c_driver = {
606
.probe = mv64xxx_i2c_probe,
607
.remove = __devexit_p(mv64xxx_i2c_remove),
608
.driver = {
609
.owner = THIS_MODULE,
610
.name = MV64XXX_I2C_CTLR_NAME,
611
},
612
};
613
614
static int __init
615
mv64xxx_i2c_init(void)
616
{
617
return platform_driver_register(&mv64xxx_i2c_driver);
618
}
619
620
static void __exit
621
mv64xxx_i2c_exit(void)
622
{
623
platform_driver_unregister(&mv64xxx_i2c_driver);
624
}
625
626
module_init(mv64xxx_i2c_init);
627
module_exit(mv64xxx_i2c_exit);
628
629
MODULE_AUTHOR("Mark A. Greer <[email protected]>");
630
MODULE_DESCRIPTION("Marvell mv64xxx host bridge i2c ctlr driver");
631
MODULE_LICENSE("GPL");
632
633