Thread (14 messages) flat view 14 messages, 5 authors, 2011-07-12
DORMANTno replies

[PATCH 4/5] DRM: Add support for the sii902x HDMI/DVI encoder

From: s.hauer@pengutronix.de (Sascha Hauer)
Date: 2011-07-12 13:21:07
Also in: dri-devel

On Fri, Jul 08, 2011 at 11:01:18PM +0200, Micha?? Miros??aw wrote:
2011/6/7 Sascha Hauer [off-list ref]:
[...]
quoted
--- /dev/null
+++ b/drivers/gpu/drm/i2c/sii902x.c
@@ -0,0 +1,334 @@
[...]
quoted
+static int sii902x_write(struct i2c_client *client, uint8_t addr, uint8_t val)
+{
+ ? ? ? int ret;
+
+ ? ? ? ret = i2c_smbus_write_byte_data(client, addr, val);
+ ? ? ? if (ret) {
+ ? ? ? ? ? ? ? dev_dbg(&client->dev, "%s failed with %d\n", __func__, ret);
+ ? ? ? }
+ ? ? ? return ret;
+}
Return value is never tested.
Yes, but there is not much I can do about it. This function is called
from void functions most of the time, so I can't even forward the error.
quoted
+static irqreturn_t sii902x_detect_handler(int irq, void *data)
+{
+ ? ? ? struct sii902x_priv *priv = data;
+ ? ? ? struct i2c_client *client = priv->client;
+ ? ? ? int dat;
+
+ ? ? ? dat = sii902x_read(client, 0x3D);
+ ? ? ? if (dat & 0x1) {
+ ? ? ? ? ? ? ? /* cable connection changes */
+ ? ? ? ? ? ? ? if (dat & 0x4) {
+ ? ? ? ? ? ? ? ? ? ? ? printk("plugin\n");
+ ? ? ? ? ? ? ? } else {
+ ? ? ? ? ? ? ? ? ? ? ? printk("plugout\n");
+ ? ? ? ? ? ? ? }
Missing code?
Yes. I will either remove interrupt support or put the missing code in.
quoted
+ ? ? ? }
+ ? ? ? sii902x_write(client, 0x3D, dat);
+
+ ? ? ? return IRQ_HANDLED;
+}
[...]
quoted
+/* I2C driver functions */
+
+static int
+sii902x_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+ ? ? ? int dat, ret;
+ ? ? ? struct sii902x_priv *priv;
+ ? ? ? const char *drm_name = "imx-drm.0"; /* FIXME: pass from pdata */
+ ? ? ? int encon_id = 0; /* FIXME: pass from pdata */
+
+ ? ? ? priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ ? ? ? if (!priv)
+ ? ? ? ? ? ? ? return -ENOMEM;
+
+ ? ? ? priv->client = client;
+
+ ? ? ? /* Set 902x in hardware TPI mode on and jump out of D3 state */
+ ? ? ? if (sii902x_write(client, 0xc7, 0x00) < 0) {
+ ? ? ? ? ? ? ? dev_err(&client->dev, "SII902x: cound not find device\n");
+ ? ? ? ? ? ? ? return -ENODEV;
Leaks priv. Same on other error paths.
Jup, thanks for noting. There are some other bugs in the probe function,
like not checking the return value of drm_encon_register().

Will fix
quoted
+ ? ? ? }
[...]
quoted
+
+
+static int sii902x_remove(struct i2c_client *client)
+{
+ ? ? ? struct sii902x_priv *priv;
+ ? ? ? int ret;
+
+ ? ? ? priv = i2c_get_clientdata(client);
+
+ ? ? ? ret = drm_encon_unregister(&priv->encon);
+ ? ? ? if (ret)
+ ? ? ? ? ? ? ? return ret;
Leaks priv on error.
and forgets to free_irq()

Thanks
 Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help