示例#1
0
static int sunxi_daudio0_resume(struct snd_soc_dai *cpu_dai)
{
	u32 reg_val;
	pr_debug("[DAUDIO]Entered %s\n", __func__);
	#if defined(CONFIG_ARCH_SUN8IW6) || defined(CONFIG_ARCH_SUN8IW8)
	/*enable the module clock*/
	if (clk_prepare_enable(daudio_pllx8)) {
		pr_err("open daudio_pllx8 failed! line = %d\n", __LINE__);
	}
	/*enable the module clock*/
	if (clk_prepare_enable(daudio_pll2clk)) {
		pr_err("open daudio_pll2clk failed! line = %d\n", __LINE__);
	}
	#endif
	/*enable the module clock*/
	if (clk_prepare_enable(daudio_moduleclk)) {
		pr_err("open daudio_moduleclk failed! line = %d\n", __LINE__);
	}
	/*for evb pin config*/
	daudio_pinctrl = devm_pinctrl_get_select_default(cpu_dai->dev);
	if (IS_ERR_OR_NULL(daudio_pinctrl)) {
		dev_warn(cpu_dai->dev,
			"pins are not configured from the driver\n");
	}

	daudioregrestore();
	/*Global Enable Digital Audio Interface*/
	reg_val = sunxi_smc_readl(sunxi_daudio.regs + SUNXI_DAUDIOCTL);
	reg_val |= SUNXI_DAUDIOCTL_GEN;
	sunxi_smc_writel(reg_val, sunxi_daudio.regs + SUNXI_DAUDIOCTL);
	
	return 0;
}
示例#2
0
int bf609_nor_flash_init(struct platform_device *pdev)
{
#define CONFIG_SMC_GCTL_VAL     0x00000010

	if (!devm_pinctrl_get_select_default(&pdev->dev))
		return -EBUSY;
	bfin_write32(SMC_GCTL, CONFIG_SMC_GCTL_VAL);
	bfin_write32(SMC_B0CTL, 0x01002011);
	bfin_write32(SMC_B0TIM, 0x08170977);
	bfin_write32(SMC_B0ETIM, 0x00092231);
	return 0;
}
示例#3
0
static int panel_probe(struct platform_device *pdev)
{
	struct device_node *node = pdev->dev.of_node;
	struct panel_module *panel_mod;
	struct tilcdc_module *mod;
	struct pinctrl *pinctrl;
	int ret = -EINVAL;


	/* bail out early if no DT data: */
	if (!node) {
		dev_err(&pdev->dev, "device-tree data is missing\n");
		return -ENXIO;
	}

	panel_mod = kzalloc(sizeof(*panel_mod), GFP_KERNEL);
	if (!panel_mod)
		return -ENOMEM;

	mod = &panel_mod->base;

	tilcdc_module_init(mod, "panel", &panel_module_ops);

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "pins are not configured\n");


	panel_mod->timings = of_get_display_timings(node);
	if (!panel_mod->timings) {
		dev_err(&pdev->dev, "could not get panel timings\n");
		goto fail;
	}

	panel_mod->info = of_get_panel_info(node);
	if (!panel_mod->info) {
		dev_err(&pdev->dev, "could not get panel info\n");
		goto fail;
	}

	mod->preferred_bpp = panel_mod->info->bpp;

	panel_mod->backlight = of_find_backlight_by_node(node);
	if (panel_mod->backlight)
		dev_info(&pdev->dev, "found backlight\n");

	return 0;

fail:
	panel_destroy(mod);
	return ret;
}
示例#4
0
static int keypad_int_platfrom(void)
{
	
	dprintk(DEBUG_INIT, "keypad io init\n");
	keypad_pinctrl = devm_pinctrl_get_select_default(&(keypd_dev->dev));
	if (IS_ERR_OR_NULL(keypad_pinctrl)) {
		pr_warn("request pinctrl handle for device [%s] failed\n",
		dev_name(&(keypd_dev->dev)));
		return -EINVAL;
	}

	return 0;
}
示例#5
0
/**
 * gyr_init_platform_resource - initialize platform related resource
 * return value: 0 : success
 *               -EIO :  i/o err.
 *
 */
static int ir_init_platform_resource(enum input_sensor_type *ir_type)
{
	struct ir_config_info *data = container_of(ir_type,
					struct ir_config_info, input_type);

	data->pinctrl = devm_pinctrl_get_select_default(data->dev);
	if (IS_ERR_OR_NULL(data->pinctrl)) {
		pr_warn("request pinctrl handle for device [%s] failed\n",
		dev_name(data->dev));
		return -EINVAL;
	}

	return 0;
}
示例#6
0
static int scr_request_gpio(void)
{
	if (NULL != scr_device)
		scr_device->init_name = &scr_dev_name[0];

	scr_pinctrl = devm_pinctrl_get_select_default(scr_device);
	if (IS_ERR_OR_NULL(scr_pinctrl)) {
		printk(KERN_ERR "%s: request pinctrl handle for device failed\n",
		__func__);
		return -EINVAL;
	}

	return 0;
}
static int sunxi_pinctrl_test_probe(struct platform_device *pdev)
{
	struct pinctrl       *pinctrl;
	
	pr_warn("device [%s] probe enter\n", dev_name(&pdev->dev));
	
	/* set device name */
	dev_set_name(&(pdev->dev), "i2s1");
	
	/* request device pinctrl, set as default state */
	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR_OR_NULL(pinctrl)) {
		pr_warn("request pinctrl handle for device [%s] failed\n", 
		        dev_name(&pdev->dev));
		return -EINVAL;
	}
	//sunxi_devices_pin_request(pdev);
	
	//sunxi_devices_pin_check(pdev);
	
	pr_warn("sunxi-pinctrl test ok\n");
	return 0;
}
示例#8
0
/* Detect MAC & PHY and perform ethernet interface initialization */
static int __init at91ether_probe(struct platform_device *pdev)
{
	struct macb_platform_data *board_data = pdev->dev.platform_data;
	struct resource *regs;
	struct net_device *dev;
	struct phy_device *phydev;
	struct pinctrl *pinctrl;
	struct macb *lp;
	int res;
	u32 reg;

	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!regs)
		return -ENOENT;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl)) {
		res = PTR_ERR(pinctrl);
		if (res == -EPROBE_DEFER)
			return res;

		dev_warn(&pdev->dev, "No pinctrl provided\n");
	}

	dev = alloc_etherdev(sizeof(struct macb));
	if (!dev)
		return -ENOMEM;

	lp = netdev_priv(dev);
	lp->pdev = pdev;
	lp->dev = dev;
	spin_lock_init(&lp->lock);

	/* physical base address */
	dev->base_addr = regs->start;
	lp->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs));
	if (!lp->regs) {
		res = -ENOMEM;
		goto err_free_dev;
	}

	/* Clock */
	lp->pclk = devm_clk_get(&pdev->dev, "ether_clk");
	if (IS_ERR(lp->pclk)) {
		res = PTR_ERR(lp->pclk);
		goto err_free_dev;
	}
	clk_enable(lp->pclk);

	/* Install the interrupt handler */
	dev->irq = platform_get_irq(pdev, 0);
	res = devm_request_irq(&pdev->dev, dev->irq, at91ether_interrupt, 0, dev->name, dev);
	if (res)
		goto err_disable_clock;

	ether_setup(dev);
	dev->netdev_ops = &at91ether_netdev_ops;
	dev->ethtool_ops = &macb_ethtool_ops;
	platform_set_drvdata(pdev, dev);
	SET_NETDEV_DEV(dev, &pdev->dev);

	res = at91ether_get_hwaddr_dt(lp);
	if (res < 0)
		macb_get_hwaddr(lp);

	res = at91ether_get_phy_mode_dt(pdev);
	if (res < 0) {
		if (board_data && board_data->is_rmii)
			lp->phy_interface = PHY_INTERFACE_MODE_RMII;
		else
			lp->phy_interface = PHY_INTERFACE_MODE_MII;
	} else {
		lp->phy_interface = res;
	}

	macb_writel(lp, NCR, 0);

	reg = MACB_BF(CLK, MACB_CLK_DIV32) | MACB_BIT(BIG);
	if (lp->phy_interface == PHY_INTERFACE_MODE_RMII)
		reg |= MACB_BIT(RM9200_RMII);

	macb_writel(lp, NCFGR, reg);

	/* Register the network interface */
	res = register_netdev(dev);
	if (res)
		goto err_disable_clock;

	if (macb_mii_init(lp) != 0)
		goto err_out_unregister_netdev;

	/* will be enabled in open() */
	netif_carrier_off(dev);

	phydev = lp->phy_dev;
	netdev_info(dev, "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
				phydev->drv->name, dev_name(&phydev->dev),
				phydev->irq);

	/* Display ethernet banner */
	netdev_info(dev, "AT91 ethernet at 0x%08lx int=%d (%pM)\n",
				dev->base_addr, dev->irq, dev->dev_addr);

	return 0;

err_out_unregister_netdev:
	unregister_netdev(dev);
err_disable_clock:
	clk_disable(lp->pclk);
err_free_dev:
	free_netdev(dev);
	return res;
}
static int pwm_test_probe(struct platform_device *pdev)
{
	struct pwm_test *pwm_test;
	struct pinctrl *pinctrl;
	struct device_node *node = (&pdev->dev)->of_node;
	int rc;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "unable to select pin group. PWM not muxed right\n");


	pwm_test = devm_kzalloc(&pdev->dev, sizeof(*pwm_test), GFP_KERNEL);

	if (!pwm_test) {
		dev_err(&pdev->dev, "memory error\n");
		return -ENOMEM;
	}

	if (pwm_test_class_init(&pdev->dev)) {
		dev_err(&pdev->dev, "sysfs creation failed\n");
		return -EINVAL;
	}

	pwm_test->pwm = devm_pwm_get(&pdev->dev, NULL);
	if (IS_ERR(pwm_test->pwm)) {
		dev_err(&pdev->dev, "unable to request PWM\n");	
		return -EINVAL;			
	}

	pwm_test->requested = 1;

	pr_debug("pwm_test got PWM\n");

	/* Get the properties of the pwm. This is set in the device driver (tiehrpwm) */
	pwm_test->period = pwm_get_period(pwm_test->pwm);

	/* Determine running or not from the device tree */
	rc = of_property_read_u32(node, "enabled", (u32*) &(pwm_test->run));
	if (rc < 0)
		return rc;

	if(pwm_test->run){
		rc = pwm_enable(pwm_test->pwm);
		if (rc < 0)
				return rc;
	}

	/* Determine the duty from the device tree */
	rc = of_property_read_u32(node, "duty", (u32*) &(pwm_test->duty_s));
	if (rc < 0)
		return rc;

	rc = pwm_config(pwm_test->pwm, pwm_test->duty_s, pwm_test->period);
	if (rc) {
		pr_err("Unable to set pwm duty %d\n", rc);
		return rc;
	}
	

	platform_set_drvdata(pdev, pwm_test);
	return 0;
}
static int exynos_usbswitch_parse_dt(struct exynos_usb_switch *usb_switch,
				     struct device *dev)
{
	struct device_node *node;
	struct platform_device *pdev;
	struct pinctrl	*pinctrl;
	int ret;

