Commit 6713feb7 authored by Benoit Parrot's avatar Benoit Parrot Committed by Mauro Carvalho Chehab

media: ti-vpe: cal: add CSI2 PHY LDO errata support

Apply Errata i913 every time the functional clock is enabled.
This should take care of suspend/resume case as well.
Signed-off-by: default avatarBenoit Parrot <bparrot@ti.com>
Signed-off-by: default avatarJyri Sarha <jsarha@ti.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 03ea2e03
...@@ -282,6 +282,12 @@ static const struct cal_data dra72x_cal_data = { ...@@ -282,6 +282,12 @@ static const struct cal_data dra72x_cal_data = {
.num_csi2_phy = ARRAY_SIZE(dra72x_cal_csi_phy), .num_csi2_phy = ARRAY_SIZE(dra72x_cal_csi_phy),
}; };
static const struct cal_data dra72x_es1_cal_data = {
.csi2_phy_core = dra72x_cal_csi_phy,
.num_csi2_phy = ARRAY_SIZE(dra72x_cal_csi_phy),
.flags = DRA72_CAL_PRE_ES2_LDO_DISABLE,
};
/* /*
* there is one cal_dev structure in the driver, it is shared by * there is one cal_dev structure in the driver, it is shared by
* all instances. * all instances.
...@@ -567,9 +573,52 @@ static void cal_get_hwinfo(struct cal_dev *dev) ...@@ -567,9 +573,52 @@ static void cal_get_hwinfo(struct cal_dev *dev)
hwinfo); hwinfo);
} }
static inline int cal_runtime_get(struct cal_dev *dev) /*
* Errata i913: CSI2 LDO Needs to be disabled when module is powered on
*
* Enabling CSI2 LDO shorts it to core supply. It is crucial the 2 CSI2
* LDOs on the device are disabled if CSI-2 module is powered on
* (0x4845 B304 | 0x4845 B384 [28:27] = 0x1) or in ULPS (0x4845 B304
* | 0x4845 B384 [28:27] = 0x2) mode. Common concerns include: high
* current draw on the module supply in active mode.
*
* Errata does not apply when CSI-2 module is powered off
* (0x4845 B304 | 0x4845 B384 [28:27] = 0x0).
*
* SW Workaround:
* Set the following register bits to disable the LDO,
* which is essentially CSI2 REG10 bit 6:
*
* Core 0: 0x4845 B828 = 0x0000 0040
* Core 1: 0x4845 B928 = 0x0000 0040
*/
static void i913_errata(struct cal_dev *dev, unsigned int port)
{ {
return pm_runtime_get_sync(&dev->pdev->dev); u32 reg10 = reg_read(dev->cc[port], CAL_CSI2_PHY_REG10);
set_field(&reg10, CAL_CSI2_PHY_REG0_HSCLOCKCONFIG_DISABLE,
CAL_CSI2_PHY_REG10_I933_LDO_DISABLE_MASK);
cal_dbg(1, dev, "CSI2_%d_REG10 = 0x%08x\n", port, reg10);
reg_write(dev->cc[port], CAL_CSI2_PHY_REG10, reg10);
}
static int cal_runtime_get(struct cal_dev *dev)
{
int r;
r = pm_runtime_get_sync(&dev->pdev->dev);
if (dev->flags & DRA72_CAL_PRE_ES2_LDO_DISABLE) {
/*
* Apply errata on both port eveytime we (re-)enable
* the clock
*/
i913_errata(dev, 0);
i913_errata(dev, 1);
}
return r;
} }
static inline void cal_runtime_put(struct cal_dev *dev) static inline void cal_runtime_put(struct cal_dev *dev)
...@@ -2064,6 +2113,10 @@ static const struct of_device_id cal_of_match[] = { ...@@ -2064,6 +2113,10 @@ static const struct of_device_id cal_of_match[] = {
.compatible = "ti,dra72-cal", .compatible = "ti,dra72-cal",
.data = (void *)&dra72x_cal_data, .data = (void *)&dra72x_cal_data,
}, },
{
.compatible = "ti,dra72-pre-es2-cal",
.data = (void *)&dra72x_es1_cal_data,
},
{}, {},
}; };
MODULE_DEVICE_TABLE(of, cal_of_match); MODULE_DEVICE_TABLE(of, cal_of_match);
......
...@@ -10,6 +10,30 @@ ...@@ -10,6 +10,30 @@
#ifndef __TI_CAL_REGS_H #ifndef __TI_CAL_REGS_H
#define __TI_CAL_REGS_H #define __TI_CAL_REGS_H
/*
* struct cal_dev.flags possibilities
*
* DRA72_CAL_PRE_ES2_LDO_DISABLE:
* Errata i913: CSI2 LDO Needs to be disabled when module is powered on
*
* Enabling CSI2 LDO shorts it to core supply. It is crucial the 2 CSI2
* LDOs on the device are disabled if CSI-2 module is powered on
* (0x4845 B304 | 0x4845 B384 [28:27] = 0x1) or in ULPS (0x4845 B304
* | 0x4845 B384 [28:27] = 0x2) mode. Common concerns include: high
* current draw on the module supply in active mode.
*
* Errata does not apply when CSI-2 module is powered off
* (0x4845 B304 | 0x4845 B384 [28:27] = 0x0).
*
* SW Workaround:
* Set the following register bits to disable the LDO,
* which is essentially CSI2 REG10 bit 6:
*
* Core 0: 0x4845 B828 = 0x0000 0040
* Core 1: 0x4845 B928 = 0x0000 0040
*/
#define DRA72_CAL_PRE_ES2_LDO_DISABLE BIT(0)
#define CAL_NUM_CSI2_PORTS 2 #define CAL_NUM_CSI2_PORTS 2
/* CAL register offsets */ /* CAL register offsets */
...@@ -71,6 +95,7 @@ ...@@ -71,6 +95,7 @@
#define CAL_CSI2_PHY_REG0 0x000 #define CAL_CSI2_PHY_REG0 0x000
#define CAL_CSI2_PHY_REG1 0x004 #define CAL_CSI2_PHY_REG1 0x004
#define CAL_CSI2_PHY_REG2 0x008 #define CAL_CSI2_PHY_REG2 0x008
#define CAL_CSI2_PHY_REG10 0x028
/* CAL Control Module Core Camerrx Control register offsets */ /* CAL Control Module Core Camerrx Control register offsets */
#define CM_CTRL_CORE_CAMERRX_CONTROL 0x000 #define CM_CTRL_CORE_CAMERRX_CONTROL 0x000
...@@ -458,6 +483,8 @@ ...@@ -458,6 +483,8 @@
#define CAL_CSI2_PHY_REG1_CLOCK_MISS_DETECTOR_STATUS_SUCCESS 0 #define CAL_CSI2_PHY_REG1_CLOCK_MISS_DETECTOR_STATUS_SUCCESS 0
#define CAL_CSI2_PHY_REG1_RESET_DONE_STATUS_MASK GENMASK(29, 28) #define CAL_CSI2_PHY_REG1_RESET_DONE_STATUS_MASK GENMASK(29, 28)
#define CAL_CSI2_PHY_REG10_I933_LDO_DISABLE_MASK BIT(6)
#define CAL_CSI2_PHY_REG2_CCP2_SYNC_PATTERN_MASK GENMASK(23, 0) #define CAL_CSI2_PHY_REG2_CCP2_SYNC_PATTERN_MASK GENMASK(23, 0)
#define CAL_CSI2_PHY_REG2_TRIGGER_CMD_RXTRIGESC3_MASK GENMASK(25, 24) #define CAL_CSI2_PHY_REG2_TRIGGER_CMD_RXTRIGESC3_MASK GENMASK(25, 24)
#define CAL_CSI2_PHY_REG2_TRIGGER_CMD_RXTRIGESC2_MASK GENMASK(27, 26) #define CAL_CSI2_PHY_REG2_TRIGGER_CMD_RXTRIGESC2_MASK GENMASK(27, 26)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment