linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFT PATCH] [media] exynos4-is: Fix fimc_is_parse_sensor_config() nodes handling
@ 2016-03-23 16:15 Javier Martinez Canillas
  2016-03-23 22:33 ` Andreas Färber
  0 siblings, 1 reply; 3+ messages in thread
From: Javier Martinez Canillas @ 2016-03-23 16:15 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-samsung-soc, Krzysztof Kozlowski, Mauro Carvalho Chehab,
	Kyungmin Park, Kukjin Kim, Sylwester Nawrocki, linux-media,
	Javier Martinez Canillas

The same struct device_node * is used for looking up the I2C sensor, OF
graph endpoint and port. So the reference count is incremented but not
decremented for the endpoint and port nodes.

Fix this by having separate pointers for each node looked up.

Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>

---
Hello,

This patch was only build tested because I don't have an Exynos4
board to test. So testing on real HW will be highly appreciated.

Best regards,
Javier

 drivers/media/platform/exynos4-is/fimc-is.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c
index 979c388ebf60..0b04a5d25187 100644
--- a/drivers/media/platform/exynos4-is/fimc-is.c
+++ b/drivers/media/platform/exynos4-is/fimc-is.c
@@ -165,6 +165,7 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
 						struct device_node *node)
 {
 	struct fimc_is_sensor *sensor = &is->sensor[index];
+	struct device_node *ep, *port;
 	u32 tmp = 0;
 	int ret;
 
@@ -175,16 +176,18 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
 		return -EINVAL;
 	}
 
-	node = of_graph_get_next_endpoint(node, NULL);
-	if (!node)
+	ep = of_graph_get_next_endpoint(node, NULL);
+	if (!ep)
 		return -ENXIO;
 
-	node = of_graph_get_remote_port(node);
-	if (!node)
+	port = of_graph_get_remote_port(ep);
+	of_node_put(ep);
+	if (!port)
 		return -ENXIO;
 
 	/* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
-	ret = of_property_read_u32(node, "reg", &tmp);
+	ret = of_property_read_u32(port, "reg", &tmp);
+	of_node_put(port);
 	if (ret < 0) {
 		dev_err(&is->pdev->dev, "reg property not found at: %s\n",
 							 node->full_name);
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RFT PATCH] [media] exynos4-is: Fix fimc_is_parse_sensor_config() nodes handling
  2016-03-23 16:15 [RFT PATCH] [media] exynos4-is: Fix fimc_is_parse_sensor_config() nodes handling Javier Martinez Canillas
@ 2016-03-23 22:33 ` Andreas Färber
  2016-03-24  0:30   ` Javier Martinez Canillas
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Färber @ 2016-03-23 22:33 UTC (permalink / raw)
  To: Javier Martinez Canillas, linux-kernel
  Cc: linux-samsung-soc, Krzysztof Kozlowski, Mauro Carvalho Chehab,
	Kyungmin Park, Kukjin Kim, Sylwester Nawrocki, linux-media

Hi Javier,

Am 23.03.2016 um 17:15 schrieb Javier Martinez Canillas:
> The same struct device_node * is used for looking up the I2C sensor, OF
> graph endpoint and port. So the reference count is incremented but not
> decremented for the endpoint and port nodes.
> 
> Fix this by having separate pointers for each node looked up.
> 
> Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
[...]
> diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c
> index 979c388ebf60..0b04a5d25187 100644
> --- a/drivers/media/platform/exynos4-is/fimc-is.c
> +++ b/drivers/media/platform/exynos4-is/fimc-is.c
> @@ -165,6 +165,7 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
>  						struct device_node *node)
>  {
>  	struct fimc_is_sensor *sensor = &is->sensor[index];
> +	struct device_node *ep, *port;
>  	u32 tmp = 0;
>  	int ret;
>  
> @@ -175,16 +176,18 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
>  		return -EINVAL;
>  	}
>  
> -	node = of_graph_get_next_endpoint(node, NULL);
> -	if (!node)
> +	ep = of_graph_get_next_endpoint(node, NULL);
> +	if (!ep)
>  		return -ENXIO;
>  
> -	node = of_graph_get_remote_port(node);
> -	if (!node)
> +	port = of_graph_get_remote_port(ep);
> +	of_node_put(ep);
> +	if (!port)
>  		return -ENXIO;
>  
>  	/* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
> -	ret = of_property_read_u32(node, "reg", &tmp);
> +	ret = of_property_read_u32(port, "reg", &tmp);
> +	of_node_put(port);
>  	if (ret < 0) {
>  		dev_err(&is->pdev->dev, "reg property not found at: %s\n",
>  							 node->full_name);

port->full_name. You'll need to defer the of_node_put(port) then.

Regards,
Andreas

-- 
SUSE Linux GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Felix Imendörffer, Jane Smithard, Graham Norton; HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFT PATCH] [media] exynos4-is: Fix fimc_is_parse_sensor_config() nodes handling
  2016-03-23 22:33 ` Andreas Färber
