Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd3353b6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "ARM: dts: msm: Add vbif register configuration for jpeg on 8996"

parents 23eab882 b5e06895
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -18,6 +18,10 @@ Required properties:
- mmagic-vdd-supply: phandle to GDSC regulator controlling mmagic.
- camss-vdd-supply: phandle to GDSC regulator controlling camss.

Optional properties:
- qcom,vbif-reg-settings: relative address offsets and value pairs for VBIF registers.
- qcom,qos-reg-settings: relative address offsets and value pairs for QoS registers.

Example:

	qcom,jpeg@a1c000 {
@@ -46,6 +50,10 @@ Example:
                        <&clock_mmss clk_mmss_mmagic_axi_clk>,
                        <&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <320000000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>,
			<0xb0 0x00100010>,
			<0xc0 0x10001000>;
		qcom,qos-reg-settings = <0x28 0x00000008>;
		status = "ok";
	};

@@ -75,6 +83,10 @@ Example:
                       <&clock_mmss clk_mmss_mmagic_axi_clk>,
                       <&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>,
			<0xb0 0x00100010>,
			<0xc0 0x10001000>;
		qcom,qos-reg-settings = <0x28 0x00000008>;
		status = "ok";
	};

@@ -104,6 +116,10 @@ Example:
                        <&clock_mmss clk_mmss_mmagic_axi_clk>,
                        <&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>,
			<0xb0 0x00100010>,
			<0xc0 0x10001000>;
		qcom,qos-reg-settings = <0x28 0x00000008>;
		status = "ok";
	};
+3 −0
Original line number Diff line number Diff line
@@ -479,6 +479,7 @@
			<&clock_mmss clk_mmss_mmagic_axi_clk>,
			<&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <320000000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>;
		status = "ok";
	};

@@ -508,6 +509,7 @@
			<&clock_mmss clk_mmss_mmagic_axi_clk>,
			<&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>;
		status = "ok";
	};

@@ -537,6 +539,7 @@
			<&clock_mmss clk_mmss_mmagic_axi_clk>,
			<&clock_mmss clk_mmagic_camss_axi_clk>;
		qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>;
		qcom,vbif-reg-settings = <0x4 0x1>;
		status = "ok";
	};

+110 −2
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@
#include "msm_jpeg_common.h"
#include "msm_jpeg_hw.h"

#define JPEG_DT_PROP_CNT 1