	/* Host detection */
	usb_switch->gpio_host_detect = of_get_named_gpio(dev->of_node,
					"samsung,id-gpio", 0);
	if (!gpio_is_valid(usb_switch->gpio_host_detect)) {
		dev_info(dev, "host detect gpio is not available\n");
	} else {
		ret = devm_gpio_request(dev, usb_switch->gpio_host_detect,
						"usbswitch_id_gpio");
		if (ret)
			dev_err(dev, "failed to request host detect gpio");
		else
			usb_switch->host_detect_irq =
				gpio_to_irq(usb_switch->gpio_host_detect);
	}

	/* Device detection */
	usb_switch->gpio_device_detect = of_get_named_gpio(dev->of_node,
					"samsung,bsess-gpio", 0);
	if (!gpio_is_valid(usb_switch->gpio_device_detect)) {
		dev_info(dev, "device detect gpio is not available\n");
	} else {
		ret = devm_gpio_request(dev, usb_switch->gpio_device_detect,
						"usbswitch_b_sess_gpio");
		if (ret)
			dev_err(dev, "failed to request host detect gpio");
		else
			usb_switch->device_detect_irq =
				gpio_to_irq(usb_switch->gpio_device_detect);
	}

	/* VBus control */
	usb_switch->gpio_host_vbus = of_get_named_gpio(dev->of_node,
					"samsung,vbus-gpio", 0);
	if (gpio_is_valid(usb_switch->gpio_host_vbus)) {
		ret = devm_gpio_request(dev, usb_switch->gpio_host_vbus,
						"usbswitch_vbus_gpio");
		if (ret)
			dev_err(dev, "failed to request vbus control gpio");
	} else {
		/* fallback to regulator */
		usb_switch->vbus_reg = devm_regulator_get(dev, "uhost-vbus");
		if (IS_ERR(usb_switch->vbus_reg))
			dev_info(dev, "vbus control is not available\n");
	}

	pinctrl = devm_pinctrl_get_select_default(dev);
	if (IS_ERR(pinctrl))
		dev_info(dev, "failed to configure pins\n");

	/* EHCI */
	node = of_parse_phandle(dev->of_node, "ehci", 0);
	if (!node) {
		dev_info(dev, "ehci device is not available\n");
	} else {
		pdev = of_find_device_by_node(node);
		if (!pdev)
			dev_err(dev, "failed to find ehci device\n");
		else
			usb_switch->ehci_dev = &pdev->dev;
		of_node_put(node);
	}

	/* OHCI */
	node = of_parse_phandle(dev->of_node, "ohci", 0);
	if (!node) {
		dev_info(dev, "ohci device is not available\n");
	} else {
		pdev = of_find_device_by_node(node);
		if (!pdev)
			dev_err(dev, "failed to find ohci device\n");
		else
			usb_switch->ohci_dev = &pdev->dev;
		of_node_put(node);
	}

	/* UDC */
	node = of_parse_phandle(dev->of_node, "udc", 0);
	if (!node) {
		dev_info(dev, "udc device is not available\n");
	} else {
		pdev = of_find_device_by_node(node);
		if (!pdev)
			dev_err(dev, "failed to find udc device\n");
		else
			usb_switch->s3c_udc_dev = &pdev->dev;
		of_node_put(node);
	}

	return 0;
}
示例#11
0
static int __devinit mxs_saif_probe(struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
	struct resource *iores, *dmares;
	struct mxs_saif *saif;
	struct mxs_saif_platform_data *pdata;
	struct pinctrl *pinctrl;
	int ret = 0;


	if (!np && pdev->id >= ARRAY_SIZE(mxs_saif))
		return -EINVAL;

	saif = devm_kzalloc(&pdev->dev, sizeof(*saif), GFP_KERNEL);
	if (!saif)
		return -ENOMEM;

	if (np) {
		struct device_node *master;
		saif->id = of_alias_get_id(np, "saif");
		if (saif->id < 0)
			return saif->id;
		/*
		 * If there is no "fsl,saif-master" phandle, it's a saif
		 * master.  Otherwise, it's a slave and its phandle points
		 * to the master.
		 */
		master = of_parse_phandle(np, "fsl,saif-master", 0);
		if (!master) {
			saif->master_id = saif->id;
		} else {
			saif->master_id = of_alias_get_id(master, "saif");
			if (saif->master_id < 0)
				return saif->master_id;
		}
	} else {
		saif->id = pdev->id;
		pdata = pdev->dev.platform_data;
		if (pdata && !pdata->master_mode)
			saif->master_id = pdata->master_id;
		else
			saif->master_id = saif->id;
	}

	if (saif->master_id < 0 || saif->master_id >= ARRAY_SIZE(mxs_saif)) {
		dev_err(&pdev->dev, "get wrong master id\n");
		return -EINVAL;
	}

	mxs_saif[saif->id] = saif;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl)) {
		ret = PTR_ERR(pinctrl);
		return ret;
	}

	saif->clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(saif->clk)) {
		ret = PTR_ERR(saif->clk);
		dev_err(&pdev->dev, "Cannot get the clock: %d\n",
			ret);
		return ret;
	}

	iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);

	saif->base = devm_request_and_ioremap(&pdev->dev, iores);
	if (!saif->base) {
		dev_err(&pdev->dev, "ioremap failed\n");
		ret = -ENODEV;
		goto failed_get_resource;
	}

	dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0);
	if (!dmares) {
		/*
		 * TODO: This is a temporary solution and should be changed
		 * to use generic DMA binding later when the helplers get in.
		 */
		ret = of_property_read_u32(np, "fsl,saif-dma-channel",
					   &saif->dma_param.chan_num);
		if (ret) {
			dev_err(&pdev->dev, "failed to get dma channel\n");
			goto failed_get_resource;
		}
	} else {
		saif->dma_param.chan_num = dmares->start;
	}

	saif->irq = platform_get_irq(pdev, 0);
	if (saif->irq < 0) {
		ret = saif->irq;
		dev_err(&pdev->dev, "failed to get irq resource: %d\n",
			ret);
		goto failed_get_resource;
	}

	saif->dev = &pdev->dev;
	ret = devm_request_irq(&pdev->dev, saif->irq, mxs_saif_irq, 0,
			       "mxs-saif", saif);
	if (ret) {
		dev_err(&pdev->dev, "failed to request irq\n");
		goto failed_get_resource;
	}

	saif->dma_param.chan_irq = platform_get_irq(pdev, 1);
	if (saif->dma_param.chan_irq < 0) {
		ret = saif->dma_param.chan_irq;
		dev_err(&pdev->dev, "failed to get dma irq resource: %d\n",
			ret);
		goto failed_get_resource;
	}

	platform_set_drvdata(pdev, saif);

	ret = snd_soc_register_dai(&pdev->dev, &mxs_saif_dai);
	if (ret) {
		dev_err(&pdev->dev, "register DAI failed\n");
		goto failed_get_resource;
	}

	ret = mxs_pcm_platform_register(&pdev->dev);
	if (ret) {
		dev_err(&pdev->dev, "register PCM failed: %d\n", ret);
		goto failed_pdev_alloc;
	}

	return 0;

failed_pdev_alloc:
	snd_soc_unregister_dai(&pdev->dev);
failed_get_resource:
	clk_put(saif->clk);

	return ret;
}
示例#12
0
static int gpio_ctrl_probe(struct platform_device *pdev)
{
	struct gpio_ctrl_platform_data *pdata=NULL;
	struct gpio_ctrl_data *ctrlmodules = NULL;

	struct device_node *np=NULL, *child=NULL;
    struct pinctrl *pinctrl=NULL;
    unsigned int count=0;
	int  ret = 0;

//	struct gpio_ctrl_platform_data *priv;

	printk(KERN_ALERT "In gpio_ctrl_probe: \n");
{
	const char *devname;
 	devname = dev_name(&(pdev->dev));
	printk(KERN_ALERT "devname=%s\n",devname);
//	printk(KERN_ALERT "devname=%s\n",kobject_name(&(pdev->dev)->kobj);
	printk(KERN_ALERT "devname=%s\n",kobject_name(&( (pdev->dev.kobj))) );
}
    pinctrl = devm_pinctrl_get_select_default(&pdev->dev);		
    if (IS_ERR(pinctrl))
       dev_warn(&pdev->dev,"pins are not configured from the driver\n");
	printk(KERN_ALERT "pinctrl=%ld\n",PTR_ERR(pinctrl));

	pdata = devm_kzalloc(&pdev->dev, MAX_LEDS*sizeof(struct gpio_ctrl_platform_data),GFP_KERNEL);
	if (!pdata)
      return(-ENOMEM);

	np = pdev->dev.of_node;
    count = of_get_child_count(np);
        if (!count)
                return (-ENODEV);
	printk("child-count=%d\n",count);
    for_each_child_of_node(np, child){
	struct gpio_ctrl_data *ctrlmodule= &(pdata->ctrlmodules[pdata->num_leds++]);
    ctrlmodule->out_gpio = of_get_gpio(child, 0);
    ctrlmodule->in_gpio = of_get_gpio(child, 1);
    ctrlmodule->led_gpio = of_get_gpio(child, 2);

	printk("gpios--%d %d %d\n",ctrlmodule->out_gpio,ctrlmodule->in_gpio,ctrlmodule->led_gpio);
	ctrlmodule->name = of_get_property(child, "label", NULL) ? : child->name;
	  
	 ctrlmodule->led_cdev.name =of_get_property(child, "label", NULL) ? : child->name;
	printk("ctrlmodule->led_cdev.name=%s\n",ctrlmodule->led_cdev.name);

	printk("irq_no=%d\n",gpio_to_irq(ctrlmodule->in_gpio) );


	ret = gpio_request_one(ctrlmodule->out_gpio,GPIOF_OUT_INIT_LOW,ctrlmodule->name);
      if(ret < 0)
         return ret;


	ret = gpio_request_one( ctrlmodule->in_gpio,GPIOF_IN,ctrlmodule->name);  		
      if(ret < 0)
         return ret;

	ret = gpio_request_one( ctrlmodule->led_gpio,GPIOF_OUT_INIT_LOW,ctrlmodule->name);
      if(ret < 0)
        return ret;

	printk(KERN_ALERT "Gpio_ctrl:gpio_request_one\n");
{
		printk("irq_no=%d\n",gpio_to_irq(ctrlmodule->in_gpio) );
	ret = request_irq(gpio_to_irq(ctrlmodule->in_gpio),gpio_ctrl_ISR,IRQF_TRIGGER_RISING , "gpio_ctrl",NULL);
	if(ret != 0)
		printk("\n Request_irq Failed %d\n",ret);
};
	gpio_export(ctrlmodule->out_gpio,0);
	gpio_export(ctrlmodule->in_gpio,0);
	gpio_export(ctrlmodule->led_gpio,0);

	ret = led_classdev_register(&pdev->dev,&(ctrlmodule->led_cdev) );
    if(ret < 0)
	    return ret;
	}

	printk(KERN_ALERT "Gpio_ctrl:led_classdev_register\n");
	platform_set_drvdata(pdev, pdata);
   
	printk(KERN_ALERT "Gpio_ctrl:probe \n");
	
return 0;
}
示例#13
0
static int __init sunxi_spdif_dev_probe(struct platform_device *pdev)
{
	int reg_val = 0;
	int ret = 0;
	#ifdef CONFIG_ARCH_SUN9IW1
	if(script_get_item("spdif0", "spdif_voltage", &spdif_voltage) != SCIRPT_ITEM_VALUE_TYPE_STR){
		printk("[aif3_voltage]script_get_item return type err\n");
		return -EFAULT;
	}
	/*spdif:dcdc1*/
	spdif_vol = regulator_get(NULL, spdif_voltage.str);
	if (!spdif_vol) {
		printk("get audio spdif_vol failed\n");
		return -EFAULT;
	}
	//regulator_set_voltage(spdif_vol, 3000000, 3000000);
	regulator_enable(spdif_vol);
	#endif

	sunxi_spdif.regs = ioremap(SUNXI_SPDIFBASE, 0x100);
	if (sunxi_spdif.regs == NULL) {
		return -ENXIO;
	}
	printk("%s, line:%d, dev_name(&pdev->dev):%s\n", __func__, __LINE__, dev_name(&pdev->dev));
	spdif_pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR_OR_NULL(spdif_pinctrl)) {
		dev_warn(&pdev->dev,
			"pins are not configured from the driver\n");
	}

    #ifdef CONFIG_ARCH_SUN8IW6
	spdif_pllx8 = clk_get(NULL, "pll_audiox8");
    if ((!spdif_pllx8)||(IS_ERR(spdif_pllx8))) {
		printk("try to get spdif_pllx8 failed\n");
	}
	if (clk_prepare_enable(spdif_pllx8)) {
		printk("enable spdif_pll2clk failed; \n");
	}
    #else
    #ifdef CONFIG_ARCH_SUN9IW1
	/*spdif pll3clk*/
	spdif_pll3clk = clk_get(NULL, "pll3");
	if ((!spdif_pll3clk)||(IS_ERR(spdif_pll3clk))) {
		printk("try to get spdif_pll3clk failed\n");
	}
	if (clk_prepare_enable(spdif_pll3clk)) {
		printk("enable spdif_pll3clk failed; \n");
	}
    #else
	spdif_pllx8 = clk_get(NULL, "pll2x8");
	if ((!spdif_pllx8)||(IS_ERR(spdif_pllx8))) {
		printk("try to get spdif_pllx8 failed\n");
	}
	if (clk_prepare_enable(spdif_pllx8)) {
		printk("enable spdif_pll2clk failed; \n");
	}
	#endif
	#endif
