mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
media: qcom: camss: Add MSM8953 resources
This commit describes the hardware layout for the MSM8953 for the following hardware blocks: - 2 x VFE, 3 RDI per VFE - 3 x CSID - 3 x CSI PHY Signed-off-by: Vladimir Lypak <vladimir.lypak@gmail.com> Acked-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Barnabás Czémán <barnabas.czeman@mainlining.org> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
This commit is contained in:
parent
c830aff08d
commit
7ee35e07cc
5 changed files with 178 additions and 0 deletions
|
@ -596,6 +596,7 @@ int msm_csiphy_subdev_init(struct camss *camss,
|
|||
return PTR_ERR(csiphy->base);
|
||||
|
||||
if (camss->res->version == CAMSS_8x16 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_8x96) {
|
||||
csiphy->base_clk_mux =
|
||||
devm_platform_ioremap_resource_byname(pdev, res->reg[1]);
|
||||
|
|
|
@ -830,6 +830,7 @@ static int ispif_set_stream(struct v4l2_subdev *sd, int enable)
|
|||
ispif_select_cid(ispif, intf, cid, vfe, 1);
|
||||
ispif_config_irq(ispif, intf, vfe, 1);
|
||||
if (camss->res->version == CAMSS_8x96 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_660)
|
||||
ispif_config_pack(ispif,
|
||||
line->fmt[MSM_ISPIF_PAD_SINK].code,
|
||||
|
@ -848,6 +849,7 @@ static int ispif_set_stream(struct v4l2_subdev *sd, int enable)
|
|||
|
||||
mutex_lock(&ispif->config_lock);
|
||||
if (camss->res->version == CAMSS_8x96 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_660)
|
||||
ispif_config_pack(ispif,
|
||||
line->fmt[MSM_ISPIF_PAD_SINK].code,
|
||||
|
@ -1111,6 +1113,7 @@ int msm_ispif_subdev_init(struct camss *camss,
|
|||
if (camss->res->version == CAMSS_8x16)
|
||||
ispif->line_num = 2;
|
||||
else if (camss->res->version == CAMSS_8x96 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_660)
|
||||
ispif->line_num = 4;
|
||||
else
|
||||
|
@ -1130,6 +1133,7 @@ int msm_ispif_subdev_init(struct camss *camss,
|
|||
ispif->line[i].nformats =
|
||||
ARRAY_SIZE(ispif_formats_8x16);
|
||||
} else if (camss->res->version == CAMSS_8x96 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_660) {
|
||||
ispif->line[i].formats = ispif_formats_8x96;
|
||||
ispif->line[i].nformats =
|
||||
|
@ -1162,6 +1166,7 @@ int msm_ispif_subdev_init(struct camss *camss,
|
|||
ret = devm_request_irq(dev, ispif->irq, ispif_isr_8x16,
|
||||
IRQF_TRIGGER_RISING, ispif->irq_name, ispif);
|
||||
else if (camss->res->version == CAMSS_8x96 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_660)
|
||||
ret = devm_request_irq(dev, ispif->irq, ispif_isr_8x96,
|
||||
IRQF_TRIGGER_RISING, ispif->irq_name, ispif);
|
||||
|
|
|
@ -285,6 +285,7 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
|
|||
|
||||
switch (vfe->camss->res->version) {
|
||||
case CAMSS_8x16:
|
||||
case CAMSS_8x53:
|
||||
switch (sink_code) {
|
||||
case MEDIA_BUS_FMT_YUYV8_1X16:
|
||||
{
|
||||
|
|
|
@ -152,6 +152,160 @@ static const struct camss_subdev_resources vfe_res_8x16[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static const struct camss_subdev_resources csid_res_8x53[] = {
|
||||
/* CSID0 */
|
||||
{
|
||||
.regulators = { "vdda" },
|
||||
.clock = { "top_ahb", "ispif_ahb", "csi0_ahb", "ahb",
|
||||
"csi0", "csi0_phy", "csi0_pix", "csi0_rdi" },
|
||||
.clock_rate = { { 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 100000000, 200000000, 310000000,
|
||||
400000000, 465000000 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 } },
|
||||
.reg = { "csid0" },
|
||||
.interrupt = { "csid0" },
|
||||
.csid = {
|
||||
.hw_ops = &csid_ops_4_7,
|
||||
.parent_dev_ops = &vfe_parent_dev_ops,
|
||||
.formats = &csid_formats_4_7
|
||||
}
|
||||
},
|
||||
|
||||
/* CSID1 */
|
||||
{
|
||||
.regulators = { "vdda" },
|
||||
.clock = { "top_ahb", "ispif_ahb", "csi1_ahb", "ahb",
|
||||
"csi1", "csi1_phy", "csi1_pix", "csi1_rdi" },
|
||||
.clock_rate = { { 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 100000000, 200000000, 310000000,
|
||||
400000000, 465000000 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 } },
|
||||
.reg = { "csid1" },
|
||||
.interrupt = { "csid1" },
|
||||
.csid = {
|
||||
.hw_ops = &csid_ops_4_7,
|
||||
.parent_dev_ops = &vfe_parent_dev_ops,
|
||||
.formats = &csid_formats_4_7
|
||||
}
|
||||
},
|
||||
|
||||
/* CSID2 */
|
||||
{
|
||||
.regulators = { "vdda" },
|
||||
.clock = { "top_ahb", "ispif_ahb", "csi2_ahb", "ahb",
|
||||
"csi2", "csi2_phy", "csi2_pix", "csi2_rdi" },
|
||||
.clock_rate = { { 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 100000000, 200000000, 310000000,
|
||||
400000000, 465000000 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 } },
|
||||
.reg = { "csid2" },
|
||||
.interrupt = { "csid2" },
|
||||
.csid = {
|
||||
.hw_ops = &csid_ops_4_7,
|
||||
.parent_dev_ops = &vfe_parent_dev_ops,
|
||||
.formats = &csid_formats_4_7
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
static const struct camss_subdev_resources ispif_res_8x53 = {
|
||||
/* ISPIF */
|
||||
.clock = { "top_ahb", "ahb", "ispif_ahb",
|
||||
"csi0", "csi0_pix", "csi0_rdi",
|
||||
"csi1", "csi1_pix", "csi1_rdi",
|
||||
"csi2", "csi2_pix", "csi2_rdi" },
|
||||
.clock_for_reset = { "vfe0", "csi_vfe0", "vfe1", "csi_vfe1" },
|
||||
.reg = { "ispif", "csi_clk_mux" },
|
||||
.interrupt = { "ispif" },
|
||||
};
|
||||
|
||||
static const struct camss_subdev_resources vfe_res_8x53[] = {
|
||||
/* VFE0 */
|
||||
{
|
||||
.regulators = {},
|
||||
.clock = { "top_ahb", "ahb", "ispif_ahb",
|
||||
"vfe0", "csi_vfe0", "vfe0_ahb", "vfe0_axi" },
|
||||
.clock_rate = { { 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 50000000, 100000000, 133330000,
|
||||
160000000, 200000000, 266670000,
|
||||
310000000, 400000000, 465000000 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 } },
|
||||
.reg = { "vfe0" },
|
||||
.interrupt = { "vfe0" },
|
||||
.vfe = {
|
||||
.line_num = 3,
|
||||
.has_pd = true,
|
||||
.pd_name = "vfe0",
|
||||
.hw_ops = &vfe_ops_4_1,
|
||||
.formats_rdi = &vfe_formats_rdi_8x16,
|
||||
.formats_pix = &vfe_formats_pix_8x16
|
||||
}
|
||||
},
|
||||
|
||||
/* VFE1 */
|
||||
{
|
||||
.regulators = {},
|
||||
.clock = { "top_ahb", "ahb", "ispif_ahb",
|
||||
"vfe1", "csi_vfe1", "vfe1_ahb", "vfe1_axi" },
|
||||
.clock_rate = { { 0 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 50000000, 100000000, 133330000,
|
||||
160000000, 200000000, 266670000,
|
||||
310000000, 400000000, 465000000 },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
{ 0 } },
|
||||
.reg = { "vfe1" },
|
||||
.interrupt = { "vfe1" },
|
||||
.vfe = {
|
||||
.line_num = 3,
|
||||
.has_pd = true,
|
||||
.pd_name = "vfe1",
|
||||
.hw_ops = &vfe_ops_4_1,
|
||||
.formats_rdi = &vfe_formats_rdi_8x16,
|
||||
.formats_pix = &vfe_formats_pix_8x16
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static const struct resources_icc icc_res_8x53[] = {
|
||||
{
|
||||
.name = "cam_ahb",
|
||||
.icc_bw_tbl.avg = 38400,
|
||||
.icc_bw_tbl.peak = 76800,
|
||||
},
|
||||
{
|
||||
.name = "cam_vfe0_mem",
|
||||
.icc_bw_tbl.avg = 939524,
|
||||
.icc_bw_tbl.peak = 1342177,
|
||||
},
|
||||
{
|
||||
.name = "cam_vfe1_mem",
|
||||
.icc_bw_tbl.avg = 939524,
|
||||
.icc_bw_tbl.peak = 1342177,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct camss_subdev_resources csiphy_res_8x96[] = {
|
||||
/* CSIPHY0 */
|
||||
{
|
||||
|
@ -2248,6 +2402,7 @@ static int camss_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
|
||||
if (camss->res->version == CAMSS_8x16 ||
|
||||
camss->res->version == CAMSS_8x53 ||
|
||||
camss->res->version == CAMSS_8x96) {
|
||||
camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL);
|
||||
if (!camss->ispif)
|
||||
|
@ -2389,6 +2544,20 @@ static const struct camss_resources msm8916_resources = {
|
|||
.link_entities = camss_link_entities
|
||||
};
|
||||
|
||||
static const struct camss_resources msm8953_resources = {
|
||||
.version = CAMSS_8x53,
|
||||
.icc_res = icc_res_8x53,
|
||||
.icc_path_num = ARRAY_SIZE(icc_res_8x53),
|
||||
.csiphy_res = csiphy_res_8x96,
|
||||
.csid_res = csid_res_8x53,
|
||||
.ispif_res = &ispif_res_8x53,
|
||||
.vfe_res = vfe_res_8x53,
|
||||
.csiphy_num = ARRAY_SIZE(csiphy_res_8x96),
|
||||
.csid_num = ARRAY_SIZE(csid_res_8x53),
|
||||
.vfe_num = ARRAY_SIZE(vfe_res_8x53),
|
||||
.link_entities = camss_link_entities
|
||||
};
|
||||
|
||||
static const struct camss_resources msm8996_resources = {
|
||||
.version = CAMSS_8x96,
|
||||
.csiphy_res = csiphy_res_8x96,
|
||||
|
@ -2455,6 +2624,7 @@ static const struct camss_resources sc8280xp_resources = {
|
|||
|
||||
static const struct of_device_id camss_dt_match[] = {
|
||||
{ .compatible = "qcom,msm8916-camss", .data = &msm8916_resources },
|
||||
{ .compatible = "qcom,msm8953-camss", .data = &msm8953_resources },
|
||||
{ .compatible = "qcom,msm8996-camss", .data = &msm8996_resources },
|
||||
{ .compatible = "qcom,sdm660-camss", .data = &sdm660_resources },
|
||||
{ .compatible = "qcom,sdm845-camss", .data = &sdm845_resources },
|
||||
|
|
|
@ -78,6 +78,7 @@ enum pm_domain {
|
|||
|
||||
enum camss_version {
|
||||
CAMSS_8x16,
|
||||
CAMSS_8x53,
|
||||
CAMSS_8x96,
|
||||
CAMSS_660,
|
||||
CAMSS_845,
|
||||
|
|
Loading…
Add table
Reference in a new issue