Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] smiapp: Allow using external clock from the clock framework

Instead of providing a function in platform data, allow also providing the
name of the external clock and use it through the clock framework.

Signed-off-by: Sakari Ailus <sakari.ailus@maxwell.research.nokia.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Sakari Ailus and committed by
Mauro Carvalho Chehab
2547428d 13c6a9f7

+50 -7
+48 -7
drivers/media/video/smiapp/smiapp-core.c
··· 26 26 * 27 27 */ 28 28 29 + #include <linux/clk.h> 29 30 #include <linux/delay.h> 30 31 #include <linux/device.h> 31 32 #include <linux/gpio.h> ··· 1112 1111 } 1113 1112 usleep_range(1000, 1000); 1114 1113 1115 - rval = sensor->platform_data->set_xclk(&sensor->src->sd, 1116 - sensor->platform_data->ext_clk); 1114 + if (sensor->platform_data->set_xclk) 1115 + rval = sensor->platform_data->set_xclk( 1116 + &sensor->src->sd, sensor->platform_data->ext_clk); 1117 + else 1118 + rval = clk_enable(sensor->ext_clk); 1117 1119 if (rval < 0) { 1118 1120 dev_dbg(&client->dev, "failed to set xclk\n"); 1119 1121 goto out_xclk_fail; ··· 1235 1231 out_cci_addr_fail: 1236 1232 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) 1237 1233 gpio_set_value(sensor->platform_data->xshutdown, 0); 1238 - sensor->platform_data->set_xclk(&sensor->src->sd, 0); 1234 + if (sensor->platform_data->set_xclk) 1235 + sensor->platform_data->set_xclk(&sensor->src->sd, 0); 1236 + else 1237 + clk_disable(sensor->ext_clk); 1239 1238 1240 1239 out_xclk_fail: 1241 1240 regulator_disable(sensor->vana); ··· 1263 1256 1264 1257 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) 1265 1258 gpio_set_value(sensor->platform_data->xshutdown, 0); 1266 - sensor->platform_data->set_xclk(&sensor->src->sd, 0); 1259 + if (sensor->platform_data->set_xclk) 1260 + sensor->platform_data->set_xclk(&sensor->src->sd, 0); 1261 + else 1262 + clk_disable(sensor->ext_clk); 1267 1263 usleep_range(5000, 5000); 1268 1264 regulator_disable(sensor->vana); 1269 1265 sensor->streaming = 0; ··· 2337 2327 return -ENODEV; 2338 2328 } 2339 2329 2330 + if (!sensor->platform_data->set_xclk) { 2331 + sensor->ext_clk = clk_get(&client->dev, 2332 + sensor->platform_data->ext_clk_name); 2333 + if (IS_ERR(sensor->ext_clk)) { 2334 + dev_err(&client->dev, "could not get clock %s\n", 2335 + sensor->platform_data->ext_clk_name); 2336 + rval = -ENODEV; 2337 + goto out_clk_get; 2338 + } 2339 + 2340 + rval = clk_set_rate(sensor->ext_clk, 2341 + sensor->platform_data->ext_clk); 2342 + if (rval < 0) { 2343 + dev_err(&client->dev, 2344 + "unable to set clock %s freq to %u\n", 2345 + sensor->platform_data->ext_clk_name, 2346 + sensor->platform_data->ext_clk); 2347 + rval = -ENODEV; 2348 + goto out_clk_set_rate; 2349 + } 2350 + } 2351 + 2340 2352 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) { 2341 2353 if (gpio_request_one(sensor->platform_data->xshutdown, 0, 2342 2354 "SMIA++ xshutdown") != 0) { ··· 2366 2334 "unable to acquire reset gpio %d\n", 2367 2335 sensor->platform_data->xshutdown); 2368 2336 rval = -ENODEV; 2369 - goto out_gpio_request; 2337 + goto out_clk_set_rate; 2370 2338 } 2371 2339 } 2372 2340 ··· 2621 2589 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) 2622 2590 gpio_free(sensor->platform_data->xshutdown); 2623 2591 2624 - out_gpio_request: 2592 + out_clk_set_rate: 2593 + clk_put(sensor->ext_clk); 2594 + sensor->ext_clk = NULL; 2595 + 2596 + out_clk_get: 2625 2597 regulator_put(sensor->vana); 2626 2598 sensor->vana = NULL; 2627 2599 return rval; ··· 2814 2778 if (sensor->power_count) { 2815 2779 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) 2816 2780 gpio_set_value(sensor->platform_data->xshutdown, 0); 2817 - sensor->platform_data->set_xclk(&sensor->src->sd, 0); 2781 + if (sensor->platform_data->set_xclk) 2782 + sensor->platform_data->set_xclk(&sensor->src->sd, 0); 2783 + else 2784 + clk_disable(sensor->ext_clk); 2818 2785 sensor->power_count = 0; 2819 2786 } 2820 2787 ··· 2833 2794 smiapp_free_controls(sensor); 2834 2795 if (sensor->platform_data->xshutdown != SMIAPP_NO_XSHUTDOWN) 2835 2796 gpio_free(sensor->platform_data->xshutdown); 2797 + if (sensor->ext_clk) 2798 + clk_put(sensor->ext_clk); 2836 2799 if (sensor->vana) 2837 2800 regulator_put(sensor->vana); 2838 2801
+1
drivers/media/video/smiapp/smiapp.h
··· 198 198 struct smiapp_subdev *pixel_array; 199 199 struct smiapp_platform_data *platform_data; 200 200 struct regulator *vana; 201 + struct clk *ext_clk; 201 202 u32 limits[SMIAPP_LIMIT_LAST]; 202 203 u8 nbinning_subtypes; 203 204 struct smiapp_binning_subtype binning_subtypes[SMIAPP_BINNING_SUBTYPES];
+1
include/media/smiapp.h
··· 77 77 struct smiapp_flash_strobe_parms *strobe_setup; 78 78 79 79 int (*set_xclk)(struct v4l2_subdev *sd, int hz); 80 + char *ext_clk_name; 80 81 int xshutdown; /* gpio or SMIAPP_NO_XSHUTDOWN */ 81 82 }; 82 83