@ 2016-03-24  0:30   ` Javier Martinez Canillas
  0 siblings, 0 replies; 3+ messages in thread
From: Javier Martinez Canillas @ 2016-03-24  0:30 UTC (permalink / raw)
  To: Andreas Färber, linux-kernel
  Cc: linux-samsung-soc, Krzysztof Kozlowski, Mauro Carvalho Chehab,
	Kyungmin Park, Kukjin Kim, Sylwester Nawrocki, linux-media

Hello Andreas,

Thanks for your feedback.

On 03/23/2016 07:33 PM, Andreas Färber wrote:
> Hi Javier,
> 
> Am 23.03.2016 um 17:15 schrieb Javier Martinez Canillas:
>> The same struct device_node * is used for looking up the I2C sensor, OF
>> graph endpoint and port. So the reference count is incremented but not
>> decremented for the endpoint and port nodes.
>>
>> Fix this by having separate pointers for each node looked up.
>>
>> Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com>
> [...]
>> diff --git a/drivers/media/platform/exynos4-is/fimc-is.c b/drivers/media/platform/exynos4-is/fimc-is.c
>> index 979c388ebf60..0b04a5d25187 100644
>> --- a/drivers/media/platform/exynos4-is/fimc-is.c
>> +++ b/drivers/media/platform/exynos4-is/fimc-is.c
>> @@ -165,6 +165,7 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
>>  						struct device_node *node)
>>  {
>>  	struct fimc_is_sensor *sensor = &is->sensor[index];
>> +	struct device_node *ep, *port;
>>  	u32 tmp = 0;
>>  	int ret;
>>  
>> @@ -175,16 +176,18 @@ static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
>>  		return -EINVAL;
>>  	}
>>  
>> -	node = of_graph_get_next_endpoint(node, NULL);
>> -	if (!node)
>> +	ep = of_graph_get_next_endpoint(node, NULL);
>> +	if (!ep)
>>  		return -ENXIO;
>>  
>> -	node = of_graph_get_remote_port(node);
>> -	if (!node)
>> +	port = of_graph_get_remote_port(ep);
>> +	of_node_put(ep);
>> +	if (!port)
>>  		return -ENXIO;
>>  
>>  	/* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
>> -	ret = of_property_read_u32(node, "reg", &tmp);
>> +	ret = of_property_read_u32(port, "reg", &tmp);
>> +	of_node_put(port);
>>  	if (ret < 0) {
>>  		dev_err(&is->pdev->dev, "reg property not found at: %s\n",
>>  							 node->full_name);
> 
> port->full_name. You'll need to defer the of_node_put(port) then.
>

Right, sorry for missing that and thanks a lot for pointing it out.
 
> Regards,
> Andreas
> 

Best regards,
-- 
Javier Martinez Canillas
Open Source Group
Samsung Research America

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-03-24  0:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-23 16:15 [RFT PATCH] [media] exynos4-is: Fix fimc_is_parse_sensor_config() nodes handling Javier Martinez Canillas
2016-03-23 22:33 ` Andreas Färber
2016-03-24  0:30   ` Javier Martinez Canillas

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).