#ifndef CONFIG_ARCH_SUN9IW1
/********spdif pll2clk can be remove****************/
	/*spdif pll2clk*/
	spdif_pll2clk = clk_get(NULL, "pll2");
	if ((!spdif_pll2clk)||(IS_ERR(spdif_pll2clk))) {
		printk("try to get spdif_pll2clk failed\n");
	}
	if (clk_prepare_enable(spdif_pll2clk)) {
		printk("enable spdif_pll2clk failed; \n");
	}
#endif
	/*spdif module clk*/
	spdif_moduleclk = clk_get(NULL, "spdif");
	if ((!spdif_moduleclk)||(IS_ERR(spdif_moduleclk))) {
		printk("try to get spdif_moduleclk failed\n");
	}
#ifndef CONFIG_ARCH_SUN9IW1
/*******clk_set_parent can be remove*******/
	if (clk_set_parent(spdif_moduleclk, spdif_pll2clk)) {
		printk("try to set parent of spdif_moduleclk to spdif_pll2ck failed! line = %d\n",__LINE__);
	}
	if (clk_set_rate(spdif_moduleclk, 24576000/8)) {
		printk("set spdif_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#else
	if (clk_set_parent(spdif_moduleclk, spdif_pll3clk)) {
		printk("try to set parent of spdif_moduleclk to spdif_pll2ck failed! line = %d\n",__LINE__);
	}
	if (clk_set_rate(spdif_moduleclk, 24576000)) {
		printk("set spdif_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#endif
	if (clk_prepare_enable(spdif_moduleclk)) {
		printk("open spdif_moduleclk failed! line = %d\n", __LINE__);
	}
//	if (clk_reset(spdif_moduleclk, AW_CCU_CLK_NRESET)) {
//		printk("try to NRESET spdif module clk failed!\n");
//	}

	/*global enbale*/
	reg_val = readl(sunxi_spdif.regs + SUNXI_SPDIF_CTL);
	reg_val |= SUNXI_SPDIF_CTL_GEN;
	writel(reg_val, sunxi_spdif.regs + SUNXI_SPDIF_CTL);

	ret = snd_soc_register_dai(&pdev->dev, &sunxi_spdif_dai);
	return 0;
}
示例#14
0
static int bq24297_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
	struct bq24297_chip *chip;
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	struct device_node *np = client->dev.of_node;
	struct pinctrl *pinctrl;
	int ret = 0;

	dev_info(&client->dev, "%s: addr=0x%x @ IIC%d, irq=%d\n",
			client->name,client->addr,client->adapter->nr,client->irq);

	if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))//I2C_FUNC_SMBUS_BYTE
		return -EIO;

	chip = kzalloc(sizeof(*chip), GFP_KERNEL);
	if (!chip)
		return -ENOMEM;
	this_chip = chip;
	chip->client = client;
	i2c_set_clientdata(client, chip);

	of_property_read_u32(np, "debug", &bq24297_dbg);

	ret = bq24297_hw_init();
	if (ret < 0)
	{
		goto err_hw_init;
	}
	bq24297_read_version();

	chip->usb.name		= "usb";
	chip->usb.type		= POWER_SUPPLY_TYPE_USB;
	chip->usb.supplied_to	= supply_to_list;
	chip->usb.num_supplicants = ARRAY_SIZE(supply_to_list);
	chip->usb.get_property	= bq24297_power_get_property;
	chip->usb.properties	= bq24297_power_props;
	chip->usb.num_properties	= ARRAY_SIZE(bq24297_power_props);

	chip->ac.name		= "ac";
	chip->ac.type		= POWER_SUPPLY_TYPE_MAINS;
	chip->ac.supplied_to	= supply_to_list;
	chip->ac.num_supplicants = ARRAY_SIZE(supply_to_list);
	chip->ac.get_property	= bq24297_power_get_property;
	chip->ac.properties	= bq24297_power_props;
	chip->ac.num_properties	= ARRAY_SIZE(bq24297_power_props);

	power_supply_register(&client->dev, &chip->usb);
	power_supply_register(&client->dev, &chip->ac);
	chip->battery = power_supply_get_by_name("battery");

	ret = sysfs_create_group(&client->dev.kobj, &bq24297_attr_group);
	if (ret)
	{
		dev_err(&client->dev, "create sysfs error\n");
		goto err_create_sysfs;
	}

	pinctrl = devm_pinctrl_get_select_default(&client->dev);
	if (IS_ERR(pinctrl))
	{
		dev_err(&client->dev, "pinctrl error\n");
		goto err_pinctrl;
	}

	INIT_DELAYED_WORK(&chip->work_status, bq24297_status_func);

	chip->chg_int_gpio = of_get_named_gpio(np, "bq24297,chg_int", 0);
	chip->chg_int_irq = gpio_to_irq(chip->chg_int_gpio);
	//gpio_set_debounce(chip->chg_int_gpio, 1);// TODO
	ret = request_irq(chip->chg_int_irq, chg_int_func,
			IRQF_TRIGGER_RISING, "chg_int", NULL);
	if (ret)
	{
		dev_err(&client->dev, "request_irq error\n");
		goto err_request_irq;
	}

	return 0;

err_request_irq:
err_pinctrl:
	sysfs_remove_group(&client->dev.kobj, &bq24297_attr_group);
err_create_sysfs:
	power_supply_unregister(&chip->usb);
	power_supply_unregister(&chip->ac);
err_hw_init:
	kfree(chip);
	return ret;	
}
示例#15
0
static int __devinit ci13xxx_imx_probe(struct platform_device *pdev)
{
	struct ci13xxx_imx_data *data;
	struct platform_device *plat_ci, *phy_pdev;
	struct device_node *phy_np;
	struct resource *res;
	struct regulator *reg_vbus;
	struct pinctrl *pinctrl;
	int ret;

	if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL)
		&& !usbmisc_ops)
		return -EPROBE_DEFER;

	data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
	if (!data) {
		dev_err(&pdev->dev, "Failed to allocate CI13xxx-IMX data!\n");
		return -ENOMEM;
	}

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev, "Can't get device resources!\n");
		return -ENOENT;
	}

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "pinctrl get/select failed, err=%ld\n",
			PTR_ERR(pinctrl));

	data->clk = devm_clk_get(&pdev->dev, NULL);
	if (IS_ERR(data->clk)) {
		dev_err(&pdev->dev,
			"Failed to get clock, err=%ld\n", PTR_ERR(data->clk));
		return PTR_ERR(data->clk);
	}

	ret = clk_prepare_enable(data->clk);
	if (ret) {
		dev_err(&pdev->dev,
			"Failed to prepare or enable clock, err=%d\n", ret);
		return ret;
	}

	phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
	if (phy_np) {
		data->phy_np = phy_np;
		phy_pdev = of_find_device_by_node(phy_np);
		if (phy_pdev) {
			struct usb_phy *phy;
			phy = pdev_to_phy(phy_pdev);
			if (phy &&
			    try_module_get(phy_pdev->dev.driver->owner)) {
				usb_phy_init(phy);
				data->phy = phy;
			}
		}
	}

	/* we only support host now, so enable vbus here */
	reg_vbus = devm_regulator_get(&pdev->dev, "vbus");
	if (!IS_ERR(reg_vbus)) {
		ret = regulator_enable(reg_vbus);
		if (ret) {
			dev_err(&pdev->dev,
				"Failed to enable vbus regulator, err=%d\n",
				ret);
			goto put_np;
		}
		data->reg_vbus = reg_vbus;
	} else {
		reg_vbus = NULL;
	}

	ci13xxx_imx_platdata.phy = data->phy;

	if (!pdev->dev.dma_mask) {
		pdev->dev.dma_mask = devm_kzalloc(&pdev->dev,
				      sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
		if (!pdev->dev.dma_mask) {
			ret = -ENOMEM;
			dev_err(&pdev->dev, "Failed to alloc dma_mask!\n");
			goto err;
		}
		*pdev->dev.dma_mask = DMA_BIT_MASK(32);
		dma_set_coherent_mask(&pdev->dev, *pdev->dev.dma_mask);
	}

	if (usbmisc_ops && usbmisc_ops->init) {
		ret = usbmisc_ops->init(&pdev->dev);
		if (ret) {
			dev_err(&pdev->dev,
				"usbmisc init failed, ret=%d\n", ret);
			goto err;
		}
	}

	plat_ci = ci13xxx_add_device(&pdev->dev,
				pdev->resource, pdev->num_resources,
				&ci13xxx_imx_platdata);
	if (IS_ERR(plat_ci)) {
		ret = PTR_ERR(plat_ci);
		dev_err(&pdev->dev,
			"Can't register ci_hdrc platform device, err=%d\n",
			ret);
		goto err;
	}

	data->ci_pdev = plat_ci;
	platform_set_drvdata(pdev, data);

	pm_runtime_no_callbacks(&pdev->dev);
	pm_runtime_enable(&pdev->dev);

	return 0;

err:
	if (reg_vbus)
		regulator_disable(reg_vbus);
put_np:
	if (phy_np)
		of_node_put(phy_np);
	clk_disable_unprepare(data->clk);
	return ret;
}
示例#16
0
static int pwm_test_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct device_node *node = dev->of_node;
	struct pwm_test *pwm_test;
	struct of_phandle_args args;
	struct pinctrl *pinctrl;
	u32 val;
	int rc;

	if (node == NULL) {
		dev_err(dev, "Non DT platforms not supported\n");
		return -EINVAL;
	}

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "Unable to select pin group\n");

	pwm_test = devm_kzalloc(&pdev->dev, sizeof(*pwm_test), GFP_KERNEL);
	if (!pwm_test) {
		dev_err(&pdev->dev, "memory error\n");
		return -ENOMEM;
	}
	platform_set_drvdata(pdev, pwm_test);

	/* now do the probe time config */
	pwm_test->pwm = devm_pwm_get(&pdev->dev, NULL);
	if (IS_ERR(pwm_test->pwm)) {
		dev_err(dev, "unable to request PWM\n");
		return PTR_ERR(pwm_test->pwm);
	}

	rc = of_parse_phandle_with_args(node, "pwms", "#pwm-cells", 0, &args);
	if (rc != 0) {
		dev_err(dev, "of_parse_phandle_with_args() failed\n");
		return rc;
	}

	/* read the period */
	pwm_test->period = args.args[1];

	/* should be at least 2, but 3 is possible to store polarity */
	pwm_test->polarity = PWM_POLARITY_NORMAL;
	/* PWM_SPEC_POLARITY is (1 << 0) */
	if (args.args_count >= 3 && (args.args[2] & (1 << 0)) != 0)
		pwm_test->polarity = PWM_POLARITY_INVERSED;

	/* Determine the duty from the device tree */
	rc = of_property_read_u32(node, "duty", &val);
	if (rc != 0)
		val = 0;	/* default is 0 */
	pwm_test->duty = val;

	/* polarity is already set */
	rc = pwm_config(pwm_test->pwm, pwm_test->duty, pwm_test->period);
	if (rc) {
		dev_err(dev, "pwm_config() failed\n");
		return rc;
	}

	/* Determine running or not from the device tree */
	rc = of_property_read_u32(node, "enabled", &val);
	if (rc < 0)
		val = 0;	/* default is disabled */

	/* single bit */
	pwm_test->run = !!val;

	if (pwm_test->run) {
		rc = pwm_enable(pwm_test->pwm);
		if (rc < 0) {
			dev_err(dev, "pwm_enable failed\n");
			return rc;
		}
	}

	rc = sysfs_create_group(&dev->kobj, &pwm_device_attr_group);
	if (rc != 0) {
		dev_err(dev, "Unable to create sysfs entries\n");
		return rc;
	}

	return 0;
}
static int atmel_asoc_wm8904_probe(struct platform_device *pdev)
{
	struct snd_soc_card *card = &atmel_asoc_wm8904_card;
	struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;
	struct clk *clk_src;
	struct pinctrl *pinctrl;
	int id, ret;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl)) {
		dev_err(&pdev->dev, "failed to request pinctrl\n");
		return PTR_ERR(pinctrl);
	}

	card->dev = &pdev->dev;
	ret = atmel_asoc_wm8904_dt_init(pdev);
	if (ret) {
		dev_err(&pdev->dev, "failed to init dt info\n");
		return ret;
	}

	id = of_alias_get_id((struct device_node *)dailink->cpu_of_node, "ssc");
	ret = atmel_ssc_set_audio(id);
	if (ret != 0) {
		dev_err(&pdev->dev, "failed to set SSC %d for audio\n", id);
		return ret;
	}

	mclk = clk_get(NULL, "pck0");
	if (IS_ERR(mclk)) {
		dev_err(&pdev->dev, "failed to get pck0\n");
		ret = PTR_ERR(mclk);
		goto err_set_audio;
	}

	clk_src = clk_get(NULL, "clk32k");
	if (IS_ERR(clk_src)) {
		dev_err(&pdev->dev, "failed to get clk32k\n");
		ret = PTR_ERR(clk_src);
		goto err_set_audio;
	}

	ret = clk_set_parent(mclk, clk_src);
	clk_put(clk_src);
	if (ret != 0) {
		dev_err(&pdev->dev, "failed to set MCLK parent\n");
		goto err_set_audio;
	}

	dev_info(&pdev->dev, "setting pck0 to %dHz\n", MCLK_RATE);
	clk_set_rate(mclk, MCLK_RATE);

	ret = snd_soc_register_card(card);
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed\n");
		goto err_set_audio;
	}

	return 0;

