netup-eeprom.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * netup-eeprom.c
  4. *
  5. * 24LC02 EEPROM driver in conjunction with NetUP Dual DVB-S2 CI card
  6. *
  7. * Copyright (C) 2009 NetUP Inc.
  8. * Copyright (C) 2009 Abylay Ospan <[email protected]>
  9. */
  10. #
  11. #include "cx23885.h"
  12. #include "netup-eeprom.h"
  13. #define EEPROM_I2C_ADDR 0x50
  14. int netup_eeprom_read(struct i2c_adapter *i2c_adap, u8 addr)
  15. {
  16. int ret;
  17. unsigned char buf[2];
  18. /* Read from EEPROM */
  19. struct i2c_msg msg[] = {
  20. {
  21. .addr = EEPROM_I2C_ADDR,
  22. .flags = 0,
  23. .buf = &buf[0],
  24. .len = 1
  25. }, {
  26. .addr = EEPROM_I2C_ADDR,
  27. .flags = I2C_M_RD,
  28. .buf = &buf[1],
  29. .len = 1
  30. }
  31. };
  32. buf[0] = addr;
  33. buf[1] = 0x0;
  34. ret = i2c_transfer(i2c_adap, msg, 2);
  35. if (ret != 2) {
  36. pr_err("eeprom i2c read error, status=%d\n", ret);
  37. return -1;
  38. }
  39. return buf[1];
  40. };
  41. int netup_eeprom_write(struct i2c_adapter *i2c_adap, u8 addr, u8 data)
  42. {
  43. int ret;
  44. unsigned char bufw[2];
  45. /* Write into EEPROM */
  46. struct i2c_msg msg[] = {
  47. {
  48. .addr = EEPROM_I2C_ADDR,
  49. .flags = 0,
  50. .buf = &bufw[0],
  51. .len = 2
  52. }
  53. };
  54. bufw[0] = addr;
  55. bufw[1] = data;
  56. ret = i2c_transfer(i2c_adap, msg, 1);
  57. if (ret != 1) {
  58. pr_err("eeprom i2c write error, status=%d\n", ret);
  59. return -1;
  60. }
  61. mdelay(10); /* prophylactic delay, datasheet write cycle time = 5 ms */
  62. return 0;
  63. };
  64. void netup_get_card_info(struct i2c_adapter *i2c_adap,
  65. struct netup_card_info *cinfo)
  66. {
  67. int i, j;
  68. cinfo->rev = netup_eeprom_read(i2c_adap, 63);
  69. for (i = 64, j = 0; i < 70; i++, j++)
  70. cinfo->port[0].mac[j] = netup_eeprom_read(i2c_adap, i);
  71. for (i = 70, j = 0; i < 76; i++, j++)
  72. cinfo->port[1].mac[j] = netup_eeprom_read(i2c_adap, i);
  73. };