@@ -33,11 +33,13 @@ struct eeprom_data {
33
33
u16 address_mask ;
34
34
u8 num_address_bytes ;
35
35
u8 idx_write_cnt ;
36
+ bool read_only ;
36
37
u8 buffer [];
37
38
};
38
39
39
40
#define I2C_SLAVE_BYTELEN GENMASK(15, 0)
40
41
#define I2C_SLAVE_FLAG_ADDR16 BIT(16)
42
+ #define I2C_SLAVE_FLAG_RO BIT(17)
41
43
#define I2C_SLAVE_DEVICE_MAGIC (_len , _flags ) ((_flags) | (_len))
42
44
43
45
static int i2c_slave_eeprom_slave_cb (struct i2c_client * client ,
@@ -53,9 +55,11 @@ static int i2c_slave_eeprom_slave_cb(struct i2c_client *client,
53
55
eeprom -> buffer_idx = * val | (eeprom -> buffer_idx << 8 );
54
56
eeprom -> idx_write_cnt ++ ;
55
57
} else {
56
- spin_lock (& eeprom -> buffer_lock );
57
- eeprom -> buffer [eeprom -> buffer_idx ++ & eeprom -> address_mask ] = * val ;
58
- spin_unlock (& eeprom -> buffer_lock );
58
+ if (!eeprom -> read_only ) {
59
+ spin_lock (& eeprom -> buffer_lock );
60
+ eeprom -> buffer [eeprom -> buffer_idx ++ & eeprom -> address_mask ] = * val ;
61
+ spin_unlock (& eeprom -> buffer_lock );
62
+ }
59
63
}
60
64
break ;
61
65
@@ -130,6 +134,7 @@ static int i2c_slave_eeprom_probe(struct i2c_client *client, const struct i2c_de
130
134
eeprom -> idx_write_cnt = 0 ;
131
135
eeprom -> num_address_bytes = flag_addr16 ? 2 : 1 ;
132
136
eeprom -> address_mask = size - 1 ;
137
+ eeprom -> read_only = FIELD_GET (I2C_SLAVE_FLAG_RO , id -> driver_data );
133
138
spin_lock_init (& eeprom -> buffer_lock );
134
139
i2c_set_clientdata (client , eeprom );
135
140
@@ -165,8 +170,11 @@ static int i2c_slave_eeprom_remove(struct i2c_client *client)
165
170
166
171
static const struct i2c_device_id i2c_slave_eeprom_id [] = {
167
172
{ "slave-24c02" , I2C_SLAVE_DEVICE_MAGIC (2048 / 8 , 0 ) },
173
+ { "slave-24c02ro" , I2C_SLAVE_DEVICE_MAGIC (2048 / 8 , I2C_SLAVE_FLAG_RO ) },
168
174
{ "slave-24c32" , I2C_SLAVE_DEVICE_MAGIC (32768 / 8 , I2C_SLAVE_FLAG_ADDR16 ) },
175
+ { "slave-24c32ro" , I2C_SLAVE_DEVICE_MAGIC (32768 / 8 , I2C_SLAVE_FLAG_ADDR16 | I2C_SLAVE_FLAG_RO ) },
169
176
{ "slave-24c64" , I2C_SLAVE_DEVICE_MAGIC (65536 / 8 , I2C_SLAVE_FLAG_ADDR16 ) },
177
+ { "slave-24c64ro" , I2C_SLAVE_DEVICE_MAGIC (65536 / 8 , I2C_SLAVE_FLAG_ADDR16 | I2C_SLAVE_FLAG_RO ) },
170
178
{ }
171
179
};
172
180
MODULE_DEVICE_TABLE (i2c , i2c_slave_eeprom_id );
0 commit comments