18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci/* 48c2ecf20Sopenharmony_ci * netup-eeprom.c 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * 24LC02 EEPROM driver in conjunction with NetUP Dual DVB-S2 CI card 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (C) 2009 NetUP Inc. 98c2ecf20Sopenharmony_ci * Copyright (C) 2009 Abylay Ospan <aospan@netup.ru> 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci# 138c2ecf20Sopenharmony_ci#include "cx23885.h" 148c2ecf20Sopenharmony_ci#include "netup-eeprom.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define EEPROM_I2C_ADDR 0x50 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ciint netup_eeprom_read(struct i2c_adapter *i2c_adap, u8 addr) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci int ret; 218c2ecf20Sopenharmony_ci unsigned char buf[2]; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci /* Read from EEPROM */ 248c2ecf20Sopenharmony_ci struct i2c_msg msg[] = { 258c2ecf20Sopenharmony_ci { 268c2ecf20Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 278c2ecf20Sopenharmony_ci .flags = 0, 288c2ecf20Sopenharmony_ci .buf = &buf[0], 298c2ecf20Sopenharmony_ci .len = 1 308c2ecf20Sopenharmony_ci }, { 318c2ecf20Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 328c2ecf20Sopenharmony_ci .flags = I2C_M_RD, 338c2ecf20Sopenharmony_ci .buf = &buf[1], 348c2ecf20Sopenharmony_ci .len = 1 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci }; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci buf[0] = addr; 408c2ecf20Sopenharmony_ci buf[1] = 0x0; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci ret = i2c_transfer(i2c_adap, msg, 2); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci if (ret != 2) { 458c2ecf20Sopenharmony_ci pr_err("eeprom i2c read error, status=%d\n", ret); 468c2ecf20Sopenharmony_ci return -1; 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci return buf[1]; 508c2ecf20Sopenharmony_ci}; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ciint netup_eeprom_write(struct i2c_adapter *i2c_adap, u8 addr, u8 data) 538c2ecf20Sopenharmony_ci{ 548c2ecf20Sopenharmony_ci int ret; 558c2ecf20Sopenharmony_ci unsigned char bufw[2]; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci /* Write into EEPROM */ 588c2ecf20Sopenharmony_ci struct i2c_msg msg[] = { 598c2ecf20Sopenharmony_ci { 608c2ecf20Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 618c2ecf20Sopenharmony_ci .flags = 0, 628c2ecf20Sopenharmony_ci .buf = &bufw[0], 638c2ecf20Sopenharmony_ci .len = 2 648c2ecf20Sopenharmony_ci } 658c2ecf20Sopenharmony_ci }; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci bufw[0] = addr; 688c2ecf20Sopenharmony_ci bufw[1] = data; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci ret = i2c_transfer(i2c_adap, msg, 1); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci if (ret != 1) { 738c2ecf20Sopenharmony_ci pr_err("eeprom i2c write error, status=%d\n", ret); 748c2ecf20Sopenharmony_ci return -1; 758c2ecf20Sopenharmony_ci } 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci mdelay(10); /* prophylactic delay, datasheet write cycle time = 5 ms */ 788c2ecf20Sopenharmony_ci return 0; 798c2ecf20Sopenharmony_ci}; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_civoid netup_get_card_info(struct i2c_adapter *i2c_adap, 828c2ecf20Sopenharmony_ci struct netup_card_info *cinfo) 838c2ecf20Sopenharmony_ci{ 848c2ecf20Sopenharmony_ci int i, j; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci cinfo->rev = netup_eeprom_read(i2c_adap, 63); 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci for (i = 64, j = 0; i < 70; i++, j++) 898c2ecf20Sopenharmony_ci cinfo->port[0].mac[j] = netup_eeprom_read(i2c_adap, i); 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci for (i = 70, j = 0; i < 76; i++, j++) 928c2ecf20Sopenharmony_ci cinfo->port[1].mac[j] = netup_eeprom_read(i2c_adap, i); 938c2ecf20Sopenharmony_ci}; 94