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