cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

netup-eeprom.c (1667B)


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