From 783eb39cdc3a26582dbe6031f7d112441a7cccd1 Mon Sep 17 00:00:00 2001 From: Vladimir Barinov Date: Sat, 3 Aug 2019 00:24:36 +0300 Subject: [PATCH] media: i2c: onsemi imager correct trigger handling This add trigger enablement from dts/bootargs Signed-off-by: Vladimir Barinov --- drivers/media/i2c/soc_camera/ar0147.c | 6 +++--- drivers/media/i2c/soc_camera/ar0231.c | 24 ++++++++++++++++++++++-- drivers/media/i2c/soc_camera/ar0231_rev7.h | 6 +++--- drivers/media/i2c/soc_camera/ar0233.c | 18 ++++++++---------- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/drivers/media/i2c/soc_camera/ar0147.c b/drivers/media/i2c/soc_camera/ar0147.c index 53be588..08fd136 100644 --- a/drivers/media/i2c/soc_camera/ar0147.c +++ b/drivers/media/i2c/soc_camera/ar0147.c @@ -532,7 +532,7 @@ static int ar0147_initialize(struct i2c_client *client) client->addr = tmp_addr; /* Enable trigger */ - if (priv->trigger < 4) { + if (priv->trigger >= 0 && priv->trigger < 4) { reg16_write16(client, 0x340A, (~(BIT(priv->trigger) << 4)) & 0xf0);/* GPIO_CONTROL1: GPIOn input enable */ reg16_write16(client, 0x340C, (0x2 << 2*priv->trigger)); /* GPIO_CONTROL2: GPIOn is trigger */ reg16_write16(client, 0x30CE, 0x0120); /* TRIGGER_MODE */ @@ -554,8 +554,8 @@ static int ar0147_initialize(struct i2c_client *client) } reg16_write16(client, 0x301a, val); - dev_info(&client->dev, "ar0147 PID %x (rev %x), res %dx%d, mode=%s, mbus=%s, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", - pid, rev, AR0147_MAX_WIDTH, AR0147_MAX_HEIGHT, mode, mbus, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); + dev_info(&client->dev, "ar0147 PID %x (rev%x), res %dx%d, mode=%s, mbus=%s, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", + pid, rev & 0xf, AR0147_MAX_WIDTH, AR0147_MAX_HEIGHT, mode, mbus, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); err: ar0147_s_port(client, 0); diff --git a/drivers/media/i2c/soc_camera/ar0231.c b/drivers/media/i2c/soc_camera/ar0231.c index dfca9e2..36b5657 100644 --- a/drivers/media/i2c/soc_camera/ar0231.c +++ b/drivers/media/i2c/soc_camera/ar0231.c @@ -45,8 +45,13 @@ struct ar0231_priv { int port; int gpio_resetb; int gpio_fsin; + int trigger; }; +static int trigger = 0; +module_param(trigger, int, 0644); +MODULE_PARM_DESC(trigger, " Trigger gpio number (default: 0 - GPIO0) "); + static inline struct ar0231_priv *to_ar0231(const struct i2c_client *client) { return container_of(i2c_get_clientdata(client), struct ar0231_priv, sd); @@ -436,13 +441,21 @@ static int ar0231_initialize(struct i2c_client *client) if (priv->max9286_addr) ar0231_set_regs(client, ar0231_regs_wizard_rev6_dvp, ARRAY_SIZE(ar0231_regs_wizard_rev6_dvp)); + /* Enable trigger */ + if (priv->trigger >= 0 && priv->trigger < 4) { + reg16_write16(client, 0x340A, (~(BIT(priv->trigger) << 4)) & 0xf0);/* GPIO_CONTROL1: GPIOn input enable */ + reg16_write16(client, 0x340C, (0x2 << 2*priv->trigger)); /* GPIO_CONTROL2: GPIOn is trigger */ + reg16_write16(client, 0x30CE, 0x0120); /* TRIGGER_MODE */ + //reg16_write16(client, 0x30DC, 0x0120); /* TRIGGER_DELAY */ + } + /* Enable stream */ reg16_read16(client, 0x301a, &val); val |= (1 << 2); reg16_write16(client, 0x301a, val); - dev_info(&client->dev, "ar0231 PID %x (rev %x), res %dx%d, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", - pid, rev, AR0231_MAX_WIDTH, AR0231_MAX_HEIGHT, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); + dev_info(&client->dev, "ar0231 PID %x (rev%x), res %dx%d, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", + pid, rev & 0xf, AR0231_MAX_WIDTH, AR0231_MAX_HEIGHT, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); err: ar0231_s_port(client, 0); return ret; @@ -460,6 +473,9 @@ static int ar0231_parse_dt(struct device_node *np, struct ar0231_priv *priv) if (!endpoint) break; + if (of_property_read_u32(endpoint, "trigger", &priv->trigger)) + priv->trigger = 0; + rendpoint = of_parse_phandle(endpoint, "remote-endpoint", 0); if (!rendpoint) continue; @@ -502,6 +518,10 @@ static int ar0231_parse_dt(struct device_node *np, struct ar0231_priv *priv) } client->addr = tmp_addr; + /* module params override dts */ + if (trigger) + priv->trigger = trigger; + return 0; } diff --git a/drivers/media/i2c/soc_camera/ar0231_rev7.h b/drivers/media/i2c/soc_camera/ar0231_rev7.h index 5f196e8..704024a 100644 --- a/drivers/media/i2c/soc_camera/ar0231_rev7.h +++ b/drivers/media/i2c/soc_camera/ar0231_rev7.h @@ -389,9 +389,9 @@ static const struct ar0231_reg ar0231_regs_wizard_rev7[] = { {0x300C, AR0231_SENSOR_WIDTH + 550}, // Line_length_pck {0x3012, 0x144}, //Integration_time -#if 1 /* Enable trigger input */ -{0x340A, 0x00E0}, // GPIO_CONTROL1: GPIO1 is trigger -{0x340C, 0x0002}, // GPIO_CONTROL2: GPIO1 is trigger +#if 0 /* Enable trigger input */ +{0x340A, 0x00E0}, // GPIO_CONTROL1: GPIO0 is trigger +{0x340C, 0x0002}, // GPIO_CONTROL2: GPIO0 is trigger {0x30CE, 0x0120}, // TRIGGER_MODE //{0x30DC, 0x0120}, // TRIGGER_DELAY {0x301A, 0x0118}, // GPI pins enable diff --git a/drivers/media/i2c/soc_camera/ar0233.c b/drivers/media/i2c/soc_camera/ar0233.c index 71bff3f..9294267 100644 --- a/drivers/media/i2c/soc_camera/ar0233.c +++ b/drivers/media/i2c/soc_camera/ar0233.c @@ -44,10 +44,6 @@ struct ar0233_priv { int trigger; }; -static int trigger = 0; -module_param(trigger, int, 0644); -MODULE_PARM_DESC(trigger, " Trigger gpio number (default: 0 - GPIO0) "); - static int extclk = 23; module_param(extclk, int, 0644); MODULE_PARM_DESC(extclk, " EXTCLK value in MHz (default: 23) "); @@ -459,10 +455,12 @@ static int ar0233_initialize(struct i2c_client *client) } /* Enable trigger */ - reg16_write16(client, 0x340A, (~(BIT(priv->trigger) << 4)) & 0xf0); /* GPIO_CONTROL1: GPIOn input enable */ - reg16_write16(client, 0x340C, (0x2 << 2*priv->trigger)); /* GPIO_CONTROL2: GPIOn is trigger */ - reg16_write16(client, 0x30CE, 0x0120); /* TRIGGER_MODE */ - //reg16_write16(client, 0x30DC, 0x0120); /* TRIGGER_DELAY */ + if (priv->trigger >= 0 && priv->trigger < 4) { + reg16_write16(client, 0x340A, (~(BIT(priv->trigger) << 4)) & 0xf0); /* GPIO_CONTROL1: GPIOn input enable */ + reg16_write16(client, 0x340C, (0x2 << 2*priv->trigger)); /* GPIO_CONTROL2: GPIOn is trigger */ + reg16_write16(client, 0x30CE, 0x0120); /* TRIGGER_MODE */ + //reg16_write16(client, 0x30DC, 0x0120); /* TRIGGER_DELAY */ + } /* Enable stream */ reg16_read16(client, 0x301a, &val); // read inital reset_register value @@ -470,8 +468,8 @@ static int ar0233_initialize(struct i2c_client *client) val |= (1 << 2); // Set streamOn bit reg16_write16(client, 0x301a, val); // Start Streaming - dev_info(&client->dev, "ar0233 PID %x (rev %x), res %dx%d, mode=%s, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", - pid, rev, AR0233_MAX_WIDTH, AR0233_MAX_HEIGHT, mode, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); + dev_info(&client->dev, "ar0233 PID %x (rev%x), res %dx%d, mode=%s, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n", + pid, rev & 0xf, AR0233_MAX_WIDTH, AR0233_MAX_HEIGHT, mode, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]); err: return ret; } -- 2.7.4