diff options
| author | Hans de Goede <hdegoede@redhat.com> | 2022-11-14 15:32:41 +0000 | 
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@kernel.org> | 2022-11-25 08:23:11 +0000 | 
| commit | f1219d9efab15a95c28df85269db72669f6206a5 (patch) | |
| tree | 8c68f7dcd88b6da07b4a6b38c3f3747bfe30c8b4 /drivers/staging/media/atomisp | |
| parent | 586ef0c6917dc5f7937726733a1f8372ce200f7a (diff) | |
| download | linux-f1219d9efab15a95c28df85269db72669f6206a5.tar.bz2 | |
media: atomisp: Remove sw_contex.power_state checks
Remove the unnecessary sw_contex.power_state checks:
1. atomisp_freq_scaling() and atomisp_stop_streaming() only run when the
   ISP is powered up through runtime-pm, so the checks are not necessary
2. atomisp_mrfld_pre_power_down() and atomisp_runtime_resume() are only
   called through the driver-core pm handling code which already
   guarantees they are not called when already powered down / up.
3. atomisp_isr() also checks isp->css_initialized which only gets set
   by atomisp_css_init() which runs *after* powering up the ISP and which
   gets cleared by atomisp_css_uninit() *before* powering down the ISP.
So all the checks are unnecessary, remove them as well as the
sw_contex.power_state field itself.
Reviewed-by: Andy Shevchenko <andy@kernel.org>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/staging/media/atomisp')
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_cmd.c | 20 | ||||
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_internal.h | 1 | ||||
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_ioctl.c | 75 | ||||
| -rw-r--r-- | drivers/staging/media/atomisp/pci/atomisp_v4l2.c | 19 | 
4 files changed, 43 insertions, 72 deletions
| diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c b/drivers/staging/media/atomisp/pci/atomisp_cmd.c index 6f3eaad921ff..cbb25608d2b0 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c +++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c @@ -207,11 +207,6 @@ int atomisp_freq_scaling(struct atomisp_device *isp,  	int i, ret;  	unsigned short fps = 0; -	if (isp->sw_contex.power_state != ATOM_ISP_POWER_UP) { -		dev_err(isp->dev, "DFS cannot proceed due to no power.\n"); -		return -EINVAL; -	} -  	if ((pdev->device & ATOMISP_PCI_DEVICE_SOC_MASK) ==  	    ATOMISP_PCI_DEVICE_SOC_CHT && ATOMISP_USE_YUVPP(asd))  		isp->dfs = &dfs_config_cht_soc; @@ -511,8 +506,8 @@ irqreturn_t atomisp_isr(int irq, void *dev)  	int err;  	spin_lock_irqsave(&isp->lock, flags); -	if (isp->sw_contex.power_state != ATOM_ISP_POWER_UP || -	    !isp->css_initialized) { + +	if (!isp->css_initialized) {  		spin_unlock_irqrestore(&isp->lock, flags);  		return IRQ_HANDLED;  	} @@ -5503,7 +5498,6 @@ out:  int atomisp_ospm_dphy_down(struct atomisp_device *isp)  {  	struct pci_dev *pdev = to_pci_dev(isp->dev); -	unsigned long flags;  	u32 reg;  	dev_dbg(isp->dev, "%s\n", __func__); @@ -5515,9 +5509,6 @@ int atomisp_ospm_dphy_down(struct atomisp_device *isp)  	if (!atomisp_dev_users(isp))  		goto done; -	spin_lock_irqsave(&isp->lock, flags); -	isp->sw_contex.power_state = ATOM_ISP_POWER_DOWN; -	spin_unlock_irqrestore(&isp->lock, flags);  done:  	/*  	 * MRFLD IUNIT DPHY is located in an always-power-on island @@ -5533,14 +5524,7 @@ done:  /*Turn on ISP dphy */  int atomisp_ospm_dphy_up(struct atomisp_device *isp)  { -	unsigned long flags; -  	dev_dbg(isp->dev, "%s\n", __func__); - -	spin_lock_irqsave(&isp->lock, flags); -	isp->sw_contex.power_state = ATOM_ISP_POWER_UP; -	spin_unlock_irqrestore(&isp->lock, flags); -  	return 0;  } diff --git a/drivers/staging/media/atomisp/pci/atomisp_internal.h b/drivers/staging/media/atomisp/pci/atomisp_internal.h index d9d158cdf09e..653e6d74a966 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_internal.h +++ b/drivers/staging/media/atomisp/pci/atomisp_internal.h @@ -195,7 +195,6 @@ struct atomisp_regs {  };  struct atomisp_sw_contex { -	int power_state;  	int running_freq;  }; diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c index 43e899457b91..cb01ba65c88f 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c +++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c @@ -1461,10 +1461,11 @@ void atomisp_stop_streaming(struct vb2_queue *vq)  	struct video_device *vdev = &pipe->vdev;  	struct atomisp_device *isp = asd->isp;  	struct pci_dev *pdev = to_pci_dev(isp->dev); +	bool recreate_streams[MAX_STREAM_NUM] = {0};  	enum ia_css_pipe_id css_pipe_id; -	int ret; -	unsigned long flags;  	bool first_streamoff = false; +	unsigned long flags; +	int i, ret;  	mutex_lock(&isp->mutex); @@ -1563,49 +1564,43 @@ stopsensor:  	 * ISP work around, need to reset isp  	 * Is it correct time to reset ISP when first node does streamoff?  	 */ -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_UP) { -		unsigned int i; -		bool recreate_streams[MAX_STREAM_NUM] = {0}; - -		if (isp->isp_timeout) -			dev_err(isp->dev, "%s: Resetting with WA activated", -				__func__); -		/* -		 * It is possible that the other asd stream is in the stage -		 * that v4l2_setfmt is just get called on it, which will -		 * create css stream on that stream. But at this point, there -		 * is no way to destroy the css stream created on that stream. -		 * -		 * So force stream destroy here. -		 */ -		for (i = 0; i < isp->num_of_streams; i++) { -			if (isp->asd[i].stream_prepared) { -				atomisp_destroy_pipes_stream_force(&isp-> -								   asd[i]); -				recreate_streams[i] = true; -			} +	if (isp->isp_timeout) +		dev_err(isp->dev, "%s: Resetting with WA activated", +			__func__); +	/* +	 * It is possible that the other asd stream is in the stage +	 * that v4l2_setfmt is just get called on it, which will +	 * create css stream on that stream. But at this point, there +	 * is no way to destroy the css stream created on that stream. +	 * +	 * So force stream destroy here. +	 */ +	for (i = 0; i < isp->num_of_streams; i++) { +		if (isp->asd[i].stream_prepared) { +			atomisp_destroy_pipes_stream_force(&isp->asd[i]); +			recreate_streams[i] = true;  		} +	} -		/* disable  PUNIT/ISP acknowlede/handshake - SRSE=3 */ -		pci_write_config_dword(pdev, PCI_I_CONTROL, -				       isp->saved_regs.i_control | MRFLD_PCI_I_CONTROL_SRSE_RESET_MASK); -		dev_err(isp->dev, "atomisp_reset"); -		atomisp_reset(isp); -		for (i = 0; i < isp->num_of_streams; i++) { -			if (recreate_streams[i]) { -				int ret2; - -				ret2 = atomisp_create_pipes_stream(&isp->asd[i]); -				if (ret2) { -					dev_err(isp->dev, "%s error re-creating streams: %d\n", -						__func__, ret2); -					if (!ret) -						ret = ret2; -				} +	/* disable  PUNIT/ISP acknowlede/handshake - SRSE=3 */ +	pci_write_config_dword(pdev, PCI_I_CONTROL, +			       isp->saved_regs.i_control | MRFLD_PCI_I_CONTROL_SRSE_RESET_MASK); +	dev_err(isp->dev, "atomisp_reset"); +	atomisp_reset(isp); +	for (i = 0; i < isp->num_of_streams; i++) { +		if (recreate_streams[i]) { +			int ret2; + +			ret2 = atomisp_create_pipes_stream(&isp->asd[i]); +			if (ret2) { +				dev_err(isp->dev, "%s error re-creating streams: %d\n", +					__func__, ret2); +				if (!ret) +					ret = ret2;  			}  		} -		isp->isp_timeout = false;  	} +	isp->isp_timeout = false;  out_unlock:  	mutex_unlock(&isp->mutex);  } diff --git a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c index f009a1bfd3ea..579cbf502fd1 100644 --- a/drivers/staging/media/atomisp/pci/atomisp_v4l2.c +++ b/drivers/staging/media/atomisp/pci/atomisp_v4l2.c @@ -573,11 +573,7 @@ static int atomisp_mrfld_pre_power_down(struct atomisp_device *isp)  	unsigned long flags;  	spin_lock_irqsave(&isp->lock, flags); -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) { -		spin_unlock_irqrestore(&isp->lock, flags); -		dev_dbg(isp->dev, "<%s %d.\n", __func__, __LINE__); -		return 0; -	} +  	/*  	 * MRFLD HAS requirement: cannot power off i-unit if  	 * ISP has IRQ not serviced. @@ -753,13 +749,11 @@ int atomisp_runtime_resume(struct device *dev)  		return ret;  	cpu_latency_qos_update_request(&isp->pm_qos, isp->max_isr_latency); -	if (isp->sw_contex.power_state == ATOM_ISP_POWER_DOWN) { -		/*Turn on ISP d-phy */ -		ret = atomisp_ospm_dphy_up(isp); -		if (ret) { -			dev_err(isp->dev, "Failed to power up ISP!.\n"); -			return -EINVAL; -		} +	/*Turn on ISP d-phy */ +	ret = atomisp_ospm_dphy_up(isp); +	if (ret) { +		dev_err(isp->dev, "Failed to power up ISP!.\n"); +		return -EINVAL;  	}  	/*restore register values for iUnit and iUnitPHY registers*/ @@ -1447,7 +1441,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i  	isp->dev = &pdev->dev;  	isp->base = pcim_iomap_table(pdev)[ATOM_ISP_PCI_BAR]; -	isp->sw_contex.power_state = ATOM_ISP_POWER_UP;  	isp->saved_regs.ispmmadr = start;  	dev_dbg(&pdev->dev, "atomisp mmio base: %p\n", isp->base); |