/drivers/i2c/busses/i2c-rpx.c

https://bitbucket.org/evzijst/gittest · C · 102 lines · 59 code · 21 blank · 22 comment · 2 complexity · a36a16c80dcc513a0dc66ff909d17728 MD5 · raw file

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