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