err_set_audio:
	atmel_ssc_put_audio(id);
	return ret;
}
static int sdhci_s3c_probe(struct platform_device *pdev)
{
	struct s3c_sdhci_platdata *pdata;
	struct sdhci_s3c_drv_data *drv_data;
	struct device *dev = &pdev->dev;
	struct sdhci_host *host;
	struct sdhci_s3c *sc;
	struct resource *res;
	int ret, irq, ptr, clks;

	if (!pdev->dev.platform_data && !pdev->dev.of_node) {
		dev_err(dev, "no device data specified\n");
		return -ENOENT;
	}

	irq = platform_get_irq(pdev, 0);
	if (irq < 0) {
		dev_err(dev, "no irq specified\n");
		return irq;
	}

	host = sdhci_alloc_host(dev, sizeof(struct sdhci_s3c));
	if (IS_ERR(host)) {
		dev_err(dev, "sdhci_alloc_host() failed\n");
		return PTR_ERR(host);
	}
	sc = sdhci_priv(host);

	pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata) {
		ret = -ENOMEM;
		goto err_pdata_io_clk;
	}

	sc->pctrl = devm_pinctrl_get_select_default(&pdev->dev);

	if (pdev->dev.of_node) {
		ret = sdhci_s3c_parse_dt(&pdev->dev, host, pdata);
		if (ret)
			goto err_pdata_io_clk;
	} else {
		memcpy(pdata, pdev->dev.platform_data, sizeof(*pdata));
		sc->ext_cd_gpio = -1; /* invalid gpio number */
	}

	drv_data = sdhci_s3c_get_driver_data(pdev);

	sc->host = host;
	sc->pdev = pdev;
	sc->pdata = pdata;

	platform_set_drvdata(pdev, host);

	sc->clk_io = clk_get(dev, "hsmmc");
	if (IS_ERR(sc->clk_io)) {
		dev_err(dev, "failed to get io clock\n");
		ret = PTR_ERR(sc->clk_io);
		goto err_pdata_io_clk;
	}

	/* enable the local io clock and keep it running for the moment. */
	clk_prepare_enable(sc->clk_io);

	for (clks = 0, ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
		struct clk *clk;
		char name[14];

		snprintf(name, 14, "mmc_busclk.%d", ptr);
		clk = clk_get(dev, name);
		if (IS_ERR(clk))
			continue;

		clks++;
		sc->clk_bus[ptr] = clk;

		/*
		 * save current clock index to know which clock bus
		 * is used later in overriding functions.
		 */
		sc->cur_clk = ptr;

		dev_info(dev, "clock source %d: %s (%ld Hz)\n",
			 ptr, name, clk_get_rate(clk));
	}

	if (clks == 0) {
		dev_err(dev, "failed to find any bus clocks\n");
		ret = -ENOENT;
		goto err_no_busclks;
	}

#ifndef CONFIG_PM_RUNTIME
	clk_prepare_enable(sc->clk_bus[sc->cur_clk]);
#endif

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	host->ioaddr = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(host->ioaddr)) {
		ret = PTR_ERR(host->ioaddr);
		goto err_req_regs;
	}

	/* Ensure we have minimal gpio selected CMD/CLK/Detect */
	if (pdata->cfg_gpio)
		pdata->cfg_gpio(pdev, pdata->max_width);

	host->hw_name = "samsung-hsmmc";
	host->ops = &sdhci_s3c_ops;
	host->quirks = 0;
	host->irq = irq;

	/* Setup quirks for the controller */
	host->quirks |= SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC;
	host->quirks |= SDHCI_QUIRK_NO_HISPD_BIT;
	if (drv_data)
		host->quirks |= drv_data->sdhci_quirks;

#ifndef CONFIG_MMC_SDHCI_S3C_DMA

	/* we currently see overruns on errors, so disable the SDMA
	 * support as well. */
	host->quirks |= SDHCI_QUIRK_BROKEN_DMA;

