lm3533
ret = lm3533_read(als->lm3533, reg, val);
ret = lm3533_write(als->lm3533, reg, val);
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_ZONE_INFO, val, mask);
ret = lm3533_read(als->lm3533, LM3533_REG_ALS_ZONE_INFO, &val);
ret = lm3533_read(als->lm3533, reg, val);
ret = lm3533_read(als->lm3533, reg2, &val2);
ret = lm3533_write(als->lm3533, reg, val);
struct lm3533 *lm3533;
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_CONF, val, mask);
ret = lm3533_write(als->lm3533, LM3533_REG_ALS_RESISTOR_SELECT, val);
ret = lm3533_read(als->lm3533, reg, &val);
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_ZONE_INFO, 0, mask);
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_CONF, mask, mask);
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_CONF, 0, mask);
struct lm3533 *lm3533;
lm3533 = dev_get_drvdata(pdev->dev.parent);
if (!lm3533)
als->lm3533 = lm3533;
als->irq = lm3533->irq;
ret = lm3533_read(als->lm3533, LM3533_REG_ALS_ZONE_INFO, &val);
ret = lm3533_update(led->lm3533, LM3533_REG_PATTERN_ENABLE, val, mask);
ret = lm3533_write(led->lm3533, reg, val);
ret = lm3533_read(led->lm3533, reg, &val);
ret = lm3533_write(led->lm3533, reg, val);
ret = lm3533_read(led->lm3533, reg, &val);
struct lm3533 *lm3533;
ret = lm3533_update(led->lm3533, reg, val, mask);
ret = lm3533_read(led->lm3533, reg, &val);
ret = lm3533_update(led->lm3533, reg, val, mask);
ret = lm3533_read(led->lm3533, reg, &val);
ret = lm3533_update(led->lm3533, reg, val, mask);
if (!led->lm3533->have_als)
struct lm3533 *lm3533;
lm3533 = dev_get_drvdata(pdev->dev.parent);
if (!lm3533)
led->lm3533 = lm3533;
led->cb.lm3533 = lm3533;
led->cb.dev = lm3533->dev;
int lm3533_write(struct lm3533 *lm3533, u8 reg, u8 val)
dev_dbg(lm3533->dev, "write [%02x]: %02x\n", reg, val);
ret = regmap_write(lm3533->regmap, reg, val);
dev_err(lm3533->dev, "failed to write register %02x: %d\n",
int lm3533_update(struct lm3533 *lm3533, u8 reg, u8 val, u8 mask)
dev_dbg(lm3533->dev, "update [%02x]: %02x/%02x\n", reg, val, mask);
ret = regmap_update_bits(lm3533->regmap, reg, mask, val);
dev_err(lm3533->dev, "failed to update register %02x: %d\n",
static int lm3533_set_boost_freq(struct lm3533 *lm3533,
ret = lm3533_update(lm3533, LM3533_REG_BOOST_PWM,
dev_err(lm3533->dev, "failed to set boost frequency\n");
static int lm3533_set_boost_ovp(struct lm3533 *lm3533,
ret = lm3533_update(lm3533, LM3533_REG_BOOST_PWM,
dev_err(lm3533->dev, "failed to set boost ovp\n");
static int lm3533_set_hvled_config(struct lm3533 *lm3533, u8 hvled, u8 bl)
ret = lm3533_update(lm3533, LM3533_REG_OUTPUT_CONF1, val, mask);
dev_err(lm3533->dev, "failed to set hvled config\n");
static int lm3533_set_lvled_config(struct lm3533 *lm3533, u8 lvled, u8 led)
ret = lm3533_update(lm3533, reg, val, mask);
dev_err(lm3533->dev, "failed to set lvled config\n");
static void lm3533_enable(struct lm3533 *lm3533)
gpiod_set_value(lm3533->hwen, 1);
static void lm3533_disable(struct lm3533 *lm3533)
gpiod_set_value(lm3533->hwen, 0);
struct lm3533 *lm3533 = dev_get_drvdata(dev);
ret = lm3533_read(lm3533, reg, &val);
struct lm3533 *lm3533 = dev_get_drvdata(dev);
ret = lm3533_set_hvled_config(lm3533, id, val);
ret = lm3533_set_lvled_config(lm3533, id, val);
struct lm3533 *lm3533 = dev_get_drvdata(dev);
if (!lm3533->have_backlights && type == LM3533_ATTR_TYPE_BACKLIGHT)
else if (!lm3533->have_leds && type == LM3533_ATTR_TYPE_LED)
static int lm3533_device_als_init(struct lm3533 *lm3533)
struct lm3533_platform_data *pdata = dev_get_platdata(lm3533->dev);
ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL,
dev_err(lm3533->dev, "failed to add ALS device\n");
lm3533->have_als = 1;
static int lm3533_device_bl_init(struct lm3533 *lm3533)
struct lm3533_platform_data *pdata = dev_get_platdata(lm3533->dev);
ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs,
dev_err(lm3533->dev, "failed to add backlight devices\n");
lm3533->have_backlights = 1;
static int lm3533_device_led_init(struct lm3533 *lm3533)
struct lm3533_platform_data *pdata = dev_get_platdata(lm3533->dev);
ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs,
dev_err(lm3533->dev, "failed to add LED devices\n");
lm3533->have_leds = 1;
static int lm3533_device_setup(struct lm3533 *lm3533,
ret = lm3533_set_boost_freq(lm3533, pdata->boost_freq);
return lm3533_set_boost_ovp(lm3533, pdata->boost_ovp);
static int lm3533_device_init(struct lm3533 *lm3533)
struct lm3533_platform_data *pdata = dev_get_platdata(lm3533->dev);
dev_dbg(lm3533->dev, "%s\n", __func__);
dev_err(lm3533->dev, "no platform data\n");
lm3533->hwen = devm_gpiod_get(lm3533->dev, NULL, GPIOD_OUT_LOW);
if (IS_ERR(lm3533->hwen))
return dev_err_probe(lm3533->dev, PTR_ERR(lm3533->hwen), "failed to request HWEN GPIO\n");
gpiod_set_consumer_name(lm3533->hwen, "lm3533-hwen");
lm3533_enable(lm3533);
ret = lm3533_device_setup(lm3533, pdata);
lm3533_device_als_init(lm3533);
lm3533_device_bl_init(lm3533);
lm3533_device_led_init(lm3533);
ret = sysfs_create_group(&lm3533->dev->kobj, &lm3533_attribute_group);
dev_err(lm3533->dev, "failed to create sysfs attributes\n");
mfd_remove_devices(lm3533->dev);
lm3533_disable(lm3533);
static void lm3533_device_exit(struct lm3533 *lm3533)
dev_dbg(lm3533->dev, "%s\n", __func__);
sysfs_remove_group(&lm3533->dev->kobj, &lm3533_attribute_group);
mfd_remove_devices(lm3533->dev);
lm3533_disable(lm3533);
struct lm3533 *lm3533;
lm3533 = devm_kzalloc(&i2c->dev, sizeof(*lm3533), GFP_KERNEL);
if (!lm3533)
i2c_set_clientdata(i2c, lm3533);
lm3533->regmap = devm_regmap_init_i2c(i2c, ®map_config);
if (IS_ERR(lm3533->regmap))
return PTR_ERR(lm3533->regmap);
lm3533->dev = &i2c->dev;
lm3533->irq = i2c->irq;
return lm3533_device_init(lm3533);
struct lm3533 *lm3533 = i2c_get_clientdata(i2c);
lm3533_device_exit(lm3533);
int lm3533_read(struct lm3533 *lm3533, u8 reg, u8 *val)
ret = regmap_read(lm3533->regmap, reg, &tmp);
dev_err(lm3533->dev, "failed to read register %02x: %d\n",
dev_dbg(lm3533->dev, "read [%02x]: %02x\n", reg, *val);
ret = lm3533_read(cb->lm3533, reg, val);
ret = lm3533_write(cb->lm3533, reg, val);
ret = lm3533_read(cb->lm3533, reg, val);
ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE,
ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE, 0, mask);
ret = lm3533_write(cb->lm3533, reg, val);
ret = lm3533_write(cb->lm3533, reg, val);
ret = lm3533_update(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, val,
ret = lm3533_read(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, &val);
ret = lm3533_update(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, val,
if (!bl->lm3533->have_als)
struct lm3533 *lm3533;
struct lm3533 *lm3533;
lm3533 = dev_get_drvdata(pdev->dev.parent);
if (!lm3533)
bl->lm3533 = lm3533;
bl->cb.lm3533 = lm3533;
ret = lm3533_read(bl->lm3533, LM3533_REG_CTRLBANK_AB_BCONF, &val);
struct lm3533 *lm3533;
extern int lm3533_read(struct lm3533 *lm3533, u8 reg, u8 *val);
extern int lm3533_write(struct lm3533 *lm3533, u8 reg, u8 val);
extern int lm3533_update(struct lm3533 *lm3533, u8 reg, u8 val, u8 mask);