static int adp5520_bl_set(struct backlight_device *bl, int brightness) { struct adp5520_bl *data = bl_get_data(bl); struct device *master = data->master; int ret = 0; if (data->pdata->en_ambl_sens) { if ((brightness > 0) && (brightness < ADP5020_MAX_BRIGHTNESS)) { ret |= adp5520_clr_bits(master, ADP5520_BL_CONTROL, ADP5520_BL_AUTO_ADJ); ret |= adp5520_write(master, ADP5520_DAYLIGHT_MAX, brightness); } else { ret |= adp5520_write(master, ADP5520_DAYLIGHT_MAX, data->cached_daylight_max); ret |= adp5520_set_bits(master, ADP5520_BL_CONTROL, ADP5520_BL_AUTO_ADJ); } } else { ret |= adp5520_write(master, ADP5520_DAYLIGHT_MAX, brightness); } if (data->current_brightness && brightness == 0) ret |= adp5520_set_bits(master, ADP5520_MODE_STATUS, ADP5520_DIM_EN); else if (data->current_brightness == 0 && brightness) ret |= adp5520_clr_bits(master, ADP5520_MODE_STATUS, ADP5520_DIM_EN); if (!ret) data->current_brightness = brightness; return ret; }
static int adp5520_resume(struct i2c_client *client) { struct adp5520_chip *chip = dev_get_drvdata(&client->dev); adp5520_set_bits(chip->dev, ADP5520_MODE_STATUS, ADP5520_nSTNBY); return 0; }
static int adp5520_bl_setup(struct backlight_device *bl) { struct adp5520_bl *data = bl_get_data(bl); struct device *master = data->master; struct adp5520_backlight_platfrom_data *pdata = data->pdata; int ret = 0; ret |= adp5520_write(master, DAYLIGHT_MAX, pdata->l1_daylight_max); ret |= adp5520_write(master, DAYLIGHT_DIM, pdata->l1_daylight_dim); if (pdata->en_ambl_sens) { data->cached_daylight_max = pdata->l1_daylight_max; ret |= adp5520_write(master, OFFICE_MAX, pdata->l2_office_max); ret |= adp5520_write(master, OFFICE_DIM, pdata->l2_office_dim); ret |= adp5520_write(master, DARK_MAX, pdata->l3_dark_max); ret |= adp5520_write(master, DARK_DIM, pdata->l3_dark_dim); ret |= adp5520_write(master, L2_TRIP, pdata->l2_trip); ret |= adp5520_write(master, L2_HYS, pdata->l2_hyst); ret |= adp5520_write(master, L3_TRIP, pdata->l3_trip); ret |= adp5520_write(master, L3_HYS, pdata->l3_hyst); ret |= adp5520_write(master, ALS_CMPR_CFG, ALS_CMPR_CFG_VAL(pdata->abml_filt, L3_EN)); } ret |= adp5520_write(master, BL_CONTROL, BL_CTRL_VAL(pdata->fade_led_law, pdata->en_ambl_sens); ret |= adp5520_write(master, BL_FADE, FADE_VAL(pdata->fade_in, pdata->fade_out)); ret |= adp5520_set_bits(master, MODE_STATUS, BL_EN | DIM_EN); return ret; }
static void adp5520_gpio_set_value(struct gpio_chip *chip, unsigned off, int val) { struct adp5520_gpio *dev; dev = gpiochip_get_data(chip); if (val) adp5520_set_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]); else adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]); }
static int adp5520_gpio_direction_output(struct gpio_chip *chip, unsigned off, int val) { struct adp5520_gpio *dev; int ret = 0; dev = gpiochip_get_data(chip); set_bit(off, &dev->output); if (val) ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]); else ret |= adp5520_clr_bits(dev->master, ADP5520_GPIO_OUT, dev->lut[off]); ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_CFG_2, dev->lut[off]); return ret; }
static int adp5520_bl_set(struct backlight_device *bl, int brightness) { struct adp5520_bl *data = bl_get_data(bl); struct device *master = data->master; int ret = 0; if (data->pdata->en_ambl_sens) { if ((brightness > 0) && (brightness < ADP5020_MAX_BRIGHTNESS)) { /* Disable Ambient Light auto adjust */ ret |= adp5520_clr_bits(master, BL_CONTROL, BL_AUTO_ADJ); ret |= adp5520_write(master, DAYLIGHT_MAX, brightness); } else { /* * MAX_BRIGHTNESS -> Enable Ambient Light auto adjust * restore daylight l3 sysfs brightness */ ret |= adp5520_write(master, DAYLIGHT_MAX, data->cached_daylight_max); ret |= adp5520_set_bits(master, BL_CONTROL, BL_AUTO_ADJ); } } else { ret |= adp5520_write(master, DAYLIGHT_MAX, brightness); } if (data->current_brightness && brightness == 0) ret |= adp5520_set_bits(master, MODE_STATUS, DIM_EN); else if (data->current_brightness == 0 && brightness) ret |= adp5520_clr_bits(master, MODE_STATUS, DIM_EN); if (!ret) data->current_brightness = brightness; return ret; }
int adp5520_register_notifier(struct device *dev, struct notifier_block *nb, unsigned int events) { struct adp5520_chip *chip = dev_get_drvdata(dev); if (chip->irq) { adp5520_set_bits(chip->dev, ADP5520_INTERRUPT_ENABLE, events & (ADP5520_KP_IEN | ADP5520_KR_IEN | ADP5520_OVP_IEN | ADP5520_CMPR_IEN)); return blocking_notifier_chain_register(&chip->notifier_list, nb); } return -ENODEV; }
static int adp5520_keys_probe(struct platform_device *pdev) { struct adp5520_keys_platform_data *pdata = dev_get_platdata(&pdev->dev); struct input_dev *input; struct adp5520_keys *dev; int ret, i; unsigned char en_mask, ctl_mask = 0; if (pdev->id != ID_ADP5520) { dev_err(&pdev->dev, "only ADP5520 supports Keypad\n"); return -EINVAL; } if (!pdata) { dev_err(&pdev->dev, "missing platform data\n"); return -EINVAL; } if (!(pdata->rows_en_mask && pdata->cols_en_mask)) return -EINVAL; dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); if (!dev) { dev_err(&pdev->dev, "failed to alloc memory\n"); return -ENOMEM; } input = devm_input_allocate_device(&pdev->dev); if (!input) return -ENOMEM; dev->master = pdev->dev.parent; dev->input = input; input->name = pdev->name; input->phys = "adp5520-keys/input0"; input->dev.parent = &pdev->dev; input_set_drvdata(input, dev); input->id.bustype = BUS_I2C; input->id.vendor = 0x0001; input->id.product = 0x5520; input->id.version = 0x0001; input->keycodesize = sizeof(dev->keycode[0]); input->keycodemax = pdata->keymapsize; input->keycode = dev->keycode; memcpy(dev->keycode, pdata->keymap, pdata->keymapsize * input->keycodesize); /* setup input device */ __set_bit(EV_KEY, input->evbit); if (pdata->repeat) __set_bit(EV_REP, input->evbit); for (i = 0; i < input->keycodemax; i++) __set_bit(dev->keycode[i], input->keybit); __clear_bit(KEY_RESERVED, input->keybit); ret = input_register_device(input); if (ret) { dev_err(&pdev->dev, "unable to register input device\n"); return ret; } en_mask = pdata->rows_en_mask | pdata->cols_en_mask; ret = adp5520_set_bits(dev->master, ADP5520_GPIO_CFG_1, en_mask); if (en_mask & ADP5520_COL_C3) ctl_mask |= ADP5520_C3_MODE; if (en_mask & ADP5520_ROW_R3) ctl_mask |= ADP5520_R3_MODE; if (ctl_mask) ret |= adp5520_set_bits(dev->master, ADP5520_LED_CONTROL, ctl_mask); ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_PULLUP, pdata->rows_en_mask); if (ret) { dev_err(&pdev->dev, "failed to write\n"); return -EIO; } dev->notifier.notifier_call = adp5520_keys_notifier; ret = adp5520_register_notifier(dev->master, &dev->notifier, ADP5520_KP_IEN | ADP5520_KR_IEN); if (ret) { dev_err(&pdev->dev, "failed to register notifier\n"); return ret; } platform_set_drvdata(pdev, dev); return 0; }
static int adp5520_gpio_probe(struct platform_device *pdev) { struct adp5520_gpio_platform_data *pdata = dev_get_platdata(&pdev->dev); struct adp5520_gpio *dev; struct gpio_chip *gc; int ret, i, gpios; unsigned char ctl_mask = 0; if (pdata == NULL) { dev_err(&pdev->dev, "missing platform data\n"); return -ENODEV; } if (pdev->id != ID_ADP5520) { dev_err(&pdev->dev, "only ADP5520 supports GPIO\n"); return -ENODEV; } dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); if (dev == NULL) return -ENOMEM; dev->master = pdev->dev.parent; for (gpios = 0, i = 0; i < ADP5520_MAXGPIOS; i++) if (pdata->gpio_en_mask & (1 << i)) dev->lut[gpios++] = 1 << i; if (gpios < 1) { ret = -EINVAL; goto err; } gc = &dev->gpio_chip; gc->direction_input = adp5520_gpio_direction_input; gc->direction_output = adp5520_gpio_direction_output; gc->get = adp5520_gpio_get_value; gc->set = adp5520_gpio_set_value; gc->can_sleep = true; gc->base = pdata->gpio_start; gc->ngpio = gpios; gc->label = pdev->name; gc->owner = THIS_MODULE; ret = adp5520_clr_bits(dev->master, ADP5520_GPIO_CFG_1, pdata->gpio_en_mask); if (pdata->gpio_en_mask & ADP5520_GPIO_C3) ctl_mask |= ADP5520_C3_MODE; if (pdata->gpio_en_mask & ADP5520_GPIO_R3) ctl_mask |= ADP5520_R3_MODE; if (ctl_mask) ret = adp5520_set_bits(dev->master, ADP5520_LED_CONTROL, ctl_mask); ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_PULLUP, pdata->gpio_pullup_mask); if (ret) { dev_err(&pdev->dev, "failed to write\n"); goto err; } ret = devm_gpiochip_add_data(&pdev->dev, &dev->gpio_chip, dev); if (ret) goto err; platform_set_drvdata(pdev, dev); return 0; err: return ret; }
static int __devinit adp5520_keys_probe(struct platform_device *pdev) { struct adp5520_keys_platfrom_data *pdata = pdev->dev.platform_data; struct input_dev *input; struct adp5520_keys *dev; int ret, i; unsigned char en_mask, ctl_mask = 0; if (pdev->id != ID_ADP5520) { dev_err(&pdev->dev, "only ADP5520 supports Keypad\n"); return -EFAULT; } if (pdata == NULL) { dev_err(&pdev->dev, "missing platform data\n"); return -ENODEV; } if (!(pdata->rows_en_mask && pdata->cols_en_mask)) return -ENODEV; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (dev == NULL) { dev_err(&pdev->dev, "failed to alloc memory\n"); return -ENOMEM; } input = input_allocate_device(); if (!input) { ret = -ENOMEM; goto err; } dev->master = pdev->dev.parent; dev->input = input; input->name = pdev->name; input->phys = "adp5520-keys/input0"; input->dev.parent = &pdev->dev; input_set_drvdata(input, dev); input->id.bustype = BUS_I2C; input->id.vendor = 0x0001; input->id.product = 0x5520; input->id.version = 0x0001; input->keycodesize = sizeof(unsigned short); input->keycodemax = pdata->keymapsize; input->keycode = dev->keycode; memcpy(dev->keycode, pdata->keymap, pdata->keymapsize * input->keycodesize); /* setup input device */ __set_bit(EV_KEY, input->evbit); if (pdata->repeat) __set_bit(EV_REP, input->evbit); for (i = 0; i < input->keycodemax; i++) __set_bit(dev->keycode[i] & KEY_MAX, input->keybit); __clear_bit(KEY_RESERVED, input->keybit); ret = input_register_device(input); if (ret) { dev_err(&pdev->dev, ": Unable to register input device (%d)\n", ret); input_free_device(input); goto err; } en_mask = pdata->rows_en_mask | pdata->cols_en_mask; ret = adp5520_set_bits(dev->master, GPIO_CFG_1, en_mask); if (en_mask & COL_C3) ctl_mask |= C3_MODE; if (en_mask & ROW_R3) ctl_mask |= R3_MODE; if (ctl_mask) ret |= adp5520_set_bits(dev->master, LED_CONTROL, ctl_mask); ret |= adp5520_set_bits(dev->master, GPIO_PULLUP, pdata->rows_en_mask); if (ret) { dev_err(&pdev->dev, "failed to write\n"); goto err1; } dev->notifier.notifier_call = adp5520_keys_notifier; ret = adp5520_register_notifier(dev->master, &dev->notifier, KP_IEN | KR_IEN); if (ret) { dev_err(&pdev->dev, "failed to register notifier\n"); goto err1; } platform_set_drvdata(pdev, dev); return 0; err1: input_unregister_device(input); err: kfree(dev); return ret; }