static int msm_jpeg_get_regulator_info(struct msm_jpeg_device *jpeg_dev,
	struct platform_device *pdev)
{
@@ -289,6 +291,72 @@ static void set_vbif_params(struct msm_jpeg_device *pgmn_dev,

}

/*
 * msm_jpeg_set_init_dt_parms() - get device tree config and write to registers.
 * @pgmn_dev: Pointer to jpeg device.
 * @dt_prop_name: Device tree property name.
 * @base: Base address.
 *
 * This function reads register offsets and values from dtsi based on
 * device tree property name and writes to jpeg registers.
 *
 * Return: 0 on success and negative error on failure.
 */
static int32_t msm_jpeg_set_init_dt_parms(struct msm_jpeg_device *pgmn_dev,
	const char *dt_prop_name,
	void *base)
{
	struct device_node *of_node;
	int32_t i = 0 , rc = 0;
	uint32_t *dt_reg_settings = NULL;
	uint32_t dt_count = 0;

	of_node = pgmn_dev->pdev->dev.of_node;
	JPEG_DBG("%s:%d E\n", __func__, __LINE__);

	if (!of_get_property(of_node, dt_prop_name,
				&dt_count)) {
		JPEG_DBG("%s: Error property does not exist\n",
				__func__);
		return -ENOENT;
	}
	if (dt_count % 8) {
		JPEG_PR_ERR("%s: Error invalid entries\n",
				__func__);
		return -EINVAL;
	}
	dt_count /= 4;
	if (dt_count != 0) {
		dt_reg_settings = kcalloc(dt_count, sizeof(uint32_t),
			GFP_KERNEL);
		if (!dt_reg_settings) {
			JPEG_PR_ERR("%s:%d No memory\n",
				__func__, __LINE__);
			return -ENOMEM;
		}
		rc = of_property_read_u32_array(of_node,
				dt_prop_name,
				dt_reg_settings,
				dt_count);
		if (rc < 0) {
			JPEG_PR_ERR("%s: No reg info\n",
				__func__);
			kfree(dt_reg_settings);
			return -EINVAL;
		}
		for (i = 0; i < dt_count; i = i + 2) {
			JPEG_DBG("%s:%d] %p %08x\n",
					__func__, __LINE__,
					base + dt_reg_settings[i],
					dt_reg_settings[i + 1]);
			writel_relaxed(dt_reg_settings[i + 1],
					base + dt_reg_settings[i]);
		}
		kfree(dt_reg_settings);
	}
	return 0;
}

static struct msm_bus_vectors msm_jpeg_init_vectors[] = {
	{
		.src = MSM_BUS_MASTER_JPEG,
@@ -455,7 +523,15 @@ int msm_jpeg_platform_init(struct platform_device *pdev,
	if (rc < 0)
		goto fail_iommu;

	rc = msm_jpeg_set_init_dt_parms(pgmn_dev, "qcom,vbif-reg-settings",
		pgmn_dev->jpeg_vbif);
	if (rc == -ENOENT) {
		JPEG_DBG("%s: No qcom,vbif-reg-settings property\n", __func__);
		set_vbif_params(pgmn_dev, pgmn_dev->jpeg_vbif);
	} else if (rc < 0) {
		JPEG_PR_ERR("%s: vbif params set fail\n", __func__);
		goto fail_set_vbif;
	}

	rc = request_irq(jpeg_irq, handler, IRQF_TRIGGER_RISING,
		dev_name(&pdev->dev), context);
@@ -473,12 +549,12 @@ int msm_jpeg_platform_init(struct platform_device *pdev,
	return rc;

fail_request_irq:
fail_set_vbif:
	msm_jpeg_detach_iommu(pgmn_dev);

fail_iommu:
	iounmap(pgmn_dev->jpeg_vbif);


fail_vbif:
	msm_cam_clk_enable(&pgmn_dev->pdev->dev, pgmn_dev->jpeg_clk_info,
	pgmn_dev->jpeg_clk, pgmn_dev->num_clk, 0);
@@ -532,3 +608,35 @@ int msm_jpeg_platform_release(struct resource *mem, void *base, int irq,
	return result;
}

/*
 * msm_jpeg_platform_set_dt_config() - set jpeg device tree configuration.
 * @pgmn_dev: Pointer to jpeg device.
 *
 * This function holds an array of device tree property names and calls
 * msm_jpeg_set_init_dt_parms() for each property.
 *
 * Return: 0 on success and negative error on failure.
 */
int msm_jpeg_platform_set_dt_config(struct msm_jpeg_device *pgmn_dev)
{
	int rc = 0;
	uint8_t dt_prop_cnt = JPEG_DT_PROP_CNT;
	char *dt_prop_name[JPEG_DT_PROP_CNT] = {"qcom,qos-reg-settings"};

	while (dt_prop_cnt) {
		dt_prop_cnt--;
		rc = msm_jpeg_set_init_dt_parms(pgmn_dev,
			dt_prop_name[dt_prop_cnt],
			pgmn_dev->base);
		if (rc == -ENOENT) {
			JPEG_DBG("%s: No %s property\n", __func__,
				dt_prop_name[dt_prop_cnt]);
		} else if (rc < 0) {
			JPEG_PR_ERR("%s: %s params set fail\n", __func__,
				dt_prop_name[dt_prop_cnt]);
			return rc;
		}
	}
	return rc;
}
+1 −0
Original line number Diff line number Diff line
@@ -36,5 +36,6 @@ int msm_jpeg_platform_init(struct platform_device *pdev,
	void *context);
int msm_jpeg_platform_release(struct resource *mem, void *base, int irq,
	void *context);
int msm_jpeg_platform_set_dt_config(struct msm_jpeg_device *pgmn_dev);

#endif /* MSM_JPEG_PLATFORM_H */
+2 −0
Original line number Diff line number Diff line
@@ -878,6 +878,8 @@ int msm_jpeg_start(struct msm_jpeg_device *pgmn_dev, void * __user arg,

	JPEG_DBG("%s:%d] Enter\n", __func__, __LINE__);

	msm_jpeg_platform_set_dt_config(pgmn_dev);

	pgmn_dev->release_buf = 1;
	for (i = 0; i < 2; i++) {
		buf_out = msm_jpeg_q_out(&pgmn_dev->input_buf_q);