Loading drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c +5 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ #include <media/cam_isp.h> #include <media/cam_defs.h> #include <media/cam_req_mgr.h> #include <dt-bindings/msm/msm-camera.h> #include "cam_ife_csid_core.h" Loading @@ -17,6 +18,7 @@ #include "cam_io_util.h" #include "cam_debug_util.h" #include "cam_cpas_api.h" #include "cam_subdev.h" /* Timeout value in msec */ #define IFE_CSID_TIMEOUT 1000 Loading Loading @@ -1742,6 +1744,9 @@ static void cam_ife_csid_halt_csi2( csid_reg->csi2_reg->csid_csi2_rx_cfg0_addr); cam_io_w_mb(0, soc_info->reg_map[0].mem_base + csid_reg->csi2_reg->csid_csi2_rx_cfg1_addr); cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE, CAM_SUBDEV_MESSAGE_IRQ_ERR, csid_hw->csi2_rx_cfg.phy_sel); } static int cam_ife_csid_init_config_pxl_path( Loading drivers/cam_isp/isp_hw_mgr/isp_hw/tfe_csid_hw/cam_tfe_csid_core.c +8 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/slab.h> #include <media/cam_tfe.h> #include <media/cam_defs.h> #include <media/cam_req_mgr.h> #include "cam_tfe_csid_core.h" #include "cam_isp_hw.h" Loading @@ -15,6 +16,7 @@ #include "cam_debug_util.h" #include "cam_cpas_api.h" #include "cam_isp_hw_mgr_intf.h" #include "cam_subdev.h" /* Timeout value in msec */ #define TFE_CSID_TIMEOUT 1000 Loading Loading @@ -2585,6 +2587,12 @@ irqreturn_t cam_tfe_csid_irq(int irq_num, void *data) csid_reg->csi2_reg->csid_csi2_rx_cfg1_addr); cam_io_w_mb(0, soc_info->reg_map[0].mem_base + csid_reg->csi2_reg->csid_csi2_rx_irq_mask_addr); /* phy_sel starts from 1 and should never be zero*/ if (csid_hw->csi2_rx_cfg.phy_sel > 0) { cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE, CAM_SUBDEV_MESSAGE_IRQ_ERR, (csid_hw->csi2_rx_cfg.phy_sel - 1)); } } if (csid_hw->csid_debug & TFE_CSID_DEBUG_ENABLE_EOT_IRQ) { Loading drivers/cam_req_mgr/cam_req_mgr_dev.c +19 −1 Original line number Diff line number Diff line Loading @@ -641,6 +641,24 @@ void cam_video_device_cleanup(void) g_dev.video = NULL; } void cam_subdev_notify_message(u32 subdev_type, enum cam_subdev_message_type_t message_type, uint32_t data) { struct v4l2_subdev *sd = NULL; struct cam_subdev *csd = NULL; list_for_each_entry(sd, &g_dev.v4l2_dev->subdevs, list) { sd->entity.name = video_device_node_name(sd->devnode); if (sd->entity.function == subdev_type) { csd = container_of(sd, struct cam_subdev, sd); if (csd->msg_cb != NULL) csd->msg_cb(sd, message_type, data); } } } EXPORT_SYMBOL(cam_subdev_notify_message); int cam_register_subdev(struct cam_subdev *csd) { struct v4l2_subdev *sd; Loading @@ -661,7 +679,7 @@ int cam_register_subdev(struct cam_subdev *csd) sd = &csd->sd; v4l2_subdev_init(sd, csd->ops); sd->internal_ops = csd->internal_ops; snprintf(sd->name, ARRAY_SIZE(sd->name), csd->name); snprintf(sd->name, V4L2_SUBDEV_NAME_SIZE, "%s", csd->name); v4l2_set_subdevdata(sd, csd->token); sd->flags = csd->sd_flags; Loading drivers/cam_req_mgr/cam_subdev.h +22 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ #define CAM_SUBDEVICE_EVENT_MAX 30 enum cam_subdev_message_type_t { CAM_SUBDEV_MESSAGE_IRQ_ERR = 0x1 }; /** * struct cam_subdev - describes a camera sub-device * Loading Loading @@ -49,8 +53,26 @@ struct cam_subdev { u32 sd_flags; void *token; u32 ent_function; void (*msg_cb)( struct v4l2_subdev *sd, enum cam_subdev_message_type_t msg_type, uint32_t data); }; /** * cam_subdev_notify_message() * * @brief: Notify message to a subdevs of specific type * * @subdev_type: Subdev type * @message_type: message type * @data: data to be delivered. * */ void cam_subdev_notify_message(u32 subdev_type, enum cam_subdev_message_type_t message_type, uint32_t data); /** * cam_subdev_probe() * Loading drivers/cam_sensor_module/cam_csiphy/cam_csiphy_dev.c +21 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,25 @@ #include <media/cam_sensor.h> #include "camera_main.h" static void cam_csiphy_subdev_handle_message( struct v4l2_subdev *sd, enum cam_subdev_message_type_t message_type, uint32_t data) { struct csiphy_device *csiphy_dev = v4l2_get_subdevdata(sd); switch (message_type) { case CAM_SUBDEV_MESSAGE_IRQ_ERR: CAM_INFO(CAM_CSIPHY, "subdev index : %d CSIPHY index: %d", csiphy_dev->soc_info.index, data); if (data == csiphy_dev->soc_info.index) cam_csiphy_status_dmp(csiphy_dev); break; default: break; } } static long cam_csiphy_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { Loading Loading @@ -151,6 +170,8 @@ static int cam_csiphy_component_bind(struct device *dev, (V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS); new_csiphy_dev->v4l2_dev_str.ent_function = CAM_CSIPHY_DEVICE_TYPE; new_csiphy_dev->v4l2_dev_str.msg_cb = cam_csiphy_subdev_handle_message; new_csiphy_dev->v4l2_dev_str.token = new_csiphy_dev; Loading Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c +5 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ #include <media/cam_isp.h> #include <media/cam_defs.h> #include <media/cam_req_mgr.h> #include <dt-bindings/msm/msm-camera.h> #include "cam_ife_csid_core.h" Loading @@ -17,6 +18,7 @@ #include "cam_io_util.h" #include "cam_debug_util.h" #include "cam_cpas_api.h" #include "cam_subdev.h" /* Timeout value in msec */ #define IFE_CSID_TIMEOUT 1000 Loading Loading @@ -1742,6 +1744,9 @@ static void cam_ife_csid_halt_csi2( csid_reg->csi2_reg->csid_csi2_rx_cfg0_addr); cam_io_w_mb(0, soc_info->reg_map[0].mem_base + csid_reg->csi2_reg->csid_csi2_rx_cfg1_addr); cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE, CAM_SUBDEV_MESSAGE_IRQ_ERR, csid_hw->csi2_rx_cfg.phy_sel); } static int cam_ife_csid_init_config_pxl_path( Loading
drivers/cam_isp/isp_hw_mgr/isp_hw/tfe_csid_hw/cam_tfe_csid_core.c +8 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/slab.h> #include <media/cam_tfe.h> #include <media/cam_defs.h> #include <media/cam_req_mgr.h> #include "cam_tfe_csid_core.h" #include "cam_isp_hw.h" Loading @@ -15,6 +16,7 @@ #include "cam_debug_util.h" #include "cam_cpas_api.h" #include "cam_isp_hw_mgr_intf.h" #include "cam_subdev.h" /* Timeout value in msec */ #define TFE_CSID_TIMEOUT 1000 Loading Loading @@ -2585,6 +2587,12 @@ irqreturn_t cam_tfe_csid_irq(int irq_num, void *data) csid_reg->csi2_reg->csid_csi2_rx_cfg1_addr); cam_io_w_mb(0, soc_info->reg_map[0].mem_base + csid_reg->csi2_reg->csid_csi2_rx_irq_mask_addr); /* phy_sel starts from 1 and should never be zero*/ if (csid_hw->csi2_rx_cfg.phy_sel > 0) { cam_subdev_notify_message(CAM_CSIPHY_DEVICE_TYPE, CAM_SUBDEV_MESSAGE_IRQ_ERR, (csid_hw->csi2_rx_cfg.phy_sel - 1)); } } if (csid_hw->csid_debug & TFE_CSID_DEBUG_ENABLE_EOT_IRQ) { Loading
drivers/cam_req_mgr/cam_req_mgr_dev.c +19 −1 Original line number Diff line number Diff line Loading @@ -641,6 +641,24 @@ void cam_video_device_cleanup(void) g_dev.video = NULL; } void cam_subdev_notify_message(u32 subdev_type, enum cam_subdev_message_type_t message_type, uint32_t data) { struct v4l2_subdev *sd = NULL; struct cam_subdev *csd = NULL; list_for_each_entry(sd, &g_dev.v4l2_dev->subdevs, list) { sd->entity.name = video_device_node_name(sd->devnode); if (sd->entity.function == subdev_type) { csd = container_of(sd, struct cam_subdev, sd); if (csd->msg_cb != NULL) csd->msg_cb(sd, message_type, data); } } } EXPORT_SYMBOL(cam_subdev_notify_message); int cam_register_subdev(struct cam_subdev *csd) { struct v4l2_subdev *sd; Loading @@ -661,7 +679,7 @@ int cam_register_subdev(struct cam_subdev *csd) sd = &csd->sd; v4l2_subdev_init(sd, csd->ops); sd->internal_ops = csd->internal_ops; snprintf(sd->name, ARRAY_SIZE(sd->name), csd->name); snprintf(sd->name, V4L2_SUBDEV_NAME_SIZE, "%s", csd->name); v4l2_set_subdevdata(sd, csd->token); sd->flags = csd->sd_flags; Loading
drivers/cam_req_mgr/cam_subdev.h +22 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ #define CAM_SUBDEVICE_EVENT_MAX 30 enum cam_subdev_message_type_t { CAM_SUBDEV_MESSAGE_IRQ_ERR = 0x1 }; /** * struct cam_subdev - describes a camera sub-device * Loading Loading @@ -49,8 +53,26 @@ struct cam_subdev { u32 sd_flags; void *token; u32 ent_function; void (*msg_cb)( struct v4l2_subdev *sd, enum cam_subdev_message_type_t msg_type, uint32_t data); }; /** * cam_subdev_notify_message() * * @brief: Notify message to a subdevs of specific type * * @subdev_type: Subdev type * @message_type: message type * @data: data to be delivered. * */ void cam_subdev_notify_message(u32 subdev_type, enum cam_subdev_message_type_t message_type, uint32_t data); /** * cam_subdev_probe() * Loading
drivers/cam_sensor_module/cam_csiphy/cam_csiphy_dev.c +21 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,25 @@ #include <media/cam_sensor.h> #include "camera_main.h" static void cam_csiphy_subdev_handle_message( struct v4l2_subdev *sd, enum cam_subdev_message_type_t message_type, uint32_t data) { struct csiphy_device *csiphy_dev = v4l2_get_subdevdata(sd); switch (message_type) { case CAM_SUBDEV_MESSAGE_IRQ_ERR: CAM_INFO(CAM_CSIPHY, "subdev index : %d CSIPHY index: %d", csiphy_dev->soc_info.index, data); if (data == csiphy_dev->soc_info.index) cam_csiphy_status_dmp(csiphy_dev); break; default: break; } } static long cam_csiphy_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { Loading Loading @@ -151,6 +170,8 @@ static int cam_csiphy_component_bind(struct device *dev, (V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS); new_csiphy_dev->v4l2_dev_str.ent_function = CAM_CSIPHY_DEVICE_TYPE; new_csiphy_dev->v4l2_dev_str.msg_cb = cam_csiphy_subdev_handle_message; new_csiphy_dev->v4l2_dev_str.token = new_csiphy_dev; Loading