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