2 * Embedded Planet RPX Lite MPC8xx CPM I2C interface.
3 * Copyright (c) 1999 Dan Malek (dmalek@jlc.net).
5 * moved into proper i2c interface;
6 * Brad Parker (brad@heeltoe.com)
8 * RPX lite specific parts of the i2c interface
9 * Update: There actually isn't anything RPXLite-specific about this module.
10 * This should work for most any 8xx board. The console messages have been
11 * changed to eliminate RPXLite references.
14 #include <linux/config.h>
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/stddef.h>
19 #include <linux/i2c.h>
20 #include <linux/i2c-algo-8xx.h>
21 #include <asm/mpc8xx.h>
22 #include <asm/commproc.h>
26 rpx_iic_init(struct i2c_algo_8xx_data
*data
)
28 volatile cpm8xx_t
*cp
;
29 volatile immap_t
*immap
;
31 cp
= cpmp
; /* Get pointer to Communication Processor */
32 immap
= (immap_t
*)IMAP_ADDR
; /* and to internal registers */
34 data
->iip
= (iic_t
*)&cp
->cp_dparam
[PROFF_IIC
];
36 /* Check for and use a microcode relocation patch.
38 if ((data
->reloc
= data
->iip
->iic_rpbase
))
39 data
->iip
= (iic_t
*)&cp
->cp_dpmem
[data
->iip
->iic_rpbase
];
41 data
->i2c
= (i2c8xx_t
*)&(immap
->im_i2c
);
44 /* Initialize Port B IIC pins.
46 cp
->cp_pbpar
|= 0x00000030;
47 cp
->cp_pbdir
|= 0x00000030;
48 cp
->cp_pbodr
|= 0x00000030;
50 /* Allocate space for two transmit and two receive buffer
51 * descriptors in the DP ram.
53 data
->dp_addr
= cpm_dpalloc(sizeof(cbd_t
) * 4, 8);
56 data
->i2c
= (i2c8xx_t
*)&(((immap_t
*)IMAP_ADDR
)->im_i2c
);
59 static int rpx_install_isr(int irq
, void (*func
)(void *, void *), void *data
)
61 /* install interrupt handler */
62 cpm_install_handler(irq
, (void (*)(void *, struct pt_regs
*)) func
, data
);
67 static struct i2c_algo_8xx_data rpx_data
= {
68 .setisr
= rpx_install_isr
71 static struct i2c_adapter rpx_ops
= {
74 .id
= I2C_HW_MPC8XX_EPON
,
75 .algo_data
= &rpx_data
,
78 int __init
i2c_rpx_init(void)
80 printk(KERN_INFO
"i2c-rpx: i2c MPC8xx driver\n");
82 /* reset hardware to sane state */
83 rpx_iic_init(&rpx_data
);
85 if (i2c_8xx_add_bus(&rpx_ops
) < 0) {
86 printk(KERN_ERR
"i2c-rpx: Unable to register with I2C\n");
93 void __exit
i2c_rpx_exit(void)
95 i2c_8xx_del_bus(&rpx_ops
);
98 MODULE_AUTHOR("Dan Malek <dmalek@jlc.net>");
99 MODULE_DESCRIPTION("I2C-Bus adapter routines for MPC8xx boards");
101 module_init(i2c_rpx_init
);
102 module_exit(i2c_rpx_exit
);