162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * netup-eeprom.c 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * 24LC02 EEPROM driver in conjunction with NetUP Dual DVB-S2 CI card 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 2009 NetUP Inc. 962306a36Sopenharmony_ci * Copyright (C) 2009 Abylay Ospan <aospan@netup.ru> 1062306a36Sopenharmony_ci */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci# 1362306a36Sopenharmony_ci#include "cx23885.h" 1462306a36Sopenharmony_ci#include "netup-eeprom.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define EEPROM_I2C_ADDR 0x50 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciint netup_eeprom_read(struct i2c_adapter *i2c_adap, u8 addr) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int ret; 2162306a36Sopenharmony_ci unsigned char buf[2]; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci /* Read from EEPROM */ 2462306a36Sopenharmony_ci struct i2c_msg msg[] = { 2562306a36Sopenharmony_ci { 2662306a36Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 2762306a36Sopenharmony_ci .flags = 0, 2862306a36Sopenharmony_ci .buf = &buf[0], 2962306a36Sopenharmony_ci .len = 1 3062306a36Sopenharmony_ci }, { 3162306a36Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 3262306a36Sopenharmony_ci .flags = I2C_M_RD, 3362306a36Sopenharmony_ci .buf = &buf[1], 3462306a36Sopenharmony_ci .len = 1 3562306a36Sopenharmony_ci } 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci }; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci buf[0] = addr; 4062306a36Sopenharmony_ci buf[1] = 0x0; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci ret = i2c_transfer(i2c_adap, msg, 2); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci if (ret != 2) { 4562306a36Sopenharmony_ci pr_err("eeprom i2c read error, status=%d\n", ret); 4662306a36Sopenharmony_ci return -1; 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci return buf[1]; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ciint netup_eeprom_write(struct i2c_adapter *i2c_adap, u8 addr, u8 data) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci int ret; 5562306a36Sopenharmony_ci unsigned char bufw[2]; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci /* Write into EEPROM */ 5862306a36Sopenharmony_ci struct i2c_msg msg[] = { 5962306a36Sopenharmony_ci { 6062306a36Sopenharmony_ci .addr = EEPROM_I2C_ADDR, 6162306a36Sopenharmony_ci .flags = 0, 6262306a36Sopenharmony_ci .buf = &bufw[0], 6362306a36Sopenharmony_ci .len = 2 6462306a36Sopenharmony_ci } 6562306a36Sopenharmony_ci }; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci bufw[0] = addr; 6862306a36Sopenharmony_ci bufw[1] = data; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci ret = i2c_transfer(i2c_adap, msg, 1); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci if (ret != 1) { 7362306a36Sopenharmony_ci pr_err("eeprom i2c write error, status=%d\n", ret); 7462306a36Sopenharmony_ci return -1; 7562306a36Sopenharmony_ci } 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci mdelay(10); /* prophylactic delay, datasheet write cycle time = 5 ms */ 7862306a36Sopenharmony_ci return 0; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid netup_get_card_info(struct i2c_adapter *i2c_adap, 8262306a36Sopenharmony_ci struct netup_card_info *cinfo) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci int i, j; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci cinfo->rev = netup_eeprom_read(i2c_adap, 63); 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci for (i = 64, j = 0; i < 70; i++, j++) 8962306a36Sopenharmony_ci cinfo->port[0].mac[j] = netup_eeprom_read(i2c_adap, i); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci for (i = 70, j = 0; i < 76; i++, j++) 9262306a36Sopenharmony_ci cinfo->port[1].mac[j] = netup_eeprom_read(i2c_adap, i); 9362306a36Sopenharmony_ci}; 94