1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * drivers/media/i2c/smiapp/smiapp-quirk.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Generic driver for SMIA/SMIA++ compliant camera modules 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 2011--2012 Nokia Corporation 8*4882a593Smuzhiyun * Contact: Sakari Ailus <sakari.ailus@iki.fi> 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __SMIAPP_QUIRK__ 12*4882a593Smuzhiyun #define __SMIAPP_QUIRK__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct smiapp_sensor; 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /** 17*4882a593Smuzhiyun * struct smiapp_quirk - quirks for sensors that deviate from SMIA++ standard 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * @limits: Replace sensor->limits with values which can't be read from 20*4882a593Smuzhiyun * sensor registers. Called the first time the sensor is powered up. 21*4882a593Smuzhiyun * @post_poweron: Called always after the sensor has been fully powered on. 22*4882a593Smuzhiyun * @pre_streamon: Called just before streaming is enabled. 23*4882a593Smuzhiyun * @post_streamon: Called right after stopping streaming. 24*4882a593Smuzhiyun * @pll_flags: Return flags for the PLL calculator. 25*4882a593Smuzhiyun * @init: Quirk initialisation, called the last in probe(). This is 26*4882a593Smuzhiyun * also appropriate for adding sensor specific controls, for instance. 27*4882a593Smuzhiyun * @reg_access: Register access quirk. The quirk may divert the access 28*4882a593Smuzhiyun * to another register, or no register at all. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * @write: Is this read (false) or write (true) access? 31*4882a593Smuzhiyun * @reg: Pointer to the register to access 32*4882a593Smuzhiyun * @value: Register value, set by the caller on write, or 33*4882a593Smuzhiyun * by the quirk on read 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * @return: 0 on success, -ENOIOCTLCMD if no register 36*4882a593Smuzhiyun * access may be done by the caller (default read 37*4882a593Smuzhiyun * value is zero), else negative error code on error 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun struct smiapp_quirk { 40*4882a593Smuzhiyun int (*limits)(struct smiapp_sensor *sensor); 41*4882a593Smuzhiyun int (*post_poweron)(struct smiapp_sensor *sensor); 42*4882a593Smuzhiyun int (*pre_streamon)(struct smiapp_sensor *sensor); 43*4882a593Smuzhiyun int (*post_streamoff)(struct smiapp_sensor *sensor); 44*4882a593Smuzhiyun unsigned long (*pll_flags)(struct smiapp_sensor *sensor); 45*4882a593Smuzhiyun int (*init)(struct smiapp_sensor *sensor); 46*4882a593Smuzhiyun int (*reg_access)(struct smiapp_sensor *sensor, bool write, u32 *reg, 47*4882a593Smuzhiyun u32 *val); 48*4882a593Smuzhiyun unsigned long flags; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define SMIAPP_QUIRK_FLAG_8BIT_READ_ONLY (1 << 0) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct smiapp_reg_8 { 54*4882a593Smuzhiyun u16 reg; 55*4882a593Smuzhiyun u8 val; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun void smiapp_replace_limit(struct smiapp_sensor *sensor, 59*4882a593Smuzhiyun u32 limit, u32 val); 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define SMIAPP_MK_QUIRK_REG_8(_reg, _val) \ 62*4882a593Smuzhiyun { \ 63*4882a593Smuzhiyun .reg = (u16)_reg, \ 64*4882a593Smuzhiyun .val = _val, \ 65*4882a593Smuzhiyun } 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define smiapp_call_quirk(sensor, _quirk, ...) \ 68*4882a593Smuzhiyun ((sensor)->minfo.quirk && \ 69*4882a593Smuzhiyun (sensor)->minfo.quirk->_quirk ? \ 70*4882a593Smuzhiyun (sensor)->minfo.quirk->_quirk(sensor, ##__VA_ARGS__) : 0) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define smiapp_needs_quirk(sensor, _quirk) \ 73*4882a593Smuzhiyun ((sensor)->minfo.quirk ? \ 74*4882a593Smuzhiyun (sensor)->minfo.quirk->flags & _quirk : 0) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun extern const struct smiapp_quirk smiapp_jt8ev1_quirk; 77*4882a593Smuzhiyun extern const struct smiapp_quirk smiapp_imx125es_quirk; 78*4882a593Smuzhiyun extern const struct smiapp_quirk smiapp_jt8ew9_quirk; 79*4882a593Smuzhiyun extern const struct smiapp_quirk smiapp_tcm8500md_quirk; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #endif /* __SMIAPP_QUIRK__ */ 82