diff options
-rw-r--r-- | drivers/i2c/chips/pcf50633.c | 117 |
1 files changed, 60 insertions, 57 deletions
diff --git a/drivers/i2c/chips/pcf50633.c b/drivers/i2c/chips/pcf50633.c index 850bf934a2a..4cb333c9ba3 100644 --- a/drivers/i2c/chips/pcf50633.c +++ b/drivers/i2c/chips/pcf50633.c @@ -2063,7 +2063,7 @@ static void populate_sysfs_group(struct pcf50633_data *pcf) static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind) { struct i2c_client *new_client; - struct pcf50633_data *data; + struct pcf50633_data *pcf; int err = 0; int irq; @@ -2086,23 +2086,24 @@ static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind) return -EBUSY; } - if (!(data = kzalloc(sizeof(*data), GFP_KERNEL))) + pcf = kzalloc(sizeof(*pcf), GFP_KERNEL); + if (!pcf) return -ENOMEM; - mutex_init(&data->lock); - mutex_init(&data->working_lock); - mutex_init(&data->working_lock_nobat); - mutex_init(&data->working_lock_usb_curlimit); - INIT_WORK(&data->work, pcf50633_work); - INIT_WORK(&data->work_nobat, pcf50633_work_nobat); - INIT_WORK(&data->work_usb_curlimit, pcf50633_work_usbcurlim); - data->irq = irq; - data->working = 0; - data->onkey_seconds = -1; - data->pdata = pcf50633_pdev->dev.platform_data; - - new_client = &data->client; - i2c_set_clientdata(new_client, data); + mutex_init(&pcf->lock); + mutex_init(&pcf->working_lock); + mutex_init(&pcf->working_lock_nobat); + mutex_init(&pcf->working_lock_usb_curlimit); + INIT_WORK(&pcf->work, pcf50633_work); + INIT_WORK(&pcf->work_nobat, pcf50633_work_nobat); + INIT_WORK(&pcf->work_usb_curlimit, pcf50633_work_usbcurlim); + pcf->irq = irq; + pcf->working = 0; + pcf->onkey_seconds = -1; + pcf->pdata = pcf50633_pdev->dev.platform_data; + + new_client = &pcf->client; + i2c_set_clientdata(new_client, pcf); new_client->addr = address; new_client->adapter = adapter; new_client->driver = &pcf50633_driver; @@ -2118,11 +2119,11 @@ static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind) goto exit_free; } - pcf50633_global = data; + pcf50633_global = pcf; - init_resume_dependency_list(&data->resume_dependency); + init_resume_dependency_list(&pcf->resume_dependency); - populate_sysfs_group(data); + populate_sysfs_group(pcf); err = sysfs_create_group(&new_client->dev.kobj, &pcf_attr_group); if (err) { @@ -2135,32 +2136,35 @@ static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind) /* register power off handler with core power management */ pm_power_off = &pcf50633_go_standby; - data->input_dev = input_allocate_device(); - if (!data->input_dev) + pcf->input_dev = input_allocate_device(); + if (!pcf->input_dev) goto exit_sysfs; - data->input_dev->name = "GTA02 PMU events"; - data->input_dev->phys = "FIXME"; - data->input_dev->id.bustype = BUS_I2C; + pcf->input_dev->name = "GTA02 PMU events"; + pcf->input_dev->phys = "FIXME"; + pcf->input_dev->id.bustype = BUS_I2C; + pcf->input_dev->cdev.dev = &new_client->dev; - data->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); - set_bit(KEY_POWER, data->input_dev->keybit); - set_bit(KEY_POWER2, data->input_dev->keybit); - set_bit(KEY_BATTERY, data->input_dev->keybit); + pcf->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); + set_bit(KEY_POWER, pcf->input_dev->keybit); + set_bit(KEY_POWER2, pcf->input_dev->keybit); + set_bit(KEY_BATTERY, pcf->input_dev->keybit); - err = input_register_device(data->input_dev); + err = input_register_device(pcf->input_dev); if (err) goto exit_sysfs; /* configure interrupt mask */ - reg_write(data, PCF50633_REG_INT1M, 0x00); /* we want SECOND to kick */ - reg_write(data, PCF50633_REG_INT2M, 0x00); - reg_write(data, PCF50633_REG_INT3M, 0x00); - reg_write(data, PCF50633_REG_INT4M, 0x00); - reg_write(data, PCF50633_REG_INT5M, 0x00); + + /* we want SECOND to kick for the coldplug initialisation */ + reg_write(pcf, PCF50633_REG_INT1M, 0x00); + reg_write(pcf, PCF50633_REG_INT2M, 0x00); + reg_write(pcf, PCF50633_REG_INT3M, 0x00); + reg_write(pcf, PCF50633_REG_INT4M, 0x00); + reg_write(pcf, PCF50633_REG_INT5M, 0x00); err = request_irq(irq, pcf50633_irq, IRQF_TRIGGER_FALLING, - "pcf50633", data); + "pcf50633", pcf); if (err < 0) goto exit_input; @@ -2168,59 +2172,58 @@ static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind) dev_err(&new_client->dev, "IRQ %u cannot be enabled as wake-up" "source in this hardware revision!", irq); - if (data->pdata->used_features & PCF50633_FEAT_RTC) { - data->rtc = rtc_device_register("pcf50633", &new_client->dev, + if (pcf->pdata->used_features & PCF50633_FEAT_RTC) { + pcf->rtc = rtc_device_register("pcf50633", &new_client->dev, &pcf50633_rtc_ops, THIS_MODULE); - if (IS_ERR(data->rtc)) { - err = PTR_ERR(data->rtc); + if (IS_ERR(pcf->rtc)) { + err = PTR_ERR(pcf->rtc); goto exit_irq; } } - if (data->pdata->used_features & PCF50633_FEAT_PWM_BL) { - data->backlight = backlight_device_register("pcf50633-bl", + if (pcf->pdata->used_features & PCF50633_FEAT_PWM_BL) { + pcf->backlight = backlight_device_register("pcf50633-bl", &new_client->dev, - data, + pcf, &pcf50633bl_ops); - if (!data->backlight) + if (!pcf->backlight) goto exit_rtc; /* FIXME: are we sure we want default == off? */ - data->backlight->props.max_brightness = 0x3f; - data->backlight->props.power = FB_BLANK_UNBLANK; - data->backlight->props.fb_blank = FB_BLANK_UNBLANK; - data->backlight->props.brightness = - data->backlight->props.max_brightness; - backlight_update_status(data->backlight); + pcf->backlight->props.max_brightness = 0x3f; + pcf->backlight->props.power = FB_BLANK_UNBLANK; + pcf->backlight->props.fb_blank = FB_BLANK_UNBLANK; + pcf->backlight->props.brightness = + pcf->backlight->props.max_brightness; + backlight_update_status(pcf->backlight); } - apm_get_power_status = pcf50633_get_power_status; - data->probe_completed = 1; + pcf->probe_completed = 1; - if (data->pdata->flag_use_apm_emulation) + if (pcf->pdata->flag_use_apm_emulation) apm_get_power_status = pcf50633_get_power_status; /* if platform was interested, give him a chance to register * platform devices that switch power with us as the parent * at registration time -- ensures suspend / resume ordering */ - if (data->pdata->attach_child_devices) - (data->pdata->attach_child_devices)(&new_client->dev); + if (pcf->pdata->attach_child_devices) + (pcf->pdata->attach_child_devices)(&new_client->dev); return 0; exit_rtc: - if (data->pdata->used_features & PCF50633_FEAT_RTC) + if (pcf->pdata->used_features & PCF50633_FEAT_RTC) rtc_device_unregister(pcf50633_global->rtc); exit_irq: free_irq(pcf50633_global->irq, pcf50633_global); exit_input: - input_unregister_device(data->input_dev); + input_unregister_device(pcf->input_dev); exit_sysfs: pm_power_off = NULL; sysfs_remove_group(&new_client->dev.kobj, &pcf_attr_group); exit_detach: i2c_detach_client(new_client); exit_free: - kfree(data); + kfree(pcf); pcf50633_global = NULL; return err; } |