18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * drivers/media/i2c/smiapp/smiapp-quirk.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Generic driver for SMIA/SMIA++ compliant camera modules 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2011--2012 Nokia Corporation 88c2ecf20Sopenharmony_ci * Contact: Sakari Ailus <sakari.ailus@iki.fi> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __SMIAPP_QUIRK__ 128c2ecf20Sopenharmony_ci#define __SMIAPP_QUIRK__ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistruct smiapp_sensor; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci/** 178c2ecf20Sopenharmony_ci * struct smiapp_quirk - quirks for sensors that deviate from SMIA++ standard 188c2ecf20Sopenharmony_ci * 198c2ecf20Sopenharmony_ci * @limits: Replace sensor->limits with values which can't be read from 208c2ecf20Sopenharmony_ci * sensor registers. Called the first time the sensor is powered up. 218c2ecf20Sopenharmony_ci * @post_poweron: Called always after the sensor has been fully powered on. 228c2ecf20Sopenharmony_ci * @pre_streamon: Called just before streaming is enabled. 238c2ecf20Sopenharmony_ci * @post_streamon: Called right after stopping streaming. 248c2ecf20Sopenharmony_ci * @pll_flags: Return flags for the PLL calculator. 258c2ecf20Sopenharmony_ci * @init: Quirk initialisation, called the last in probe(). This is 268c2ecf20Sopenharmony_ci * also appropriate for adding sensor specific controls, for instance. 278c2ecf20Sopenharmony_ci * @reg_access: Register access quirk. The quirk may divert the access 288c2ecf20Sopenharmony_ci * to another register, or no register at all. 298c2ecf20Sopenharmony_ci * 308c2ecf20Sopenharmony_ci * @write: Is this read (false) or write (true) access? 318c2ecf20Sopenharmony_ci * @reg: Pointer to the register to access 328c2ecf20Sopenharmony_ci * @value: Register value, set by the caller on write, or 338c2ecf20Sopenharmony_ci * by the quirk on read 348c2ecf20Sopenharmony_ci * 358c2ecf20Sopenharmony_ci * @return: 0 on success, -ENOIOCTLCMD if no register 368c2ecf20Sopenharmony_ci * access may be done by the caller (default read 378c2ecf20Sopenharmony_ci * value is zero), else negative error code on error 388c2ecf20Sopenharmony_ci */ 398c2ecf20Sopenharmony_cistruct smiapp_quirk { 408c2ecf20Sopenharmony_ci int (*limits)(struct smiapp_sensor *sensor); 418c2ecf20Sopenharmony_ci int (*post_poweron)(struct smiapp_sensor *sensor); 428c2ecf20Sopenharmony_ci int (*pre_streamon)(struct smiapp_sensor *sensor); 438c2ecf20Sopenharmony_ci int (*post_streamoff)(struct smiapp_sensor *sensor); 448c2ecf20Sopenharmony_ci unsigned long (*pll_flags)(struct smiapp_sensor *sensor); 458c2ecf20Sopenharmony_ci int (*init)(struct smiapp_sensor *sensor); 468c2ecf20Sopenharmony_ci int (*reg_access)(struct smiapp_sensor *sensor, bool write, u32 *reg, 478c2ecf20Sopenharmony_ci u32 *val); 488c2ecf20Sopenharmony_ci unsigned long flags; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define SMIAPP_QUIRK_FLAG_8BIT_READ_ONLY (1 << 0) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistruct smiapp_reg_8 { 548c2ecf20Sopenharmony_ci u16 reg; 558c2ecf20Sopenharmony_ci u8 val; 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_civoid smiapp_replace_limit(struct smiapp_sensor *sensor, 598c2ecf20Sopenharmony_ci u32 limit, u32 val); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci#define SMIAPP_MK_QUIRK_REG_8(_reg, _val) \ 628c2ecf20Sopenharmony_ci { \ 638c2ecf20Sopenharmony_ci .reg = (u16)_reg, \ 648c2ecf20Sopenharmony_ci .val = _val, \ 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci#define smiapp_call_quirk(sensor, _quirk, ...) \ 688c2ecf20Sopenharmony_ci ((sensor)->minfo.quirk && \ 698c2ecf20Sopenharmony_ci (sensor)->minfo.quirk->_quirk ? \ 708c2ecf20Sopenharmony_ci (sensor)->minfo.quirk->_quirk(sensor, ##__VA_ARGS__) : 0) 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci#define smiapp_needs_quirk(sensor, _quirk) \ 738c2ecf20Sopenharmony_ci ((sensor)->minfo.quirk ? \ 748c2ecf20Sopenharmony_ci (sensor)->minfo.quirk->flags & _quirk : 0) 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ciextern const struct smiapp_quirk smiapp_jt8ev1_quirk; 778c2ecf20Sopenharmony_ciextern const struct smiapp_quirk smiapp_imx125es_quirk; 788c2ecf20Sopenharmony_ciextern const struct smiapp_quirk smiapp_jt8ew9_quirk; 798c2ecf20Sopenharmony_ciextern const struct smiapp_quirk smiapp_tcm8500md_quirk; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#endif /* __SMIAPP_QUIRK__ */ 82