Lines Matching refs:at24
249 static struct at24_client *at24_translate_offset(struct at24_data *at24, in at24_translate_offset() argument
254 if (at24->flags & AT24_FLAG_ADDR16) { in at24_translate_offset()
262 return &at24->client[i]; in at24_translate_offset()
265 static struct device *at24_base_client_dev(struct at24_data *at24) in at24_base_client_dev() argument
267 return &at24->client[0].client->dev; in at24_base_client_dev()
270 static size_t at24_adjust_read_count(struct at24_data *at24, in at24_adjust_read_count() argument
281 if (at24->flags & AT24_FLAG_NO_RDROL) { in at24_adjust_read_count()
282 bits = (at24->flags & AT24_FLAG_ADDR16) ? 16 : 8; in at24_adjust_read_count()
294 static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, in at24_regmap_read() argument
303 at24_client = at24_translate_offset(at24, &offset); in at24_regmap_read()
306 count = at24_adjust_read_count(at24, offset, count); in at24_regmap_read()
309 offset += at24->offset_adj; in at24_regmap_read()
331 static size_t at24_adjust_write_count(struct at24_data *at24, in at24_adjust_write_count() argument
337 if (count > at24->write_max) in at24_adjust_write_count()
338 count = at24->write_max; in at24_adjust_write_count()
341 next_page = roundup(offset + 1, at24->page_size); in at24_adjust_write_count()
348 static ssize_t at24_regmap_write(struct at24_data *at24, const char *buf, in at24_regmap_write() argument
357 at24_client = at24_translate_offset(at24, &offset); in at24_regmap_write()
360 count = at24_adjust_write_count(at24, offset, count); in at24_regmap_write()
375 struct at24_data *at24; in at24_read() local
380 at24 = priv; in at24_read()
381 dev = at24_base_client_dev(at24); in at24_read()
386 if (off + count > at24->byte_len) in at24_read()
399 mutex_lock(&at24->lock); in at24_read()
402 ret = at24_regmap_read(at24, buf, off, count); in at24_read()
404 mutex_unlock(&at24->lock); in at24_read()
413 mutex_unlock(&at24->lock); in at24_read()
422 struct at24_data *at24; in at24_write() local
427 at24 = priv; in at24_write()
428 dev = at24_base_client_dev(at24); in at24_write()
433 if (off + count > at24->byte_len) in at24_write()
446 mutex_lock(&at24->lock); in at24_write()
447 gpiod_set_value_cansleep(at24->wp_gpio, 0); in at24_write()
450 ret = at24_regmap_write(at24, buf, off, count); in at24_write()
452 gpiod_set_value_cansleep(at24->wp_gpio, 1); in at24_write()
453 mutex_unlock(&at24->lock); in at24_write()
462 gpiod_set_value_cansleep(at24->wp_gpio, 1); in at24_write()
463 mutex_unlock(&at24->lock); in at24_write()
552 static void at24_remove_dummy_clients(struct at24_data *at24) in at24_remove_dummy_clients() argument
556 for (i = 1; i < at24->num_addresses; i++) in at24_remove_dummy_clients()
557 i2c_unregister_device(at24->client[i].client); in at24_remove_dummy_clients()
560 static int at24_make_dummy_client(struct at24_data *at24, unsigned int index, in at24_make_dummy_client() argument
568 base_client = at24->client[0].client; in at24_make_dummy_client()
585 at24->client[index].client = dummy_client; in at24_make_dummy_client()
586 at24->client[index].regmap = regmap; in at24_make_dummy_client()
622 struct at24_data *at24; in at24_probe() local
668 at24_size = sizeof(*at24) + num_addresses * sizeof(struct at24_client); in at24_probe()
669 at24 = devm_kzalloc(dev, at24_size, GFP_KERNEL); in at24_probe()
670 if (!at24) in at24_probe()
673 mutex_init(&at24->lock); in at24_probe()
674 at24->byte_len = pdata.byte_len; in at24_probe()
675 at24->page_size = pdata.page_size; in at24_probe()
676 at24->flags = pdata.flags; in at24_probe()
677 at24->num_addresses = num_addresses; in at24_probe()
678 at24->offset_adj = at24_get_offset_adj(pdata.flags, pdata.byte_len); in at24_probe()
679 at24->client[0].client = client; in at24_probe()
680 at24->client[0].regmap = regmap; in at24_probe()
682 at24->wp_gpio = devm_gpiod_get_optional(dev, "wp", GPIOD_OUT_HIGH); in at24_probe()
683 if (IS_ERR(at24->wp_gpio)) in at24_probe()
684 return PTR_ERR(at24->wp_gpio); in at24_probe()
688 at24->write_max = min_t(unsigned int, in at24_probe()
690 if (!i2c_fn_i2c && at24->write_max > I2C_SMBUS_BLOCK_MAX) in at24_probe()
691 at24->write_max = I2C_SMBUS_BLOCK_MAX; in at24_probe()
696 err = at24_make_dummy_client(at24, i, ®map_config); in at24_probe()
698 at24_remove_dummy_clients(at24); in at24_probe()
703 i2c_set_clientdata(client, at24); in at24_probe()
713 err = at24_read(at24, 0, &test_byte, 1); in at24_probe()
729 nvmem_config.priv = at24; in at24_probe()
734 at24->nvmem = devm_nvmem_register(dev, &nvmem_config); in at24_probe()
735 if (IS_ERR(at24->nvmem)) { in at24_probe()
736 err = PTR_ERR(at24->nvmem); in at24_probe()
742 writable ? "writable" : "read-only", at24->write_max); in at24_probe()
746 pdata.setup(at24->nvmem, pdata.context); in at24_probe()
751 at24_remove_dummy_clients(at24); in at24_probe()
759 struct at24_data *at24; in at24_remove() local
761 at24 = i2c_get_clientdata(client); in at24_remove()
763 at24_remove_dummy_clients(at24); in at24_remove()