Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
420 giacomo 1
/*
2
 * Embedded Planet RPX Lite MPC8xx CPM I2C interface.
3
 * Copyright (c) 1999 Dan Malek (dmalek@jlc.net).
4
 *
5
 * moved into proper i2c interface;
6
 * Brad Parker (brad@heeltoe.com)
7
 *
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.
12
 */
13
 
14
#include <linux/kernel.h>
15
#include <linux/ioport.h>
16
#include <linux/module.h>
17
#include <linux/init.h>
18
#include <linux/stddef.h>
19
#include <linux/parport.h>
20
#include <linux/i2c.h>
21
#include <linux/i2c-algo-8xx.h>
22
#include <asm/mpc8xx.h>
23
#include <asm/commproc.h>
24
 
25
 
26
static void
27
rpx_iic_init(struct i2c_algo_8xx_data *data)
28
{
29
        volatile cpm8xx_t *cp;
30
        volatile immap_t *immap;
31
 
32
        cp = cpmp;      /* Get pointer to Communication Processor */
33
        immap = (immap_t *)IMAP_ADDR;   /* and to internal registers */
34
 
35
        data->iip = (iic_t *)&cp->cp_dparam[PROFF_IIC];
36
 
37
        /* Check for and use a microcode relocation patch.
38
        */
39
        if ((data->reloc = data->iip->iic_rpbase))
40
                data->iip = (iic_t *)&cp->cp_dpmem[data->iip->iic_rpbase];
41
 
42
        data->i2c = (i2c8xx_t *)&(immap->im_i2c);
43
        data->cp = cp;
44
 
45
        /* Initialize Port B IIC pins.
46
        */
47
        cp->cp_pbpar |= 0x00000030;
48
        cp->cp_pbdir |= 0x00000030;
49
        cp->cp_pbodr |= 0x00000030;
50
 
51
        /* Allocate space for two transmit and two receive buffer
52
         * descriptors in the DP ram.
53
         */
54
        data->dp_addr = m8xx_cpm_dpalloc(sizeof(cbd_t) * 4);
55
 
56
        /* ptr to i2c area */
57
        data->i2c = (i2c8xx_t *)&(((immap_t *)IMAP_ADDR)->im_i2c);
58
}
59
 
60
static int rpx_install_isr(int irq, void (*func)(void *, void *), void *data)
61
{
62
        /* install interrupt handler */
63
        cpm_install_handler(irq, (void (*)(void *, struct pt_regs *)) func, data);
64
 
65
        return 0;
66
}
67
 
68
static struct i2c_algo_8xx_data rpx_data = {
69
        .setisr = rpx_install_isr
70
};
71
 
72
static struct i2c_adapter rpx_ops = {
73
        .owner          = THIS_MODULE,
74
        .name           = "m8xx",
75
        .id             = I2C_HW_MPC8XX_EPON,
76
        .algo_data      = &rpx_data,
77
};
78
 
79
int __init i2c_rpx_init(void)
80
{
81
        printk(KERN_INFO "i2c-rpx: i2c MPC8xx driver\n");
82
 
83
        /* reset hardware to sane state */
84
        rpx_iic_init(&rpx_data);
85
 
86
        if (i2c_8xx_add_bus(&rpx_ops) < 0) {
87
                printk("i2c-rpx: Unable to register with I2C\n");
88
                return -ENODEV;
89
        }
90
 
91
        return 0;
92
}
93
 
94
void __exit i2c_rpx_exit(void)
95
{
96
        i2c_8xx_del_bus(&rpx_ops);
97
}
98
 
99
MODULE_AUTHOR("Dan Malek <dmalek@jlc.net>");
100
MODULE_DESCRIPTION("I2C-Bus adapter routines for MPC8xx boards");
101
 
102
module_init(i2c_rpx_init);
103
module_exit(i2c_rpx_exit);