i2c-ixp4xx.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. /*
  2. * drivers/i2c/i2c-adap-ixp4xx.c
  3. *
  4. * Intel's IXP4xx XScale NPU chipsets (IXP420, 421, 422, 425) do not have
  5. * an on board I2C controller but provide 16 GPIO pins that are often
  6. * used to create an I2C bus. This driver provides an i2c_adapter
  7. * interface that plugs in under algo_bit and drives the GPIO pins
  8. * as instructed by the alogorithm driver.
  9. *
  10. * Author: Deepak Saxena <dsaxena@plexity.net>
  11. *
  12. * Copyright (c) 2003-2004 MontaVista Software Inc.
  13. *
  14. * This file is licensed under the terms of the GNU General Public
  15. * License version 2. This program is licensed "as is" without any
  16. * warranty of any kind, whether express or implied.
  17. *
  18. * NOTE: Since different platforms will use different GPIO pins for
  19. * I2C, this driver uses an IXP4xx-specific platform_data
  20. * pointer to pass the GPIO numbers to the driver. This
  21. * allows us to support all the different IXP4xx platforms
  22. * w/o having to put #ifdefs in this driver.
  23. *
  24. * See arch/arm/mach-ixp4xx/ixdp425.c for an example of building a
  25. * device list and filling in the ixp4xx_i2c_pins data structure
  26. * that is passed as the platform_data to this driver.
  27. */
  28. #include <linux/config.h>
  29. #ifdef CONFIG_I2C_DEBUG_BUS
  30. #define DEBUG 1
  31. #endif
  32. #include <linux/kernel.h>
  33. #include <linux/init.h>
  34. #include <linux/device.h>
  35. #include <linux/module.h>
  36. #include <linux/i2c.h>
  37. #include <linux/i2c-algo-bit.h>
  38. #include <asm/hardware.h> /* Pick up IXP4xx-specific bits */
  39. static inline int ixp4xx_scl_pin(void *data)
  40. {
  41. return ((struct ixp4xx_i2c_pins*)data)->scl_pin;
  42. }
  43. static inline int ixp4xx_sda_pin(void *data)
  44. {
  45. return ((struct ixp4xx_i2c_pins*)data)->sda_pin;
  46. }
  47. static void ixp4xx_bit_setscl(void *data, int val)
  48. {
  49. gpio_line_set(ixp4xx_scl_pin(data), 0);
  50. gpio_line_config(ixp4xx_scl_pin(data),
  51. val ? IXP4XX_GPIO_IN : IXP4XX_GPIO_OUT );
  52. }
  53. static void ixp4xx_bit_setsda(void *data, int val)
  54. {
  55. gpio_line_set(ixp4xx_sda_pin(data), 0);
  56. gpio_line_config(ixp4xx_sda_pin(data),
  57. val ? IXP4XX_GPIO_IN : IXP4XX_GPIO_OUT );
  58. }
  59. static int ixp4xx_bit_getscl(void *data)
  60. {
  61. int scl;
  62. gpio_line_config(ixp4xx_scl_pin(data), IXP4XX_GPIO_IN );
  63. gpio_line_get(ixp4xx_scl_pin(data), &scl);
  64. return scl;
  65. }
  66. static int ixp4xx_bit_getsda(void *data)
  67. {
  68. int sda;
  69. gpio_line_config(ixp4xx_sda_pin(data), IXP4XX_GPIO_IN );
  70. gpio_line_get(ixp4xx_sda_pin(data), &sda);
  71. return sda;
  72. }
  73. struct ixp4xx_i2c_data {
  74. struct ixp4xx_i2c_pins *gpio_pins;
  75. struct i2c_adapter adapter;
  76. struct i2c_algo_bit_data algo_data;
  77. };
  78. static int ixp4xx_i2c_remove(struct device *dev)
  79. {
  80. struct platform_device *plat_dev = to_platform_device(dev);
  81. struct ixp4xx_i2c_data *drv_data = dev_get_drvdata(&plat_dev->dev);
  82. dev_set_drvdata(&plat_dev->dev, NULL);
  83. i2c_bit_del_bus(&drv_data->adapter);
  84. kfree(drv_data);
  85. return 0;
  86. }
  87. static int ixp4xx_i2c_probe(struct device *dev)
  88. {
  89. int err;
  90. struct platform_device *plat_dev = to_platform_device(dev);
  91. struct ixp4xx_i2c_pins *gpio = plat_dev->dev.platform_data;
  92. struct ixp4xx_i2c_data *drv_data =
  93. kmalloc(sizeof(struct ixp4xx_i2c_data), GFP_KERNEL);
  94. if(!drv_data)
  95. return -ENOMEM;
  96. memzero(drv_data, sizeof(struct ixp4xx_i2c_data));
  97. drv_data->gpio_pins = gpio;
  98. /*
  99. * We could make a lot of these structures static, but
  100. * certain platforms may have multiple GPIO-based I2C
  101. * buses for various device domains, so we need per-device
  102. * algo_data->data.
  103. */
  104. drv_data->algo_data.data = gpio;
  105. drv_data->algo_data.setsda = ixp4xx_bit_setsda;
  106. drv_data->algo_data.setscl = ixp4xx_bit_setscl;
  107. drv_data->algo_data.getsda = ixp4xx_bit_getsda;
  108. drv_data->algo_data.getscl = ixp4xx_bit_getscl;
  109. drv_data->algo_data.udelay = 10;
  110. drv_data->algo_data.mdelay = 10;
  111. drv_data->algo_data.timeout = 100;
  112. drv_data->adapter.id = I2C_HW_B_IXP4XX;
  113. drv_data->adapter.algo_data = &drv_data->algo_data;
  114. drv_data->adapter.dev.parent = &plat_dev->dev;
  115. gpio_line_config(gpio->scl_pin, IXP4XX_GPIO_IN);
  116. gpio_line_config(gpio->sda_pin, IXP4XX_GPIO_IN);
  117. gpio_line_set(gpio->scl_pin, 0);
  118. gpio_line_set(gpio->sda_pin, 0);
  119. if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) {
  120. printk(KERN_ERR "ERROR: Could not install %s\n", dev->bus_id);
  121. kfree(drv_data);
  122. return err;
  123. }
  124. dev_set_drvdata(&plat_dev->dev, drv_data);
  125. return 0;
  126. }
  127. static struct device_driver ixp4xx_i2c_driver = {
  128. .name = "IXP4XX-I2C",
  129. .bus = &platform_bus_type,
  130. .probe = ixp4xx_i2c_probe,
  131. .remove = ixp4xx_i2c_remove,
  132. };
  133. static int __init ixp4xx_i2c_init(void)
  134. {
  135. return driver_register(&ixp4xx_i2c_driver);
  136. }
  137. static void __exit ixp4xx_i2c_exit(void)
  138. {
  139. driver_unregister(&ixp4xx_i2c_driver);
  140. }
  141. module_init(ixp4xx_i2c_init);
  142. module_exit(ixp4xx_i2c_exit);
  143. MODULE_DESCRIPTION("GPIO-based I2C adapter for IXP4xx systems");
  144. MODULE_LICENSE("GPL");
  145. MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>");