]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: platform: meson-ao-cec-g12a: add support for SM1
authorNeil Armstrong <narmstrong@baylibre.com>
Mon, 1 Jul 2019 10:47:02 +0000 (06:47 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Tue, 23 Jul 2019 12:51:50 +0000 (08:51 -0400)
Add support for the Amlogic SM1 SoC Family to the G12A AO-CECB
derivative.

It only adds a single init register.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
[hverkuil-cisco@xs4all.nl: dropped spurious newline]
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/meson/ao-cec-g12a.c

index c99d01926673045af4fde4a3ac2957c64daa475b..3b39e875292e46e485a7f9635f17fcc167ddfeac 100644 (file)
 #define CECB_CTRL_TYPE_NEXT    2
 
 #define CECB_CTRL2             0x01
+
+#define CECB_CTRL2_RISE_DEL_MAX        GENMASK(4, 0)
+
 #define CECB_INTR_MASK         0x02
 #define CECB_LADD_LOW          0x05
 #define CECB_LADD_HIGH         0x06
 
 #define CECB_WAKEUPCTRL                0x31
 
+struct meson_ao_cec_g12a_data {
+       /* Setup the internal CECB_CTRL2 register */
+       bool                            ctrl2_setup;
+};
+
 struct meson_ao_cec_g12a_device {
        struct platform_device          *pdev;
        struct regmap                   *regmap;
@@ -175,6 +183,7 @@ struct meson_ao_cec_g12a_device {
        struct cec_msg                  rx_msg;
        struct clk                      *oscin;
        struct clk                      *core;
+       const struct meson_ao_cec_g12a_data *data;
 };
 
 static const struct regmap_config meson_ao_cec_g12a_regmap_conf = {
@@ -605,6 +614,10 @@ static int meson_ao_cec_g12a_adap_enable(struct cec_adapter *adap, bool enable)
        regmap_update_bits(ao_cec->regmap, CECB_GEN_CNTL_REG,
                           CECB_GEN_CNTL_RESET, 0);
 
+       if (ao_cec->data->ctrl2_setup)
+               regmap_write(ao_cec->regmap_cec, CECB_CTRL2,
+                            FIELD_PREP(CECB_CTRL2_RISE_DEL_MAX, 2));
+
        meson_ao_cec_g12a_irq_setup(ao_cec, true);
 
        return 0;
@@ -632,6 +645,12 @@ static int meson_ao_cec_g12a_probe(struct platform_device *pdev)
        if (!ao_cec)
                return -ENOMEM;
 
+       ao_cec->data = of_device_get_match_data(&pdev->dev);
+       if (!ao_cec->data) {
+               dev_err(&pdev->dev, "failed to get match data\n");
+               return -ENODEV;
+       }
+
        spin_lock_init(&ao_cec->cec_reg_lock);
        ao_cec->pdev = pdev;
 
@@ -740,8 +759,23 @@ static int meson_ao_cec_g12a_remove(struct platform_device *pdev)
        return 0;
 }
 
+static const struct meson_ao_cec_g12a_data ao_cec_g12a_data = {
+       .ctrl2_setup = false,
+};
+
+static const struct meson_ao_cec_g12a_data ao_cec_sm1_data = {
+       .ctrl2_setup = true,
+};
+
 static const struct of_device_id meson_ao_cec_g12a_of_match[] = {
-       { .compatible = "amlogic,meson-g12a-ao-cec", },
+       {
+               .compatible = "amlogic,meson-g12a-ao-cec",
+               .data = &ao_cec_g12a_data,
+       },
+       {
+               .compatible = "amlogic,meson-sm1-ao-cec",
+               .data = &ao_cec_sm1_data,
+       },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, meson_ao_cec_g12a_of_match);