#endif /* CONFIG_MMC_SDHCI_S3C_DMA */

	/* It seems we do not get an DATA transfer complete on non-busy
	 * transfers, not sure if this is a problem with this specific
	 * SDHCI block, or a missing configuration that needs to be set. */
	host->quirks |= SDHCI_QUIRK_NO_BUSY_IRQ;

	/* This host supports the Auto CMD12 */
	host->quirks |= SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12;

	/* Samsung SoCs need BROKEN_ADMA_ZEROLEN_DESC */
	host->quirks |= SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC;

	if (pdata->cd_type == S3C_SDHCI_CD_NONE ||
	    pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
		host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;

	if (pdata->cd_type == S3C_SDHCI_CD_PERMANENT)
		host->mmc->caps = MMC_CAP_NONREMOVABLE;

	switch (pdata->max_width) {
	case 8:
		host->mmc->caps |= MMC_CAP_8_BIT_DATA;
	case 4:
		host->mmc->caps |= MMC_CAP_4_BIT_DATA;
		break;
	}

	if (pdata->pm_caps)
		host->mmc->pm_caps |= pdata->pm_caps;

	host->quirks |= (SDHCI_QUIRK_32BIT_DMA_ADDR |
			 SDHCI_QUIRK_32BIT_DMA_SIZE);

	/* HSMMC on Samsung SoCs uses SDCLK as timeout clock */
	host->quirks |= SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK;

	/*
	 * If controller does not have internal clock divider,
	 * we can use overriding functions instead of default.
	 */
	if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) {
		sdhci_s3c_ops.set_clock = sdhci_cmu_set_clock;
		sdhci_s3c_ops.get_min_clock = sdhci_cmu_get_min_clock;
		sdhci_s3c_ops.get_max_clock = sdhci_cmu_get_max_clock;
	}

	/* It supports additional host capabilities if needed */
	if (pdata->host_caps)
		host->mmc->caps |= pdata->host_caps;

	if (pdata->host_caps2)
		host->mmc->caps2 |= pdata->host_caps2;

	pm_runtime_enable(&pdev->dev);
	pm_runtime_set_autosuspend_delay(&pdev->dev, 50);
	pm_runtime_use_autosuspend(&pdev->dev);
	pm_suspend_ignore_children(&pdev->dev, 1);

	ret = sdhci_add_host(host);
	if (ret) {
		dev_err(dev, "sdhci_add_host() failed\n");
		pm_runtime_forbid(&pdev->dev);
		pm_runtime_get_noresume(&pdev->dev);
		goto err_req_regs;
	}

	/* The following two methods of card detection might call
	   sdhci_s3c_notify_change() immediately, so they can be called
	   only after sdhci_add_host(). Setup errors are ignored. */
	if (pdata->cd_type == S3C_SDHCI_CD_EXTERNAL && pdata->ext_cd_init)
		pdata->ext_cd_init(&sdhci_s3c_notify_change);
	if (pdata->cd_type == S3C_SDHCI_CD_GPIO &&
	    gpio_is_valid(pdata->ext_cd_gpio))
		sdhci_s3c_setup_card_detect_gpio(sc);

#ifdef CONFIG_PM_RUNTIME
	if (pdata->cd_type != S3C_SDHCI_CD_INTERNAL)
		clk_disable_unprepare(sc->clk_io);
#endif
	return 0;

 err_req_regs:
#ifndef CONFIG_PM_RUNTIME
	clk_disable_unprepare(sc->clk_bus[sc->cur_clk]);
#endif
	for (ptr = 0; ptr < MAX_BUS_CLK; ptr++) {
		if (sc->clk_bus[ptr]) {
			clk_put(sc->clk_bus[ptr]);
		}
	}

 err_no_busclks:
	clk_disable_unprepare(sc->clk_io);
	clk_put(sc->clk_io);

 err_pdata_io_clk:
	sdhci_free_host(host);

	return ret;
}
static int panel_probe(struct platform_device *pdev)
{
	struct device_node *bl_node, *node = pdev->dev.of_node;
	struct panel_module *panel_mod;
	struct tilcdc_module *mod;
	struct pinctrl *pinctrl;
	int ret;

	/* bail out early if no DT data: */
	if (!node) {
		dev_err(&pdev->dev, "device-tree data is missing\n");
		return -ENXIO;
	}

	panel_mod = devm_kzalloc(&pdev->dev, sizeof(*panel_mod), GFP_KERNEL);
	if (!panel_mod)
		return -ENOMEM;

	bl_node = of_parse_phandle(node, "backlight", 0);
	if (bl_node) {
		panel_mod->backlight = of_find_backlight_by_node(bl_node);
		of_node_put(bl_node);

		if (!panel_mod->backlight)
			return -EPROBE_DEFER;

		dev_info(&pdev->dev, "found backlight\n");
	}

	panel_mod->enable_gpio = devm_gpiod_get_optional(&pdev->dev, "enable",
							 GPIOD_OUT_LOW);
	if (IS_ERR(panel_mod->enable_gpio)) {
		ret = PTR_ERR(panel_mod->enable_gpio);
		dev_err(&pdev->dev, "failed to request enable GPIO\n");
		goto fail_backlight;
	}

	if (panel_mod->enable_gpio)
		dev_info(&pdev->dev, "found enable GPIO\n");

	mod = &panel_mod->base;
	pdev->dev.platform_data = mod;

	tilcdc_module_init(mod, "panel", &panel_module_ops);

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "pins are not configured\n");

	panel_mod->timings = of_get_display_timings(node);
	if (!panel_mod->timings) {
		dev_err(&pdev->dev, "could not get panel timings\n");
		ret = -EINVAL;
		goto fail_free;
	}

	panel_mod->info = of_get_panel_info(node);
	if (!panel_mod->info) {
		dev_err(&pdev->dev, "could not get panel info\n");
		ret = -EINVAL;
		goto fail_timings;
	}

	mod->preferred_bpp = panel_mod->info->bpp;

	return 0;

fail_timings:
	display_timings_release(panel_mod->timings);

fail_free:
	tilcdc_module_cleanup(mod);

fail_backlight:
	if (panel_mod->backlight)
		put_device(&panel_mod->backlight->dev);
	return ret;
}
示例#20
0
static int w1_gpio_probe(struct platform_device *pdev)
{
	struct w1_bus_master *master;
	struct w1_gpio_platform_data *pdata;
	struct pinctrl *pinctrl;
	int err;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "unable to select pin group\n");

	if (of_have_populated_dt()) {
		err = w1_gpio_probe_dt(pdev);
		if (err < 0) {
			dev_err(&pdev->dev, "Failed to parse DT\n");
			return err;
		}
	}

	pdata = pdev->dev.platform_data;

	if (!pdata) {
		dev_err(&pdev->dev, "No configuration data\n");
		return -ENXIO;
	}

	master = kzalloc(sizeof(struct w1_bus_master), GFP_KERNEL);
	if (!master) {
		dev_err(&pdev->dev, "Out of memory\n");
		return -ENOMEM;
	}

	err = gpio_request(pdata->pin, "w1");
	if (err) {
		dev_err(&pdev->dev, "gpio_request (pin) failed\n");
		goto free_master;
	}

	if (gpio_is_valid(pdata->ext_pullup_enable_pin)) {
		err = gpio_request_one(pdata->ext_pullup_enable_pin,
				       GPIOF_INIT_LOW, "w1 pullup");
		if (err < 0) {
			dev_err(&pdev->dev, "gpio_request_one "
					"(ext_pullup_enable_pin) failed\n");
			goto free_gpio;
		}
	}

	master->data = pdata;
	master->read_bit = w1_gpio_read_bit;

	if (pdata->is_open_drain) {
		gpio_direction_output(pdata->pin, 1);
		master->write_bit = w1_gpio_write_bit_val;
	} else {
		gpio_direction_input(pdata->pin);
		master->write_bit = w1_gpio_write_bit_dir;
	}

	err = w1_add_master_device(master);
	if (err) {
		dev_err(&pdev->dev, "w1_add_master device failed\n");
		goto free_gpio_ext_pu;
	}

	/* voltage regulator support */
	pdata->regulator_en = 0;
	pdata->w1_gpio_vdd = regulator_get(&pdev->dev, "w1_vdd");
	if (IS_ERR(pdata->w1_gpio_vdd)) {
		pdata->w1_gpio_vdd = NULL;
		dev_err(&pdev->dev,
				"%s: Failed to get w1_vdd regulator\n",
				__func__);
	} else {
		dev_err(&pdev->dev, "w1-vdd regulator is initially %s\n",
			regulator_is_enabled(pdata->w1_gpio_vdd) ?
			"on" : "off");
		err = regulator_enable(pdata->w1_gpio_vdd);
		if (err) {
			pr_err("%s: Error %d enabling w1-vdd regulator\n",
				__func__, err);
			goto free_regulator;
		} else {
			pdata->regulator_en = 1;
		}
	}

	if (pdata->enable_external_pullup)
		pdata->enable_external_pullup(1);

	if (gpio_is_valid(pdata->ext_pullup_enable_pin))
		gpio_set_value(pdata->ext_pullup_enable_pin, 1);

	platform_set_drvdata(pdev, master);

	return 0;

 free_regulator:
	if (pdata->w1_gpio_vdd != NULL)
		regulator_put(pdata->w1_gpio_vdd);
 free_gpio_ext_pu:
	if (gpio_is_valid(pdata->ext_pullup_enable_pin))
		gpio_free(pdata->ext_pullup_enable_pin);
 free_gpio:
	gpio_free(pdata->pin);
 free_master:
	kfree(master);

	return err;
}
示例#21
0
static int uart_omap_probe(struct platform_device *pdev)
{
	printk("omap_i2c_probe started\n");

	struct uart_omap_port *up;
	struct resource *mem,*irq;
	struct omap_uart_port_info *omap_up_info=pdev->dev.platform_data;
	int ret;
	struct rtdm_device *rdev;	
	void __iomem            *mem_1;
	int retval;

	if(pdev->dev.of_node)
		omap_up_info = of_get_uart_port_info(&pdev->dev);

	mem = platform_get_resource(pdev,IORESOURCE_MEM,0);
	if(!mem)
	{
		dev_err(&pdev->dev,"no mem resource\n");
		return -ENODEV;
	}

	printk("platform_get_resource for mem\n");

	irq = platform_get_resource(pdev,IORESOURCE_IRQ,0);
	if(!irq)
	{
		dev_err(&pdev->dev,"no irq resource\n");
		return -ENODEV;
	}
	
	printk("platform_get_resource for irq\n");
	
	if(!devm_request_mem_region(&pdev->dev,mem->start,resource_size(mem),pdev->dev.driver->name))
	{
		dev_err(&pdev->dev,"memory region already claimed\n");
		return -EBUSY;
	}

	printk("mem->start=%x\n",mem->start);
	printk("irq->start=%x\n",irq->start);

	if ( gpio_is_valid(omap_up_info->DTR_gpio) && omap_up_info->DTR_present) 
	{
		ret = gpio_request(omap_up_info->DTR_gpio, "omap-serial");
			printk("gpio_request\n");
		if (ret < 0)
			return ret;

		ret = gpio_direction_output(omap_up_info->DTR_gpio,omap_up_info->DTR_inverted);
			printk("gpio_direction_output\n");
		if (ret < 0)
			return ret;
	}

	printk("gpio_is_valid\n");

	up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL);
	if (!up)
		return -ENOMEM;

	printk("Local struct up=%x\n",up);


	rtdm_printk("clock enabling.......UART4\n");
        mem_1 = ioremap(SOC_PRCM_REGS, SOC_PRCM_SIZE);
        if(!mem)
         {
            printk (KERN_ERR "HI: ERROR: Failed to remap memory for GPIO Bank 2 IRQ pin configuration.\n");
            return 0;
         }

//        retval=ioread32(mem_1 + 0x78);
//        rtdm_printk("value of clock i2c enable retval=%d\n",retval);
        iowrite32(CM_PER_UART4_CLKCTRL , mem_1 + 0x78);
//        retval = ioread32(CM_PER_UART4_CLKCTRL + 0x78);
//        rtdm_printk("value of clock i2c enable retval=%d\n",retval);
        rtdm_printk("clock enable for UART4\n");
	
	
	rdev=kzalloc(sizeof(struct rtdm_device),GFP_KERNEL);
        rdev = &up->rtdm_dev;
        memcpy(rdev, &uart_device, sizeof(struct rtdm_device));
	
        ret=rtdm_dev_register(rdev);
        if(ret<0)
        {
                    printk("RTDM device not registered\n");
        }
	
        rdev->device_data =  devm_kzalloc(&pdev->dev, sizeof(MY_DEV), GFP_KERNEL);
        rdev->device_data = up;
	
	printk("RTDM driver register\n");
	
	
	if (gpio_is_valid(omap_up_info->DTR_gpio) && omap_up_info->DTR_present) 
	{
		up->DTR_gpio = omap_up_info->DTR_gpio;
		up->DTR_inverted = omap_up_info->DTR_inverted;
		printk("DTR gpio valid\n");
	} 
	else
		up->DTR_gpio = -EINVAL;
	
	up->DTR_active = 0;
	up->dev = &pdev->dev;
	up->irq = irq->start;
	
	up->regshift = 2;
	up->fifosize = 64;

	if (pdev->dev.of_node)
	{
		up->line = of_alias_get_id(pdev->dev.of_node, "serial");
		printk("pdev->dev.of_node\n");
	}
	else
	{
		up->line = pdev->id;
		printk("pdev->id\n");
	}
	if (up->line < 0) 
	{
		dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n",up->line);
		ret = -ENODEV;
//		goto err_port_line;
	}	
	
	
	up->pins = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(up->pins)) 
	{
		dev_warn(&pdev->dev, "did not get pins for uart%i error: %li\n",up->line, PTR_ERR(up->pins));
		up->pins = NULL;
	}
	
	printk("devm_pinctrl_get_select_default\n");
	
	sprintf(up->name, "OMAP UART%d", up->line);
	
	
	up->mapbase = mem->start;
	up->membase = devm_ioremap(&pdev->dev,mem->start,resource_size(mem));//what does ioremap do???? read about it
	
	if (!up->membase) 
	{
		dev_err(&pdev->dev, "can't ioremap UART\n");
		ret = -ENOMEM;
//		goto err_ioremap;
	}
	
	up->flags = omap_up_info->flags;
	up->uartclk = omap_up_info->uartclk;
	
	printk("clock freq=%d\n",up->uartclk);
	
	if(!up->uartclk) 
	{	
		up->uartclk = DEFAULT_CLK_SPEED;
		dev_warn(&pdev->dev, "No clock speed specified: using default:""%d\n", DEFAULT_CLK_SPEED);
	}	
		
	up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
	up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;

	platform_set_drvdata(pdev, up);

	omap_serial_fill_features_erratas(up);		

        return 0;

//err_unuse_clocks:
//        omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
//err_free_mem:
//        platform_set_drvdata(pdev, NULL);
//        return r;
}
示例#22
0
static int __devinit serial_omap_probe(struct platform_device *pdev)
{
	struct uart_omap_port	*up;
	struct resource		*mem, *irq;
	struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data;
	int ret;

	if (pdev->dev.of_node)
		omap_up_info = of_get_uart_port_info(&pdev->dev);

	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!mem) {
		dev_err(&pdev->dev, "no mem resource?\n");
		return -ENODEV;
	}

	irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (!irq) {
		dev_err(&pdev->dev, "no irq resource?\n");
		return -ENODEV;
	}

	if (!devm_request_mem_region(&pdev->dev, mem->start, resource_size(mem),
				pdev->dev.driver->name)) {
		dev_err(&pdev->dev, "memory region already claimed\n");
		return -EBUSY;
	}

	if (gpio_is_valid(omap_up_info->DTR_gpio) &&
	    omap_up_info->DTR_present) {
		ret = gpio_request(omap_up_info->DTR_gpio, "omap-serial");
		if (ret < 0)
			return ret;
		ret = gpio_direction_output(omap_up_info->DTR_gpio,
					    omap_up_info->DTR_inverted);
		if (ret < 0)
			return ret;
	}

	up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL);
	if (!up)
		return -ENOMEM;

	if (gpio_is_valid(omap_up_info->DTR_gpio) &&
	    omap_up_info->DTR_present) {
		up->DTR_gpio = omap_up_info->DTR_gpio;
		up->DTR_inverted = omap_up_info->DTR_inverted;
	} else
		up->DTR_gpio = -EINVAL;
	up->DTR_active = 0;

	up->dev = &pdev->dev;
	up->port.dev = &pdev->dev;
	up->port.type = PORT_OMAP;
	up->port.iotype = UPIO_MEM;
	up->port.irq = irq->start;

	up->port.regshift = 2;
	up->port.fifosize = 64;
	up->port.ops = &serial_omap_pops;

	if (pdev->dev.of_node)
		up->port.line = of_alias_get_id(pdev->dev.of_node, "serial");
	else
		up->port.line = pdev->id;

	if (up->port.line < 0) {
		dev_err(&pdev->dev, "failed to get alias/pdev id, errno %d\n",
								up->port.line);
		ret = -ENODEV;
		goto err_port_line;
	}

	up->pins = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(up->pins)) {
		dev_warn(&pdev->dev, "did not get pins for uart%i error: %li\n",
			 up->port.line, PTR_ERR(up->pins));
		up->pins = NULL;
	}

	sprintf(up->name, "OMAP UART%d", up->port.line);
	up->port.mapbase = mem->start;
	up->port.membase = devm_ioremap(&pdev->dev, mem->start,
						resource_size(mem));
	if (!up->port.membase) {
		dev_err(&pdev->dev, "can't ioremap UART\n");
		ret = -ENOMEM;
		goto err_ioremap;
	}

	up->port.flags = omap_up_info->flags;
	up->port.uartclk = omap_up_info->uartclk;
	if (!up->port.uartclk) {
		up->port.uartclk = DEFAULT_CLK_SPEED;
		dev_warn(&pdev->dev, "No clock speed specified: using default:"
						"%d\n", DEFAULT_CLK_SPEED);
	}

	up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
	up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
	pm_qos_add_request(&up->pm_qos_request,
		PM_QOS_CPU_DMA_LATENCY, up->latency);
	serial_omap_uart_wq = create_singlethread_workqueue(up->name);
	INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);

	platform_set_drvdata(pdev, up);
	pm_runtime_enable(&pdev->dev);
	pm_runtime_use_autosuspend(&pdev->dev);
	pm_runtime_set_autosuspend_delay(&pdev->dev,
			omap_up_info->autosuspend_timeout);

	pm_runtime_irq_safe(&pdev->dev);
	pm_runtime_get_sync(&pdev->dev);

	omap_serial_fill_features_erratas(up);

	ui[up->port.line] = up;
	serial_omap_add_console_port(up);

	ret = uart_add_one_port(&serial_omap_reg, &up->port);
	if (ret != 0)
		goto err_add_port;

	pm_runtime_mark_last_busy(up->dev);
	pm_runtime_put_autosuspend(up->dev);
	return 0;

err_add_port:
	pm_runtime_put(&pdev->dev);
	pm_runtime_disable(&pdev->dev);
err_ioremap:
err_port_line:
	dev_err(&pdev->dev, "[UART%d]: failure [%s]: %d\n",
				pdev->id, __func__, ret);
	return ret;
}
示例#23
0
static int spi_imx_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    const struct of_device_id *of_id =
        of_match_device(spi_imx_dt_ids, &pdev->dev);
    struct spi_imx_master *mxc_platform_info =
        dev_get_platdata(&pdev->dev);
    struct spi_master *master;
    struct spi_imx_data *spi_imx;
    struct resource *res;
    struct pinctrl *pinctrl;
    int i, ret, num_cs;

    if (!np && !mxc_platform_info) {
        dev_err(&pdev->dev, "can't get the platform data\n");
        return -EINVAL;
    }

    ret = of_property_read_u32(np, "fsl,spi-num-chipselects", &num_cs);
    if (ret < 0) {
        if (mxc_platform_info)
            num_cs = mxc_platform_info->num_chipselect;
        else
            return ret;
    }

    master = spi_alloc_master(&pdev->dev,
                              sizeof(struct spi_imx_data) + sizeof(int) * num_cs);
    if (!master)
        return -ENOMEM;

    platform_set_drvdata(pdev, master);

    master->bus_num = pdev->id;
    master->num_chipselect = num_cs;

    spi_imx = spi_master_get_devdata(master);
    spi_imx->bitbang.master = spi_master_get(master);

    for (i = 0; i < master->num_chipselect; i++) {
        int cs_gpio = of_get_named_gpio(np, "cs-gpios", i);
        if (!gpio_is_valid(cs_gpio) && mxc_platform_info)
            cs_gpio = mxc_platform_info->chipselect[i];

        spi_imx->chipselect[i] = cs_gpio;
        if (!gpio_is_valid(cs_gpio))
            continue;

        ret = gpio_request(spi_imx->chipselect[i], DRIVER_NAME);
        if (ret) {
            dev_err(&pdev->dev, "can't get cs gpios\n");
            goto out_gpio_free;
        }
    }

    spi_imx->bitbang.chipselect = spi_imx_chipselect;
    spi_imx->bitbang.setup_transfer = spi_imx_setupxfer;
    spi_imx->bitbang.txrx_bufs = spi_imx_transfer;
    spi_imx->bitbang.master->setup = spi_imx_setup;
    spi_imx->bitbang.master->cleanup = spi_imx_cleanup;
    spi_imx->bitbang.master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;

    init_completion(&spi_imx->xfer_done);

    spi_imx->devtype_data = of_id ? of_id->data :
                            (struct spi_imx_devtype_data *) pdev->id_entry->driver_data;

    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    if (!res) {
        dev_err(&pdev->dev, "can't get platform resource\n");
        ret = -ENOMEM;
        goto out_gpio_free;
    }

    if (!request_mem_region(res->start, resource_size(res), pdev->name)) {
        dev_err(&pdev->dev, "request_mem_region failed\n");
        ret = -EBUSY;
        goto out_gpio_free;
    }

    spi_imx->base = ioremap(res->start, resource_size(res));
    if (!spi_imx->base) {
        ret = -EINVAL;
        goto out_release_mem;
    }

    spi_imx->irq = platform_get_irq(pdev, 0);
    if (spi_imx->irq < 0) {
        ret = -EINVAL;
        goto out_iounmap;
    }

    ret = request_irq(spi_imx->irq, spi_imx_isr, 0, DRIVER_NAME, spi_imx);
    if (ret) {
        dev_err(&pdev->dev, "can't get irq%d: %d\n", spi_imx->irq, ret);
        goto out_iounmap;
    }

    pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
    if (IS_ERR(pinctrl)) {
        ret = PTR_ERR(pinctrl);
        goto out_free_irq;
    }

    spi_imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
    if (IS_ERR(spi_imx->clk_ipg)) {
        ret = PTR_ERR(spi_imx->clk_ipg);
        goto out_free_irq;
    }

    spi_imx->clk_per = devm_clk_get(&pdev->dev, "per");
    if (IS_ERR(spi_imx->clk_per)) {
        ret = PTR_ERR(spi_imx->clk_per);
        goto out_free_irq;
    }

    clk_prepare_enable(spi_imx->clk_per);
    clk_prepare_enable(spi_imx->clk_ipg);

    spi_imx->spi_clk = clk_get_rate(spi_imx->clk_per);

    spi_imx->devtype_data->reset(spi_imx);

    spi_imx->devtype_data->intctrl(spi_imx, 0);

    master->dev.of_node = pdev->dev.of_node;
    ret = spi_bitbang_start(&spi_imx->bitbang);
    if (ret) {
        dev_err(&pdev->dev, "bitbang start failed with %d\n", ret);
        goto out_clk_put;
    }

    dev_info(&pdev->dev, "probed\n");

    return ret;

out_clk_put:
    clk_disable_unprepare(spi_imx->clk_per);
    clk_disable_unprepare(spi_imx->clk_ipg);
out_free_irq:
    free_irq(spi_imx->irq, spi_imx);
out_iounmap:
    iounmap(spi_imx->base);
out_release_mem:
    release_mem_region(res->start, resource_size(res));
out_gpio_free:
    while (--i >= 0) {
        if (gpio_is_valid(spi_imx->chipselect[i]))
            gpio_free(spi_imx->chipselect[i]);
    }
    spi_master_put(master);
    kfree(master);
    platform_set_drvdata(pdev, NULL);
    return ret;
}
示例#24
0
static int __devinit qt1070_probe(struct i2c_client *client,
				const struct i2c_device_id *id)
{
	struct qt1070_data *data;
	struct input_dev *input;
	struct pinctrl *pinctrl;
	int i;
	int err;

	pinctrl = devm_pinctrl_get_select_default(&client->dev);
	if (IS_ERR(pinctrl)) {
		dev_err(&client->dev, "Failed to request pinctrl\n");
		return PTR_ERR(pinctrl);
	}

	err = i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE);
	if (!err) {
		dev_err(&client->dev, "%s adapter not supported\n",
			dev_driver_string(&client->adapter->dev));
		return -ENODEV;
	}

	if (!client->irq) {
		dev_err(&client->dev, "please assign the irq to this device\n");
		return -EINVAL;
	}

	/* Identify the qt1070 chip */
	if (!qt1070_identify(client))
		return -ENODEV;

	data = kzalloc(sizeof(struct qt1070_data), GFP_KERNEL);
	input = input_allocate_device();
	if (!data || !input) {
		dev_err(&client->dev, "insufficient memory\n");
		err = -ENOMEM;
		goto err_free_mem;
	}

	data->client = client;
	data->input = input;
	data->irq = client->irq;

	input->name = "AT42QT1070 QTouch Sensor";
	input->dev.parent = &client->dev;
	input->id.bustype = BUS_I2C;

	/* Add the keycode */
	input->keycode = data->keycodes;
	input->keycodesize = sizeof(data->keycodes[0]);
	input->keycodemax = ARRAY_SIZE(qt1070_key2code);

	__set_bit(EV_KEY, input->evbit);

	for (i = 0; i < ARRAY_SIZE(qt1070_key2code); i++) {
		data->keycodes[i] = qt1070_key2code[i];
		__set_bit(qt1070_key2code[i], input->keybit);
	}

	/* Calibrate device */
	qt1070_write(client, CALIBRATE_CMD, 1);
	msleep(QT1070_CAL_TIME);

	/* Soft reset */
	qt1070_write(client, RESET, 1);
	msleep(QT1070_RESET_TIME);

	err = request_threaded_irq(client->irq, NULL, qt1070_interrupt,
				   IRQF_TRIGGER_NONE | IRQF_ONESHOT,
				   client->dev.driver->name, data);
	if (err) {
		dev_err(&client->dev, "fail to request irq\n");
		goto err_free_mem;
	}

	err = device_init_wakeup(&client->dev, true);
	if (err)
		dev_err(&client->dev, "fail to init device as wakeup source\n");
	err = enable_irq_wake(client->irq);
	if (err)
		dev_err(&client->dev, "fail to enable irq wake\n");

	/* Register the input device */
	err = input_register_device(data->input);
	if (err) {
		dev_err(&client->dev, "Failed to register input device\n");
		goto err_free_irq;
	}

	i2c_set_clientdata(client, data);

	/* Read to clear the chang line */
	qt1070_read(client, DET_STATUS);

	return 0;

err_free_irq:
	free_irq(client->irq, data);
err_free_mem:
	input_free_device(input);
	kfree(data);
	return err;
}
示例#25
0
static int __init w1_gpio_probe(struct platform_device *pdev)
{
	struct w1_bus_master *master;
	struct w1_gpio_platform_data *pdata;
	struct pinctrl *pinctrl;
	int err;

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev, "unable to select pin group\n");

	if (of_have_populated_dt()) {
		err = w1_gpio_probe_dt(pdev);
		if (err < 0) {
			dev_err(&pdev->dev, "Failed to parse DT\n");
			return err;
		}
	}

	pdata = pdev->dev.platform_data;

	if (!pdata) {
		dev_err(&pdev->dev, "No configuration data\n");
		return -ENXIO;
	}

	master = kzalloc(sizeof(struct w1_bus_master), GFP_KERNEL);
	if (!master) {
		dev_err(&pdev->dev, "Out of memory\n");
		return -ENOMEM;
	}

	err = gpio_request(pdata->pin, "w1");
	if (err) {
		dev_err(&pdev->dev, "gpio_request (pin) failed\n");
		goto free_master;
	}

	if (gpio_is_valid(pdata->ext_pullup_enable_pin)) {
		err = gpio_request_one(pdata->ext_pullup_enable_pin,
				       GPIOF_INIT_LOW, "w1 pullup");
		if (err < 0) {
			dev_err(&pdev->dev, "gpio_request_one "
					"(ext_pullup_enable_pin) failed\n");
			goto free_gpio;
		}
	}

	master->data = pdata;
	master->read_bit = w1_gpio_read_bit;

	if (pdata->is_open_drain) {
		gpio_direction_output(pdata->pin, 1);
		master->write_bit = w1_gpio_write_bit_val;
	} else {
		gpio_direction_input(pdata->pin);
		master->write_bit = w1_gpio_write_bit_dir;
	}

	err = w1_add_master_device(master);
	if (err) {
		dev_err(&pdev->dev, "w1_add_master device failed\n");
		goto free_gpio_ext_pu;
	}

	if (pdata->enable_external_pullup)
		pdata->enable_external_pullup(1);

	if (gpio_is_valid(pdata->ext_pullup_enable_pin))
		gpio_set_value(pdata->ext_pullup_enable_pin, 1);

	platform_set_drvdata(pdev, master);

	return 0;

 free_gpio_ext_pu:
	if (gpio_is_valid(pdata->ext_pullup_enable_pin))
		gpio_free(pdata->ext_pullup_enable_pin);
 free_gpio:
	gpio_free(pdata->pin);
 free_master:
	kfree(master);

	return err;
}
示例#26
0
//static struct pinctrl *daudio_pinctrl;
static int __init sunxi_daudio0_dev_probe(struct platform_device *pdev)
{
	int ret = 0;
	int reg_val = 0;
	script_item_u val;
	script_item_value_type_e  type;


	sunxi_daudio.regs = ioremap(SUNXI_DAUDIOBASE, 0x100);
	if (sunxi_daudio.regs == NULL) {
		return -ENXIO;
	}
	/*for A80 evb pin config*/
	daudio_pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR_OR_NULL(daudio_pinctrl)) {
		dev_warn(&pdev->dev,
			"pins are not configured from the driver\n");
	}
	pin_count = script_get_pio_list (TDM_NAME, &pin_daudio0_list);
	if (pin_count == 0) {
		/* "daudio0" have no pin configuration */
		pr_err("daudio0 have no pin configuration\n");
	}

