Lines Matching full:gpmc
3 * GPMC support functions
33 #include <linux/omap-gpmc.h>
39 #define DEVICE_NAME "omap-gpmc"
41 /* GPMC register offsets */
68 /* GPMC ECC control settings */
97 * The first 1MB of GPMC address space is typically mapped to
100 * As GPMC minimum partition size is 16MB we can only start from
207 /* Structure to save gpmc cs context */
220 * Structure to save/restore gpmc context
422 * @name: DTS node name, w/o "gpmc,"
426 * raw format: gpmc,name = <value>
427 * tick format: gpmc,name = <value> /‍* x ns -- y ns; x ticks *‍/
467 pr_info("gpmc,%s = <%u>; /* %u ns - %u ns; %i ticks%s*/\n", in get_gpmc_timing_reg()
472 pr_info("gpmc,%s = <%u>;%s\n", name, l, in get_gpmc_timing_reg()
499 pr_info("gpmc cs%i %s:\n", cs, desc); in gpmc_show_regs()
509 * Note that gpmc,wait-pin handing wrongly assumes bit 8 is available,
516 pr_info("gpmc cs%i access configuration:\n", cs); in gpmc_cs_show_timings()
529 GPMC_GET_RAW_BOOL(GPMC_CS_CONFIG1, 29, 29, "gpmc,sync-read"); in gpmc_cs_show_timings()
543 pr_info("gpmc cs%i timings configuration:\n", cs); in gpmc_cs_show_timings()
626 pr_err("%s: GPMC CS%d: %s %d ns, %d ticks > %d ticks\n", in set_gpmc_timing_reg()
634 pr_info("GPMC CS%d: %-17s: %3d ticks, %3lu ns (was %3i ticks) %3d ns\n", in set_gpmc_timing_reg()
696 * @t: GPMC timing parameters.
697 * @s: GPMC timing settings.
713 * Calculate GPMCFCLKDIVIDER independent of gpmc,sync-clk-ps in DT for in gpmc_cs_set_timings()
842 pr_info("GPMC CS%d CLK period is %lu ns (div %d)\n", in gpmc_cs_set_timings()
918 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_set_reserved() local
920 gpmc->flags |= GPMC_CS_RESERVED; in gpmc_cs_set_reserved()
925 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_reserved() local
927 return gpmc->flags & GPMC_CS_RESERVED; in gpmc_cs_reserved()
946 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_insert_mem() local
947 struct resource *res = &gpmc->mem; in gpmc_cs_insert_mem()
962 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_delete_mem() local
963 struct resource *res = &gpmc->mem; in gpmc_cs_delete_mem()
977 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_request() local
978 struct resource *res = &gpmc->mem; in gpmc_cs_request()
1022 struct gpmc_cs_data *gpmc; in gpmc_cs_free() local
1027 WARN(1, "Trying to free non-reserved GPMC CS%d\n", cs); in gpmc_cs_free()
1030 gpmc = &gpmc_cs[cs]; in gpmc_cs_free()
1031 res = &gpmc->mem; in gpmc_cs_free()
1045 static int gpmc_alloc_waitpin(struct gpmc_device *gpmc, in gpmc_alloc_waitpin() argument
1055 waitpin = &gpmc->waitpins[p->wait_pin]; in gpmc_alloc_waitpin()
1062 waitpin_desc = gpiochip_request_own_desc(&gpmc->gpio_chip, in gpmc_alloc_waitpin()
1079 dev_err(gpmc->dev, in gpmc_alloc_waitpin()
1083 dev_info(gpmc->dev, "shared wait-pin: %d\n", waitpin->pin); in gpmc_alloc_waitpin()
1089 static void gpmc_free_waitpin(struct gpmc_device *gpmc, in gpmc_free_waitpin() argument
1093 gpiochip_free_own_desc(gpmc->waitpins[wait_pin].desc); in gpmc_free_waitpin()
1097 * gpmc_configure - write request to configure gpmc
1138 * gpmc_omap_get_nand_ops - Get the GPMC NAND interface
1139 * @reg: the GPMC NAND register map exclusive for NAND use.
1140 * @cs: GPMC chip select number on which the NAND sits. The
1384 struct gpmc_device *gpmc = d->host_data; in gpmc_irq_map() local
1386 irq_set_chip_data(virq, gpmc); in gpmc_irq_map()
1389 irq_set_chip_and_handler(virq, &gpmc->irq_chip, in gpmc_irq_map()
1392 irq_set_chip_and_handler(virq, &gpmc->irq_chip, in gpmc_irq_map()
1408 struct gpmc_device *gpmc = data; in gpmc_handle_irq() local
1416 for (hwirq = 0; hwirq < gpmc->nirqs; hwirq++) { in gpmc_handle_irq()
1424 dev_warn(gpmc->dev, in gpmc_handle_irq()
1438 static int gpmc_setup_irq(struct gpmc_device *gpmc) in gpmc_setup_irq() argument
1450 gpmc->irq_chip.name = "gpmc"; in gpmc_setup_irq()
1451 gpmc->irq_chip.irq_enable = gpmc_irq_enable; in gpmc_setup_irq()
1452 gpmc->irq_chip.irq_disable = gpmc_irq_disable; in gpmc_setup_irq()
1453 gpmc->irq_chip.irq_ack = gpmc_irq_ack; in gpmc_setup_irq()
1454 gpmc->irq_chip.irq_mask = gpmc_irq_mask; in gpmc_setup_irq()
1455 gpmc->irq_chip.irq_unmask = gpmc_irq_unmask; in gpmc_setup_irq()
1456 gpmc->irq_chip.irq_set_type = gpmc_irq_set_type; in gpmc_setup_irq()
1458 gpmc_irq_domain = irq_domain_add_linear(gpmc->dev->of_node, in gpmc_setup_irq()
1459 gpmc->nirqs, in gpmc_setup_irq()
1461 gpmc); in gpmc_setup_irq()
1463 dev_err(gpmc->dev, "IRQ domain add failed\n"); in gpmc_setup_irq()
1467 rc = request_irq(gpmc->irq, gpmc_handle_irq, 0, "gpmc", gpmc); in gpmc_setup_irq()
1469 dev_err(gpmc->dev, "failed to request irq %d: %d\n", in gpmc_setup_irq()
1470 gpmc->irq, rc); in gpmc_setup_irq()
1478 static int gpmc_free_irq(struct gpmc_device *gpmc) in gpmc_free_irq() argument
1482 free_irq(gpmc->irq, gpmc); in gpmc_free_irq()
1484 for (hwirq = 0; hwirq < gpmc->nirqs; hwirq++) in gpmc_free_irq()
1504 static void gpmc_mem_init(struct gpmc_device *gpmc) in gpmc_mem_init() argument
1508 if (!gpmc->data) { in gpmc_mem_init()
1513 gpmc_mem_root.start = gpmc->data->start; in gpmc_mem_init()
1514 gpmc_mem_root.end = gpmc->data->end; in gpmc_mem_init()
1854 * @cs: GPMC chip-select to program
1855 * @p: pointer to GPMC settings structure
1857 * Programs non-timing related settings for a GPMC chip-select, such as
1950 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_set_name() local
1952 gpmc->name = name; in gpmc_cs_set_name()
1957 struct gpmc_cs_data *gpmc = &gpmc_cs[cs]; in gpmc_cs_get_name() local
1959 return gpmc->name; in gpmc_cs_get_name()
1982 * Make sure we ignore any device offsets from the GPMC partition in gpmc_cs_remap()
1984 * to the GPMC 16MB minimum granularity. in gpmc_cs_remap()
2006 * gpmc_read_settings_dt - read gpmc settings from device-tree
2007 * @np: pointer to device-tree node for a gpmc child device
2008 * @p: pointer to gpmc settings structure
2010 * Reads the GPMC settings for a GPMC child device from device-tree and
2011 * stores them in the GPMC settings structure passed. The GPMC settings
2019 p->sync_read = of_property_read_bool(np, "gpmc,sync-read"); in gpmc_read_settings_dt()
2020 p->sync_write = of_property_read_bool(np, "gpmc,sync-write"); in gpmc_read_settings_dt()
2021 of_property_read_u32(np, "gpmc,device-width", &p->device_width); in gpmc_read_settings_dt()
2022 of_property_read_u32(np, "gpmc,mux-add-data", &p->mux_add_data); in gpmc_read_settings_dt()
2024 if (!of_property_read_u32(np, "gpmc,burst-length", &p->burst_len)) { in gpmc_read_settings_dt()
2025 p->burst_wrap = of_property_read_bool(np, "gpmc,burst-wrap"); in gpmc_read_settings_dt()
2026 p->burst_read = of_property_read_bool(np, "gpmc,burst-read"); in gpmc_read_settings_dt()
2027 p->burst_write = of_property_read_bool(np, "gpmc,burst-write"); in gpmc_read_settings_dt()
2036 if (!of_property_read_u32(np, "gpmc,wait-pin", &p->wait_pin)) { in gpmc_read_settings_dt()
2053 "gpmc,wait-on-read"); in gpmc_read_settings_dt()
2055 "gpmc,wait-on-write"); in gpmc_read_settings_dt()
2073 of_property_read_u32(np, "gpmc,sync-clk-ps", &gpmc_t->sync_clk); in gpmc_read_timings_dt()
2076 of_property_read_u32(np, "gpmc,cs-on-ns", &gpmc_t->cs_on); in gpmc_read_timings_dt()
2077 of_property_read_u32(np, "gpmc,cs-rd-off-ns", &gpmc_t->cs_rd_off); in gpmc_read_timings_dt()
2078 of_property_read_u32(np, "gpmc,cs-wr-off-ns", &gpmc_t->cs_wr_off); in gpmc_read_timings_dt()
2081 of_property_read_u32(np, "gpmc,adv-on-ns", &gpmc_t->adv_on); in gpmc_read_timings_dt()
2082 of_property_read_u32(np, "gpmc,adv-rd-off-ns", &gpmc_t->adv_rd_off); in gpmc_read_timings_dt()
2083 of_property_read_u32(np, "gpmc,adv-wr-off-ns", &gpmc_t->adv_wr_off); in gpmc_read_timings_dt()
2084 of_property_read_u32(np, "gpmc,adv-aad-mux-on-ns", in gpmc_read_timings_dt()
2086 of_property_read_u32(np, "gpmc,adv-aad-mux-rd-off-ns", in gpmc_read_timings_dt()
2088 of_property_read_u32(np, "gpmc,adv-aad-mux-wr-off-ns", in gpmc_read_timings_dt()
2092 of_property_read_u32(np, "gpmc,we-on-ns", &gpmc_t->we_on); in gpmc_read_timings_dt()
2093 of_property_read_u32(np, "gpmc,we-off-ns", &gpmc_t->we_off); in gpmc_read_timings_dt()
2096 of_property_read_u32(np, "gpmc,oe-on-ns", &gpmc_t->oe_on); in gpmc_read_timings_dt()
2097 of_property_read_u32(np, "gpmc,oe-off-ns", &gpmc_t->oe_off); in gpmc_read_timings_dt()
2098 of_property_read_u32(np, "gpmc,oe-aad-mux-on-ns", in gpmc_read_timings_dt()
2100 of_property_read_u32(np, "gpmc,oe-aad-mux-off-ns", in gpmc_read_timings_dt()
2104 of_property_read_u32(np, "gpmc,page-burst-access-ns", in gpmc_read_timings_dt()
2106 of_property_read_u32(np, "gpmc,access-ns", &gpmc_t->access); in gpmc_read_timings_dt()
2107 of_property_read_u32(np, "gpmc,rd-cycle-ns", &gpmc_t->rd_cycle); in gpmc_read_timings_dt()
2108 of_property_read_u32(np, "gpmc,wr-cycle-ns", &gpmc_t->wr_cycle); in gpmc_read_timings_dt()
2109 of_property_read_u32(np, "gpmc,bus-turnaround-ns", in gpmc_read_timings_dt()
2111 of_property_read_u32(np, "gpmc,cycle2cycle-delay-ns", in gpmc_read_timings_dt()
2113 of_property_read_u32(np, "gpmc,wait-monitoring-ns", in gpmc_read_timings_dt()
2115 of_property_read_u32(np, "gpmc,clk-activation-ns", in gpmc_read_timings_dt()
2119 of_property_read_u32(np, "gpmc,wr-access-ns", &gpmc_t->wr_access); in gpmc_read_timings_dt()
2120 of_property_read_u32(np, "gpmc,wr-data-mux-bus-ns", in gpmc_read_timings_dt()
2127 of_property_read_bool(np, "gpmc,cycle2cycle-diffcsen"); in gpmc_read_timings_dt()
2129 of_property_read_bool(np, "gpmc,cycle2cycle-samecsen"); in gpmc_read_timings_dt()
2130 p->we_extra_delay = of_property_read_bool(np, "gpmc,we-extra-delay"); in gpmc_read_timings_dt()
2131 p->oe_extra_delay = of_property_read_bool(np, "gpmc,oe-extra-delay"); in gpmc_read_timings_dt()
2132 p->adv_extra_delay = of_property_read_bool(np, "gpmc,adv-extra-delay"); in gpmc_read_timings_dt()
2133 p->cs_extra_delay = of_property_read_bool(np, "gpmc,cs-extra-delay"); in gpmc_read_timings_dt()
2135 of_property_read_bool(np, "gpmc,time-para-granularity"); in gpmc_read_timings_dt()
2139 * gpmc_probe_generic_child - configures the gpmc for a child device
2140 * @pdev: pointer to gpmc platform device
2143 * Allocates and configures a GPMC chip-select for a child device.
2156 struct gpmc_device *gpmc = platform_get_drvdata(pdev); in gpmc_probe_generic_child() local
2181 dev_err(&pdev->dev, "cannot request GPMC CS %d\n", cs); in gpmc_probe_generic_child()
2190 * For some GPMC devices we still need to rely on the bootloader in gpmc_probe_generic_child()
2195 WARN(1, "enable GPMC debug to configure .dts timings for CS%i\n", in gpmc_probe_generic_child()
2198 "please add GPMC bootloader timings to .dts"); in gpmc_probe_generic_child()
2202 /* CS must be disabled while making changes to gpmc configuration */ in gpmc_probe_generic_child()
2207 * location in the gpmc address space. When booting with in gpmc_probe_generic_child()
2215 dev_err(&pdev->dev, "cannot remap GPMC CS %d to %pa\n", in gpmc_probe_generic_child()
2219 "GPMC CS %d start cannot be lesser than 0x%x\n", in gpmc_probe_generic_child()
2223 "GPMC CS %d end cannot be greater than 0x%x\n", in gpmc_probe_generic_child()
2255 "%pOF has no 'gpmc,device-width' property\n", in gpmc_probe_generic_child()
2263 ret = gpmc_alloc_waitpin(gpmc, &gpmc_s); in gpmc_probe_generic_child()
2276 dev_err(&pdev->dev, "failed to set gpmc timings for: %pOFn\n", in gpmc_probe_generic_child()
2303 dev_err(&pdev->dev, "failed to create gpmc child %pOFn\n", child); in gpmc_probe_generic_child()
2307 gpmc_free_waitpin(gpmc, gpmc_s.wait_pin); in gpmc_probe_generic_child()
2325 ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-cs", in gpmc_probe_dt()
2339 ret = of_property_read_u32(pdev->dev.of_node, "gpmc,num-waitpins", in gpmc_probe_dt()
2410 static int gpmc_gpio_init(struct gpmc_device *gpmc) in gpmc_gpio_init() argument
2414 gpmc->gpio_chip.parent = gpmc->dev; in gpmc_gpio_init()
2415 gpmc->gpio_chip.owner = THIS_MODULE; in gpmc_gpio_init()
2416 gpmc->gpio_chip.label = DEVICE_NAME; in gpmc_gpio_init()
2417 gpmc->gpio_chip.ngpio = gpmc_nr_waitpins; in gpmc_gpio_init()
2418 gpmc->gpio_chip.get_direction = gpmc_gpio_get_direction; in gpmc_gpio_init()
2419 gpmc->gpio_chip.direction_input = gpmc_gpio_direction_input; in gpmc_gpio_init()
2420 gpmc->gpio_chip.direction_output = gpmc_gpio_direction_output; in gpmc_gpio_init()
2421 gpmc->gpio_chip.set = gpmc_gpio_set; in gpmc_gpio_init()
2422 gpmc->gpio_chip.get = gpmc_gpio_get; in gpmc_gpio_init()
2423 gpmc->gpio_chip.base = -1; in gpmc_gpio_init()
2425 ret = devm_gpiochip_add_data(gpmc->dev, &gpmc->gpio_chip, NULL); in gpmc_gpio_init()
2427 dev_err(gpmc->dev, "could not register gpio chip: %d\n", ret); in gpmc_gpio_init()
2434 static void omap3_gpmc_save_context(struct gpmc_device *gpmc) in omap3_gpmc_save_context() argument
2439 if (!gpmc || !gpmc_base) in omap3_gpmc_save_context()
2442 gpmc_context = &gpmc->context; in omap3_gpmc_save_context()
2472 static void omap3_gpmc_restore_context(struct gpmc_device *gpmc) in omap3_gpmc_restore_context() argument
2477 if (!gpmc || !gpmc_base) in omap3_gpmc_restore_context()
2480 gpmc_context = &gpmc->context; in omap3_gpmc_restore_context()
2514 struct gpmc_device *gpmc; in omap_gpmc_context_notifier() local
2516 gpmc = container_of(nb, struct gpmc_device, nb); in omap_gpmc_context_notifier()
2517 if (gpmc->is_suspended || pm_runtime_suspended(gpmc->dev)) in omap_gpmc_context_notifier()
2522 omap3_gpmc_save_context(gpmc); in omap_gpmc_context_notifier()
2527 omap3_gpmc_restore_context(gpmc); in omap_gpmc_context_notifier()
2539 struct gpmc_device *gpmc; in gpmc_probe() local
2541 gpmc = devm_kzalloc(&pdev->dev, sizeof(*gpmc), GFP_KERNEL); in gpmc_probe()
2542 if (!gpmc) in gpmc_probe()
2545 gpmc->dev = &pdev->dev; in gpmc_probe()
2546 platform_set_drvdata(pdev, gpmc); in gpmc_probe()
2565 gpmc->data = res; in gpmc_probe()
2568 gpmc->irq = platform_get_irq(pdev, 0); in gpmc_probe()
2569 if (gpmc->irq < 0) in gpmc_probe()
2570 return gpmc->irq; in gpmc_probe()
2574 dev_err(&pdev->dev, "Failed to get GPMC fck\n"); in gpmc_probe()
2579 dev_err(&pdev->dev, "Invalid GPMC fck clock rate\n"); in gpmc_probe()
2592 gpmc->waitpins = devm_kzalloc(&pdev->dev, in gpmc_probe()
2595 if (!gpmc->waitpins) in gpmc_probe()
2599 gpmc->waitpins[i].pin = GPMC_WAITPIN_INVALID; in gpmc_probe()
2613 * GPMC IP revisions: in gpmc_probe()
2622 dev_info(gpmc->dev, "GPMC revision %d.%d\n", GPMC_REVISION_MAJOR(l), in gpmc_probe()
2625 gpmc_mem_init(gpmc); in gpmc_probe()
2626 rc = gpmc_gpio_init(gpmc); in gpmc_probe()
2630 gpmc->nirqs = GPMC_NR_NAND_IRQS + gpmc_nr_waitpins; in gpmc_probe()
2631 rc = gpmc_setup_irq(gpmc); in gpmc_probe()
2633 dev_err(gpmc->dev, "gpmc_setup_irq failed\n"); in gpmc_probe()
2639 gpmc->nb.notifier_call = omap_gpmc_context_notifier; in gpmc_probe()
2640 cpu_pm_register_notifier(&gpmc->nb); in gpmc_probe()
2655 struct gpmc_device *gpmc = platform_get_drvdata(pdev); in gpmc_remove() local
2657 cpu_pm_unregister_notifier(&gpmc->nb); in gpmc_remove()
2659 gpmc_free_waitpin(gpmc, i); in gpmc_remove()
2660 gpmc_free_irq(gpmc); in gpmc_remove()
2669 struct gpmc_device *gpmc = dev_get_drvdata(dev); in gpmc_suspend() local
2671 omap3_gpmc_save_context(gpmc); in gpmc_suspend()
2673 gpmc->is_suspended = 1; in gpmc_suspend()
2680 struct gpmc_device *gpmc = dev_get_drvdata(dev); in gpmc_resume() local
2683 omap3_gpmc_restore_context(gpmc); in gpmc_resume()
2684 gpmc->is_suspended = 0; in gpmc_resume()
2694 { .compatible = "ti,omap2420-gpmc" },
2695 { .compatible = "ti,omap2430-gpmc" },
2696 { .compatible = "ti,omap3430-gpmc" }, /* omap3430 & omap3630 */
2697 { .compatible = "ti,omap4430-gpmc" }, /* omap4430 & omap4460 & omap543x */
2698 { .compatible = "ti,am3352-gpmc" }, /* am335x devices */
2699 { .compatible = "ti,am64-gpmc" },
2717 MODULE_DESCRIPTION("Texas Instruments GPMC driver");