Skip to content

Commit

Permalink
media: ccs: Hardware requires a delay after starting the clock of lif…
Browse files Browse the repository at this point in the history
…ting 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 <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
Sakari Ailus authored and mchehab committed Jan 12, 2021
1 parent 51fc72e commit 2fed6c8
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions drivers/media/i2c/ccs/ccs-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -1525,21 +1524,25 @@ 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);
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;
if (ccsdev->flags & CCS_DEVICE_FLAG_IS_SMIA)
sleep = SMIAPP_RESET_DELAY(sensor->hwcfg.ext_clk);
else
sleep = 5000;

usleep_range(sleep, sleep);
usleep_range(sleep, sleep);
}

/*
* Failures to respond to the address change command have been noticed.
Expand Down

0 comments on commit 2fed6c8

Please sign in to comment.