Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
[sfrench/cifs-2.6.git] / drivers / media / pci / cx23885 / netup-eeprom.c
1
2 /*
3  * netup-eeprom.c
4  *
5  * 24LC02 EEPROM driver in conjunction with NetUP Dual DVB-S2 CI card
6  *
7  * Copyright (C) 2009 NetUP Inc.
8  * Copyright (C) 2009 Abylay Ospan <aospan@netup.ru>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *
19  * GNU General Public License for more details.
20  */
21
22 #
23 #include "cx23885.h"
24 #include "netup-eeprom.h"
25
26 #define EEPROM_I2C_ADDR 0x50
27
28 int netup_eeprom_read(struct i2c_adapter *i2c_adap, u8 addr)
29 {
30         int ret;
31         unsigned char buf[2];
32
33         /* Read from EEPROM */
34         struct i2c_msg msg[] = {
35                 {
36                         .addr   = EEPROM_I2C_ADDR,
37                         .flags  = 0,
38                         .buf    = &buf[0],
39                         .len    = 1
40                 }, {
41                         .addr   = EEPROM_I2C_ADDR,
42                         .flags  = I2C_M_RD,
43                         .buf    = &buf[1],
44                         .len    = 1
45                 }
46
47         };
48
49         buf[0] = addr;
50         buf[1] = 0x0;
51
52         ret = i2c_transfer(i2c_adap, msg, 2);
53
54         if (ret != 2) {
55                 pr_err("eeprom i2c read error, status=%d\n", ret);
56                 return -1;
57         }
58
59         return buf[1];
60 };
61
62 int netup_eeprom_write(struct i2c_adapter *i2c_adap, u8 addr, u8 data)
63 {
64         int ret;
65         unsigned char bufw[2];
66
67         /* Write into EEPROM */
68         struct i2c_msg msg[] = {
69                 {
70                         .addr   = EEPROM_I2C_ADDR,
71                         .flags  = 0,
72                         .buf    = &bufw[0],
73                         .len    = 2
74                 }
75         };
76
77         bufw[0] = addr;
78         bufw[1] = data;
79
80         ret = i2c_transfer(i2c_adap, msg, 1);
81
82         if (ret != 1) {
83                 pr_err("eeprom i2c write error, status=%d\n", ret);
84                 return -1;
85         }
86
87         mdelay(10); /* prophylactic delay, datasheet write cycle time = 5 ms */
88         return 0;
89 };
90
91 void netup_get_card_info(struct i2c_adapter *i2c_adap,
92                                 struct netup_card_info *cinfo)
93 {
94         int i, j;
95
96         cinfo->rev =  netup_eeprom_read(i2c_adap, 63);
97
98         for (i = 64, j = 0; i < 70; i++, j++)
99                 cinfo->port[0].mac[j] =  netup_eeprom_read(i2c_adap, i);
100
101         for (i = 70, j = 0; i < 76; i++, j++)
102                 cinfo->port[1].mac[j] =  netup_eeprom_read(i2c_adap, i);
103 };