[PATCH 50/133] [Jaunty SRU] ARM.imx51 Freescale:ENGR00111670-1 ch7026: Return error when not present
Brad Figg
brad.figg at canonical.com
Thu Jul 9 16:48:40 UTC 2009
From: Rob Herring <r.herring at freescale.com>
Make the ch7026 driver return an error when it is not found.
Signed-off-by: Rob Herring <r.herring at freescale.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
drivers/video/mxc/mxcfb_ch7026.c | 32 ++++++++++++++++++++++++++------
1 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/drivers/video/mxc/mxcfb_ch7026.c b/drivers/video/mxc/mxcfb_ch7026.c
index 2acb072..c781e1c 100644
--- a/drivers/video/mxc/mxcfb_ch7026.c
+++ b/drivers/video/mxc/mxcfb_ch7026.c
@@ -41,7 +41,7 @@
static struct i2c_client *ch7026_client;
-static void lcd_init(void);
+static int lcd_init(void);
static void lcd_poweron(struct fb_info *info);
static void lcd_poweroff(void);
@@ -110,6 +110,7 @@ static struct notifier_block nb = {
*/
static int __devinit lcd_probe(struct device *dev)
{
+ int ret = 0;
int i;
struct mxc_lcd_platform_data *plat = dev->platform_data;
@@ -119,16 +120,23 @@ static int __devinit lcd_probe(struct device *dev)
if (!IS_ERR(io_reg)) {
regulator_set_voltage(io_reg, 1800000, 1800000);
regulator_enable(io_reg);
+ } else {
+ io_reg = NULL;
}
+
core_reg = regulator_get(dev, plat->core_reg);
if (!IS_ERR(core_reg)) {
regulator_set_voltage(core_reg, 2500000, 2500000);
regulator_enable(core_reg);
+ } else {
+ core_reg = NULL;
}
analog_reg = regulator_get(dev, plat->analog_reg);
if (!IS_ERR(analog_reg)) {
regulator_set_voltage(analog_reg, 2775000, 2775000);
regulator_enable(analog_reg);
+ } else {
+ analog_reg = NULL;
}
msleep(100);
@@ -139,16 +147,27 @@ static int __devinit lcd_probe(struct device *dev)
for (i = 0; i < num_registered_fb; i++) {
if (strcmp(registered_fb[i]->fix.id, "DISP3 BG - DI1") == 0) {
+ ret = lcd_init();
+ if (ret < 0)
+ goto err;
+
lcd_init_fb(registered_fb[i]);
fb_show_logo(registered_fb[i], 0);
- lcd_init();
lcd_poweron(registered_fb[i]);
}
}
fb_register_client(&nb);
-
return 0;
+err:
+ if (io_reg)
+ regulator_disable(io_reg);
+ if (core_reg)
+ regulator_disable(core_reg);
+ if (analog_reg)
+ regulator_disable(analog_reg);
+
+ return ret;
}
static int __devinit ch7026_probe(struct i2c_client *client,
@@ -249,7 +268,7 @@ u8 reg_init[][2] = {
* Send init commands to L4F00242T03
*
*/
-static void lcd_init(void)
+static int lcd_init(void)
{
int i;
int dat;
@@ -261,14 +280,15 @@ static void lcd_init(void)
dat = i2c_smbus_read_byte_data(ch7026_client, 0x00);
dev_dbg(&ch7026_client->dev, "read id = 0x%02X\n", dat);
if (dat != 0x54)
- return;
+ return -ENODEV;
for (i = 0; i < REGMAP_LENGTH; ++i) {
if (i2c_smbus_write_byte_data
(ch7026_client, reg_init[i][0], reg_init[i][1]) < 0)
- return;
+ return -EIO;
}
+ return 0;
}
static int lcd_on;
--
1.6.0.4
More information about the kernel-team
mailing list