1*34009bffSJacopo Mondi /* SPDX-License-Identifier: GPL-2.0+ */ 2*34009bffSJacopo Mondi /* 3*34009bffSJacopo Mondi * Copyright (C) 2017-2020 Jacopo Mondi 4*34009bffSJacopo Mondi * Copyright (C) 2017-2020 Kieran Bingham 5*34009bffSJacopo Mondi * Copyright (C) 2017-2020 Laurent Pinchart 6*34009bffSJacopo Mondi * Copyright (C) 2017-2020 Niklas Söderlund 7*34009bffSJacopo Mondi * Copyright (C) 2016 Renesas Electronics Corporation 8*34009bffSJacopo Mondi * Copyright (C) 2015 Cogent Embedded, Inc. 9*34009bffSJacopo Mondi */ 10*34009bffSJacopo Mondi 11*34009bffSJacopo Mondi #include <linux/i2c.h> 12*34009bffSJacopo Mondi 13*34009bffSJacopo Mondi #define MAX9271_DEFAULT_ADDR 0x40 14*34009bffSJacopo Mondi 15*34009bffSJacopo Mondi /* Register 0x02 */ 16*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_0 (0 << 5) 17*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_05 (1 << 5) 18*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_15 (2 << 5) 19*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_1 (5 << 5) 20*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_2 (3 << 5) 21*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_3 (6 << 5) 22*34009bffSJacopo Mondi #define MAX9271_SPREAD_SPECT_4 (7 << 5) 23*34009bffSJacopo Mondi #define MAX9271_R02_RES BIT(4) 24*34009bffSJacopo Mondi #define MAX9271_PCLK_AUTODETECT (3 << 2) 25*34009bffSJacopo Mondi #define MAX9271_SERIAL_AUTODETECT (0x03) 26*34009bffSJacopo Mondi /* Register 0x04 */ 27*34009bffSJacopo Mondi #define MAX9271_SEREN BIT(7) 28*34009bffSJacopo Mondi #define MAX9271_CLINKEN BIT(6) 29*34009bffSJacopo Mondi #define MAX9271_PRBSEN BIT(5) 30*34009bffSJacopo Mondi #define MAX9271_SLEEP BIT(4) 31*34009bffSJacopo Mondi #define MAX9271_INTTYPE_I2C (0 << 2) 32*34009bffSJacopo Mondi #define MAX9271_INTTYPE_UART (1 << 2) 33*34009bffSJacopo Mondi #define MAX9271_INTTYPE_NONE (2 << 2) 34*34009bffSJacopo Mondi #define MAX9271_REVCCEN BIT(1) 35*34009bffSJacopo Mondi #define MAX9271_FWDCCEN BIT(0) 36*34009bffSJacopo Mondi /* Register 0x07 */ 37*34009bffSJacopo Mondi #define MAX9271_DBL BIT(7) 38*34009bffSJacopo Mondi #define MAX9271_DRS BIT(6) 39*34009bffSJacopo Mondi #define MAX9271_BWS BIT(5) 40*34009bffSJacopo Mondi #define MAX9271_ES BIT(4) 41*34009bffSJacopo Mondi #define MAX9271_HVEN BIT(2) 42*34009bffSJacopo Mondi #define MAX9271_EDC_1BIT_PARITY (0 << 0) 43*34009bffSJacopo Mondi #define MAX9271_EDC_6BIT_CRC (1 << 0) 44*34009bffSJacopo Mondi #define MAX9271_EDC_6BIT_HAMMING (2 << 0) 45*34009bffSJacopo Mondi /* Register 0x08 */ 46*34009bffSJacopo Mondi #define MAX9271_INVVS BIT(7) 47*34009bffSJacopo Mondi #define MAX9271_INVHS BIT(6) 48*34009bffSJacopo Mondi #define MAX9271_REV_LOGAIN BIT(3) 49*34009bffSJacopo Mondi #define MAX9271_REV_HIVTH BIT(0) 50*34009bffSJacopo Mondi /* Register 0x09 */ 51*34009bffSJacopo Mondi #define MAX9271_ID 0x09 52*34009bffSJacopo Mondi /* Register 0x0d */ 53*34009bffSJacopo Mondi #define MAX9271_I2CLOCACK BIT(7) 54*34009bffSJacopo Mondi #define MAX9271_I2CSLVSH_1046NS_469NS (3 << 5) 55*34009bffSJacopo Mondi #define MAX9271_I2CSLVSH_938NS_352NS (2 << 5) 56*34009bffSJacopo Mondi #define MAX9271_I2CSLVSH_469NS_234NS (1 << 5) 57*34009bffSJacopo Mondi #define MAX9271_I2CSLVSH_352NS_117NS (0 << 5) 58*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_837KBPS (7 << 2) 59*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_533KBPS (6 << 2) 60*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_339KBPS (5 << 2) 61*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_173KBPS (4 << 2) 62*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_105KBPS (3 << 2) 63*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_84KBPS (2 << 2) 64*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_28KBPS (1 << 2) 65*34009bffSJacopo Mondi #define MAX9271_I2CMSTBT_8KBPS (0 << 2) 66*34009bffSJacopo Mondi #define MAX9271_I2CSLVTO_NONE (3 << 0) 67*34009bffSJacopo Mondi #define MAX9271_I2CSLVTO_1024US (2 << 0) 68*34009bffSJacopo Mondi #define MAX9271_I2CSLVTO_256US (1 << 0) 69*34009bffSJacopo Mondi #define MAX9271_I2CSLVTO_64US (0 << 0) 70*34009bffSJacopo Mondi /* Register 0x0f */ 71*34009bffSJacopo Mondi #define MAX9271_GPIO5OUT BIT(5) 72*34009bffSJacopo Mondi #define MAX9271_GPIO4OUT BIT(4) 73*34009bffSJacopo Mondi #define MAX9271_GPIO3OUT BIT(3) 74*34009bffSJacopo Mondi #define MAX9271_GPIO2OUT BIT(2) 75*34009bffSJacopo Mondi #define MAX9271_GPIO1OUT BIT(1) 76*34009bffSJacopo Mondi #define MAX9271_GPO BIT(0) 77*34009bffSJacopo Mondi /* Register 0x15 */ 78*34009bffSJacopo Mondi #define MAX9271_PCLKDET BIT(0) 79*34009bffSJacopo Mondi 80*34009bffSJacopo Mondi /** 81*34009bffSJacopo Mondi * struct max9271_device - max9271 device 82*34009bffSJacopo Mondi * @client: The i2c client for the max9271 instance 83*34009bffSJacopo Mondi */ 84*34009bffSJacopo Mondi struct max9271_device { 85*34009bffSJacopo Mondi struct i2c_client *client; 86*34009bffSJacopo Mondi }; 87*34009bffSJacopo Mondi 88*34009bffSJacopo Mondi /** 89*34009bffSJacopo Mondi * max9271_set_serial_link() - Enable/disable serial link 90*34009bffSJacopo Mondi * @dev: The max9271 device 91*34009bffSJacopo Mondi * @enable: Serial link enable/disable flag 92*34009bffSJacopo Mondi * 93*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 94*34009bffSJacopo Mondi */ 95*34009bffSJacopo Mondi int max9271_set_serial_link(struct max9271_device *dev, bool enable); 96*34009bffSJacopo Mondi 97*34009bffSJacopo Mondi /** 98*34009bffSJacopo Mondi * max9271_configure_i2c() - Configure I2C bus parameters 99*34009bffSJacopo Mondi * @dev: The max9271 device 100*34009bffSJacopo Mondi * @i2c_config: The I2C bus configuration bit mask 101*34009bffSJacopo Mondi * 102*34009bffSJacopo Mondi * Configure MAX9271 I2C interface. The bus configuration provided in the 103*34009bffSJacopo Mondi * @i2c_config parameter shall be assembled using bit values defined by the 104*34009bffSJacopo Mondi * MAX9271_I2C* macros. 105*34009bffSJacopo Mondi * 106*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 107*34009bffSJacopo Mondi */ 108*34009bffSJacopo Mondi int max9271_configure_i2c(struct max9271_device *dev, u8 i2c_config); 109*34009bffSJacopo Mondi 110*34009bffSJacopo Mondi /** 111*34009bffSJacopo Mondi * max9271_set_high_threshold() - Enable or disable reverse channel high 112*34009bffSJacopo Mondi * threshold 113*34009bffSJacopo Mondi * @dev: The max9271 device 114*34009bffSJacopo Mondi * @enable: High threshold enable/disable flag 115*34009bffSJacopo Mondi * 116*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 117*34009bffSJacopo Mondi */ 118*34009bffSJacopo Mondi int max9271_set_high_threshold(struct max9271_device *dev, bool enable); 119*34009bffSJacopo Mondi 120*34009bffSJacopo Mondi /** 121*34009bffSJacopo Mondi * max9271_configure_gmsl_link() - Configure the GMSL link 122*34009bffSJacopo Mondi * @dev: The max9271 device 123*34009bffSJacopo Mondi * 124*34009bffSJacopo Mondi * FIXME: the GMSL link configuration is currently hardcoded and performed 125*34009bffSJacopo Mondi * by programming registers 0x04, 0x07 and 0x02. 126*34009bffSJacopo Mondi * 127*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 128*34009bffSJacopo Mondi */ 129*34009bffSJacopo Mondi int max9271_configure_gmsl_link(struct max9271_device *dev); 130*34009bffSJacopo Mondi 131*34009bffSJacopo Mondi /** 132*34009bffSJacopo Mondi * max9271_set_gpios() - Set gpio lines to physical high value 133*34009bffSJacopo Mondi * @dev: The max9271 device 134*34009bffSJacopo Mondi * @gpio_mask: The mask of gpio lines to set to high value 135*34009bffSJacopo Mondi * 136*34009bffSJacopo Mondi * The @gpio_mask parameter shall be assembled using the MAX9271_GP[IO|O]* 137*34009bffSJacopo Mondi * bit values. 138*34009bffSJacopo Mondi * 139*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 140*34009bffSJacopo Mondi */ 141*34009bffSJacopo Mondi int max9271_set_gpios(struct max9271_device *dev, u8 gpio_mask); 142*34009bffSJacopo Mondi 143*34009bffSJacopo Mondi /** 144*34009bffSJacopo Mondi * max9271_clear_gpios() - Set gpio lines to physical low value 145*34009bffSJacopo Mondi * @dev: The max9271 device 146*34009bffSJacopo Mondi * @gpio_mask: The mask of gpio lines to set to low value 147*34009bffSJacopo Mondi * 148*34009bffSJacopo Mondi * The @gpio_mask parameter shall be assembled using the MAX9271_GP[IO|O]* 149*34009bffSJacopo Mondi * bit values. 150*34009bffSJacopo Mondi * 151*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 152*34009bffSJacopo Mondi */ 153*34009bffSJacopo Mondi int max9271_clear_gpios(struct max9271_device *dev, u8 gpio_mask); 154*34009bffSJacopo Mondi 155*34009bffSJacopo Mondi /** 156*34009bffSJacopo Mondi * max9271_enable_gpios() - Enable gpio lines 157*34009bffSJacopo Mondi * @dev: The max9271 device 158*34009bffSJacopo Mondi * @gpio_mask: The mask of gpio lines to enable 159*34009bffSJacopo Mondi * 160*34009bffSJacopo Mondi * The @gpio_mask parameter shall be assembled using the MAX9271_GPIO* 161*34009bffSJacopo Mondi * bit values. GPO line is always enabled by default. 162*34009bffSJacopo Mondi * 163*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 164*34009bffSJacopo Mondi */ 165*34009bffSJacopo Mondi int max9271_enable_gpios(struct max9271_device *dev, u8 gpio_mask); 166*34009bffSJacopo Mondi 167*34009bffSJacopo Mondi /** 168*34009bffSJacopo Mondi * max9271_disable_gpios() - Disable gpio lines 169*34009bffSJacopo Mondi * @dev: The max9271 device 170*34009bffSJacopo Mondi * @gpio_mask: The mask of gpio lines to disable 171*34009bffSJacopo Mondi * 172*34009bffSJacopo Mondi * The @gpio_mask parameter shall be assembled using the MAX9271_GPIO* 173*34009bffSJacopo Mondi * bit values. GPO line is always enabled by default and cannot be disabled. 174*34009bffSJacopo Mondi * 175*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 176*34009bffSJacopo Mondi */ 177*34009bffSJacopo Mondi int max9271_disable_gpios(struct max9271_device *dev, u8 gpio_mask); 178*34009bffSJacopo Mondi 179*34009bffSJacopo Mondi /** 180*34009bffSJacopo Mondi * max9271_verify_id() - Read and verify MAX9271 id 181*34009bffSJacopo Mondi * @dev: The max9271 device 182*34009bffSJacopo Mondi * 183*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 184*34009bffSJacopo Mondi */ 185*34009bffSJacopo Mondi int max9271_verify_id(struct max9271_device *dev); 186*34009bffSJacopo Mondi 187*34009bffSJacopo Mondi /** 188*34009bffSJacopo Mondi * max9271_set_address() - Program a new I2C address 189*34009bffSJacopo Mondi * @dev: The max9271 device 190*34009bffSJacopo Mondi * @addr: The new I2C address in 7-bit format 191*34009bffSJacopo Mondi * 192*34009bffSJacopo Mondi * This function only takes care of programming the new I2C address @addr to 193*34009bffSJacopo Mondi * in the MAX9271 chip registers, it is responsiblity of the caller to set 194*34009bffSJacopo Mondi * the i2c address client to the @addr value to be able to communicate with 195*34009bffSJacopo Mondi * the MAX9271 chip using the I2C framework APIs after this function returns. 196*34009bffSJacopo Mondi * 197*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 198*34009bffSJacopo Mondi */ 199*34009bffSJacopo Mondi int max9271_set_address(struct max9271_device *dev, u8 addr); 200*34009bffSJacopo Mondi 201*34009bffSJacopo Mondi /** 202*34009bffSJacopo Mondi * max9271_set_deserializer_address() - Program the remote deserializer address 203*34009bffSJacopo Mondi * @dev: The max9271 device 204*34009bffSJacopo Mondi * @addr: The deserializer I2C address in 7-bit format 205*34009bffSJacopo Mondi * 206*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 207*34009bffSJacopo Mondi */ 208*34009bffSJacopo Mondi int max9271_set_deserializer_address(struct max9271_device *dev, u8 addr); 209*34009bffSJacopo Mondi 210*34009bffSJacopo Mondi /** 211*34009bffSJacopo Mondi * max9271_set_translation() - Program I2C address translation 212*34009bffSJacopo Mondi * @dev: The max9271 device 213*34009bffSJacopo Mondi * @source: The I2C source address 214*34009bffSJacopo Mondi * @dest: The I2C destination address 215*34009bffSJacopo Mondi * 216*34009bffSJacopo Mondi * Program address translation from @source to @dest. This is required to 217*34009bffSJacopo Mondi * communicate with local devices that do not support address reprogramming. 218*34009bffSJacopo Mondi * 219*34009bffSJacopo Mondi * TODO: The device supports translation of two address, this function currently 220*34009bffSJacopo Mondi * supports a single one. 221*34009bffSJacopo Mondi * 222*34009bffSJacopo Mondi * Return 0 on success or a negative error code on failure 223*34009bffSJacopo Mondi */ 224*34009bffSJacopo Mondi int max9271_set_translation(struct max9271_device *dev, u8 source, u8 dest); 225