Lines Matching +full:cmd +full:- +full:gpios
1 // SPDX-License-Identifier: GPL-2.0
17 #include <media/media-entity.h>
18 #include <media/v4l2-async.h>
19 #include <media/v4l2-ctrls.h>
20 #include <media/v4l2-subdev.h>
21 #include <media/v4l2-fwnode.h>
30 #include <linux/rk-camera-module.h>
31 #include <linux/rk-preisp.h>
44 #define OF_CAMERA_MODULE_REGULATORS "rockchip,regulator-names"
45 #define OF_CAMERA_MODULE_REGULATOR_VOLTAGES "rockchip,regulator-voltages"
99 struct device *dev = &pisp_dmy->client->dev; in __pisp_dmy_power_on()
101 if (!IS_ERR_OR_NULL(pisp_dmy->pins_default)) { in __pisp_dmy_power_on()
102 ret = pinctrl_select_state(pisp_dmy->pinctrl, in __pisp_dmy_power_on()
103 pisp_dmy->pins_default); in __pisp_dmy_power_on()
108 ret = clk_prepare_enable(pisp_dmy->xvclk); in __pisp_dmy_power_on()
114 if (pisp_dmy->regulators.regulator) { in __pisp_dmy_power_on()
115 for (i = 0; i < pisp_dmy->regulators.cnt; i++) { in __pisp_dmy_power_on()
116 regulator = pisp_dmy->regulators.regulator + i; in __pisp_dmy_power_on()
117 if (IS_ERR(regulator->regulator)) in __pisp_dmy_power_on()
120 regulator->regulator, in __pisp_dmy_power_on()
121 regulator->min_uV, in __pisp_dmy_power_on()
122 regulator->max_uV); in __pisp_dmy_power_on()
123 if (regulator_enable(regulator->regulator)) { in __pisp_dmy_power_on()
132 if (!IS_ERR(pisp_dmy->pwd_gpio)) { in __pisp_dmy_power_on()
133 gpiod_direction_output(pisp_dmy->pwd_gpio, 1); in __pisp_dmy_power_on()
137 if (!IS_ERR(pisp_dmy->pwd2_gpio)) { in __pisp_dmy_power_on()
138 gpiod_direction_output(pisp_dmy->pwd2_gpio, 1); in __pisp_dmy_power_on()
142 if (!IS_ERR(pisp_dmy->pd_gpio)) { in __pisp_dmy_power_on()
143 gpiod_direction_output(pisp_dmy->pd_gpio, 1); in __pisp_dmy_power_on()
147 if (!IS_ERR(pisp_dmy->pd2_gpio)) { in __pisp_dmy_power_on()
148 gpiod_direction_output(pisp_dmy->pd2_gpio, 1); in __pisp_dmy_power_on()
152 if (!IS_ERR(pisp_dmy->rst_gpio)) { in __pisp_dmy_power_on()
153 gpiod_direction_output(pisp_dmy->rst_gpio, 0); in __pisp_dmy_power_on()
155 gpiod_direction_output(pisp_dmy->rst_gpio, 1); in __pisp_dmy_power_on()
158 if (!IS_ERR(pisp_dmy->rst2_gpio)) { in __pisp_dmy_power_on()
159 gpiod_direction_output(pisp_dmy->rst2_gpio, 0); in __pisp_dmy_power_on()
161 gpiod_direction_output(pisp_dmy->rst2_gpio, 1); in __pisp_dmy_power_on()
167 clk_disable_unprepare(pisp_dmy->xvclk); in __pisp_dmy_power_on()
177 struct device *dev = &pisp_dmy->client->dev; in __pisp_dmy_power_off()
179 if (!IS_ERR(pisp_dmy->pd_gpio)) in __pisp_dmy_power_off()
180 gpiod_direction_output(pisp_dmy->pd_gpio, 0); in __pisp_dmy_power_off()
182 if (!IS_ERR(pisp_dmy->pd2_gpio)) in __pisp_dmy_power_off()
183 gpiod_direction_output(pisp_dmy->pd2_gpio, 0); in __pisp_dmy_power_off()
185 clk_disable_unprepare(pisp_dmy->xvclk); in __pisp_dmy_power_off()
187 if (!IS_ERR(pisp_dmy->rst_gpio)) in __pisp_dmy_power_off()
188 gpiod_direction_output(pisp_dmy->rst_gpio, 0); in __pisp_dmy_power_off()
190 if (!IS_ERR(pisp_dmy->rst2_gpio)) in __pisp_dmy_power_off()
191 gpiod_direction_output(pisp_dmy->rst2_gpio, 0); in __pisp_dmy_power_off()
193 if (!IS_ERR(pisp_dmy->pwd_gpio)) in __pisp_dmy_power_off()
194 gpiod_direction_output(pisp_dmy->pwd_gpio, 0); in __pisp_dmy_power_off()
196 if (!IS_ERR(pisp_dmy->pwd2_gpio)) in __pisp_dmy_power_off()
197 gpiod_direction_output(pisp_dmy->pwd2_gpio, 0); in __pisp_dmy_power_off()
199 if (!IS_ERR_OR_NULL(pisp_dmy->pins_sleep)) { in __pisp_dmy_power_off()
200 ret = pinctrl_select_state(pisp_dmy->pinctrl, in __pisp_dmy_power_off()
201 pisp_dmy->pins_sleep); in __pisp_dmy_power_off()
206 if (pisp_dmy->regulators.regulator) { in __pisp_dmy_power_off()
207 for (i = 0; i < pisp_dmy->regulators.cnt; i++) { in __pisp_dmy_power_off()
208 regulator = pisp_dmy->regulators.regulator + i; in __pisp_dmy_power_off()
209 if (IS_ERR(regulator->regulator)) in __pisp_dmy_power_off()
211 regulator_disable(regulator->regulator); in __pisp_dmy_power_off()
221 mutex_lock(&pisp_dmy->mutex); in pisp_dmy_power()
223 /* If the power state is not modified - no work to do. */ in pisp_dmy_power()
224 if (pisp_dmy->power_on == !!on) in pisp_dmy_power()
232 pisp_dmy->power_on = true; in pisp_dmy_power()
235 pisp_dmy->power_on = false; in pisp_dmy_power()
239 mutex_unlock(&pisp_dmy->mutex); in pisp_dmy_power()
248 strlcpy(inf->base.sensor, PISP_DMY_NAME, sizeof(inf->base.sensor)); in pisp_dmy_get_module_inf()
249 strlcpy(inf->base.module, pisp_dmy->module_name, in pisp_dmy_get_module_inf()
250 sizeof(inf->base.module)); in pisp_dmy_get_module_inf()
251 strlcpy(inf->base.lens, pisp_dmy->len_name, sizeof(inf->base.lens)); in pisp_dmy_get_module_inf()
254 static long pisp_dmy_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) in pisp_dmy_ioctl() argument
259 switch (cmd) { in pisp_dmy_ioctl()
264 ret = -ENOTTY; in pisp_dmy_ioctl()
273 unsigned int cmd, unsigned long arg) in pisp_dmy_compat_ioctl32() argument
280 switch (cmd) { in pisp_dmy_compat_ioctl32()
284 ret = -ENOMEM; in pisp_dmy_compat_ioctl32()
288 ret = pisp_dmy_ioctl(sd, cmd, inf); in pisp_dmy_compat_ioctl32()
292 return -EFAULT; in pisp_dmy_compat_ioctl32()
299 ret = -ENOMEM; in pisp_dmy_compat_ioctl32()
305 return -EFAULT; in pisp_dmy_compat_ioctl32()
308 ret = pisp_dmy_ioctl(sd, cmd, cfg); in pisp_dmy_compat_ioctl32()
312 ret = -ENOIOCTLCMD; in pisp_dmy_compat_ioctl32()
364 struct device *dev = &pisp_dmy->client->dev; in pisp_dmy_analyze_dts()
365 struct device_node *np = of_node_get(dev->of_node); in pisp_dmy_analyze_dts()
367 pisp_dmy->xvclk = devm_clk_get(dev, "xvclk"); in pisp_dmy_analyze_dts()
368 if (IS_ERR(pisp_dmy->xvclk)) { in pisp_dmy_analyze_dts()
370 return -EINVAL; in pisp_dmy_analyze_dts()
372 ret = clk_set_rate(pisp_dmy->xvclk, PISP_DMY_XVCLK_FREQ); in pisp_dmy_analyze_dts()
377 if (clk_get_rate(pisp_dmy->xvclk) != PISP_DMY_XVCLK_FREQ) in pisp_dmy_analyze_dts()
380 pisp_dmy->pinctrl = devm_pinctrl_get(dev); in pisp_dmy_analyze_dts()
381 if (!IS_ERR(pisp_dmy->pinctrl)) { in pisp_dmy_analyze_dts()
382 pisp_dmy->pins_default = in pisp_dmy_analyze_dts()
383 pinctrl_lookup_state(pisp_dmy->pinctrl, in pisp_dmy_analyze_dts()
385 if (IS_ERR(pisp_dmy->pins_default)) in pisp_dmy_analyze_dts()
388 pisp_dmy->pins_sleep = in pisp_dmy_analyze_dts()
389 pinctrl_lookup_state(pisp_dmy->pinctrl, in pisp_dmy_analyze_dts()
391 if (IS_ERR(pisp_dmy->pins_sleep)) in pisp_dmy_analyze_dts()
406 pisp_dmy->regulators.regulator = in pisp_dmy_analyze_dts()
407 devm_kzalloc(&pisp_dmy->client->dev, in pisp_dmy_analyze_dts()
410 if (!pisp_dmy->regulators.regulator) { in pisp_dmy_analyze_dts()
412 return -ENOMEM; in pisp_dmy_analyze_dts()
415 pisp_dmy->regulators.cnt = elem_size; in pisp_dmy_analyze_dts()
419 regulator = pisp_dmy->regulators.regulator; in pisp_dmy_analyze_dts()
428 regulator->regulator = in pisp_dmy_analyze_dts()
430 if (IS_ERR(regulator->regulator)) in pisp_dmy_analyze_dts()
437 ®ulator->min_uV); in pisp_dmy_analyze_dts()
438 regulator->max_uV = regulator->min_uV; in pisp_dmy_analyze_dts()
440 } while (--elem_size); in pisp_dmy_analyze_dts()
443 pisp_dmy->pd_gpio = devm_gpiod_get(dev, "pd", GPIOD_OUT_LOW); in pisp_dmy_analyze_dts()
444 if (IS_ERR(pisp_dmy->pd_gpio)) in pisp_dmy_analyze_dts()
445 dev_warn(dev, "can not find pd-gpios, error %ld\n", in pisp_dmy_analyze_dts()
446 PTR_ERR(pisp_dmy->pd_gpio)); in pisp_dmy_analyze_dts()
448 pisp_dmy->pd2_gpio = devm_gpiod_get(dev, "pd2", GPIOD_OUT_LOW); in pisp_dmy_analyze_dts()
449 if (IS_ERR(pisp_dmy->pd2_gpio)) in pisp_dmy_analyze_dts()
450 dev_warn(dev, "can not find pd2-gpios, error %ld\n", in pisp_dmy_analyze_dts()
451 PTR_ERR(pisp_dmy->pd2_gpio)); in pisp_dmy_analyze_dts()
453 pisp_dmy->rst_gpio = devm_gpiod_get(dev, "rst", GPIOD_OUT_LOW); in pisp_dmy_analyze_dts()
454 if (IS_ERR(pisp_dmy->rst_gpio)) in pisp_dmy_analyze_dts()
455 dev_warn(dev, "can not find rst-gpios, error %ld\n", in pisp_dmy_analyze_dts()
456 PTR_ERR(pisp_dmy->rst_gpio)); in pisp_dmy_analyze_dts()
458 pisp_dmy->rst2_gpio = devm_gpiod_get(dev, "rst2", GPIOD_OUT_LOW); in pisp_dmy_analyze_dts()
459 if (IS_ERR(pisp_dmy->rst2_gpio)) in pisp_dmy_analyze_dts()
460 dev_warn(dev, "can not find rst2-gpios, error %ld\n", in pisp_dmy_analyze_dts()
461 PTR_ERR(pisp_dmy->rst2_gpio)); in pisp_dmy_analyze_dts()
463 pisp_dmy->pwd_gpio = devm_gpiod_get(dev, "pwd", GPIOD_OUT_HIGH); in pisp_dmy_analyze_dts()
464 if (IS_ERR(pisp_dmy->pwd_gpio)) in pisp_dmy_analyze_dts()
465 dev_warn(dev, "can not find pwd-gpios, error %ld\n", in pisp_dmy_analyze_dts()
466 PTR_ERR(pisp_dmy->pwd_gpio)); in pisp_dmy_analyze_dts()
468 pisp_dmy->pwd2_gpio = devm_gpiod_get(dev, "pwd2", GPIOD_OUT_HIGH); in pisp_dmy_analyze_dts()
469 if (IS_ERR(pisp_dmy->pwd2_gpio)) in pisp_dmy_analyze_dts()
470 dev_warn(dev, "can not find pwd2-gpios, error %ld\n", in pisp_dmy_analyze_dts()
471 PTR_ERR(pisp_dmy->pwd2_gpio)); in pisp_dmy_analyze_dts()
479 struct device *dev = &client->dev; in pisp_dmy_probe()
480 struct device_node *node = dev->of_node; in pisp_dmy_probe()
492 return -ENOMEM; in pisp_dmy_probe()
495 &pisp_dmy->module_index); in pisp_dmy_probe()
497 &pisp_dmy->module_facing); in pisp_dmy_probe()
499 &pisp_dmy->module_name); in pisp_dmy_probe()
501 &pisp_dmy->len_name); in pisp_dmy_probe()
504 return -EINVAL; in pisp_dmy_probe()
507 pisp_dmy->client = client; in pisp_dmy_probe()
515 mutex_init(&pisp_dmy->mutex); in pisp_dmy_probe()
517 sd = &pisp_dmy->subdev; in pisp_dmy_probe()
534 mutex_destroy(&pisp_dmy->mutex); in pisp_dmy_remove()
536 pm_runtime_disable(&client->dev); in pisp_dmy_remove()
537 if (!pm_runtime_status_suspended(&client->dev)) in pisp_dmy_remove()
539 pm_runtime_set_suspended(&client->dev); in pisp_dmy_remove()