static int __devinit pcf50633_rtc_probe(struct platform_device *pdev) { struct pcf50633_rtc *rtc; rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); if (!rtc) return -ENOMEM; rtc->pcf = dev_to_pcf50633(pdev->dev.parent); platform_set_drvdata(pdev, rtc); rtc->rtc_dev = rtc_device_register("pcf50633-rtc", &pdev->dev, &pcf50633_rtc_ops, THIS_MODULE); if (IS_ERR(rtc->rtc_dev)) { int ret = PTR_ERR(rtc->rtc_dev); kfree(rtc); return ret; } pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM, pcf50633_rtc_irq, rtc); pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_SECOND, pcf50633_rtc_irq, rtc); return 0; }
static int pcf50633_mbc_probe(struct platform_device *pdev) { struct power_supply_config psy_cfg = {}; struct pcf50633_mbc *mbc; int i; u8 mbcs1; mbc = devm_kzalloc(&pdev->dev, sizeof(*mbc), GFP_KERNEL); if (!mbc) return -ENOMEM; platform_set_drvdata(pdev, mbc); mbc->pcf = dev_to_pcf50633(pdev->dev.parent); /* Set up IRQ handlers */ for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++) pcf50633_register_irq(mbc->pcf, mbc_irq_handlers[i], pcf50633_mbc_irq_handler, mbc); psy_cfg.supplied_to = mbc->pcf->pdata->batteries; psy_cfg.num_supplicants = mbc->pcf->pdata->num_batteries; psy_cfg.drv_data = mbc; /* Create power supplies */ mbc->adapter = power_supply_register(&pdev->dev, &pcf50633_mbc_adapter_desc, &psy_cfg); if (IS_ERR(mbc->adapter)) { dev_err(mbc->pcf->dev, "failed to register adapter\n"); return PTR_ERR(mbc->adapter); } mbc->usb = power_supply_register(&pdev->dev, &pcf50633_mbc_usb_desc, &psy_cfg); if (IS_ERR(mbc->usb)) { dev_err(mbc->pcf->dev, "failed to register usb\n"); power_supply_unregister(mbc->adapter); return PTR_ERR(mbc->usb); } mbc->ac = power_supply_register(&pdev->dev, &pcf50633_mbc_ac_desc, &psy_cfg); if (IS_ERR(mbc->ac)) { dev_err(mbc->pcf->dev, "failed to register ac\n"); power_supply_unregister(mbc->adapter); power_supply_unregister(mbc->usb); return PTR_ERR(mbc->ac); } if (sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group)) dev_err(mbc->pcf->dev, "failed to create sysfs entries\n"); mbcs1 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS1); if (mbcs1 & PCF50633_MBCS1_USBPRES) pcf50633_mbc_irq_handler(PCF50633_IRQ_USBINS, mbc); if (mbcs1 & PCF50633_MBCS1_ADAPTPRES) pcf50633_mbc_irq_handler(PCF50633_IRQ_ADPINS, mbc); return 0; }
static int pcf50633_regulator_probe(struct platform_device *pdev) { struct regulator_dev *rdev; struct pcf50633 *pcf; struct regulator_config config = { }; /* Already set by core driver */ pcf = dev_to_pcf50633(pdev->dev.parent); config.dev = &pdev->dev; config.init_data = pdev->dev.platform_data; config.driver_data = pcf; config.regmap = pcf->regmap; rdev = regulator_register(®ulators[pdev->id], &config); if (IS_ERR(rdev)) return PTR_ERR(rdev); platform_set_drvdata(pdev, rdev); if (pcf->pdata->regulator_registered) pcf->pdata->regulator_registered(pcf, pdev->id); return 0; }
static int __devinit pcf50633_bl_probe(struct platform_device *pdev) { int ret; struct pcf50633_bl *pcf_bl; struct device *parent = pdev->dev.parent; struct pcf50633_platform_data *pcf50633_data = parent->platform_data; struct pcf50633_bl_platform_data *pdata = pcf50633_data->backlight_data; struct backlight_properties bl_props; pcf_bl = kzalloc(sizeof(*pcf_bl), GFP_KERNEL); if (!pcf_bl) return -ENOMEM; bl_props.type = BACKLIGHT_RAW; bl_props.max_brightness = 0x3f; bl_props.power = FB_BLANK_UNBLANK; if (pdata) { bl_props.brightness = pdata->default_brightness; pcf_bl->brightness_limit = pdata->default_brightness_limit; } else { bl_props.brightness = 0x3f; pcf_bl->brightness_limit = 0x3f; } pcf_bl->pcf = dev_to_pcf50633(pdev->dev.parent); pcf_bl->bl = backlight_device_register(pdev->name, &pdev->dev, pcf_bl, &pcf50633_bl_ops, &bl_props); if (IS_ERR(pcf_bl->bl)) { ret = PTR_ERR(pcf_bl->bl); goto err_free; } platform_set_drvdata(pdev, pcf_bl); pcf50633_reg_write(pcf_bl->pcf, PCF50633_REG_LEDDIM, pdata->ramp_time); /* Should be different from bl_props.brightness, so we do not exit * update_status early the first time it's called */ pcf_bl->brightness = pcf_bl->bl->props.brightness + 1; backlight_update_status(pcf_bl->bl); return 0; err_free: kfree(pcf_bl); return ret; }
static int pcf50633_adc_probe(struct platform_device *pdev) { struct pcf50633_adc *adc; adc = kzalloc(sizeof(*adc), GFP_KERNEL); if (!adc) return -ENOMEM; adc->pcf = dev_to_pcf50633(pdev->dev.parent); platform_set_drvdata(pdev, adc); pcf50633_register_irq(adc->pcf, PCF50633_IRQ_ADCRDY, pcf50633_adc_irq, adc); mutex_init(&adc->queue_mutex); return 0; }
static int __devinit pcf50633_regulator_probe(struct platform_device *pdev) { struct regulator_dev *rdev; struct pcf50633 *pcf; /* Already set by core driver */ pcf = dev_to_pcf50633(pdev->dev.parent); rdev = regulator_register(®ulators[pdev->id], &pdev->dev, pdev->dev.platform_data, pcf); if (IS_ERR(rdev)) return PTR_ERR(rdev); platform_set_drvdata(pdev, rdev); if (pcf->pdata->regulator_registered) pcf->pdata->regulator_registered(pcf, pdev->id); return 0; }
static int __devinit pcf50633_input_probe(struct platform_device *pdev) { struct pcf50633_input *input; struct input_dev *input_dev; int ret; input = kzalloc(sizeof(*input), GFP_KERNEL); if (!input) return -ENOMEM; input_dev = input_allocate_device(); if (!input_dev) { kfree(input); return -ENOMEM; } platform_set_drvdata(pdev, input); input->pcf = dev_to_pcf50633(pdev->dev.parent); input->input_dev = input_dev; input_dev->name = "PCF50633 PMU events"; input_dev->id.bustype = BUS_I2C; input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); set_bit(KEY_POWER, input_dev->keybit); ret = input_register_device(input_dev); if (ret) { input_free_device(input_dev); kfree(input); return ret; } pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYR, pcf50633_input_irq, input); pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYF, pcf50633_input_irq, input); return 0; }
static int __devinit pcf50633_mbc_probe(struct platform_device *pdev) { struct pcf50633_mbc *mbc; int ret; int i; u8 mbcs1; mbc = kzalloc(sizeof(*mbc), GFP_KERNEL); if (!mbc) return -ENOMEM; platform_set_drvdata(pdev, mbc); mbc->pcf = dev_to_pcf50633(pdev->dev.parent); /* Set up IRQ handlers */ for (i = 0; i < ARRAY_SIZE(mbc_irq_handlers); i++) pcf50633_register_irq(mbc->pcf, mbc_irq_handlers[i], pcf50633_mbc_irq_handler, mbc); /* Create power supplies */ mbc->adapter.name = "adapter"; mbc->adapter.type = POWER_SUPPLY_TYPE_MAINS; mbc->adapter.properties = power_props; mbc->adapter.num_properties = ARRAY_SIZE(power_props); mbc->adapter.get_property = &adapter_get_property; mbc->adapter.supplied_to = mbc->pcf->pdata->batteries; mbc->adapter.num_supplicants = mbc->pcf->pdata->num_batteries; mbc->usb.name = "usb"; mbc->usb.type = POWER_SUPPLY_TYPE_USB; mbc->usb.properties = power_props; mbc->usb.num_properties = ARRAY_SIZE(power_props); mbc->usb.get_property = usb_get_property; mbc->usb.supplied_to = mbc->pcf->pdata->batteries; mbc->usb.num_supplicants = mbc->pcf->pdata->num_batteries; mbc->ac.name = "ac"; mbc->ac.type = POWER_SUPPLY_TYPE_MAINS; mbc->ac.properties = power_props; mbc->ac.num_properties = ARRAY_SIZE(power_props); mbc->ac.get_property = ac_get_property; mbc->ac.supplied_to = mbc->pcf->pdata->batteries; mbc->ac.num_supplicants = mbc->pcf->pdata->num_batteries; ret = power_supply_register(&pdev->dev, &mbc->adapter); if (ret) { dev_err(mbc->pcf->dev, "failed to register adapter\n"); kfree(mbc); return ret; } ret = power_supply_register(&pdev->dev, &mbc->usb); if (ret) { dev_err(mbc->pcf->dev, "failed to register usb\n"); power_supply_unregister(&mbc->adapter); kfree(mbc); return ret; } ret = power_supply_register(&pdev->dev, &mbc->ac); if (ret) { dev_err(mbc->pcf->dev, "failed to register ac\n"); power_supply_unregister(&mbc->adapter); power_supply_unregister(&mbc->usb); kfree(mbc); return ret; } ret = sysfs_create_group(&pdev->dev.kobj, &mbc_attr_group); if (ret) dev_err(mbc->pcf->dev, "failed to create sysfs entries\n"); mbcs1 = pcf50633_reg_read(mbc->pcf, PCF50633_REG_MBCS1); if (mbcs1 & PCF50633_MBCS1_USBPRES) pcf50633_mbc_irq_handler(PCF50633_IRQ_USBINS, mbc); if (mbcs1 & PCF50633_MBCS1_ADAPTPRES) pcf50633_mbc_irq_handler(PCF50633_IRQ_ADPINS, mbc); return 0; }