csi2_dev
struct regmap *regmap = csi2_dev->regmap;
csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes;
struct v4l2_mbus_framefmt *mbus_format = &csi2_dev->bridge.mbus_format;
struct device *dev = csi2_dev->dev;
struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
struct v4l2_subdev *source_subdev = csi2_dev->bridge.source_subdev;
struct v4l2_mbus_framefmt *mbus_format = &csi2_dev->bridge.mbus_format;
struct phy *dphy = csi2_dev->dphy;
struct device *dev = csi2_dev->dev;
csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes;
sun6i_mipi_csi2_configure(csi2_dev);
sun6i_mipi_csi2_enable(csi2_dev);
sun6i_mipi_csi2_disable(csi2_dev);
struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
struct mutex *lock = &csi2_dev->bridge.lock;
struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
struct mutex *lock = &csi2_dev->bridge.lock;
*mbus_format = csi2_dev->bridge.mbus_format;
struct sun6i_mipi_csi2_device *csi2_dev = v4l2_get_subdevdata(subdev);
struct mutex *lock = &csi2_dev->bridge.lock;
csi2_dev->bridge.mbus_format = *mbus_format;
struct sun6i_mipi_csi2_device *csi2_dev =
struct device *dev = csi2_dev->dev;
csi2_dev->bridge.source_subdev = remote_subdev;
sun6i_mipi_csi2_bridge_source_setup(struct sun6i_mipi_csi2_device *csi2_dev)
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
struct v4l2_fwnode_endpoint *endpoint = &csi2_dev->bridge.endpoint;
struct device *dev = csi2_dev->dev;
static int sun6i_mipi_csi2_bridge_setup(struct sun6i_mipi_csi2_device *csi2_dev)
struct sun6i_mipi_csi2_bridge *bridge = &csi2_dev->bridge;
struct device *dev = csi2_dev->dev;
v4l2_set_subdevdata(subdev, csi2_dev);
ret = sun6i_mipi_csi2_bridge_source_setup(csi2_dev);
sun6i_mipi_csi2_bridge_cleanup(struct sun6i_mipi_csi2_device *csi2_dev)
struct v4l2_subdev *subdev = &csi2_dev->bridge.subdev;
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
struct sun6i_mipi_csi2_device *csi2_dev = dev_get_drvdata(dev);
clk_disable_unprepare(csi2_dev->clock_mod);
reset_control_assert(csi2_dev->reset);
struct sun6i_mipi_csi2_device *csi2_dev = dev_get_drvdata(dev);
ret = reset_control_deassert(csi2_dev->reset);
ret = clk_prepare_enable(csi2_dev->clock_mod);
reset_control_assert(csi2_dev->reset);
sun6i_mipi_csi2_resources_setup(struct sun6i_mipi_csi2_device *csi2_dev,
struct device *dev = csi2_dev->dev;
csi2_dev->regmap =
if (IS_ERR(csi2_dev->regmap)) {
return PTR_ERR(csi2_dev->regmap);
csi2_dev->clock_mod = devm_clk_get(dev, "mod");
if (IS_ERR(csi2_dev->clock_mod)) {
return PTR_ERR(csi2_dev->clock_mod);
ret = clk_set_rate_exclusive(csi2_dev->clock_mod, 297000000);
csi2_dev->reset = devm_reset_control_get_shared(dev, NULL);
if (IS_ERR(csi2_dev->reset)) {
ret = PTR_ERR(csi2_dev->reset);
csi2_dev->dphy = devm_phy_get(dev, "dphy");
if (IS_ERR(csi2_dev->dphy)) {
ret = PTR_ERR(csi2_dev->dphy);
ret = phy_init(csi2_dev->dphy);
clk_rate_exclusive_put(csi2_dev->clock_mod);
sun6i_mipi_csi2_resources_cleanup(struct sun6i_mipi_csi2_device *csi2_dev)
pm_runtime_disable(csi2_dev->dev);
phy_exit(csi2_dev->dphy);
clk_rate_exclusive_put(csi2_dev->clock_mod);
struct sun6i_mipi_csi2_device *csi2_dev;
csi2_dev = devm_kzalloc(dev, sizeof(*csi2_dev), GFP_KERNEL);
if (!csi2_dev)
csi2_dev->dev = dev;
platform_set_drvdata(platform_dev, csi2_dev);
ret = sun6i_mipi_csi2_resources_setup(csi2_dev, platform_dev);
ret = sun6i_mipi_csi2_bridge_setup(csi2_dev);
sun6i_mipi_csi2_resources_cleanup(csi2_dev);
struct sun6i_mipi_csi2_device *csi2_dev =
sun6i_mipi_csi2_bridge_cleanup(csi2_dev);
sun6i_mipi_csi2_resources_cleanup(csi2_dev);
static void sun6i_mipi_csi2_enable(struct sun6i_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
static void sun6i_mipi_csi2_disable(struct sun6i_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
static void sun6i_mipi_csi2_configure(struct sun6i_mipi_csi2_device *csi2_dev)
struct sun8i_a83t_mipi_csi2_device *csi2_dev = phy_get_drvdata(dphy);
struct regmap *regmap = csi2_dev->regmap;
struct sun8i_a83t_mipi_csi2_device *csi2_dev = phy_get_drvdata(dphy);
struct regmap *regmap = csi2_dev->regmap;
int sun8i_a83t_dphy_register(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct device *dev = csi2_dev->dev;
csi2_dev->dphy = devm_phy_create(dev, NULL, &sun8i_a83t_dphy_ops);
if (IS_ERR(csi2_dev->dphy)) {
return PTR_ERR(csi2_dev->dphy);
phy_set_drvdata(csi2_dev->dphy, csi2_dev);
int sun8i_a83t_dphy_register(struct sun8i_a83t_mipi_csi2_device *csi2_dev);
sun8i_a83t_mipi_csi2_enable(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
sun8i_a83t_mipi_csi2_disable(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
sun8i_a83t_mipi_csi2_configure(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes;
struct v4l2_mbus_framefmt *mbus_format = &csi2_dev->bridge.mbus_format;
struct device *dev = csi2_dev->dev;
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
struct v4l2_subdev *source_subdev = csi2_dev->bridge.source_subdev;
struct v4l2_mbus_framefmt *mbus_format = &csi2_dev->bridge.mbus_format;
struct phy *dphy = csi2_dev->dphy;
struct device *dev = csi2_dev->dev;
csi2_dev->bridge.endpoint.bus.mipi_csi2.num_data_lanes;
sun8i_a83t_mipi_csi2_configure(csi2_dev);
sun8i_a83t_mipi_csi2_enable(csi2_dev);
sun8i_a83t_mipi_csi2_disable(csi2_dev);
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
struct mutex *lock = &csi2_dev->bridge.lock;
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
struct mutex *lock = &csi2_dev->bridge.lock;
*mbus_format = csi2_dev->bridge.mbus_format;
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
struct mutex *lock = &csi2_dev->bridge.lock;
csi2_dev->bridge.mbus_format = *mbus_format;
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
struct device *dev = csi2_dev->dev;
csi2_dev->bridge.source_subdev = remote_subdev;
sun8i_a83t_mipi_csi2_bridge_source_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
struct v4l2_fwnode_endpoint *endpoint = &csi2_dev->bridge.endpoint;
struct device *dev = csi2_dev->dev;
sun8i_a83t_mipi_csi2_bridge_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct sun8i_a83t_mipi_csi2_bridge *bridge = &csi2_dev->bridge;
struct device *dev = csi2_dev->dev;
v4l2_set_subdevdata(subdev, csi2_dev);
ret = sun8i_a83t_mipi_csi2_bridge_source_setup(csi2_dev);
sun8i_a83t_mipi_csi2_bridge_cleanup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct v4l2_subdev *subdev = &csi2_dev->bridge.subdev;
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
struct sun8i_a83t_mipi_csi2_device *csi2_dev = dev_get_drvdata(dev);
clk_disable_unprepare(csi2_dev->clock_misc);
clk_disable_unprepare(csi2_dev->clock_mipi);
clk_disable_unprepare(csi2_dev->clock_mod);
reset_control_assert(csi2_dev->reset);
struct sun8i_a83t_mipi_csi2_device *csi2_dev = dev_get_drvdata(dev);
ret = reset_control_deassert(csi2_dev->reset);
ret = clk_prepare_enable(csi2_dev->clock_mod);
ret = clk_prepare_enable(csi2_dev->clock_mipi);
ret = clk_prepare_enable(csi2_dev->clock_misc);
sun8i_a83t_mipi_csi2_init(csi2_dev);
clk_disable_unprepare(csi2_dev->clock_mipi);
clk_disable_unprepare(csi2_dev->clock_mod);
reset_control_assert(csi2_dev->reset);
sun8i_a83t_mipi_csi2_resources_setup(struct sun8i_a83t_mipi_csi2_device *csi2_dev,
struct device *dev = csi2_dev->dev;
csi2_dev->regmap =
if (IS_ERR(csi2_dev->regmap)) {
return PTR_ERR(csi2_dev->regmap);
csi2_dev->clock_mod = devm_clk_get(dev, "mod");
if (IS_ERR(csi2_dev->clock_mod)) {
return PTR_ERR(csi2_dev->clock_mod);
ret = clk_set_rate_exclusive(csi2_dev->clock_mod, 297000000);
csi2_dev->clock_mipi = devm_clk_get(dev, "mipi");
if (IS_ERR(csi2_dev->clock_mipi)) {
ret = PTR_ERR(csi2_dev->clock_mipi);
csi2_dev->clock_misc = devm_clk_get(dev, "misc");
if (IS_ERR(csi2_dev->clock_misc)) {
ret = PTR_ERR(csi2_dev->clock_misc);
csi2_dev->reset = devm_reset_control_get_shared(dev, NULL);
if (IS_ERR(csi2_dev->reset)) {
ret = PTR_ERR(csi2_dev->reset);
ret = sun8i_a83t_dphy_register(csi2_dev);
clk_rate_exclusive_put(csi2_dev->clock_mod);
sun8i_a83t_mipi_csi2_resources_cleanup(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
pm_runtime_disable(csi2_dev->dev);
phy_exit(csi2_dev->dphy);
clk_rate_exclusive_put(csi2_dev->clock_mod);
struct sun8i_a83t_mipi_csi2_device *csi2_dev;
csi2_dev = devm_kzalloc(dev, sizeof(*csi2_dev), GFP_KERNEL);
if (!csi2_dev)
csi2_dev->dev = dev;
platform_set_drvdata(platform_dev, csi2_dev);
ret = sun8i_a83t_mipi_csi2_resources_setup(csi2_dev, platform_dev);
ret = sun8i_a83t_mipi_csi2_bridge_setup(csi2_dev);
sun8i_a83t_mipi_csi2_resources_cleanup(csi2_dev);
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
sun8i_a83t_mipi_csi2_bridge_cleanup(csi2_dev);
sun8i_a83t_mipi_csi2_resources_cleanup(csi2_dev);
sun8i_a83t_mipi_csi2_init(struct sun8i_a83t_mipi_csi2_device *csi2_dev)
struct regmap *regmap = csi2_dev->regmap;
return container_of(n, struct csi2_dev, notifier);
static void csi2_enable(struct csi2_dev *csi2, bool enable)
static void csi2_set_lanes(struct csi2_dev *csi2, unsigned int lanes)
static void dw_mipi_csi2_phy_write(struct csi2_dev *csi2,
static int csi2_dphy_init(struct csi2_dev *csi2)
static int __maybe_unused csi2_dphy_wait_ulp(struct csi2_dev *csi2)
static void csi2_dphy_wait_stopstate(struct csi2_dev *csi2, unsigned int lanes)
static int csi2_dphy_wait_clock_lane(struct csi2_dev *csi2)
static void csi2ipu_gasket_init(struct csi2_dev *csi2)
static int csi2_get_active_lanes(struct csi2_dev *csi2, unsigned int *lanes)
static int csi2_start(struct csi2_dev *csi2)
static void csi2_stop(struct csi2_dev *csi2)
struct csi2_dev *csi2 = sd_to_dev(sd);
struct csi2_dev *csi2 = sd_to_dev(sd);
__csi2_get_fmt(struct csi2_dev *csi2, struct v4l2_subdev_state *sd_state,
struct csi2_dev *csi2 = sd_to_dev(sd);
struct csi2_dev *csi2 = sd_to_dev(sd);
struct csi2_dev *csi2 = sd_to_dev(sd);
struct csi2_dev *csi2 = sd_to_dev(sd);
struct csi2_dev *csi2 = notifier_to_dev(notifier);
struct csi2_dev *csi2 = notifier_to_dev(notifier);
static int csi2_async_register(struct csi2_dev *csi2)
struct csi2_dev *csi2;
struct csi2_dev *csi2 = sd_to_dev(sd);
static inline struct csi2_dev *sd_to_dev(struct v4l2_subdev *sdev)
return container_of(sdev, struct csi2_dev, sd);
static inline struct csi2_dev *notifier_to_dev(struct v4l2_async_notifier *n)