1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2017-2020 Jacopo Mondi 4 * Copyright (C) 2017-2020 Kieran Bingham 5 * Copyright (C) 2017-2020 Laurent Pinchart 6 * Copyright (C) 2017-2020 Niklas Söderlund 7 * Copyright (C) 2016 Renesas Electronics Corporation 8 * Copyright (C) 2015 Cogent Embedded, Inc. 9 * 10 * This file exports functions to control the Maxim MAX9271 GMSL serializer 11 * chip. This is not a self-contained driver, as MAX9271 is usually embedded in 12 * camera modules with at least one image sensor and optional additional 13 * components, such as uController units or ISPs/DSPs. 14 * 15 * Drivers for the camera modules (i.e. rdacm20/21) are expected to use 16 * functions exported from this library driver to maximize code re-use. 17 */ 18 19 #include <linux/delay.h> 20 #include <linux/i2c.h> 21 22 #include "max9271.h" 23 24 static int max9271_read(struct max9271_device *dev, u8 reg) 25 { 26 int ret; 27 28 dev_dbg(&dev->client->dev, "%s(0x%02x)\n", __func__, reg); 29 30 ret = i2c_smbus_read_byte_data(dev->client, reg); 31 if (ret < 0) 32 dev_dbg(&dev->client->dev, 33 "%s: register 0x%02x read failed (%d)\n", 34 __func__, reg, ret); 35 36 return ret; 37 } 38 39 static int max9271_write(struct max9271_device *dev, u8 reg, u8 val) 40 { 41 int ret; 42 43 dev_dbg(&dev->client->dev, "%s(0x%02x, 0x%02x)\n", __func__, reg, val); 44 45 ret = i2c_smbus_write_byte_data(dev->client, reg, val); 46 if (ret < 0) 47 dev_err(&dev->client->dev, 48 "%s: register 0x%02x write failed (%d)\n", 49 __func__, reg, ret); 50 51 return ret; 52 } 53 54 /* 55 * max9271_pclk_detect() - Detect valid pixel clock from image sensor 56 * 57 * Wait up to 10ms for a valid pixel clock. 58 * 59 * Returns 0 for success, < 0 for pixel clock not properly detected 60 */ 61 static int max9271_pclk_detect(struct max9271_device *dev) 62 { 63 unsigned int i; 64 int ret; 65 66 for (i = 0; i < 100; i++) { 67 ret = max9271_read(dev, 0x15); 68 if (ret < 0) 69 return ret; 70 71 if (ret & MAX9271_PCLKDET) 72 return 0; 73 74 usleep_range(50, 100); 75 } 76 77 dev_err(&dev->client->dev, "Unable to detect valid pixel clock\n"); 78 79 return -EIO; 80 } 81 82 int max9271_set_serial_link(struct max9271_device *dev, bool enable) 83 { 84 int ret; 85 u8 val = MAX9271_REVCCEN | MAX9271_FWDCCEN; 86 87 if (enable) { 88 ret = max9271_pclk_detect(dev); 89 if (ret) 90 return ret; 91 92 val |= MAX9271_SEREN; 93 } else { 94 val |= MAX9271_CLINKEN; 95 } 96 97 /* 98 * The serializer temporarily disables the reverse control channel for 99 * 350µs after starting/stopping the forward serial link, but the 100 * deserializer synchronization time isn't clearly documented. 101 * 102 * According to the serializer datasheet we should wait 3ms, while 103 * according to the deserializer datasheet we should wait 5ms. 104 * 105 * Short delays here appear to show bit-errors in the writes following. 106 * Therefore a conservative delay seems best here. 107 */ 108 max9271_write(dev, 0x04, val); 109 usleep_range(5000, 8000); 110 111 return 0; 112 } 113 EXPORT_SYMBOL_GPL(max9271_set_serial_link); 114 115 int max9271_configure_i2c(struct max9271_device *dev, u8 i2c_config) 116 { 117 int ret; 118 119 ret = max9271_write(dev, 0x0d, i2c_config); 120 if (ret) 121 return ret; 122 123 /* The delay required after an I2C bus configuration change is not 124 * characterized in the serializer manual. Sleep up to 5msec to 125 * stay safe. 126 */ 127 usleep_range(3500, 5000); 128 129 return 0; 130 } 131 EXPORT_SYMBOL_GPL(max9271_configure_i2c); 132 133 int max9271_set_high_threshold(struct max9271_device *dev, bool enable) 134 { 135 int ret; 136 137 ret = max9271_read(dev, 0x08); 138 if (ret < 0) 139 return ret; 140 141 /* 142 * Enable or disable reverse channel high threshold to increase 143 * immunity to power supply noise. 144 */ 145 max9271_write(dev, 0x08, enable ? ret | BIT(0) : ret & ~BIT(0)); 146 usleep_range(2000, 2500); 147 148 return 0; 149 } 150 EXPORT_SYMBOL_GPL(max9271_set_high_threshold); 151 152 int max9271_configure_gmsl_link(struct max9271_device *dev) 153 { 154 /* 155 * Configure the GMSL link: 156 * 157 * - Double input mode, high data rate, 24-bit mode 158 * - Latch input data on PCLKIN rising edge 159 * - Enable HS/VS encoding 160 * - 1-bit parity error detection 161 * 162 * TODO: Make the GMSL link configuration parametric. 163 */ 164 max9271_write(dev, 0x07, MAX9271_DBL | MAX9271_HVEN | 165 MAX9271_EDC_1BIT_PARITY); 166 usleep_range(5000, 8000); 167 168 /* 169 * Adjust spread spectrum to +4% and auto-detect pixel clock 170 * and serial link rate. 171 */ 172 max9271_write(dev, 0x02, MAX9271_SPREAD_SPECT_4 | MAX9271_R02_RES | 173 MAX9271_PCLK_AUTODETECT | MAX9271_SERIAL_AUTODETECT); 174 usleep_range(5000, 8000); 175 176 return 0; 177 } 178 EXPORT_SYMBOL_GPL(max9271_configure_gmsl_link); 179 180 int max9271_set_gpios(struct max9271_device *dev, u8 gpio_mask) 181 { 182 int ret; 183 184 ret = max9271_read(dev, 0x0f); 185 if (ret < 0) 186 return 0; 187 188 ret |= gpio_mask; 189 ret = max9271_write(dev, 0x0f, ret); 190 if (ret < 0) { 191 dev_err(&dev->client->dev, "Failed to set gpio (%d)\n", ret); 192 return ret; 193 } 194 195 usleep_range(3500, 5000); 196 197 return 0; 198 } 199 EXPORT_SYMBOL_GPL(max9271_set_gpios); 200 201 int max9271_clear_gpios(struct max9271_device *dev, u8 gpio_mask) 202 { 203 int ret; 204 205 ret = max9271_read(dev, 0x0f); 206 if (ret < 0) 207 return 0; 208 209 ret &= ~gpio_mask; 210 ret = max9271_write(dev, 0x0f, ret); 211 if (ret < 0) { 212 dev_err(&dev->client->dev, "Failed to clear gpio (%d)\n", ret); 213 return ret; 214 } 215 216 usleep_range(3500, 5000); 217 218 return 0; 219 } 220 EXPORT_SYMBOL_GPL(max9271_clear_gpios); 221 222 int max9271_enable_gpios(struct max9271_device *dev, u8 gpio_mask) 223 { 224 int ret; 225 226 ret = max9271_read(dev, 0x0f); 227 if (ret < 0) 228 return 0; 229 230 /* BIT(0) reserved: GPO is always enabled. */ 231 ret |= gpio_mask | BIT(0); 232 ret = max9271_write(dev, 0x0e, ret); 233 if (ret < 0) { 234 dev_err(&dev->client->dev, "Failed to enable gpio (%d)\n", ret); 235 return ret; 236 } 237 238 usleep_range(3500, 5000); 239 240 return 0; 241 } 242 EXPORT_SYMBOL_GPL(max9271_enable_gpios); 243 244 int max9271_disable_gpios(struct max9271_device *dev, u8 gpio_mask) 245 { 246 int ret; 247 248 ret = max9271_read(dev, 0x0f); 249 if (ret < 0) 250 return 0; 251 252 /* BIT(0) reserved: GPO cannot be disabled */ 253 ret &= (~gpio_mask | BIT(0)); 254 ret = max9271_write(dev, 0x0e, ret); 255 if (ret < 0) { 256 dev_err(&dev->client->dev, "Failed to disable gpio (%d)\n", ret); 257 return ret; 258 } 259 260 usleep_range(3500, 5000); 261 262 return 0; 263 } 264 EXPORT_SYMBOL_GPL(max9271_disable_gpios); 265 266 int max9271_verify_id(struct max9271_device *dev) 267 { 268 int ret; 269 270 ret = max9271_read(dev, 0x1e); 271 if (ret < 0) { 272 dev_err(&dev->client->dev, "MAX9271 ID read failed (%d)\n", 273 ret); 274 return ret; 275 } 276 277 if (ret != MAX9271_ID) { 278 dev_err(&dev->client->dev, "MAX9271 ID mismatch (0x%02x)\n", 279 ret); 280 return -ENXIO; 281 } 282 283 return 0; 284 } 285 EXPORT_SYMBOL_GPL(max9271_verify_id); 286 287 int max9271_set_address(struct max9271_device *dev, u8 addr) 288 { 289 int ret; 290 291 ret = max9271_write(dev, 0x00, addr << 1); 292 if (ret < 0) { 293 dev_err(&dev->client->dev, 294 "MAX9271 I2C address change failed (%d)\n", ret); 295 return ret; 296 } 297 usleep_range(3500, 5000); 298 299 return 0; 300 } 301 EXPORT_SYMBOL_GPL(max9271_set_address); 302 303 int max9271_set_deserializer_address(struct max9271_device *dev, u8 addr) 304 { 305 int ret; 306 307 ret = max9271_write(dev, 0x01, addr << 1); 308 if (ret < 0) { 309 dev_err(&dev->client->dev, 310 "MAX9271 deserializer address set failed (%d)\n", ret); 311 return ret; 312 } 313 usleep_range(3500, 5000); 314 315 return 0; 316 } 317 EXPORT_SYMBOL_GPL(max9271_set_deserializer_address); 318 319 int max9271_set_translation(struct max9271_device *dev, u8 source, u8 dest) 320 { 321 int ret; 322 323 ret = max9271_write(dev, 0x09, source << 1); 324 if (ret < 0) { 325 dev_err(&dev->client->dev, 326 "MAX9271 I2C translation setup failed (%d)\n", ret); 327 return ret; 328 } 329 usleep_range(3500, 5000); 330 331 ret = max9271_write(dev, 0x0a, dest << 1); 332 if (ret < 0) { 333 dev_err(&dev->client->dev, 334 "MAX9271 I2C translation setup failed (%d)\n", ret); 335 return ret; 336 } 337 usleep_range(3500, 5000); 338 339 return 0; 340 } 341 EXPORT_SYMBOL_GPL(max9271_set_translation); 342