mirror of https://gitee.com/openkylin/linux.git
media: ccs: Hardware requires a delay after starting the clock of lifting reset
A CCS compliant device requires a delay before the first I²C transaction after pulling xshutdown up or starting the external clock. This is what the driver does. However, if neither is actually there, there's no need for the delay. This also has the effect of removing an unnecessary delay on ACPI systems where ACPI is responsible for the power-up sequence. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
51fc72e541
commit
2fed6c84dc
|
@ -1515,7 +1515,6 @@ static int ccs_power_on(struct device *dev)
|
|||
struct ccs_sensor *sensor =
|
||||
container_of(ssd, struct ccs_sensor, ssds[0]);
|
||||
const struct ccs_device *ccsdev = device_get_match_data(dev);
|
||||
unsigned int sleep;
|
||||
int rval;
|
||||
|
||||
rval = regulator_bulk_enable(ARRAY_SIZE(ccs_regulators),
|
||||
|
@ -1525,22 +1524,26 @@ static int ccs_power_on(struct device *dev)
|
|||
return rval;
|
||||
}
|
||||
|
||||
rval = clk_prepare_enable(sensor->ext_clk);
|
||||
if (rval < 0) {
|
||||
dev_dbg(dev, "failed to enable xclk\n");
|
||||
goto out_xclk_fail;
|
||||
if (sensor->reset || sensor->xshutdown || sensor->ext_clk) {
|
||||
unsigned int sleep;
|
||||
|
||||
rval = clk_prepare_enable(sensor->ext_clk);
|
||||
if (rval < 0) {
|
||||
dev_dbg(dev, "failed to enable xclk\n");
|
||||
goto out_xclk_fail;
|
||||
}
|
||||
|
||||
gpiod_set_value(sensor->reset, 0);
|
||||
gpiod_set_value(sensor->xshutdown, 1);
|
||||
|
||||
if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
|
||||
sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
|
||||
else
|
||||
sleep = 5000;
|
||||
|
||||
usleep_range(sleep, sleep);
|
||||
}
|
||||
|
||||
gpiod_set_value(sensor->reset, 0);
|
||||
gpiod_set_value(sensor->xshutdown, 1);
|
||||
|
||||
if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
|
||||
sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
|
||||
else
|
||||
sleep = 5000;
|
||||
|
||||
usleep_range(sleep, sleep);
|
||||
|
||||
/*
|
||||
* Failures to respond to the address change command have been noticed.
|
||||
* Those failures seem to be caused by the sensor requiring a longer
|
||||
|
|
Loading…
Reference in New Issue