Lines Matching +full:ahb +full:- +full:addr +full:- +full:masks
20 #include <linux/aspeed-lpc-ctrl.h>
22 #define DEVICE_NAME "aspeed-lpc-ctrl"
43 return container_of(file->private_data, struct aspeed_lpc_ctrl, in file_aspeed_lpc_ctrl()
50 unsigned long vsize = vma->vm_end - vma->vm_start; in aspeed_lpc_ctrl_mmap()
51 pgprot_t prot = vma->vm_page_prot; in aspeed_lpc_ctrl_mmap()
53 if (vma->vm_pgoff + vsize > lpc_ctrl->mem_base + lpc_ctrl->mem_size) in aspeed_lpc_ctrl_mmap()
54 return -EINVAL; in aspeed_lpc_ctrl_mmap()
56 /* ast2400/2500 AHB accesses are not cache coherent */ in aspeed_lpc_ctrl_mmap()
59 if (remap_pfn_range(vma, vma->vm_start, in aspeed_lpc_ctrl_mmap()
60 (lpc_ctrl->mem_base >> PAGE_SHIFT) + vma->vm_pgoff, in aspeed_lpc_ctrl_mmap()
62 return -EAGAIN; in aspeed_lpc_ctrl_mmap()
73 u32 addr; in aspeed_lpc_ctrl_ioctl() local
78 return -EFAULT; in aspeed_lpc_ctrl_ioctl()
81 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
87 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
91 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
93 map.size = lpc_ctrl->mem_size; in aspeed_lpc_ctrl_ioctl()
95 return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0; in aspeed_lpc_ctrl_ioctl()
119 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
122 * Because of the way the masks work in HICR8 offset has to in aspeed_lpc_ctrl_ioctl()
125 if (map.offset & (map.size - 1)) in aspeed_lpc_ctrl_ioctl()
126 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
129 addr = lpc_ctrl->pnor_base; in aspeed_lpc_ctrl_ioctl()
130 size = lpc_ctrl->pnor_size; in aspeed_lpc_ctrl_ioctl()
132 addr = lpc_ctrl->mem_base; in aspeed_lpc_ctrl_ioctl()
133 size = lpc_ctrl->mem_size; in aspeed_lpc_ctrl_ioctl()
135 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
141 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
144 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
146 addr += map.offset; in aspeed_lpc_ctrl_ioctl()
149 * addr (host lpc address) is safe regardless of values. This in aspeed_lpc_ctrl_ioctl()
157 rc = regmap_write(lpc_ctrl->regmap, HICR7, in aspeed_lpc_ctrl_ioctl()
158 (addr | (map.addr >> 16))); in aspeed_lpc_ctrl_ioctl()
162 rc = regmap_write(lpc_ctrl->regmap, HICR8, in aspeed_lpc_ctrl_ioctl()
163 (~(map.size - 1)) | ((map.size >> 16) - 1)); in aspeed_lpc_ctrl_ioctl()
171 return regmap_update_bits(lpc_ctrl->regmap, HICR5, in aspeed_lpc_ctrl_ioctl()
176 return -EINVAL; in aspeed_lpc_ctrl_ioctl()
193 dev = &pdev->dev; in aspeed_lpc_ctrl_probe()
197 return -ENOMEM; in aspeed_lpc_ctrl_probe()
199 node = of_parse_phandle(dev->of_node, "flash", 0); in aspeed_lpc_ctrl_probe()
202 return -ENODEV; in aspeed_lpc_ctrl_probe()
212 lpc_ctrl->pnor_size = resource_size(&resm); in aspeed_lpc_ctrl_probe()
213 lpc_ctrl->pnor_base = resm.start; in aspeed_lpc_ctrl_probe()
215 dev_set_drvdata(&pdev->dev, lpc_ctrl); in aspeed_lpc_ctrl_probe()
217 node = of_parse_phandle(dev->of_node, "memory-region", 0); in aspeed_lpc_ctrl_probe()
220 return -EINVAL; in aspeed_lpc_ctrl_probe()
227 return -ENOMEM; in aspeed_lpc_ctrl_probe()
230 lpc_ctrl->mem_size = resource_size(&resm); in aspeed_lpc_ctrl_probe()
231 lpc_ctrl->mem_base = resm.start; in aspeed_lpc_ctrl_probe()
233 lpc_ctrl->regmap = syscon_node_to_regmap( in aspeed_lpc_ctrl_probe()
234 pdev->dev.parent->of_node); in aspeed_lpc_ctrl_probe()
235 if (IS_ERR(lpc_ctrl->regmap)) { in aspeed_lpc_ctrl_probe()
237 return -ENODEV; in aspeed_lpc_ctrl_probe()
240 lpc_ctrl->clk = devm_clk_get(dev, NULL); in aspeed_lpc_ctrl_probe()
241 if (IS_ERR(lpc_ctrl->clk)) { in aspeed_lpc_ctrl_probe()
243 return PTR_ERR(lpc_ctrl->clk); in aspeed_lpc_ctrl_probe()
245 rc = clk_prepare_enable(lpc_ctrl->clk); in aspeed_lpc_ctrl_probe()
251 lpc_ctrl->miscdev.minor = MISC_DYNAMIC_MINOR; in aspeed_lpc_ctrl_probe()
252 lpc_ctrl->miscdev.name = DEVICE_NAME; in aspeed_lpc_ctrl_probe()
253 lpc_ctrl->miscdev.fops = &aspeed_lpc_ctrl_fops; in aspeed_lpc_ctrl_probe()
254 lpc_ctrl->miscdev.parent = dev; in aspeed_lpc_ctrl_probe()
255 rc = misc_register(&lpc_ctrl->miscdev); in aspeed_lpc_ctrl_probe()
266 clk_disable_unprepare(lpc_ctrl->clk); in aspeed_lpc_ctrl_probe()
272 struct aspeed_lpc_ctrl *lpc_ctrl = dev_get_drvdata(&pdev->dev); in aspeed_lpc_ctrl_remove()
274 misc_deregister(&lpc_ctrl->miscdev); in aspeed_lpc_ctrl_remove()
275 clk_disable_unprepare(lpc_ctrl->clk); in aspeed_lpc_ctrl_remove()
281 { .compatible = "aspeed,ast2400-lpc-ctrl" },
282 { .compatible = "aspeed,ast2500-lpc-ctrl" },