static int __init aries_init_touchkey_led(void) { int i; int ret = 0; u32 gpio; down(&i2c_sem); if (!machine_is_aries() || !aries_is_tft_dev()) return 0; for (i = 0; i < ARRAY_SIZE(led_gpios); i++) { gpio = S5PV210_GPJ3(led_gpios[i]); ret = gpio_request(gpio, "touchkey led"); if (ret) { pr_err("Failed to request touchkey led gpio %d\n", i); goto err_req; } s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_PREV); s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE); } aries_touchkey_led_onoff(1); register_early_suspend(&early_suspend); #ifdef CONFIG_BLD register_bld_implementation(&aries_touchkey_bld); #endif if (misc_register(&bl_led_device)) printk("%s misc_register(%s) failed\n", __FUNCTION__, bl_led_device.name); else { if (sysfs_create_group(&bl_led_device.this_device->kobj, &bl_led_group) < 0) pr_err("failed to create sysfs group for device %s\n", bl_led_device.name); } /* Initialize wake locks */ wake_lock_init(&sBlinkWakeLock, WAKE_LOCK_SUSPEND, "blink_wake"); setup_timer(&blink_timer, blink_timer_callback, 0); up(&i2c_sem); return 0; err_req: while (--i >= 0) gpio_free(S5PV210_GPJ3(led_gpios[i])); up(&i2c_sem); return ret; }
static int __init herring_init_touchkey_led(void) { int i; int ret = 0; u32 gpio; if (!machine_is_herring() || !herring_is_tft_dev()) return 0; for (i = 0; i < ARRAY_SIZE(led_gpios); i++) { gpio = S5PV210_GPJ3(led_gpios[i]); ret = gpio_request(gpio, "touchkey led"); if (ret) { pr_err("Failed to request touchkey led gpio %d\n", i); goto err_req; } s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); s3c_gpio_slp_cfgpin(gpio, S3C_GPIO_SLP_PREV); s3c_gpio_slp_setpull_updown(gpio, S3C_GPIO_PULL_NONE); } herring_touchkey_led_onoff(1); register_early_suspend(&early_suspend); #ifdef CONFIG_GENERIC_BLN register_bln_implementation(&herring_touchkey_bln); #endif #ifdef CONFIG_BLD register_bld_implementation(&herring_touchkey_bld); #endif return 0; err_req: while (--i >= 0) gpio_free(S5PV210_GPJ3(led_gpios[i])); return ret; }
static int cypress_touchkey_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct input_dev *input_dev; struct cypress_touchkey_devdata *devdata; u8 data[3]; int err; int cnt; if (!dev->platform_data) { dev_err(dev, "%s: Platform data is NULL\n", __func__); return -EINVAL; } devdata = kzalloc(sizeof(*devdata), GFP_KERNEL); if (devdata == NULL) { dev_err(dev, "%s: failed to create our state\n", __func__); return -ENODEV; } devdata->client = client; i2c_set_clientdata(client, devdata); devdata->pdata = client->dev.platform_data; if (!devdata->pdata->keycode) { dev_err(dev, "%s: Invalid platform data\n", __func__); err = -EINVAL; goto err_null_keycodes; } strlcpy(devdata->client->name, DEVICE_NAME, I2C_NAME_SIZE); input_dev = input_allocate_device(); if (!input_dev) { err = -ENOMEM; goto err_input_alloc_dev; } devdata->input_dev = input_dev; dev_set_drvdata(&input_dev->dev, devdata); input_dev->name = DEVICE_NAME; input_dev->id.bustype = BUS_HOST; for (cnt = 0; cnt < devdata->pdata->keycode_cnt; cnt++) input_set_capability(input_dev, EV_KEY, devdata->pdata->keycode[cnt]); devdata->is_powering_on = true; devdata->pdata->touchkey_onoff(TOUCHKEY_ON); err = i2c_master_recv(client, data, sizeof(data)); if (err < sizeof(data)) { if (err >= 0) err = -EIO; dev_err(dev, "%s: error reading hardware version\n", __func__); goto err_read; } dev_info(dev, "%s: hardware rev1 = %#02x, rev2 = %#02x\n", __func__, data[1], data[2]); if (data[1] != 0xa || data[2] < 0x9) input_dev->open = cypress_touchkey_open; err = input_register_device(input_dev); if (err) goto err_input_reg_dev; set_device_params(devdata, data); err = i2c_touchkey_write_byte(devdata, devdata->backlight_on); if (err) { dev_err(dev, "%s: touch keypad backlight on failed\n", __func__); /* The device may not be responding because of bad firmware * Allow the firmware to be reflashed if it needs to be */ if (!input_dev->open) goto err_backlight_on; } err = request_threaded_irq(client->irq, touchkey_interrupt_handler, touchkey_interrupt_thread, IRQF_TRIGGER_FALLING, DEVICE_NAME, devdata); if (err) { dev_err(dev, "%s: Can't allocate irq.\n", __func__); goto err_req_irq; } #ifdef CONFIG_HAS_EARLYSUSPEND devdata->early_suspend.suspend = cypress_touchkey_early_suspend; devdata->early_suspend.resume = cypress_touchkey_early_resume; #endif register_early_suspend(&devdata->early_suspend); devdata->is_powering_on = false; #ifdef CONFIG_GENERIC_BLN blndevdata = devdata; register_bln_implementation(&cypress_touchkey_bln); #endif #ifdef CONFIG_BLD blddevdata = devdata; register_bld_implementation(&cypress_touchkey_bld); #endif #ifdef CONFIG_TOUCH_WAKE touchwakedevdata = devdata; register_touchwake_implementation(&cypress_touchwake); #endif return 0; err_req_irq: err_backlight_on: input_unregister_device(input_dev); goto touchkey_off; err_input_reg_dev: err_read: input_free_device(input_dev); touchkey_off: devdata->pdata->touchkey_onoff(TOUCHKEY_OFF); err_input_alloc_dev: err_null_keycodes: kfree(devdata); return err; }