^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (c) 2020 Rockchip Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * otp_eeprom driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * V0.0X01.0X01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * 1. fix table_size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * 2. fix ioctl return value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * 3. add version control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * V0.0X01.0X02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * 1. fix otp info null issue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * V0.0X01.0X03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 1. add buf read optimize otp read speed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * 2. add mutex for otp read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) //#define DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/pm_runtime.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/rk-camera-module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/sem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <media/v4l2-ctrls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <media/v4l2-device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/version.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "otp_eeprom.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define DRIVER_VERSION KERNEL_VERSION(0, 0x01, 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define DEVICE_NAME "otp_eeprom"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) static inline struct eeprom_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *sd_to_eeprom(struct v4l2_subdev *subdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return container_of(subdev, struct eeprom_device, sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* Read registers up to 4 at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static int read_reg_otp(struct i2c_client *client, u16 reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) unsigned int len, u32 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct i2c_msg msgs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 *data_be_p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) __be32 data_be = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) __be16 reg_addr_be = cpu_to_be16(reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (len > 4 || !len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) data_be_p = (u8 *)&data_be;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* Write register address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) msgs[0].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) msgs[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) msgs[0].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) msgs[0].buf = (u8 *)®_addr_be;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* Read data from register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) msgs[1].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) msgs[1].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) msgs[1].len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) msgs[1].buf = &data_be_p[4 - len];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) if (ret != ARRAY_SIZE(msgs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) *val = be32_to_cpu(data_be);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /* Read registers buffers at a time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) static int read_reg_otp_buf(struct i2c_client *client, u16 reg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unsigned int len, u8 *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct i2c_msg msgs[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) __be16 reg_addr_be = cpu_to_be16(reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* Write register address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) msgs[0].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) msgs[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) msgs[0].len = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) msgs[0].buf = (u8 *)®_addr_be;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* Read data from register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) msgs[1].addr = client->addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) msgs[1].flags = I2C_M_RD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) msgs[1].len = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) msgs[1].buf = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (ret != ARRAY_SIZE(msgs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) static u8 get_vendor_flag(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) u8 vendor_flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) u8 vendor[9];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) u32 temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) for (i = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) read_reg_otp(client, INFO_FLAG_REG + i, 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) vendor[i] = (u8)temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) vendor[8] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) if (strcmp(vendor, "ROCKCHIP") == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) vendor_flag |= 0x40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) vendor_flag |= 0x80;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return vendor_flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static int otp_read_data(struct eeprom_device *eeprom_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) struct otp_info *otp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) u32 temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) otp_ptr = kzalloc(sizeof(*otp_ptr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (!otp_ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* OTP base information*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ret = read_reg_otp(client, INFO_FLAG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 1, &otp_ptr->basic_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) if (otp_ptr->basic_data.flag == 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) ret |= read_reg_otp(client, INFO_ID_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 1, &otp_ptr->basic_data.id.supplier_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) ret |= read_reg_otp(client, INFO_ID_REG + 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 1, &otp_ptr->basic_data.id.year);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ret |= read_reg_otp(client, INFO_ID_REG + 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 1, &otp_ptr->basic_data.id.month);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ret |= read_reg_otp(client, INFO_ID_REG + 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 1, &otp_ptr->basic_data.id.day);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ret |= read_reg_otp(client, INFO_ID_REG + 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 1, &otp_ptr->basic_data.id.sensor_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) ret |= read_reg_otp(client, INFO_ID_REG + 5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 1, &otp_ptr->basic_data.id.lens_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ret |= read_reg_otp(client, INFO_ID_REG + 6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 1, &otp_ptr->basic_data.id.vcm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ret |= read_reg_otp(client, INFO_ID_REG + 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 1, &otp_ptr->basic_data.id.driver_ic_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ret |= read_reg_otp(client, INFO_ID_REG + 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 1, &otp_ptr->basic_data.id.color_temperature_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) for (i = 0; i < SMARTISAN_PN_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) ret |= read_reg_otp(client, SMARTISAN_PN_REG + i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) otp_ptr->basic_data.smartisan_pn[i] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) for (i = 0; i < MOUDLE_ID_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ret |= read_reg_otp(client, MOUDLE_ID_REG + i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) otp_ptr->basic_data.modul_id[i] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ret |= read_reg_otp(client, MIRROR_FLIP_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 1, &otp_ptr->basic_data.mirror_flip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ret |= read_reg_otp(client, FULL_SIZE_WIGHT_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 2, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) otp_ptr->basic_data.size.width = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ret |= read_reg_otp(client, FULL_SIZE_HEIGHT_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 2, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) otp_ptr->basic_data.size.height = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ret |= read_reg_otp(client, INFO_CHECKSUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 1, &otp_ptr->basic_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) dev_dbg(dev, "fasic info: supplier_id(0x%x) lens(0x%x) time(%d_%d_%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) otp_ptr->basic_data.id.supplier_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) otp_ptr->basic_data.id.lens_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) otp_ptr->basic_data.id.year,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) otp_ptr->basic_data.id.month,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) otp_ptr->basic_data.id.day);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* OTP WB calibration data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) ret = read_reg_otp(client, AWB_FLAG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 1, &otp_ptr->awb_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) if (otp_ptr->awb_data.flag == 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ret |= read_reg_otp(client, AWB_VERSION_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 1, &otp_ptr->awb_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) ret |= read_reg_otp(client, CUR_R_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 2, &otp_ptr->awb_data.r_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) ret |= read_reg_otp(client, CUR_B_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 2, &otp_ptr->awb_data.b_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ret |= read_reg_otp(client, CUR_G_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 2, &otp_ptr->awb_data.g_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) ret |= read_reg_otp(client, GOLDEN_R_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 2, &otp_ptr->awb_data.r_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ret |= read_reg_otp(client, GOLDEN_B_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 2, &otp_ptr->awb_data.b_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) ret |= read_reg_otp(client, GOLDEN_G_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 2, &otp_ptr->awb_data.g_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) ret |= read_reg_otp(client, AWB_CHECKSUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 1, &otp_ptr->awb_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) dev_dbg(dev, "awb version:0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) otp_ptr->awb_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* OTP LSC calibration data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) ret = read_reg_otp(client, LSC_FLAG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 1, &otp_ptr->lsc_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) if (otp_ptr->lsc_data.flag == 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ret |= read_reg_otp(client, LSC_VERSION_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 1, &otp_ptr->lsc_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) ret |= read_reg_otp(client, LSC_TABLE_SIZE_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 2, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) otp_ptr->lsc_data.table_size = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) for (i = 0; i < LSC_DATA_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) ret |= read_reg_otp(client, LSC_DATA_START_REG + i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) otp_ptr->lsc_data.data[i] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) ret |= read_reg_otp(client, LSC_CHECKSUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 1, &otp_ptr->lsc_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) dev_dbg(dev, "lsc cur:(version 0x%x, table_size 0x%x checksum 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) otp_ptr->lsc_data.version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) otp_ptr->lsc_data.table_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) otp_ptr->lsc_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* OTP sfr calibration data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) ret = read_reg_otp(client, LSC_FLAG_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 1, &otp_ptr->sfr_otp_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (otp_ptr->sfr_otp_data.flag == 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) ret |= read_reg_otp(client, SFR_EQUIQ_NUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 1, &otp_ptr->sfr_otp_data.equip_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) ret |= read_reg_otp(client, SFR_C_HOR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 2, &otp_ptr->sfr_otp_data.center_horizontal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) ret |= read_reg_otp(client, SFR_C_VER_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 2, &otp_ptr->sfr_otp_data.center_vertical);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) for (i = 0; i < 3; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) ret |= read_reg_otp(client, SFR_TOP_L_HOR_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 2, &otp_ptr->sfr_otp_data.data[i].top_l_horizontal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) ret |= read_reg_otp(client, SFR_TOP_L_VER_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 2, &otp_ptr->sfr_otp_data.data[i].top_l_vertical);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) ret |= read_reg_otp(client, SFR_TOP_R_HOR_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 2, &otp_ptr->sfr_otp_data.data[i].top_r_horizontal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ret |= read_reg_otp(client, SFR_TOP_R_VER_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 2, &otp_ptr->sfr_otp_data.data[i].top_r_vertical);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ret |= read_reg_otp(client, SFR_BOTTOM_L_HOR_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 2, &otp_ptr->sfr_otp_data.data[i].bottom_l_horizontal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) ret |= read_reg_otp(client, SFR_BOTTOM_L_VER_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 2, &otp_ptr->sfr_otp_data.data[i].bottom_l_vertical);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ret |= read_reg_otp(client, SFR_BOTTOM_R_HOR_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 2, &otp_ptr->sfr_otp_data.data[i].bottom_r_horizontal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) ret |= read_reg_otp(client, SFR_BOTTOM_R_VER_REG + 16 * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 2, &otp_ptr->sfr_otp_data.data[i].bottom_r_vertical);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) ret |= read_reg_otp(client, SFR_CHECKSUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 1, &otp_ptr->sfr_otp_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ret = read_reg_otp(client, TOTAL_CHECKSUM_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 1, &otp_ptr->total_checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (otp_ptr->total_checksum) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) eeprom_dev->otp = otp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) dev_info(dev, "get otp successful\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) eeprom_dev->otp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) kfree(otp_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) dev_warn(&client->dev, "otp is NULL!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) eeprom_dev->otp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) kfree(otp_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) dev_warn(&client->dev, "@%s read otp err!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) static void rkotp_read_module_info(struct eeprom_device *eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) struct otp_info *otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) u32 base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) u32 temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) u32 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 4, &otp_ptr->basic_data.module_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) checksum += otp_ptr->basic_data.module_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) base_addr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 2, &otp_ptr->basic_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) checksum += otp_ptr->basic_data.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 1, &otp_ptr->basic_data.id.supplier_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) checksum += otp_ptr->basic_data.id.supplier_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 1, &otp_ptr->basic_data.id.year);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) checksum += otp_ptr->basic_data.id.year;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 1, &otp_ptr->basic_data.id.month);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) checksum += otp_ptr->basic_data.id.month;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 1, &otp_ptr->basic_data.id.day);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) checksum += otp_ptr->basic_data.id.day;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 1, &otp_ptr->basic_data.id.sensor_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) checksum += otp_ptr->basic_data.id.sensor_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 1, &otp_ptr->basic_data.id.lens_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) checksum += otp_ptr->basic_data.id.lens_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 1, &otp_ptr->basic_data.id.vcm_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) checksum += otp_ptr->basic_data.id.vcm_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 1, &otp_ptr->basic_data.id.driver_ic_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) checksum += otp_ptr->basic_data.id.driver_ic_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) for (i = 0; i < RKMOUDLE_ID_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) otp_ptr->basic_data.modul_id[i] = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 1, &otp_ptr->basic_data.mirror_flip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) checksum += otp_ptr->basic_data.mirror_flip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 2, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) otp_ptr->basic_data.size.width = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 2, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) otp_ptr->basic_data.size.height = temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) for (i = 0; i < RK_INFO_RESERVED_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 1, &otp_ptr->basic_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) if ((checksum % 255 + 1) == otp_ptr->basic_data.checksum && (!ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) otp_ptr->basic_data.flag = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) otp_ptr->flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) dev_info(dev, "fasic info: supplier_id(0x%x) lens(0x%x) time(%d_%d_%d) module id %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) otp_ptr->basic_data.id.supplier_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) otp_ptr->basic_data.id.lens_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) otp_ptr->basic_data.id.year,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) otp_ptr->basic_data.id.month,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) otp_ptr->basic_data.id.day,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) (u32)(*otp_ptr->basic_data.modul_id));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) otp_ptr->basic_data.flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) dev_info(dev, "fasic info: checksum err, checksum %d, reg_checksum %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) (int)(checksum % 255 + 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) (int)otp_ptr->basic_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) dev_info(dev, "fasic info: supplier_id(0x%x) lens(0x%x) time(%d_%d_%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) otp_ptr->basic_data.id.supplier_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) otp_ptr->basic_data.id.lens_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) otp_ptr->basic_data.id.year,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) otp_ptr->basic_data.id.month,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) otp_ptr->basic_data.id.day);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) dev_info(dev, "fasic info: full size, width(%d) height(%d) flip(0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) otp_ptr->basic_data.size.width,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) otp_ptr->basic_data.size.height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) otp_ptr->basic_data.mirror_flip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) static void rkotp_read_awb(struct eeprom_device *eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) struct otp_info *otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) u32 base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) u32 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) u32 temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ret = read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 4, &otp_ptr->awb_data.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) checksum += otp_ptr->awb_data.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) base_addr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 2, &otp_ptr->awb_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) checksum += otp_ptr->awb_data.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 2, &otp_ptr->awb_data.r_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) checksum += otp_ptr->awb_data.r_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 2, &otp_ptr->awb_data.b_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) checksum += otp_ptr->awb_data.b_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 2, &otp_ptr->awb_data.g_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) checksum += otp_ptr->awb_data.g_ratio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 2, &otp_ptr->awb_data.r_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) checksum += otp_ptr->awb_data.r_golden;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 2, &otp_ptr->awb_data.b_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) checksum += otp_ptr->awb_data.b_golden;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 2, &otp_ptr->awb_data.g_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) checksum += otp_ptr->awb_data.g_golden;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) for (i = 0; i < RK_AWB_RESERVED_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 1, &otp_ptr->awb_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if ((checksum % 255 + 1) == otp_ptr->awb_data.checksum && (!ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) otp_ptr->awb_data.flag = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) otp_ptr->flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) dev_info(dev, "awb version:0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) otp_ptr->awb_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) dev_info(dev, "awb cur:(r 0x%x, b 0x%x, g 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) otp_ptr->awb_data.r_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) otp_ptr->awb_data.b_ratio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) otp_ptr->awb_data.g_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) dev_info(dev, "awb gol:(r 0x%x, b 0x%x, g 0x%x),\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) otp_ptr->awb_data.r_golden,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) otp_ptr->awb_data.b_golden,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) otp_ptr->awb_data.g_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) otp_ptr->awb_data.flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) dev_info(dev, "awb info: checksum err, checksum %d, reg_checksum %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) (int) (checksum % 255 + 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) (int) otp_ptr->awb_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static void rkotp_read_lsc(struct eeprom_device *eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) struct otp_info *otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) u32 base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) u32 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) u8 *lsc_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) int w, h, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) lsc_buf = kzalloc(LSC_DATA_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) if (!lsc_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) dev_err(dev, "%s ENOMEM!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ret = read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 4, &otp_ptr->lsc_data.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) checksum += otp_ptr->lsc_data.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) base_addr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 2, &otp_ptr->lsc_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) checksum += otp_ptr->lsc_data.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) ret |= read_reg_otp_buf(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) LSC_DATA_SIZE, lsc_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) base_addr += LSC_DATA_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) for (i = 0; i < LSC_DATA_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) otp_ptr->lsc_data.data[i] = lsc_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) checksum += lsc_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) otp_ptr->lsc_data.table_size = LSC_DATA_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) w = 17 * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) h = 17 * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) dev_info(dev, "show lsc table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) for (i = 0; i < h; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) for (j = 0; j < w; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) dev_info(dev, "%d ", otp_ptr->lsc_data.data[i * w + j]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (i < h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) dev_info(dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) memset(lsc_buf, 0, LSC_DATA_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) ret |= read_reg_otp_buf(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) RK_LSC_RESERVED_SIZE, lsc_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) for (i = 0; i < RK_LSC_RESERVED_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) checksum += lsc_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) base_addr += RK_LSC_RESERVED_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 1, &otp_ptr->lsc_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if ((checksum % 255 + 1) == otp_ptr->lsc_data.checksum && (!ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) otp_ptr->lsc_data.flag = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) otp_ptr->flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) dev_info(dev, "lsc info:(version 0x%x, checksum 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) otp_ptr->lsc_data.version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) (int)otp_ptr->lsc_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) otp_ptr->lsc_data.flag = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) dev_info(dev, "lsc info: checksum err, checksum %d, reg_checksum %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) (int)(checksum % 255 + 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) (int)otp_ptr->lsc_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) kfree(lsc_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) static void rkotp_read_pdaf(struct eeprom_device *eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) struct otp_info *otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) u32 base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) u32 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) u8 *pdaf_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) int w, h, j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) pdaf_buf = kzalloc(RK_GAINMAP_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) if (!pdaf_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) dev_err(dev, "%s ENOMEM!\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) ret = read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 4, &otp_ptr->pdaf_data.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) checksum += otp_ptr->pdaf_data.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) base_addr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 2, &otp_ptr->pdaf_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) checksum += otp_ptr->pdaf_data.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 1, &otp_ptr->pdaf_data.gainmap_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) checksum += otp_ptr->pdaf_data.gainmap_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 1, &otp_ptr->pdaf_data.gainmap_height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) checksum += otp_ptr->pdaf_data.gainmap_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) ret |= read_reg_otp_buf(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) RK_GAINMAP_SIZE, pdaf_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) base_addr += RK_GAINMAP_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) for (i = 0; i < RK_GAINMAP_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) otp_ptr->pdaf_data.gainmap[i] = pdaf_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) checksum += otp_ptr->pdaf_data.gainmap[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) w = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) h = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) dev_info(dev, "show pdaf gainmap table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) for (i = 0; i < h; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) for (j = 0; j < w; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) dev_info(dev, "%d ", otp_ptr->pdaf_data.gainmap[i * w + j]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (i < h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) dev_info(dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 1, &otp_ptr->pdaf_data.gainmap_checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) checksum += otp_ptr->pdaf_data.gainmap_checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 1, &otp_ptr->pdaf_data.dcc_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) checksum += otp_ptr->pdaf_data.dcc_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 1, &otp_ptr->pdaf_data.dcc_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) checksum += otp_ptr->pdaf_data.dcc_dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 1, &otp_ptr->pdaf_data.dccmap_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) checksum += otp_ptr->pdaf_data.dccmap_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 1, &otp_ptr->pdaf_data.dccmap_height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) checksum += otp_ptr->pdaf_data.dccmap_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) memset(pdaf_buf, 0, RK_DCCMAP_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) ret |= read_reg_otp_buf(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) RK_DCCMAP_SIZE, pdaf_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) for (i = 0; i < RK_DCCMAP_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) otp_ptr->pdaf_data.dccmap[i] = pdaf_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) checksum += otp_ptr->pdaf_data.dccmap[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) base_addr += RK_DCCMAP_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) w = 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) h = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) dev_info(dev, "show pdaf dccmap table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) for (i = 0; i < h; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) for (j = 0; j < w; j++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) dev_info(dev, "%d ", otp_ptr->pdaf_data.dccmap[i * w + j]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (i < h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) dev_info(dev, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 1, &otp_ptr->pdaf_data.dccmap_checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) checksum += otp_ptr->pdaf_data.dccmap_checksum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) memset(pdaf_buf, 0, RK_PDAF_RESERVED_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) ret |= read_reg_otp_buf(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) RK_PDAF_RESERVED_SIZE, pdaf_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) for (i = 0; i < RK_PDAF_RESERVED_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) checksum += pdaf_buf[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) base_addr += RK_PDAF_RESERVED_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 1, &otp_ptr->pdaf_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) if ((checksum % 255 + 1) == otp_ptr->pdaf_data.checksum && (!ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) otp_ptr->pdaf_data.flag = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) otp_ptr->flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) dev_info(dev, "pdaf info:(version 0x%x, checksum 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) otp_ptr->pdaf_data.version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) (int)otp_ptr->pdaf_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) otp_ptr->pdaf_data.flag = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) dev_info(dev, "pdaf info: checksum err, checksum %d, reg_checksum %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) (int)(checksum % 255 + 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) (int)otp_ptr->pdaf_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) kfree(pdaf_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) static void rkotp_read_af(struct eeprom_device *eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) struct otp_info *otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) u32 base_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) u32 checksum = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) u32 temp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) ret = read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 4, &otp_ptr->af_data.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) checksum += otp_ptr->af_data.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) base_addr += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 2, &otp_ptr->af_data.version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) checksum += otp_ptr->af_data.version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 2, &otp_ptr->af_data.af_inf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) checksum += otp_ptr->af_data.af_inf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 2, &otp_ptr->af_data.af_macro);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) checksum += otp_ptr->af_data.af_macro;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) base_addr += 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) for (i = 0; i < RK_AF_RESERVED_SIZE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 1, &temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) checksum += temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) base_addr += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) ret |= read_reg_otp(client, base_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 1, &otp_ptr->af_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if ((checksum % 255 + 1) == otp_ptr->af_data.checksum && (!ret)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) otp_ptr->af_data.flag = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) otp_ptr->flag++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) dev_info(dev, "af info:(version 0x%x, checksum 0x%x)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) otp_ptr->af_data.version,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) (int)otp_ptr->af_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) otp_ptr->af_data.flag = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) dev_info(dev, "af info: checksum err, checksum %d, reg_checksum %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) (int)(checksum % 255 + 1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) (int)otp_ptr->af_data.checksum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) static int rkotp_read_data(struct eeprom_device *eeprom_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) struct otp_info *otp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) struct device *dev = &eeprom_dev->client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) u32 id = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) u32 base_addr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) otp_ptr = kzalloc(sizeof(*otp_ptr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) if (!otp_ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) base_addr = RKOTP_REG_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) otp_ptr->flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) for (i = 0; i < RKOTP_MAX_MODULE; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) read_reg_otp(client, base_addr, 1, &id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) dev_info(dev, "show block id %d, addr 0x%x\n", id, base_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) switch (id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) case RKOTP_INFO_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) rkotp_read_module_info(eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) base_addr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) base_addr += 0x28;//v1 0x30 v2 0x28;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) case RKOTP_AWB_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) rkotp_read_awb(eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) base_addr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) base_addr += 0x30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) case RKOTP_LSC_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) rkotp_read_lsc(eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) base_addr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) base_addr += 0x930;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) case RKOTP_PDAF_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) rkotp_read_pdaf(eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) base_addr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) base_addr += 0xA30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) case RKOTP_AF_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) rkotp_read_af(eeprom_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) otp_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) base_addr + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) base_addr += 0x20;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) id = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) if (id == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) if (otp_ptr->flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) eeprom_dev->otp = otp_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) dev_info(dev, "rkotp read successful!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) eeprom_dev->otp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) kfree(otp_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) dev_warn(&client->dev, "otp is NULL!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) ret = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) static int otp_read(struct eeprom_device *eeprom_dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) u8 vendor_flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) struct i2c_client *client = eeprom_dev->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) mutex_lock(&eeprom_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) vendor_flag = get_vendor_flag(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) if (vendor_flag == 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) otp_read_data(eeprom_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) else if (vendor_flag == 0x40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) rkotp_read_data(eeprom_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) dev_warn(&client->dev, "no vendor flag infos!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) mutex_unlock(&eeprom_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) mutex_unlock(&eeprom_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) static long eeprom_ioctl(struct v4l2_subdev *sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) unsigned int cmd, void *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) struct eeprom_device *eeprom_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) sd_to_eeprom(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) long ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) if (!eeprom_dev->otp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (otp_read(eeprom_dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) if (arg && eeprom_dev->otp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) memcpy(arg, eeprom_dev->otp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) sizeof(struct otp_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) #ifdef CONFIG_PROC_FS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) static int otp_eeprom_show(struct seq_file *p, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) struct eeprom_device *dev = p->private;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) int j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) u32 gainmap_w, gainmap_h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) u32 dccmap_w, dccmap_h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) if (dev && dev->otp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) seq_puts(p, "[Header]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) seq_puts(p, "version=1.0;\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (dev->otp->awb_data.flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) seq_puts(p, "[RKAWBOTPParam]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) seq_printf(p, "flag=%d;\n", dev->otp->awb_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) seq_printf(p, "r_value=%d;\n", dev->otp->awb_data.r_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) seq_printf(p, "b_value=%d;\n", dev->otp->awb_data.b_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) seq_printf(p, "gr_value=%d;\n", dev->otp->awb_data.g_ratio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) seq_puts(p, "gb_value=-1;\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) seq_printf(p, "golden_r_value=%d;\n", dev->otp->awb_data.r_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) seq_printf(p, "golden_b_value=%d;\n", dev->otp->awb_data.b_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) seq_printf(p, "golden_gr_value=%d;\n", dev->otp->awb_data.g_golden);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) seq_puts(p, "golden_gb_value=-1;\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) seq_puts(p, "[RKLSCOTPParam]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) seq_printf(p, "flag=%d;\n", dev->otp->lsc_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) seq_printf(p, "width=%d;\n", dev->otp->basic_data.size.width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) seq_printf(p, "height=%d;\n", dev->otp->basic_data.size.height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) seq_printf(p, "tablesize=%d;\n\n", dev->otp->lsc_data.table_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) seq_puts(p, "lsc_r_table=\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) for (i = 0; i < 17; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) for (j = 0; j < 17; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2] << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) | dev->otp->lsc_data.data[(i * 17 + j) * 2 + 1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (j < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) seq_puts(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) if (i < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) seq_puts(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) seq_puts(p, "\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) if (dev->otp->lsc_data.flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) seq_puts(p, "lsc_b_table=\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) for (i = 0; i < 17; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) for (j = 0; j < 17; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) 1734] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) 2 + 1735]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) if (j < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) seq_puts(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (i < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) seq_puts(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) seq_puts(p, "\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) seq_puts(p, "lsc_gr_table=\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) for (i = 0; i < 17; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) for (j = 0; j < 17; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) 578] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) 2 + 579]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) if (j < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) seq_puts(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) if (i < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) seq_puts(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) seq_puts(p, "\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) seq_puts(p, "lsc_gb_table=\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) for (i = 0; i < 17; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) for (j = 0; j < 17; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) seq_printf(p, "%d", (dev->otp->lsc_data.data[(i * 17 + j) * 2 +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) 1156] << 8) | dev->otp->lsc_data.data[(i * 17 + j) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) 2 + 1157]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (j < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) seq_puts(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) if (i < 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) seq_puts(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) seq_puts(p, "\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (dev->otp->pdaf_data.flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) gainmap_w = dev->otp->pdaf_data.gainmap_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) gainmap_h = dev->otp->pdaf_data.gainmap_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) dccmap_w = dev->otp->pdaf_data.dccmap_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) dccmap_h = dev->otp->pdaf_data.dccmap_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) seq_printf(p, "[RKPDAFOTPParam]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) seq_printf(p, "flag=%d;\n", dev->otp->pdaf_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) seq_printf(p, "gainmap_width=%d;\n", gainmap_w);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) seq_printf(p, "gainmap_height=%d;\n", gainmap_h);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) seq_printf(p, "gainmap_table=\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) for (i = 0; i < gainmap_h; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) for (j = 0; j < gainmap_w; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) seq_printf(p, "%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) (dev->otp->pdaf_data.gainmap[(i * gainmap_w + j) * 2] << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) dev->otp->pdaf_data.gainmap[(i * gainmap_w + j) * 2 + 1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) if (j < gainmap_w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) seq_printf(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (i < gainmap_h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) seq_printf(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) seq_printf(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) seq_printf(p, "dcc_mode=%d\n", dev->otp->pdaf_data.dcc_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) seq_printf(p, "dcc_dir=%d\n", dev->otp->pdaf_data.dcc_dir);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) seq_printf(p, "dccmap_width=%d\n", dev->otp->pdaf_data.dccmap_width);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) seq_printf(p, "dccmap_height=%d\n", dev->otp->pdaf_data.dccmap_height);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) for (i = 0; i < dccmap_h; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) for (j = 0; j < dccmap_w; j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) seq_printf(p, "%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) (dev->otp->pdaf_data.dccmap[(i * dccmap_w + j) * 2] << 8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) dev->otp->pdaf_data.dccmap[(i * dccmap_w + j) * 2 + 1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (j < dccmap_w)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) seq_printf(p, " ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) if (i < dccmap_h)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) seq_printf(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) seq_printf(p, "\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) if (dev->otp->af_data.flag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) seq_printf(p, "[RKAFOTPParam]\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) seq_printf(p, "flag=%d;\n", dev->otp->af_data.flag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) seq_printf(p, "af_inf=%d;\n", dev->otp->af_data.af_inf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) seq_printf(p, "af_macro=%d;\n", dev->otp->af_data.af_macro);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) seq_puts(p, "otp is null!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) static int eeprom_open(struct inode *inode, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) struct eeprom_device *data = PDE_DATA(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) return single_open(file, otp_eeprom_show, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) static const struct proc_ops ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) .proc_open = eeprom_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) .proc_read = seq_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) .proc_lseek = seq_lseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) .proc_release = single_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) static int eeprom_proc_init(struct eeprom_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) dev->procfs = proc_create_data(dev->name, 0, NULL, &ops, dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) if (!dev->procfs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) static void eeprom_proc_cleanup(struct eeprom_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (dev->procfs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) remove_proc_entry(dev->name, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) dev->procfs = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) static const struct v4l2_subdev_core_ops eeprom_core_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) .ioctl = eeprom_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) static const struct v4l2_subdev_ops eeprom_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) .core = &eeprom_core_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) static void eeprom_subdev_cleanup(struct eeprom_device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) v4l2_device_unregister_subdev(&dev->sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) media_entity_cleanup(&dev->sd.entity);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) static int eeprom_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) struct eeprom_device *eeprom_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) dev_info(&client->dev, "driver version: %02x.%02x.%02x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) DRIVER_VERSION >> 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) (DRIVER_VERSION & 0xff00) >> 8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) DRIVER_VERSION & 0x00ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) eeprom_dev = devm_kzalloc(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) sizeof(*eeprom_dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) if (eeprom_dev == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) dev_err(&client->dev, "Probe failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) mutex_init(&eeprom_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) v4l2_i2c_subdev_init(&eeprom_dev->sd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) client, &eeprom_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) eeprom_dev->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) snprintf(eeprom_dev->name, sizeof(eeprom_dev->name), "%s-%d-%02x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) DEVICE_NAME, i2c_adapter_id(client->adapter), client->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) eeprom_proc_init(eeprom_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) pm_runtime_set_active(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) pm_runtime_enable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) pm_runtime_idle(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) dev_info(&client->dev, "probing successful\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) static int eeprom_remove(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) struct v4l2_subdev *sd = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) struct eeprom_device *eeprom_dev =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) sd_to_eeprom(sd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) kfree(eeprom_dev->otp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) mutex_destroy(&eeprom_dev->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) pm_runtime_disable(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) eeprom_subdev_cleanup(eeprom_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) eeprom_proc_cleanup(eeprom_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) static int __maybe_unused eeprom_suspend(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) static int __maybe_unused eeprom_resume(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) static const struct i2c_device_id eeprom_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) { DEVICE_NAME, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) { { 0 } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) MODULE_DEVICE_TABLE(i2c, eeprom_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) static const struct of_device_id eeprom_of_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) { .compatible = "rk,otp_eeprom" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) { { 0 } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) MODULE_DEVICE_TABLE(of, eeprom_of_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) static const struct dev_pm_ops eeprom_pm_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) SET_SYSTEM_SLEEP_PM_OPS(eeprom_suspend, eeprom_resume)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) SET_RUNTIME_PM_OPS(eeprom_suspend, eeprom_resume, NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) static struct i2c_driver eeprom_i2c_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) .name = DEVICE_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) .pm = &eeprom_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) .of_match_table = eeprom_of_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) .probe = &eeprom_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) .remove = &eeprom_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) .id_table = eeprom_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) module_i2c_driver(eeprom_i2c_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) MODULE_DESCRIPTION("OTP driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) MODULE_LICENSE("GPL v2");