Re: [PATCH v2 07/11] media: i2c: Add support for new frequencies to ov7251

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 25, 2022 at 12:07:49AM +0000, Daniel Scally wrote:
> The OV7251 sensor is used as the IR camera sensor on the Microsoft
> Surface line of tablets; this provides a 19.2MHz external clock, and
> the Windows driver for this sensor configures a 319.2MHz link freq to
> the CSI-2 receiver. Add the ability to support those rate to the
> driver by defining a new set of PLL configs.

> +static const struct ov7251_pll1_cfg ov7251_pll1_cfg_19_2_mhz_240_mhz = {
> +	.pre_div = 0x03,
> +	.mult = 0x4b,
> +	.div = 0x01,
> +	.pix_div = 0x0a,
> +	.mipi_div = 0x05

+ Comma.

> +};
> +
> +static const struct ov7251_pll1_cfg ov7251_pll1_cfg_19_2_mhz_319_2_mhz = {
> +	.pre_div = 0x01,
> +	.mult = 0x85,
> +	.div = 0x04,
> +	.pix_div = 0x0a,
> +	.mipi_div = 0x05

Ditto.

> +};

...

> +static const struct ov7251_pll1_cfg ov7251_pll1_cfg_24_mhz_319_2_mhz = {
> +	.pre_div = 0x05,
> +	.mult = 0x85,
> +	.div = 0x02,
> +	.pix_div = 0x0a,
> +	.mipi_div = 0x05

Ditto.

> +};
> +
> +static const struct ov7251_pll2_cfg ov7251_pll2_cfg_19_2_mhz = {
> +	.pre_div = 0x04,
> +	.mult = 0x32,
> +	.div = 0x00,
> +	.sys_div = 0x05,
> +	.adc_div = 0x04

Ditto.

> +};

...

> +static const struct ov7251_pll_cfgs ov7251_pll_cfgs_19_2_mhz = {
> +	.pll2 = &ov7251_pll2_cfg_19_2_mhz,
> +	.pll1 = {
> +		[OV7251_LINK_FREQ_240_MHZ] = &ov7251_pll1_cfg_19_2_mhz_240_mhz,
> +		[OV7251_LINK_FREQ_319_2_MHZ] = &ov7251_pll1_cfg_19_2_mhz_319_2_mhz,
> +	}

Ditto.

> +};

...

>  	/* get system clock (xclk) */
> -	ov7251->xclk = devm_clk_get(dev, "xclk");
> +	ov7251->xclk = devm_clk_get(dev, NULL);

Why a clock doesn't have a name anymore?
Shouldn't you rather switch to _optional()?

>  	if (IS_ERR(ov7251->xclk)) {
>  		dev_err(dev, "could not get xclk");
>  		return PTR_ERR(ov7251->xclk);

This should be dev_err_probe().

>  	}

...

> +	/*
> +	 * We could have either a 24MHz or 19.2MHz clock rate from either dt or

DT

> +	 * ACPI. We also need to support the IPU3 case which will have both an
> +	 * external clock AND a clock-frequency property.

Why is that? Broken table?

> +	 */
>  	ret = fwnode_property_read_u32(dev_fwnode(dev), "clock-frequency",
> -				       &ov7251->xclk_freq);
> -	if (ret) {
> -		dev_err(dev, "could not get xclk frequency\n");
> -		return ret;
> +				       &rate);
> +	if (!ret && ov7251->xclk) {
> +		ret = clk_set_rate(ov7251->xclk, rate);
> +		if (ret)
> +			return dev_err_probe(dev, ret,
> +					     "failed to set clock rate\n");
> +	} else if (ret && !ov7251->xclk) {

Redundant 'else' if you test for error condition first.

> +		return dev_err_probe(dev, ret, "invalid clock config\n");
>  	}

-- 
With Best Regards,
Andy Shevchenko





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux