From: Huang, Tao Date: Wed, 11 Nov 2015 07:13:59 +0000 (+0800) Subject: rk: rename spi-rockchip.c to spi-rk.c X-Git-Tag: firefly_0821_release~3612 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5923db9f65b2ae5dc6fb747a7f5d48370b4cd459;p=firefly-linux-kernel-4.4.55.git rk: rename spi-rockchip.c to spi-rk.c Signed-off-by: Huang, Tao --- diff --git a/drivers/spi/spi-rk.c b/drivers/spi/spi-rk.c new file mode 100644 index 000000000000..257319be2dbe --- /dev/null +++ b/drivers/spi/spi-rk.c @@ -0,0 +1,349 @@ +/* + * rockchip spi interface driver for DW SPI Core + * + * Copyright (c) 2014, ROCKCHIP Corporation. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "spi-rockchip-core.h" + + +#define DRIVER_NAME "rockchip_spi_driver_data" +#define SPI_MAX_FREQUENCY 24000000 + +struct rockchip_spi_driver_data { + struct platform_device *pdev; + struct dw_spi dws; + struct rockchip_spi_info *info; + struct clk *clk_spi; + struct clk *pclk_spi; +}; + +#ifdef CONFIG_OF +static struct rockchip_spi_info *rockchip_spi_parse_dt(struct device *dev) +{ + struct rockchip_spi_info *info; + u32 temp; + + info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); + if (!info) { + dev_err(dev, "memory allocation for spi_info failed\n"); + return ERR_PTR(-ENOMEM); + } + + if (of_property_read_u32(dev->of_node, "rockchip,spi-src-clk", &temp)) { + dev_warn(dev, "spi bus clock parent not specified, using clock at index 0 as parent\n"); + info->src_clk_nr = 0; + } else { + info->src_clk_nr = temp; + } +#if 0 + if (of_property_read_u32(dev->of_node, "bus-num", &temp)) { + dev_warn(dev, "number of bus not specified, assuming bus 0\n"); + info->bus_num= 0; + } else { + info->bus_num = temp; + } +#endif + if (of_property_read_u32(dev->of_node, "num-cs", &temp)) { + dev_warn(dev, "number of chip select lines not specified, assuming 1 chip select line\n"); + info->num_cs = 1; + } else { + info->num_cs = temp; + } + + if (of_property_read_u32(dev->of_node, "max-freq", &temp)) { + dev_warn(dev, "fail to get max-freq,default set %dHZ\n",SPI_MAX_FREQUENCY); + info->spi_freq = SPI_MAX_FREQUENCY; + } else { + info->spi_freq = temp; + } + + //printk("%s:line=%d,src_clk_nr=%d,bus_num=%d,num_cs=%d\n",__func__, __LINE__,info->src_clk_nr,info->bus_num,info->num_cs); + + return info; +} +#else +static struct rockchip_spi_info *rockchip_spi_parse_dt(struct device *dev) +{ + return dev->platform_data; +} +#endif + + +static int rockchip_spi_probe(struct platform_device *pdev) +{ + struct resource *mem_res; + struct rockchip_spi_driver_data *sdd; + struct rockchip_spi_info *info = pdev->dev.platform_data; + struct dw_spi *dws; + int ret, irq; + char clk_name[16]; + + if (!info && pdev->dev.of_node) { + info = rockchip_spi_parse_dt(&pdev->dev); + if (IS_ERR(info)) + return PTR_ERR(info); + } + + if (!info) { + dev_err(&pdev->dev, "platform_data missing!\n"); + return -ENODEV; + } + + sdd = kzalloc(sizeof(struct rockchip_spi_driver_data), GFP_KERNEL); + if (!sdd) { + ret = -ENOMEM; + goto err_kfree; + } + + + sdd->pdev = pdev; + sdd->info = info; + dws = &sdd->dws; + + atomic_set(&dws->debug_flag, 0);//debug flag + + /* Get basic io resource and map it */ + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_warn(&pdev->dev, "Failed to get IRQ: %d\n", irq); + return irq; + } + + mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (mem_res == NULL) { + dev_err(&pdev->dev, "Unable to get SPI MEM resource\n"); + ret = -ENXIO; + goto err_unmap; + } + + dws->regs = ioremap(mem_res->start, (mem_res->end - mem_res->start) + 1); + if (!dws->regs){ + ret = -EBUSY; + goto err_unmap; + } + + dws->paddr = mem_res->start; + dws->iolen = (mem_res->end - mem_res->start) + 1; + + printk(KERN_INFO "dws->regs: %p\n", dws->regs); + + //get bus num + if (pdev->dev.of_node) { + ret = of_alias_get_id(pdev->dev.of_node, "spi"); + if (ret < 0) { + dev_err(&pdev->dev, "failed to get alias id, errno %d\n", + ret); + goto err_release_mem; + } + info->bus_num = ret; + } else { + info->bus_num = pdev->id; + } + + /* Setup clocks */ + sdd->clk_spi = devm_clk_get(&pdev->dev, "spi"); + if (IS_ERR(sdd->clk_spi)) { + dev_err(&pdev->dev, "Unable to acquire clock 'spi'\n"); + ret = PTR_ERR(sdd->clk_spi); + goto err_clk; + } + + if (clk_prepare_enable(sdd->clk_spi)) { + dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n"); + ret = -EBUSY; + goto err_clk; + } + + sprintf(clk_name, "pclk_spi%d", info->src_clk_nr); + sdd->pclk_spi = devm_clk_get(&pdev->dev, clk_name); + if (IS_ERR(sdd->pclk_spi)) { + dev_err(&pdev->dev, + "Unable to acquire clock '%s'\n", clk_name); + ret = PTR_ERR(sdd->pclk_spi); + goto err_pclk; + } + + if (clk_prepare_enable(sdd->pclk_spi)) { + dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); + ret = -EBUSY; + goto err_pclk; + } + + clk_set_rate(sdd->clk_spi, info->spi_freq); + + dws->max_freq = clk_get_rate(sdd->clk_spi); + dws->parent_dev = &pdev->dev; + dws->bus_num = info->bus_num; + dws->num_cs = info->num_cs; + dws->irq = irq; + dws->clk_spi = sdd->clk_spi; + dws->pclk_spi = sdd->pclk_spi; + + /* + * handling for rockchip paltforms, like dma setup, + * clock rate, FIFO depth. + */ + +#ifdef CONFIG_SPI_ROCKCHIP_DMA + ret = dw_spi_dma_init(dws); + if (ret) + printk("%s:fail to init dma\n",__func__); +#endif + + ret = dw_spi_add_host(dws); + if (ret) + goto err_release_mem; + + platform_set_drvdata(pdev, sdd); + + printk("%s:num_cs=%d,bus_num=%d,irq=%d,freq=%d ok\n",__func__, info->num_cs, info->bus_num, irq, dws->max_freq); + + return 0; +err_release_mem: + release_mem_region(mem_res->start, (mem_res->end - mem_res->start) + 1); +err_pclk: + clk_disable_unprepare(sdd->pclk_spi); +err_clk: + clk_disable_unprepare(sdd->clk_spi); +err_unmap: + iounmap(dws->regs); +err_kfree: + kfree(sdd); + return ret; +} + +static int rockchip_spi_remove(struct platform_device *pdev) +{ + struct rockchip_spi_driver_data *sdd = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + dw_spi_remove_host(&sdd->dws); + iounmap(sdd->dws.regs); + kfree(sdd); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int rockchip_spi_suspend(struct device *dev) +{ + struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); + int ret = 0; + + ret = dw_spi_suspend_host(&sdd->dws); + + return ret; +} + +static int rockchip_spi_resume(struct device *dev) +{ + struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); + int ret = 0; + + ret = dw_spi_resume_host(&sdd->dws); + + return ret; +} +#endif /* CONFIG_PM_SLEEP */ + +#ifdef CONFIG_PM_RUNTIME +static int rockchip_spi_runtime_suspend(struct device *dev) +{ + struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); + struct dw_spi *dws = &sdd->dws; + + clk_disable_unprepare(sdd->clk_spi); + clk_disable_unprepare(sdd->pclk_spi); + + + DBG_SPI("%s\n",__func__); + + return 0; +} + +static int rockchip_spi_runtime_resume(struct device *dev) +{ + struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); + struct dw_spi *dws = &sdd->dws; + + clk_prepare_enable(sdd->pclk_spi); + clk_prepare_enable(sdd->clk_spi); + + DBG_SPI("%s\n",__func__); + return 0; +} +#endif /* CONFIG_PM_RUNTIME */ + +static const struct dev_pm_ops rockchip_spi_pm = { + SET_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume) + SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend, + rockchip_spi_runtime_resume, NULL) +}; + +#ifdef CONFIG_OF +static const struct of_device_id rockchip_spi_dt_match[] = { + { .compatible = "rockchip,rockchip-spi", + }, + { }, +}; +MODULE_DEVICE_TABLE(of, rockchip_spi_dt_match); +#endif /* CONFIG_OF */ + +static struct platform_driver rockchip_spi_driver = { + .driver = { + .name = "rockchip-spi", + .owner = THIS_MODULE, + .pm = &rockchip_spi_pm, + .of_match_table = of_match_ptr(rockchip_spi_dt_match), + }, + .remove = rockchip_spi_remove, +}; +MODULE_ALIAS("platform:rockchip-spi"); + +static int __init rockchip_spi_init(void) +{ + return platform_driver_probe(&rockchip_spi_driver, rockchip_spi_probe); +} +module_init(rockchip_spi_init); + +static void __exit rockchip_spi_exit(void) +{ + platform_driver_unregister(&rockchip_spi_driver); +} +module_exit(rockchip_spi_exit); + +MODULE_AUTHOR("Luo Wei "); +MODULE_DESCRIPTION("ROCKCHIP SPI Controller Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c deleted file mode 100644 index 257319be2dbe..000000000000 --- a/drivers/spi/spi-rockchip.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - * rockchip spi interface driver for DW SPI Core - * - * Copyright (c) 2014, ROCKCHIP Corporation. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "spi-rockchip-core.h" - - -#define DRIVER_NAME "rockchip_spi_driver_data" -#define SPI_MAX_FREQUENCY 24000000 - -struct rockchip_spi_driver_data { - struct platform_device *pdev; - struct dw_spi dws; - struct rockchip_spi_info *info; - struct clk *clk_spi; - struct clk *pclk_spi; -}; - -#ifdef CONFIG_OF -static struct rockchip_spi_info *rockchip_spi_parse_dt(struct device *dev) -{ - struct rockchip_spi_info *info; - u32 temp; - - info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL); - if (!info) { - dev_err(dev, "memory allocation for spi_info failed\n"); - return ERR_PTR(-ENOMEM); - } - - if (of_property_read_u32(dev->of_node, "rockchip,spi-src-clk", &temp)) { - dev_warn(dev, "spi bus clock parent not specified, using clock at index 0 as parent\n"); - info->src_clk_nr = 0; - } else { - info->src_clk_nr = temp; - } -#if 0 - if (of_property_read_u32(dev->of_node, "bus-num", &temp)) { - dev_warn(dev, "number of bus not specified, assuming bus 0\n"); - info->bus_num= 0; - } else { - info->bus_num = temp; - } -#endif - if (of_property_read_u32(dev->of_node, "num-cs", &temp)) { - dev_warn(dev, "number of chip select lines not specified, assuming 1 chip select line\n"); - info->num_cs = 1; - } else { - info->num_cs = temp; - } - - if (of_property_read_u32(dev->of_node, "max-freq", &temp)) { - dev_warn(dev, "fail to get max-freq,default set %dHZ\n",SPI_MAX_FREQUENCY); - info->spi_freq = SPI_MAX_FREQUENCY; - } else { - info->spi_freq = temp; - } - - //printk("%s:line=%d,src_clk_nr=%d,bus_num=%d,num_cs=%d\n",__func__, __LINE__,info->src_clk_nr,info->bus_num,info->num_cs); - - return info; -} -#else -static struct rockchip_spi_info *rockchip_spi_parse_dt(struct device *dev) -{ - return dev->platform_data; -} -#endif - - -static int rockchip_spi_probe(struct platform_device *pdev) -{ - struct resource *mem_res; - struct rockchip_spi_driver_data *sdd; - struct rockchip_spi_info *info = pdev->dev.platform_data; - struct dw_spi *dws; - int ret, irq; - char clk_name[16]; - - if (!info && pdev->dev.of_node) { - info = rockchip_spi_parse_dt(&pdev->dev); - if (IS_ERR(info)) - return PTR_ERR(info); - } - - if (!info) { - dev_err(&pdev->dev, "platform_data missing!\n"); - return -ENODEV; - } - - sdd = kzalloc(sizeof(struct rockchip_spi_driver_data), GFP_KERNEL); - if (!sdd) { - ret = -ENOMEM; - goto err_kfree; - } - - - sdd->pdev = pdev; - sdd->info = info; - dws = &sdd->dws; - - atomic_set(&dws->debug_flag, 0);//debug flag - - /* Get basic io resource and map it */ - irq = platform_get_irq(pdev, 0); - if (irq < 0) { - dev_warn(&pdev->dev, "Failed to get IRQ: %d\n", irq); - return irq; - } - - mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (mem_res == NULL) { - dev_err(&pdev->dev, "Unable to get SPI MEM resource\n"); - ret = -ENXIO; - goto err_unmap; - } - - dws->regs = ioremap(mem_res->start, (mem_res->end - mem_res->start) + 1); - if (!dws->regs){ - ret = -EBUSY; - goto err_unmap; - } - - dws->paddr = mem_res->start; - dws->iolen = (mem_res->end - mem_res->start) + 1; - - printk(KERN_INFO "dws->regs: %p\n", dws->regs); - - //get bus num - if (pdev->dev.of_node) { - ret = of_alias_get_id(pdev->dev.of_node, "spi"); - if (ret < 0) { - dev_err(&pdev->dev, "failed to get alias id, errno %d\n", - ret); - goto err_release_mem; - } - info->bus_num = ret; - } else { - info->bus_num = pdev->id; - } - - /* Setup clocks */ - sdd->clk_spi = devm_clk_get(&pdev->dev, "spi"); - if (IS_ERR(sdd->clk_spi)) { - dev_err(&pdev->dev, "Unable to acquire clock 'spi'\n"); - ret = PTR_ERR(sdd->clk_spi); - goto err_clk; - } - - if (clk_prepare_enable(sdd->clk_spi)) { - dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n"); - ret = -EBUSY; - goto err_clk; - } - - sprintf(clk_name, "pclk_spi%d", info->src_clk_nr); - sdd->pclk_spi = devm_clk_get(&pdev->dev, clk_name); - if (IS_ERR(sdd->pclk_spi)) { - dev_err(&pdev->dev, - "Unable to acquire clock '%s'\n", clk_name); - ret = PTR_ERR(sdd->pclk_spi); - goto err_pclk; - } - - if (clk_prepare_enable(sdd->pclk_spi)) { - dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); - ret = -EBUSY; - goto err_pclk; - } - - clk_set_rate(sdd->clk_spi, info->spi_freq); - - dws->max_freq = clk_get_rate(sdd->clk_spi); - dws->parent_dev = &pdev->dev; - dws->bus_num = info->bus_num; - dws->num_cs = info->num_cs; - dws->irq = irq; - dws->clk_spi = sdd->clk_spi; - dws->pclk_spi = sdd->pclk_spi; - - /* - * handling for rockchip paltforms, like dma setup, - * clock rate, FIFO depth. - */ - -#ifdef CONFIG_SPI_ROCKCHIP_DMA - ret = dw_spi_dma_init(dws); - if (ret) - printk("%s:fail to init dma\n",__func__); -#endif - - ret = dw_spi_add_host(dws); - if (ret) - goto err_release_mem; - - platform_set_drvdata(pdev, sdd); - - printk("%s:num_cs=%d,bus_num=%d,irq=%d,freq=%d ok\n",__func__, info->num_cs, info->bus_num, irq, dws->max_freq); - - return 0; -err_release_mem: - release_mem_region(mem_res->start, (mem_res->end - mem_res->start) + 1); -err_pclk: - clk_disable_unprepare(sdd->pclk_spi); -err_clk: - clk_disable_unprepare(sdd->clk_spi); -err_unmap: - iounmap(dws->regs); -err_kfree: - kfree(sdd); - return ret; -} - -static int rockchip_spi_remove(struct platform_device *pdev) -{ - struct rockchip_spi_driver_data *sdd = platform_get_drvdata(pdev); - - platform_set_drvdata(pdev, NULL); - dw_spi_remove_host(&sdd->dws); - iounmap(sdd->dws.regs); - kfree(sdd); - - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int rockchip_spi_suspend(struct device *dev) -{ - struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); - int ret = 0; - - ret = dw_spi_suspend_host(&sdd->dws); - - return ret; -} - -static int rockchip_spi_resume(struct device *dev) -{ - struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); - int ret = 0; - - ret = dw_spi_resume_host(&sdd->dws); - - return ret; -} -#endif /* CONFIG_PM_SLEEP */ - -#ifdef CONFIG_PM_RUNTIME -static int rockchip_spi_runtime_suspend(struct device *dev) -{ - struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); - struct dw_spi *dws = &sdd->dws; - - clk_disable_unprepare(sdd->clk_spi); - clk_disable_unprepare(sdd->pclk_spi); - - - DBG_SPI("%s\n",__func__); - - return 0; -} - -static int rockchip_spi_runtime_resume(struct device *dev) -{ - struct rockchip_spi_driver_data *sdd = dev_get_drvdata(dev); - struct dw_spi *dws = &sdd->dws; - - clk_prepare_enable(sdd->pclk_spi); - clk_prepare_enable(sdd->clk_spi); - - DBG_SPI("%s\n",__func__); - return 0; -} -#endif /* CONFIG_PM_RUNTIME */ - -static const struct dev_pm_ops rockchip_spi_pm = { - SET_SYSTEM_SLEEP_PM_OPS(rockchip_spi_suspend, rockchip_spi_resume) - SET_RUNTIME_PM_OPS(rockchip_spi_runtime_suspend, - rockchip_spi_runtime_resume, NULL) -}; - -#ifdef CONFIG_OF -static const struct of_device_id rockchip_spi_dt_match[] = { - { .compatible = "rockchip,rockchip-spi", - }, - { }, -}; -MODULE_DEVICE_TABLE(of, rockchip_spi_dt_match); -#endif /* CONFIG_OF */ - -static struct platform_driver rockchip_spi_driver = { - .driver = { - .name = "rockchip-spi", - .owner = THIS_MODULE, - .pm = &rockchip_spi_pm, - .of_match_table = of_match_ptr(rockchip_spi_dt_match), - }, - .remove = rockchip_spi_remove, -}; -MODULE_ALIAS("platform:rockchip-spi"); - -static int __init rockchip_spi_init(void) -{ - return platform_driver_probe(&rockchip_spi_driver, rockchip_spi_probe); -} -module_init(rockchip_spi_init); - -static void __exit rockchip_spi_exit(void) -{ - platform_driver_unregister(&rockchip_spi_driver); -} -module_exit(rockchip_spi_exit); - -MODULE_AUTHOR("Luo Wei "); -MODULE_DESCRIPTION("ROCKCHIP SPI Controller Driver"); -MODULE_LICENSE("GPL");