#ifdef CONFIG_ARCH_SUN9IW1
	/*daudio pll2clk*/
	daudio_pll3clk = clk_get(NULL, "pll3");
	if ((!daudio_pll3clk)||(IS_ERR(daudio_pll3clk))) {
		pr_err("try to get daudio_pll2clk failed\n");
	}
	if (clk_prepare_enable(daudio_pll3clk)) {
		pr_err("enable daudio_pll2clk failed; \n");
	}
	/*daudio module clk*/
	daudio_moduleclk = clk_get(NULL, "cpuri2s1");
	if ((!daudio_moduleclk)||(IS_ERR(daudio_moduleclk))) {
		pr_err("try to get daudio_moduleclk failed\n");
	}
	if (clk_set_parent(daudio_moduleclk, daudio_pll3clk)) {
		pr_err("try to set parent of daudio_moduleclk to daudio_pll2ck failed! line = %d\n",__LINE__);
	}
	if (clk_set_rate(daudio_pll3clk, 24576000)) {
		pr_err("set daudio_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}

	if (clk_prepare_enable(daudio_moduleclk)) {
		pr_err("open daudio_moduleclk failed! line = %d\n", __LINE__);
	}
#else
#ifdef CONFIG_ARCH_SUN8IW7
	daudio_pll = clk_get(NULL, "pll_audio");
	if ((!daudio_pll)||(IS_ERR(daudio_pll))) {
		pr_err("try to get daudio_pll failed\n");
	}
	if (clk_prepare_enable(daudio_pll)) {
		pr_err("enable daudio_pll2clk failed; \n");
	}
	/*daudio module clk*/
	daudio_moduleclk = clk_get(NULL, "i2s0");
	if ((!daudio_moduleclk)||(IS_ERR(daudio_moduleclk))) {
		pr_err("try to get daudio_moduleclk failed\n");
	}
	if (clk_set_parent(daudio_moduleclk, daudio_pll)) {
		pr_err("try to set parent of daudio_moduleclk to daudio_pll2ck failed! line = %d\n",__LINE__);
	}

	if (clk_set_rate(daudio_moduleclk, 24576000)) {
		pr_err("set daudio_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}

	if (clk_prepare_enable(daudio_moduleclk)) {
		pr_err("open daudio_moduleclk failed! line = %d\n", __LINE__);
	}
#else
	daudio_pllx8 = clk_get(NULL, "pll_audiox8");
	if ((!daudio_pllx8)||(IS_ERR(daudio_pllx8))) {
		pr_err("try to get daudio_pllx8 failed\n");
	}
	if (clk_prepare_enable(daudio_pllx8)) {
		pr_err("enable daudio_pll2clk failed; \n");
	}

	/*daudio pll2clk*/
	daudio_pll2clk = clk_get(NULL, "pll2");
	if ((!daudio_pll2clk)||(IS_ERR(daudio_pll2clk))) {
		pr_err("try to get daudio_pll2clk failed\n");
	}
	if (clk_prepare_enable(daudio_pll2clk)) {
		pr_err("enable daudio_pll2clk failed; \n");
	}
#ifdef CONFIG_ARCH_SUN8IW8
	/*daudio module clk*/
	daudio_moduleclk = clk_get(NULL, "i2s0");
#else
	//pr_debug("%s,line:%d,0xbc:%x\n",__func__,__LINE__,sunxi_smc_readl(0xf1c200bc));
	daudio_moduleclk = clk_get(NULL, "tdm");
#endif
	if ((!daudio_moduleclk)||(IS_ERR(daudio_moduleclk))) {
		pr_err("try to get daudio_moduleclk failed\n");
	}

	if (clk_set_parent(daudio_moduleclk, daudio_pll2clk)) {
		pr_err("try to set parent of daudio_moduleclk to daudio_pll2ck failed! line = %d\n",__LINE__);
	}
#if defined(CONFIG_ARCH_SUN8IW6) || defined(CONFIG_ARCH_SUN8IW8)
//#ifdef CONFIG_ARCH_SUN8IW6
	if (clk_set_rate(daudio_moduleclk, 24576000)) {
		pr_err("set daudio_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#else
	if (clk_set_rate(daudio_moduleclk, 24576000/8)) {
		pr_err("set daudio_moduleclk clock freq to 24576000 failed! line = %d\n", __LINE__);
	}
#endif
	if (clk_prepare_enable(daudio_moduleclk)) {
		pr_err("open daudio_moduleclk failed! line = %d\n", __LINE__);
	}
	//pr_debug("%s,line:%d,bc:%x\n",__func__,__LINE__,sunxi_smc_readl(0xf1c200bc));
#endif
#endif
	reg_val = sunxi_smc_readl(sunxi_daudio.regs + SUNXI_DAUDIOCTL);
	reg_val |= SUNXI_DAUDIOCTL_GEN;
	sunxi_smc_writel(reg_val, sunxi_daudio.regs + SUNXI_DAUDIOCTL);

	type = script_get_item(TDM_NAME, "mclk_fs", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] mclk_fs type err!\n");
    }
	mclk_fs = val.val;

	type = script_get_item(TDM_NAME, "sample_resolution", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] sample_resolution type err!\n");
    }
	sample_resolution = val.val;

	type = script_get_item(TDM_NAME, "slot_width_select", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] slot_width_select type err!\n");
    }
	slot_width_select = val.val;

	type = script_get_item(TDM_NAME, "pcm_lrck_period", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] pcm_lrck_period type err!\n");
    }
	pcm_lrck_period = val.val;

	type = script_get_item(TDM_NAME, "pcm_lrckr_period", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] pcm_lrckr_period type err!\n");
    }
	pcm_lrckr_period = val.val;

	type = script_get_item(TDM_NAME, "msb_lsb_first", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] msb_lsb_first type err!\n");
    }
	msb_lsb_first = val.val;
	type = script_get_item(TDM_NAME, "sign_extend", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] sign_extend type err!\n");
    }
	sign_extend = val.val;
	type = script_get_item(TDM_NAME, "slot_index", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] slot_index type err!\n");
    }
	slot_index = val.val;
	type = script_get_item(TDM_NAME, "frame_width", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] frame_width type err!\n");
    }
	frame_width = val.val;
	type = script_get_item(TDM_NAME, "tx_data_mode", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] tx_data_mode type err!\n");
    }
	tx_data_mode = val.val;

	type = script_get_item(TDM_NAME, "rx_data_mode", &val);
	if (SCIRPT_ITEM_VALUE_TYPE_INT != type) {
        pr_err("[DAUDIO] rx_data_mode type err!\n");
    }
	rx_data_mode = val.val;

	ret = snd_soc_register_dais(&pdev->dev,sunxi_daudio_dai, ARRAY_SIZE(sunxi_daudio_dai));
	if (ret) {
		dev_err(&pdev->dev, "Failed to register DAI\n");
	}

	return 0;
}
示例#27
0
static int sunxi_devices_pin_request(struct platform_device *pdev)
{
	int              mainkey_count;
	int              mainkey_idx;
	struct pinctrl   *pinctrl;
	
	/* get main key count */
	mainkey_count = script_get_main_key_count();
	pr_warn("mainkey total count : %d\n", mainkey_count);
	for (mainkey_idx = 0; mainkey_idx < mainkey_count; mainkey_idx++) {
		char           *mainkey_name;
		script_item_u  *pin_list;
		int            pin_count;
		char           *device_name;
		script_item_value_type_e type;
		script_item_u   item;
		script_item_u   used;
		
		/* get main key name by index */
		mainkey_name = script_get_main_key_name(mainkey_idx);
		if (!mainkey_name) {
			/* get mainkey name failed */
			pr_warn("get mainkey [%s] name failed\n", mainkey_name);
			continue;
		}
		/* get main-key(device) pin configuration */
		pin_count = script_get_pio_list(mainkey_name, &pin_list);
		pr_warn("mainkey name : %s, pin count : %d\n", mainkey_name, pin_count);
		if (pin_count == 0) {
			/* mainley have no pin configuration */
			continue;
		}
		/* try to get device name */
		type = script_get_item(mainkey_name, "used", &used);
		if ((type != SCIRPT_ITEM_VALUE_TYPE_INT) || (used.val == 0)) {
			/* this device not used */
			continue;
		}
		/* try to get device name */
		type = script_get_item(mainkey_name, "device_name", &item);
		if ((type == SCIRPT_ITEM_VALUE_TYPE_STR) && (item.str)) {
			/* the mainkey have valid device-name,
			 * use the config device_name
			 */
			device_name = item.str;
		} else {
			/* have no device_name config, 
			 * default use mainkey name as device name
			 */
			device_name = mainkey_name;
		}
		/* set device name */
		dev_set_name(&(pdev->dev), device_name);
		
		/* request device pinctrl, set as default state */
		pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
		if (IS_ERR_OR_NULL(pinctrl)) {
			pr_warn("request pinctrl handle for device [%s] failed\n", 
			        dev_name(&pdev->dev));
			return -EINVAL;
		}
		pr_warn("device [%s] pinctrl request succeeded\n", device_name);
		devices_pinctrl[mainkey_idx] = pinctrl;
	}
	return 0;
}
static int c_can_plat_probe(struct platform_device *pdev)
{
	int ret;
	void __iomem *addr;
	struct rtcan_device *dev;
	struct c_can_priv *priv;
	const struct of_device_id *match;
	const struct platform_device_id *id;
	struct pinctrl *pinctrl;
	struct resource *mem, *res;
	int irq;
	struct clk *clk;

	if (pdev->dev.of_node) {
		match = of_match_device(c_can_of_table, &pdev->dev);
		if (!match) {
			dev_err(&pdev->dev, "Failed to find matching dt id\n");
			ret = -EINVAL;
			goto exit;
		}
		id = match->data;
	} else {
		id = platform_get_device_id(pdev);
	}

	pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	if (IS_ERR(pinctrl))
		dev_warn(&pdev->dev,
			"failed to configure pins from driver\n");

	/* get the appropriate clk */
	clk = clk_get(&pdev->dev, NULL);
	if (IS_ERR(clk)) {
		dev_err(&pdev->dev, "no clock defined\n");
		ret = -ENODEV;
		goto exit;
	}
	
	dev_info(&pdev->dev, "setting up step 1: platform_get_resource\n");
	
	/* get the platform data */
	mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	irq = platform_get_irq(pdev, 0);
	if (!mem || irq <= 0) {
		ret = -ENODEV;
		goto exit_free_clk;
	}
	
	dev_info(&pdev->dev, "setting up step 2: request mem region. Start %x, size %d\n", mem->start, resource_size(mem));
	
	if (!request_mem_region(mem->start, resource_size(mem),
				"c_can")) {
		dev_err(&pdev->dev, "resource unavailable\n");
		ret = -ENODEV;
		goto exit_free_clk;
	}
	
	dev_info(&pdev->dev, "setting up step 3: ioremap. Start %x, size %d\n", mem->start, resource_size(mem));

	addr = ioremap(mem->start, resource_size(mem));
	if (!addr) {
		dev_err(&pdev->dev, "failed to map can port\n");
		ret = -ENOMEM;
		goto exit_release_mem;
	}
	
	dev_info(&pdev->dev, "alloc dev...\n");
	
	/* allocate the c_can device */
	dev = alloc_c_can_dev();
	if (!dev) {
		ret = -ENOMEM;
		goto exit_iounmap;
	}

	priv = rtcan_priv(dev);
	switch (id->driver_data) {
	case BOSCH_C_CAN:
		priv->regs = reg_map_c_can;
		switch (mem->flags & IORESOURCE_MEM_TYPE_MASK) {
		case IORESOURCE_MEM_32BIT:
			priv->read_reg = c_can_plat_read_reg_aligned_to_32bit;
			priv->write_reg = c_can_plat_write_reg_aligned_to_32bit;
			break;
		case IORESOURCE_MEM_16BIT:
		default:
			priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
			priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
			break;
		}
		break;
	case BOSCH_D_CAN:
		priv->regs = reg_map_d_can;
		priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
		priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;

		if (pdev->dev.of_node)
			priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can");
		else
			priv->instance = pdev->id;
		
		dev_info(&pdev->dev, "platform_get_resource...\n");
		
		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
		
		dev_info(&pdev->dev, "devm request and ioremap..\n");
		
		priv->raminit_ctrlreg =	devm_request_and_ioremap(&pdev->dev, res);
		
		if (!priv->raminit_ctrlreg || priv->instance < 0)
			dev_info(&pdev->dev, "control memory is not used for raminit\n");
		else
			priv->raminit = c_can_hw_raminit;
		break;
	default:
		ret = -EINVAL;
		goto exit_free_device;
	}

	priv->irq = irq;
	priv->base = addr;
	priv->device = &pdev->dev;
	priv->priv = clk;
	priv->type = id->driver_data;

	platform_set_drvdata(pdev, dev);
	
	dev->ctrl_name = c_can_ctrl_name;
	dev->board_name = my_board_name;
	dev->base_addr = (unsigned long)addr;
	dev->can_sys_clock = clk_get_rate(clk);
	dev->hard_start_xmit = c_can_start_xmit;
	dev->do_set_mode = c_can_set_mode;
	dev->do_set_bit_time = c_can_save_bit_time;
	dev->bittiming_const = &c_can_bittiming_const;
	dev->state = CAN_STATE_STOPPED;
	
	/* Give device an interface name */
	strncpy(dev->name, DEV_NAME, IFNAMSIZ);

	ret = register_c_candev(dev);
	if (ret) {
		dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
			"c_can", ret);
		goto exit_free_device;
	}

	dev_info(&pdev->dev, "%s device registered (regs=%p, irq=%d)\n",
		 "c_can", priv->base, priv->irq);
	return 0;

exit_free_device:
	platform_set_drvdata(pdev, NULL);
exit_iounmap:
	iounmap(addr);
exit_release_mem:
	release_mem_region(mem->start, resource_size(mem));
exit_free_clk:
	clk_put(clk);
exit:
	dev_err(&pdev->dev, "probe failed\n");

	return ret;
}