Lines Matching refs:gc032a

97 struct gc032a {  struct
486 static inline struct gc032a *to_gc032a(struct v4l2_subdev *sd) in to_gc032a()
488 return container_of(sd, struct gc032a, sd); in to_gc032a()
575 static void gc032a_set_streaming(struct gc032a *gc032a, int on) in gc032a_set_streaming() argument
577 struct i2c_client *client = gc032a->client; in gc032a_set_streaming()
638 struct gc032a *gc032a = to_gc032a(sd); in gc032a_get_fmt() local
647 mutex_lock(&gc032a->lock); in gc032a_get_fmt()
649 mutex_unlock(&gc032a->lock); in gc032a_get_fmt()
656 mutex_lock(&gc032a->lock); in gc032a_get_fmt()
657 fmt->format = gc032a->format; in gc032a_get_fmt()
658 mutex_unlock(&gc032a->lock); in gc032a_get_fmt()
661 gc032a->format.code, gc032a->format.width, in gc032a_get_fmt()
662 gc032a->format.height); in gc032a_get_fmt()
703 struct gc032a *gc032a = to_gc032a(sd); in gc032a_set_fmt() local
721 mutex_lock(&gc032a->lock); in gc032a_set_fmt()
731 if (gc032a->streaming) { in gc032a_set_fmt()
732 mutex_unlock(&gc032a->lock); in gc032a_set_fmt()
736 gc032a->frame_size = size; in gc032a_set_fmt()
737 gc032a->format = fmt->format; in gc032a_set_fmt()
740 mutex_unlock(&gc032a->lock); in gc032a_set_fmt()
744 static void gc032a_get_module_inf(struct gc032a *gc032a, in gc032a_get_module_inf() argument
749 strlcpy(inf->base.module, gc032a->module_name, in gc032a_get_module_inf()
751 strlcpy(inf->base.lens, gc032a->len_name, sizeof(inf->base.lens)); in gc032a_get_module_inf()
756 struct gc032a *gc032a = to_gc032a(sd); in gc032a_ioctl() local
762 gc032a_get_module_inf(gc032a, (struct rkmodule_inf *)arg); in gc032a_ioctl()
769 gc032a_set_streaming(gc032a, 0xff); in gc032a_ioctl()
771 gc032a_set_streaming(gc032a, 0x00); in gc032a_ioctl()
833 struct gc032a *gc032a = to_gc032a(sd); in gc032a_s_stream() local
837 mutex_lock(&gc032a->lock); in gc032a_s_stream()
839 if (gc032a->streaming == on) in gc032a_s_stream()
844 gc032a_set_streaming(gc032a, 0x00); in gc032a_s_stream()
845 gc032a->streaming = on; in gc032a_s_stream()
849 gc032a_set_streaming(gc032a, 0xFF); in gc032a_s_stream()
850 gc032a->streaming = on; in gc032a_s_stream()
853 mutex_unlock(&gc032a->lock); in gc032a_s_stream()
857 static int gc032a_set_test_pattern(struct gc032a *gc032a, int value) in gc032a_set_test_pattern() argument
864 struct gc032a *gc032a = in gc032a_s_ctrl() local
865 container_of(ctrl->handler, struct gc032a, ctrls); in gc032a_s_ctrl()
869 return gc032a_set_test_pattern(gc032a, ctrl->val); in gc032a_s_ctrl()
917 struct gc032a *gc032a = to_gc032a(sd); in gc032a_power() local
918 struct i2c_client *client = gc032a->client; in gc032a_power()
922 if (!IS_ERR(gc032a->pwdn_gpio)) { in gc032a_power()
923 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 0); in gc032a_power()
926 ret = gc032a_write_array(client, gc032a->frame_size->regs); in gc032a_power()
929 gc032a->power_on = true; in gc032a_power()
931 if (!IS_ERR(gc032a->pwdn_gpio)) { in gc032a_power()
932 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 1); in gc032a_power()
935 gc032a->power_on = false; in gc032a_power()
990 static int gc032a_detect(struct gc032a *gc032a) in gc032a_detect() argument
992 struct i2c_client *client = gc032a->client; in gc032a_detect()
1014 if (!IS_ERR(gc032a->pwdn_gpio)) in gc032a_detect()
1015 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 1); in gc032a_detect()
1022 static int __gc032a_power_on(struct gc032a *gc032a) in __gc032a_power_on() argument
1025 struct device *dev = &gc032a->client->dev; in __gc032a_power_on()
1027 if (!IS_ERR(gc032a->xvclk)) { in __gc032a_power_on()
1028 ret = clk_set_rate(gc032a->xvclk, 24000000); in __gc032a_power_on()
1033 if (!IS_ERR(gc032a->pwdn_gpio)) { in __gc032a_power_on()
1034 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 1); in __gc032a_power_on()
1038 if (!IS_ERR(gc032a->supplies)) { in __gc032a_power_on()
1040 gc032a->supplies); in __gc032a_power_on()
1047 if (!IS_ERR(gc032a->pwdn_gpio)) { in __gc032a_power_on()
1048 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 0); in __gc032a_power_on()
1052 if (!IS_ERR(gc032a->xvclk)) { in __gc032a_power_on()
1053 ret = clk_prepare_enable(gc032a->xvclk); in __gc032a_power_on()
1059 gc032a->power_on = true; in __gc032a_power_on()
1063 static void __gc032a_power_off(struct gc032a *gc032a) in __gc032a_power_off() argument
1065 if (!IS_ERR(gc032a->xvclk)) in __gc032a_power_off()
1066 clk_disable_unprepare(gc032a->xvclk); in __gc032a_power_off()
1067 if (!IS_ERR(gc032a->supplies)) in __gc032a_power_off()
1068 regulator_bulk_disable(GC032A_NUM_SUPPLIES, gc032a->supplies); in __gc032a_power_off()
1069 if (!IS_ERR(gc032a->pwdn_gpio)) in __gc032a_power_off()
1070 gpiod_set_value_cansleep(gc032a->pwdn_gpio, 1); in __gc032a_power_off()
1071 gc032a->power_on = false; in __gc032a_power_off()
1074 static int gc032a_configure_regulators(struct gc032a *gc032a) in gc032a_configure_regulators() argument
1079 gc032a->supplies[i].supply = gc032a_supply_names[i]; in gc032a_configure_regulators()
1081 return devm_regulator_bulk_get(&gc032a->client->dev, in gc032a_configure_regulators()
1083 gc032a->supplies); in gc032a_configure_regulators()
1086 static int gc032a_parse_of(struct gc032a *gc032a) in gc032a_parse_of() argument
1088 struct device *dev = &gc032a->client->dev; in gc032a_parse_of()
1091 gc032a->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in gc032a_parse_of()
1092 if (IS_ERR(gc032a->pwdn_gpio)) in gc032a_parse_of()
1095 ret = gc032a_configure_regulators(gc032a); in gc032a_parse_of()
1099 return __gc032a_power_on(gc032a); in gc032a_parse_of()
1108 struct gc032a *gc032a; in gc032a_probe() local
1117 gc032a = devm_kzalloc(&client->dev, sizeof(*gc032a), GFP_KERNEL); in gc032a_probe()
1118 if (!gc032a) in gc032a_probe()
1122 &gc032a->module_index); in gc032a_probe()
1124 &gc032a->module_facing); in gc032a_probe()
1126 &gc032a->module_name); in gc032a_probe()
1128 &gc032a->len_name); in gc032a_probe()
1134 gc032a->client = client; in gc032a_probe()
1135 gc032a->xvclk = devm_clk_get(&client->dev, "xvclk"); in gc032a_probe()
1136 if (IS_ERR(gc032a->xvclk)) { in gc032a_probe()
1141 gc032a_parse_of(gc032a); in gc032a_probe()
1143 gc032a->xvclk_frequency = clk_get_rate(gc032a->xvclk); in gc032a_probe()
1144 if (gc032a->xvclk_frequency < 6000000 || in gc032a_probe()
1145 gc032a->xvclk_frequency > 27000000) in gc032a_probe()
1148 v4l2_ctrl_handler_init(&gc032a->ctrls, 2); in gc032a_probe()
1149 gc032a->link_frequency = in gc032a_probe()
1150 v4l2_ctrl_new_std(&gc032a->ctrls, &gc032a_ctrl_ops, in gc032a_probe()
1155 v4l2_ctrl_new_std_menu_items(&gc032a->ctrls, &gc032a_ctrl_ops, in gc032a_probe()
1159 gc032a->sd.ctrl_handler = &gc032a->ctrls; in gc032a_probe()
1161 if (gc032a->ctrls.error) { in gc032a_probe()
1163 __func__, gc032a->ctrls.error); in gc032a_probe()
1164 return gc032a->ctrls.error; in gc032a_probe()
1167 sd = &gc032a->sd; in gc032a_probe()
1178 gc032a->pad.flags = MEDIA_PAD_FL_SOURCE; in gc032a_probe()
1180 ret = media_entity_pads_init(&sd->entity, 1, &gc032a->pad); in gc032a_probe()
1182 v4l2_ctrl_handler_free(&gc032a->ctrls); in gc032a_probe()
1187 mutex_init(&gc032a->lock); in gc032a_probe()
1189 gc032a_get_default_format(&gc032a->format); in gc032a_probe()
1190 gc032a->frame_size = &gc032a_framesizes[0]; in gc032a_probe()
1192 ret = gc032a_detect(gc032a); in gc032a_probe()
1197 if (strcmp(gc032a->module_facing, "back") == 0) in gc032a_probe()
1203 gc032a->module_index, facing, in gc032a_probe()
1210 gc032a->power_on = false; in gc032a_probe()
1214 v4l2_ctrl_handler_free(&gc032a->ctrls); in gc032a_probe()
1218 mutex_destroy(&gc032a->lock); in gc032a_probe()
1219 __gc032a_power_off(gc032a); in gc032a_probe()
1226 struct gc032a *gc032a = to_gc032a(sd); in gc032a_remove() local
1228 v4l2_ctrl_handler_free(&gc032a->ctrls); in gc032a_remove()
1233 mutex_destroy(&gc032a->lock); in gc032a_remove()
1235 __gc032a_power_off(gc032a); in gc032a_remove()