···11+/*22+ * arch/sh/include/asm/clkdev.h33+ *44+ * Cloned from arch/arm/include/asm/clkdev.h:55+ *66+ * Copyright (C) 2008 Russell King.77+ *88+ * This program is free software; you can redistribute it and/or modify99+ * it under the terms of the GNU General Public License version 2 as1010+ * published by the Free Software Foundation.1111+ *1212+ * Helper for the clk API to assist looking up a struct clk.1313+ */1414+#ifndef __ASM_CLKDEV_H1515+#define __ASM_CLKDEV_H1616+1717+struct clk;1818+1919+struct clk_lookup {2020+ struct list_head node;2121+ const char *dev_id;2222+ const char *con_id;2323+ struct clk *clk;2424+};2525+2626+struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id,2727+ const char *dev_fmt, ...);2828+2929+void clkdev_add(struct clk_lookup *cl);3030+void clkdev_drop(struct clk_lookup *cl);3131+3232+void clkdev_add_table(struct clk_lookup *, size_t);3333+int clk_add_alias(const char *, const char *, char *, struct device *);3434+3535+#endif
-7
arch/sh/include/asm/clock.h
···4545 struct cpufreq_frequency_table *freq_table;4646};47474848-struct clk_lookup {4949- struct list_head node;5050- const char *dev_id;5151- const char *con_id;5252- struct clk *clk;5353-};5454-5548#define CLK_ENABLE_ON_INIT (1 << 0)56495750/* Should be defined by processor-specific code */
+2-61
arch/sh/include/asm/dmaengine.h
···1010#ifndef ASM_DMAENGINE_H1111#define ASM_DMAENGINE_H12121313-#include <linux/dmaengine.h>1414-#include <linux/list.h>1313+#include <linux/sh_dma.h>15141616-#include <asm/dma-register.h>1717-1818-#define SH_DMAC_MAX_CHANNELS 61919-2020-enum sh_dmae_slave_chan_id {1515+enum {2116 SHDMA_SLAVE_SCIF0_TX,2217 SHDMA_SLAVE_SCIF0_RX,2318 SHDMA_SLAVE_SCIF1_TX,···2934 SHDMA_SLAVE_SIUA_RX,3035 SHDMA_SLAVE_SIUB_TX,3136 SHDMA_SLAVE_SIUB_RX,3232- SHDMA_SLAVE_NUMBER, /* Must stay last */3333-};3434-3535-struct sh_dmae_slave_config {3636- enum sh_dmae_slave_chan_id slave_id;3737- dma_addr_t addr;3838- u32 chcr;3939- char mid_rid;4040-};4141-4242-struct sh_dmae_channel {4343- unsigned int offset;4444- unsigned int dmars;4545- unsigned int dmars_bit;4646-};4747-4848-struct sh_dmae_pdata {4949- struct sh_dmae_slave_config *slave;5050- int slave_num;5151- struct sh_dmae_channel *channel;5252- int channel_num;5353- unsigned int ts_low_shift;5454- unsigned int ts_low_mask;5555- unsigned int ts_high_shift;5656- unsigned int ts_high_mask;5757- unsigned int *ts_shift;5858- int ts_shift_num;5959- u16 dmaor_init;6060-};6161-6262-struct device;6363-6464-/* Used by slave DMA clients to request DMA to/from a specific peripheral */6565-struct sh_dmae_slave {6666- enum sh_dmae_slave_chan_id slave_id; /* Set by the platform */6767- struct device *dma_dev; /* Set by the platform */6868- struct sh_dmae_slave_config *config; /* Set by the driver */6969-};7070-7171-struct sh_dmae_regs {7272- u32 sar; /* SAR / source address */7373- u32 dar; /* DAR / destination address */7474- u32 tcr; /* TCR / transfer count */7575-};7676-7777-struct sh_desc {7878- struct sh_dmae_regs hw;7979- struct list_head node;8080- struct dma_async_tx_descriptor async_tx;8181- enum dma_data_direction direction;8282- dma_cookie_t cookie;8383- size_t partial;8484- int chunks;8585- int mark;8637};87388839#endif
+4-4
arch/sh/include/asm/siu.h
···17171818struct siu_platform {1919 struct device *dma_dev;2020- enum sh_dmae_slave_chan_id dma_slave_tx_a;2121- enum sh_dmae_slave_chan_id dma_slave_rx_a;2222- enum sh_dmae_slave_chan_id dma_slave_tx_b;2323- enum sh_dmae_slave_chan_id dma_slave_rx_b;2020+ unsigned int dma_slave_tx_a;2121+ unsigned int dma_slave_rx_a;2222+ unsigned int dma_slave_tx_b;2323+ unsigned int dma_slave_rx_b;2424};25252626#endif /* ASM_SIU_H */
···11+/*22+ * arch/sh/kernel/clkdev.c33+ *44+ * Cloned from arch/arm/common/clkdev.c:55+ *66+ * Copyright (C) 2008 Russell King.77+ *88+ * This program is free software; you can redistribute it and/or modify99+ * it under the terms of the GNU General Public License version 2 as1010+ * published by the Free Software Foundation.1111+ *1212+ * Helper for the clk API to assist looking up a struct clk.1313+ */1414+#include <linux/module.h>1515+#include <linux/kernel.h>1616+#include <linux/device.h>1717+#include <linux/list.h>1818+#include <linux/errno.h>1919+#include <linux/err.h>2020+#include <linux/string.h>2121+#include <linux/mutex.h>2222+#include <linux/clk.h>2323+#include <linux/slab.h>2424+#include <linux/bootmem.h>2525+#include <linux/mm.h>2626+#include <asm/clock.h>2727+#include <asm/clkdev.h>2828+2929+static LIST_HEAD(clocks);3030+static DEFINE_MUTEX(clocks_mutex);3131+3232+/*3333+ * Find the correct struct clk for the device and connection ID.3434+ * We do slightly fuzzy matching here:3535+ * An entry with a NULL ID is assumed to be a wildcard.3636+ * If an entry has a device ID, it must match3737+ * If an entry has a connection ID, it must match3838+ * Then we take the most specific entry - with the following3939+ * order of precidence: dev+con > dev only > con only.4040+ */4141+static struct clk *clk_find(const char *dev_id, const char *con_id)4242+{4343+ struct clk_lookup *p;4444+ struct clk *clk = NULL;4545+ int match, best = 0;4646+4747+ list_for_each_entry(p, &clocks, node) {4848+ match = 0;4949+ if (p->dev_id) {5050+ if (!dev_id || strcmp(p->dev_id, dev_id))5151+ continue;5252+ match += 2;5353+ }5454+ if (p->con_id) {5555+ if (!con_id || strcmp(p->con_id, con_id))5656+ continue;5757+ match += 1;5858+ }5959+ if (match == 0)6060+ continue;6161+6262+ if (match > best) {6363+ clk = p->clk;6464+ best = match;6565+ }6666+ }6767+ return clk;6868+}6969+7070+struct clk *clk_get_sys(const char *dev_id, const char *con_id)7171+{7272+ struct clk *clk;7373+7474+ mutex_lock(&clocks_mutex);7575+ clk = clk_find(dev_id, con_id);7676+ mutex_unlock(&clocks_mutex);7777+7878+ return clk ? clk : ERR_PTR(-ENOENT);7979+}8080+EXPORT_SYMBOL(clk_get_sys);8181+8282+void clkdev_add(struct clk_lookup *cl)8383+{8484+ mutex_lock(&clocks_mutex);8585+ list_add_tail(&cl->node, &clocks);8686+ mutex_unlock(&clocks_mutex);8787+}8888+EXPORT_SYMBOL(clkdev_add);8989+9090+void __init clkdev_add_table(struct clk_lookup *cl, size_t num)9191+{9292+ mutex_lock(&clocks_mutex);9393+ while (num--) {9494+ list_add_tail(&cl->node, &clocks);9595+ cl++;9696+ }9797+ mutex_unlock(&clocks_mutex);9898+}9999+100100+#define MAX_DEV_ID 20101101+#define MAX_CON_ID 16102102+103103+struct clk_lookup_alloc {104104+ struct clk_lookup cl;105105+ char dev_id[MAX_DEV_ID];106106+ char con_id[MAX_CON_ID];107107+};108108+109109+struct clk_lookup * __init_refok110110+clkdev_alloc(struct clk *clk, const char *con_id, const char *dev_fmt, ...)111111+{112112+ struct clk_lookup_alloc *cla;113113+114114+ if (!slab_is_available())115115+ cla = alloc_bootmem_low_pages(sizeof(*cla));116116+ else117117+ cla = kzalloc(sizeof(*cla), GFP_KERNEL);118118+119119+ if (!cla)120120+ return NULL;121121+122122+ cla->cl.clk = clk;123123+ if (con_id) {124124+ strlcpy(cla->con_id, con_id, sizeof(cla->con_id));125125+ cla->cl.con_id = cla->con_id;126126+ }127127+128128+ if (dev_fmt) {129129+ va_list ap;130130+131131+ va_start(ap, dev_fmt);132132+ vscnprintf(cla->dev_id, sizeof(cla->dev_id), dev_fmt, ap);133133+ cla->cl.dev_id = cla->dev_id;134134+ va_end(ap);135135+ }136136+137137+ return &cla->cl;138138+}139139+EXPORT_SYMBOL(clkdev_alloc);140140+141141+int clk_add_alias(const char *alias, const char *alias_dev_name, char *id,142142+ struct device *dev)143143+{144144+ struct clk *r = clk_get(dev, id);145145+ struct clk_lookup *l;146146+147147+ if (IS_ERR(r))148148+ return PTR_ERR(r);149149+150150+ l = clkdev_alloc(r, alias, alias_dev_name);151151+ clk_put(r);152152+ if (!l)153153+ return -ENODEV;154154+ clkdev_add(l);155155+ return 0;156156+}157157+EXPORT_SYMBOL(clk_add_alias);158158+159159+/*160160+ * clkdev_drop - remove a clock dynamically allocated161161+ */162162+void clkdev_drop(struct clk_lookup *cl)163163+{164164+ mutex_lock(&clocks_mutex);165165+ list_del(&cl->node);166166+ mutex_unlock(&clocks_mutex);167167+ kfree(cl);168168+}169169+EXPORT_SYMBOL(clkdev_drop);
···1010 *1111 * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com>1212 *1313- * With clkdev bits:1414- *1515- * Copyright (C) 2008 Russell King.1616- *1713 * This file is subject to the terms and conditions of the GNU General Public1814 * License. See the file "COPYING" in the main directory of this archive1915 * for more details.···2630#include <linux/platform_device.h>2731#include <linux/debugfs.h>2832#include <linux/cpufreq.h>3333+#include <linux/clk.h>2934#include <asm/clock.h>3035#include <asm/machvec.h>3136···393396 return clk_get_rate(clk);394397}395398EXPORT_SYMBOL_GPL(clk_round_rate);396396-397397-/*398398- * Find the correct struct clk for the device and connection ID.399399- * We do slightly fuzzy matching here:400400- * An entry with a NULL ID is assumed to be a wildcard.401401- * If an entry has a device ID, it must match402402- * If an entry has a connection ID, it must match403403- * Then we take the most specific entry - with the following404404- * order of precedence: dev+con > dev only > con only.405405- */406406-static struct clk *clk_find(const char *dev_id, const char *con_id)407407-{408408- struct clk_lookup *p;409409- struct clk *clk = NULL;410410- int match, best = 0;411411-412412- list_for_each_entry(p, &clock_list, node) {413413- match = 0;414414- if (p->dev_id) {415415- if (!dev_id || strcmp(p->dev_id, dev_id))416416- continue;417417- match += 2;418418- }419419- if (p->con_id) {420420- if (!con_id || strcmp(p->con_id, con_id))421421- continue;422422- match += 1;423423- }424424- if (match == 0)425425- continue;426426-427427- if (match > best) {428428- clk = p->clk;429429- best = match;430430- }431431- }432432- return clk;433433-}434434-435435-struct clk *clk_get_sys(const char *dev_id, const char *con_id)436436-{437437- struct clk *clk;438438-439439- mutex_lock(&clock_list_sem);440440- clk = clk_find(dev_id, con_id);441441- mutex_unlock(&clock_list_sem);442442-443443- return clk ? clk : ERR_PTR(-ENOENT);444444-}445445-EXPORT_SYMBOL_GPL(clk_get_sys);446399447400/*448401 * Returns a clock. Note that we first try to use device id on the bus
···12541254 }1255125512561256 if (match) {12571257+ /*12581258+ * Set up a sensible init_name to enable12591259+ * dev_name() and others to be used before the12601260+ * rest of the driver core is initialized.12611261+ */12621262+ if (!match->dev.init_name) {12631263+ if (match->id != -1)12641264+ match->dev.init_name =12651265+ kasprintf(GFP_KERNEL, "%s.%d",12661266+ match->name,12671267+ match->id);12681268+ else12691269+ match->dev.init_name =12701270+ kasprintf(GFP_KERNEL, "%s",12711271+ match->name);12721272+12731273+ if (!match->dev.init_name)12741274+ return -ENOMEM;12751275+ }12761276+12571277 if (epdrv->pdrv->probe(match))12581278 pr_warning("%s: unable to probe %s early.\n",12591279 class_str, match->name);
+21-21
drivers/clocksource/sh_cmt.c
···149149150150static int sh_cmt_enable(struct sh_cmt_priv *p, unsigned long *rate)151151{152152- struct sh_timer_config *cfg = p->pdev->dev.platform_data;153152 int ret;154153155154 /* enable clock */156155 ret = clk_enable(p->clk);157156 if (ret) {158158- pr_err("sh_cmt: cannot enable clock \"%s\"\n", cfg->clk);157157+ dev_err(&p->pdev->dev, "cannot enable clock\n");159158 return ret;160159 }161160···277278 delay = 1;278279279280 if (!delay)280280- pr_warning("sh_cmt: too long delay\n");281281+ dev_warn(&p->pdev->dev, "too long delay\n");281282282283 } while (delay);283284}···287288 unsigned long flags;288289289290 if (delta > p->max_match_value)290290- pr_warning("sh_cmt: delta out of range\n");291291+ dev_warn(&p->pdev->dev, "delta out of range\n");291292292293 spin_lock_irqsave(&p->lock, flags);293294 p->next_match_value = delta;···449450 cs->resume = sh_cmt_clocksource_resume;450451 cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);451452 cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;452452- pr_info("sh_cmt: %s used as clock source\n", cs->name);453453+ dev_info(&p->pdev->dev, "used as clock source\n");453454 clocksource_register(cs);454455 return 0;455456}···495496496497 switch (mode) {497498 case CLOCK_EVT_MODE_PERIODIC:498498- pr_info("sh_cmt: %s used for periodic clock events\n",499499- ced->name);499499+ dev_info(&p->pdev->dev, "used for periodic clock events\n");500500 sh_cmt_clock_event_start(p, 1);501501 break;502502 case CLOCK_EVT_MODE_ONESHOT:503503- pr_info("sh_cmt: %s used for oneshot clock events\n",504504- ced->name);503503+ dev_info(&p->pdev->dev, "used for oneshot clock events\n");505504 sh_cmt_clock_event_start(p, 0);506505 break;507506 case CLOCK_EVT_MODE_SHUTDOWN:···540543 ced->set_next_event = sh_cmt_clock_event_next;541544 ced->set_mode = sh_cmt_clock_event_mode;542545543543- pr_info("sh_cmt: %s used for clock events\n", ced->name);546546+ dev_info(&p->pdev->dev, "used for clock events\n");544547 clockevents_register_device(ced);545548}546549···597600 /* map memory, let mapbase point to our channel */598601 p->mapbase = ioremap_nocache(res->start, resource_size(res));599602 if (p->mapbase == NULL) {600600- pr_err("sh_cmt: failed to remap I/O memory\n");603603+ dev_err(&p->pdev->dev, "failed to remap I/O memory\n");601604 goto err0;602605 }603606604607 /* request irq using setup_irq() (too early for request_irq()) */605605- p->irqaction.name = cfg->name;608608+ p->irqaction.name = dev_name(&p->pdev->dev);606609 p->irqaction.handler = sh_cmt_interrupt;607610 p->irqaction.dev_id = p;608611 p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL;609612610613 /* get hold of clock */611611- p->clk = clk_get(&p->pdev->dev, cfg->clk);614614+ p->clk = clk_get(&p->pdev->dev, "cmt_fck");612615 if (IS_ERR(p->clk)) {613613- pr_err("sh_cmt: cannot get clock \"%s\"\n", cfg->clk);614614- ret = PTR_ERR(p->clk);615615- goto err1;616616+ dev_warn(&p->pdev->dev, "using deprecated clock lookup\n");617617+ p->clk = clk_get(&p->pdev->dev, cfg->clk);618618+ if (IS_ERR(p->clk)) {619619+ dev_err(&p->pdev->dev, "cannot get clock\n");620620+ ret = PTR_ERR(p->clk);621621+ goto err1;622622+ }616623 }617624618625 if (resource_size(res) == 6) {···629628 p->clear_bits = ~0xc000;630629 }631630632632- ret = sh_cmt_register(p, cfg->name,631631+ ret = sh_cmt_register(p, (char *)dev_name(&p->pdev->dev),633632 cfg->clockevent_rating,634633 cfg->clocksource_rating);635634 if (ret) {636636- pr_err("sh_cmt: registration failed\n");635635+ dev_err(&p->pdev->dev, "registration failed\n");637636 goto err1;638637 }639638640639 ret = setup_irq(irq, &p->irqaction);641640 if (ret) {642642- pr_err("sh_cmt: failed to request irq %d\n", irq);641641+ dev_err(&p->pdev->dev, "failed to request irq %d\n", irq);643642 goto err1;644643 }645644···654653static int __devinit sh_cmt_probe(struct platform_device *pdev)655654{656655 struct sh_cmt_priv *p = platform_get_drvdata(pdev);657657- struct sh_timer_config *cfg = pdev->dev.platform_data;658656 int ret;659657660658 if (p) {661661- pr_info("sh_cmt: %s kept as earlytimer\n", cfg->name);659659+ dev_info(&pdev->dev, "kept as earlytimer\n");662660 return 0;663661 }664662
+18-16
drivers/clocksource/sh_mtu2.c
···118118119119static int sh_mtu2_enable(struct sh_mtu2_priv *p)120120{121121- struct sh_timer_config *cfg = p->pdev->dev.platform_data;122121 int ret;123122124123 /* enable clock */125124 ret = clk_enable(p->clk);126125 if (ret) {127127- pr_err("sh_mtu2: cannot enable clock \"%s\"\n", cfg->clk);126126+ dev_err(&p->pdev->dev, "cannot enable clock\n");128127 return ret;129128 }130129···192193193194 switch (mode) {194195 case CLOCK_EVT_MODE_PERIODIC:195195- pr_info("sh_mtu2: %s used for periodic clock events\n",196196- ced->name);196196+ dev_info(&p->pdev->dev, "used for periodic clock events\n");197197 sh_mtu2_enable(p);198198 break;199199 case CLOCK_EVT_MODE_UNUSED:···219221 ced->cpumask = cpumask_of(0);220222 ced->set_mode = sh_mtu2_clock_event_mode;221223222222- pr_info("sh_mtu2: %s used for clock events\n", ced->name);224224+ dev_info(&p->pdev->dev, "used for clock events\n");223225 clockevents_register_device(ced);224226225227 ret = setup_irq(p->irqaction.irq, &p->irqaction);226228 if (ret) {227227- pr_err("sh_mtu2: failed to request irq %d\n",228228- p->irqaction.irq);229229+ dev_err(&p->pdev->dev, "failed to request irq %d\n",230230+ p->irqaction.irq);229231 return;230232 }231233}···271273 /* map memory, let mapbase point to our channel */272274 p->mapbase = ioremap_nocache(res->start, resource_size(res));273275 if (p->mapbase == NULL) {274274- pr_err("sh_mtu2: failed to remap I/O memory\n");276276+ dev_err(&p->pdev->dev, "failed to remap I/O memory\n");275277 goto err0;276278 }277279278280 /* setup data for setup_irq() (too early for request_irq()) */279279- p->irqaction.name = cfg->name;281281+ p->irqaction.name = dev_name(&p->pdev->dev);280282 p->irqaction.handler = sh_mtu2_interrupt;281283 p->irqaction.dev_id = p;282284 p->irqaction.irq = irq;283285 p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL;284286285287 /* get hold of clock */286286- p->clk = clk_get(&p->pdev->dev, cfg->clk);288288+ p->clk = clk_get(&p->pdev->dev, "mtu2_fck");287289 if (IS_ERR(p->clk)) {288288- pr_err("sh_mtu2: cannot get clock \"%s\"\n", cfg->clk);289289- ret = PTR_ERR(p->clk);290290- goto err1;290290+ dev_warn(&p->pdev->dev, "using deprecated clock lookup\n");291291+ p->clk = clk_get(&p->pdev->dev, cfg->clk);292292+ if (IS_ERR(p->clk)) {293293+ dev_err(&p->pdev->dev, "cannot get clock\n");294294+ ret = PTR_ERR(p->clk);295295+ goto err1;296296+ }291297 }292298293293- return sh_mtu2_register(p, cfg->name, cfg->clockevent_rating);299299+ return sh_mtu2_register(p, (char *)dev_name(&p->pdev->dev),300300+ cfg->clockevent_rating);294301 err1:295302 iounmap(p->mapbase);296303 err0:···305302static int __devinit sh_mtu2_probe(struct platform_device *pdev)306303{307304 struct sh_mtu2_priv *p = platform_get_drvdata(pdev);308308- struct sh_timer_config *cfg = pdev->dev.platform_data;309305 int ret;310306311307 if (p) {312312- pr_info("sh_mtu2: %s kept as earlytimer\n", cfg->name);308308+ dev_info(&pdev->dev, "kept as earlytimer\n");313309 return 0;314310 }315311
+19-19
drivers/clocksource/sh_tmu.c
···106106107107static int sh_tmu_enable(struct sh_tmu_priv *p)108108{109109- struct sh_timer_config *cfg = p->pdev->dev.platform_data;110109 int ret;111110112111 /* enable clock */113112 ret = clk_enable(p->clk);114113 if (ret) {115115- pr_err("sh_tmu: cannot enable clock \"%s\"\n", cfg->clk);114114+ dev_err(&p->pdev->dev, "cannot enable clock\n");116115 return ret;117116 }118117···227228 cs->disable = sh_tmu_clocksource_disable;228229 cs->mask = CLOCKSOURCE_MASK(32);229230 cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;230230- pr_info("sh_tmu: %s used as clock source\n", cs->name);231231+ dev_info(&p->pdev->dev, "used as clock source\n");231232 clocksource_register(cs);232233 return 0;233234}···275276276277 switch (mode) {277278 case CLOCK_EVT_MODE_PERIODIC:278278- pr_info("sh_tmu: %s used for periodic clock events\n",279279- ced->name);279279+ dev_info(&p->pdev->dev, "used for periodic clock events\n");280280 sh_tmu_clock_event_start(p, 1);281281 break;282282 case CLOCK_EVT_MODE_ONESHOT:283283- pr_info("sh_tmu: %s used for oneshot clock events\n",284284- ced->name);283283+ dev_info(&p->pdev->dev, "used for oneshot clock events\n");285284 sh_tmu_clock_event_start(p, 0);286285 break;287286 case CLOCK_EVT_MODE_UNUSED:···320323 ced->set_next_event = sh_tmu_clock_event_next;321324 ced->set_mode = sh_tmu_clock_event_mode;322325323323- pr_info("sh_tmu: %s used for clock events\n", ced->name);326326+ dev_info(&p->pdev->dev, "used for clock events\n");324327 clockevents_register_device(ced);325328326329 ret = setup_irq(p->irqaction.irq, &p->irqaction);327330 if (ret) {328328- pr_err("sh_tmu: failed to request irq %d\n",329329- p->irqaction.irq);331331+ dev_err(&p->pdev->dev, "failed to request irq %d\n",332332+ p->irqaction.irq);330333 return;331334 }332335}···375378 /* map memory, let mapbase point to our channel */376379 p->mapbase = ioremap_nocache(res->start, resource_size(res));377380 if (p->mapbase == NULL) {378378- pr_err("sh_tmu: failed to remap I/O memory\n");381381+ dev_err(&p->pdev->dev, "failed to remap I/O memory\n");379382 goto err0;380383 }381384382385 /* setup data for setup_irq() (too early for request_irq()) */383383- p->irqaction.name = cfg->name;386386+ p->irqaction.name = dev_name(&p->pdev->dev);384387 p->irqaction.handler = sh_tmu_interrupt;385388 p->irqaction.dev_id = p;386389 p->irqaction.irq = irq;387390 p->irqaction.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL;388391389392 /* get hold of clock */390390- p->clk = clk_get(&p->pdev->dev, cfg->clk);393393+ p->clk = clk_get(&p->pdev->dev, "tmu_fck");391394 if (IS_ERR(p->clk)) {392392- pr_err("sh_tmu: cannot get clock \"%s\"\n", cfg->clk);393393- ret = PTR_ERR(p->clk);394394- goto err1;395395+ dev_warn(&p->pdev->dev, "using deprecated clock lookup\n");396396+ p->clk = clk_get(&p->pdev->dev, cfg->clk);397397+ if (IS_ERR(p->clk)) {398398+ dev_err(&p->pdev->dev, "cannot get clock\n");399399+ ret = PTR_ERR(p->clk);400400+ goto err1;401401+ }395402 }396403397397- return sh_tmu_register(p, cfg->name,404404+ return sh_tmu_register(p, (char *)dev_name(&p->pdev->dev),398405 cfg->clockevent_rating,399406 cfg->clocksource_rating);400407 err1:···410409static int __devinit sh_tmu_probe(struct platform_device *pdev)411410{412411 struct sh_tmu_priv *p = platform_get_drvdata(pdev);413413- struct sh_timer_config *cfg = pdev->dev.platform_data;414412 int ret;415413416414 if (p) {417417- pr_info("sh_tmu: %s kept as earlytimer\n", cfg->name);415415+ dev_info(&pdev->dev, "kept as earlytimer\n");418416 return 0;419417 }420418
+6-7
drivers/dma/shdma.c
···2525#include <linux/dma-mapping.h>2626#include <linux/platform_device.h>2727#include <linux/pm_runtime.h>2828-2929-#include <asm/dmaengine.h>2828+#include <linux/sh_dma.h>30293130#include "shdma.h"3231···4344#define LOG2_DEFAULT_XFER_SIZE 244454546/* A bitmask with bits enough for enum sh_dmae_slave_chan_id */4646-static unsigned long sh_dmae_slave_used[BITS_TO_LONGS(SHDMA_SLAVE_NUMBER)];4747+static unsigned long sh_dmae_slave_used[BITS_TO_LONGS(SH_DMA_SLAVE_NUMBER)];47484849static void sh_dmae_chan_ld_cleanup(struct sh_dmae_chan *sh_chan, bool all);4950···265266}266267267268static struct sh_dmae_slave_config *sh_dmae_find_slave(268268- struct sh_dmae_chan *sh_chan, enum sh_dmae_slave_chan_id slave_id)269269+ struct sh_dmae_chan *sh_chan, struct sh_dmae_slave *param)269270{270271 struct dma_device *dma_dev = sh_chan->common.device;271272 struct sh_dmae_device *shdev = container_of(dma_dev,···273274 struct sh_dmae_pdata *pdata = shdev->pdata;274275 int i;275276276276- if ((unsigned)slave_id >= SHDMA_SLAVE_NUMBER)277277+ if (param->slave_id >= SH_DMA_SLAVE_NUMBER)277278 return NULL;278279279280 for (i = 0; i < pdata->slave_num; i++)280280- if (pdata->slave[i].slave_id == slave_id)281281+ if (pdata->slave[i].slave_id == param->slave_id)281282 return pdata->slave + i;282283283284 return NULL;···298299 if (param) {299300 struct sh_dmae_slave_config *cfg;300301301301- cfg = sh_dmae_find_slave(sh_chan, param->slave_id);302302+ cfg = sh_dmae_find_slave(sh_chan, param);302303 if (!cfg)303304 return -EINVAL;304305
···82828383 /* Interface clock */8484 struct clk *iclk;8585- /* Data clock */8686- struct clk *dclk;8585+ /* Function clock */8686+ struct clk *fclk;87878888 struct list_head node;8989 struct dma_chan *chan_tx;9090 struct dma_chan *chan_rx;9191#ifdef CONFIG_SERIAL_SH_SCI_DMA9292 struct device *dma_dev;9393- enum sh_dmae_slave_chan_id slave_tx;9494- enum sh_dmae_slave_chan_id slave_rx;9393+ unsigned int slave_tx;9494+ unsigned int slave_rx;9595 struct dma_async_tx_descriptor *desc_tx;9696 struct dma_async_tx_descriptor *desc_rx[2];9797 dma_cookie_t cookie_tx;···106106 struct work_struct work_tx;107107 struct work_struct work_rx;108108 struct timer_list rx_timer;109109+ unsigned int rx_timeout;109110#endif110111};111112···674673 struct sci_port *s = to_sci_port(port);675674676675 if (s->chan_rx) {677677- unsigned long tout;678676 u16 scr = sci_in(port, SCSCR);679677 u16 ssr = sci_in(port, SCxSR);680678681679 /* Disable future Rx interrupts */682682- sci_out(port, SCSCR, scr & ~SCI_CTRL_FLAGS_RIE);680680+ if (port->type == PORT_SCIFA) {681681+ disable_irq_nosync(irq);682682+ scr |= 0x4000;683683+ } else {684684+ scr &= ~SCI_CTRL_FLAGS_RIE;685685+ }686686+ sci_out(port, SCSCR, scr);683687 /* Clear current interrupt */684688 sci_out(port, SCxSR, ssr & ~(1 | SCxSR_RDxF(port)));685685- /* Calculate delay for 1.5 DMA buffers */686686- tout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /687687- port->fifosize / 2;688688- dev_dbg(port->dev, "Rx IRQ: setup timeout in %lu ms\n",689689- tout * 1000 / HZ);690690- if (tout < 2)691691- tout = 2;692692- mod_timer(&s->rx_timer, jiffies + tout);689689+ dev_dbg(port->dev, "Rx IRQ %lu: setup t-out in %u jiffies\n",690690+ jiffies, s->rx_timeout);691691+ mod_timer(&s->rx_timer, jiffies + s->rx_timeout);693692694693 return IRQ_HANDLED;695694 }···799798 (phase == CPUFREQ_RESUMECHANGE)) {800799 spin_lock_irqsave(&priv->lock, flags);801800 list_for_each_entry(sci_port, &priv->ports, node)802802- sci_port->port.uartclk = clk_get_rate(sci_port->dclk);801801+ sci_port->port.uartclk = clk_get_rate(sci_port->iclk);803802 spin_unlock_irqrestore(&priv->lock, flags);804803 }805804···810809{811810 struct sci_port *sci_port = to_sci_port(port);812811813813- clk_enable(sci_port->dclk);814814- sci_port->port.uartclk = clk_get_rate(sci_port->dclk);815815-816816- if (sci_port->iclk)817817- clk_enable(sci_port->iclk);812812+ clk_enable(sci_port->iclk);813813+ sci_port->port.uartclk = clk_get_rate(sci_port->iclk);814814+ clk_enable(sci_port->fclk);818815}819816820817static void sci_clk_disable(struct uart_port *port)821818{822819 struct sci_port *sci_port = to_sci_port(port);823820824824- if (sci_port->iclk)825825- clk_disable(sci_port->iclk);826826-827827- clk_disable(sci_port->dclk);821821+ clk_disable(sci_port->fclk);822822+ clk_disable(sci_port->iclk);828823}829824830825static int sci_request_irq(struct sci_port *port)···909912910913 spin_lock_irqsave(&port->lock, flags);911914912912- xmit->tail += s->sg_tx.length;915915+ xmit->tail += sg_dma_len(&s->sg_tx);913916 xmit->tail &= UART_XMIT_SIZE - 1;914917915915- port->icount.tx += s->sg_tx.length;918918+ port->icount.tx += sg_dma_len(&s->sg_tx);916919917920 async_tx_ack(s->desc_tx);918921 s->cookie_tx = -EINVAL;919922 s->desc_tx = NULL;920923921921- spin_unlock_irqrestore(&port->lock, flags);922922-923924 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)924925 uart_write_wakeup(port);925926926926- if (uart_circ_chars_pending(xmit))927927+ if (!uart_circ_empty(xmit)) {927928 schedule_work(&s->work_tx);929929+ } else if (port->type == PORT_SCIFA) {930930+ u16 ctrl = sci_in(port, SCSCR);931931+ sci_out(port, SCSCR, ctrl & ~SCI_CTRL_FLAGS_TIE);932932+ }933933+934934+ spin_unlock_irqrestore(&port->lock, flags);928935}929936930937/* Locking: called with port lock held */···972971 unsigned long flags;973972 int count;974973975975- dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);974974+ dev_dbg(port->dev, "%s(%d) active #%d\n", __func__, port->line, s->active_rx);976975977976 spin_lock_irqsave(&port->lock, flags);978977979978 count = sci_dma_rx_push(s, tty, s->buf_len_rx);980979981981- mod_timer(&s->rx_timer, jiffies + msecs_to_jiffies(5));980980+ mod_timer(&s->rx_timer, jiffies + s->rx_timeout);982981983982 spin_unlock_irqrestore(&port->lock, flags);984983···10501049 sci_rx_dma_release(s, true);10511050 return;10521051 }10521052+ dev_dbg(s->port.dev, "%s(): cookie %d to #%d\n", __func__,10531053+ s->cookie_rx[i], i);10531054 }1054105510551056 s->active_rx = s->cookie_rx[0];···11091106 return;11101107 }1111110811121112- dev_dbg(port->dev, "%s: cookie %d #%d\n", __func__,11131113- s->cookie_rx[new], new);11141114-11151109 s->active_rx = s->cookie_rx[!new];11101110+11111111+ dev_dbg(port->dev, "%s: cookie %d #%d, new active #%d\n", __func__,11121112+ s->cookie_rx[new], new, s->active_rx);11161113}1117111411181115static void work_fn_tx(struct work_struct *work)···11331130 */11341131 spin_lock_irq(&port->lock);11351132 sg->offset = xmit->tail & (UART_XMIT_SIZE - 1);11361136- sg->dma_address = (sg_dma_address(sg) & ~(UART_XMIT_SIZE - 1)) +11331133+ sg_dma_address(sg) = (sg_dma_address(sg) & ~(UART_XMIT_SIZE - 1)) +11371134 sg->offset;11381138- sg->length = min((int)CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE),11351135+ sg_dma_len(sg) = min((int)CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE),11391136 CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE));11401140- sg->dma_length = sg->length;11411137 spin_unlock_irq(&port->lock);1142113811431143- BUG_ON(!sg->length);11391139+ BUG_ON(!sg_dma_len(sg));1144114011451141 desc = chan->device->device_prep_slave_sg(chan,11461142 sg, s->sg_len_tx, DMA_TO_DEVICE,···1174117211751173static void sci_start_tx(struct uart_port *port)11761174{11751175+ struct sci_port *s = to_sci_port(port);11771176 unsigned short ctrl;1178117711791178#ifdef CONFIG_SERIAL_SH_SCI_DMA11801180- struct sci_port *s = to_sci_port(port);11811181-11821182- if (s->chan_tx) {11831183- if (!uart_circ_empty(&s->port.state->xmit) && s->cookie_tx < 0)11841184- schedule_work(&s->work_tx);11851185-11861186- return;11791179+ if (port->type == PORT_SCIFA) {11801180+ u16 new, scr = sci_in(port, SCSCR);11811181+ if (s->chan_tx)11821182+ new = scr | 0x8000;11831183+ else11841184+ new = scr & ~0x8000;11851185+ if (new != scr)11861186+ sci_out(port, SCSCR, new);11871187 }11881188+ if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) &&11891189+ s->cookie_tx < 0)11901190+ schedule_work(&s->work_tx);11881191#endif11891189-11901190- /* Set TIE (Transmit Interrupt Enable) bit in SCSCR */11911191- ctrl = sci_in(port, SCSCR);11921192- ctrl |= SCI_CTRL_FLAGS_TIE;11931193- sci_out(port, SCSCR, ctrl);11921192+ if (!s->chan_tx || port->type == PORT_SCIFA) {11931193+ /* Set TIE (Transmit Interrupt Enable) bit in SCSCR */11941194+ ctrl = sci_in(port, SCSCR);11951195+ sci_out(port, SCSCR, ctrl | SCI_CTRL_FLAGS_TIE);11961196+ }11941197}1195119811961199static void sci_stop_tx(struct uart_port *port)···1204119712051198 /* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */12061199 ctrl = sci_in(port, SCSCR);12001200+ if (port->type == PORT_SCIFA)12011201+ ctrl &= ~0x8000;12071202 ctrl &= ~SCI_CTRL_FLAGS_TIE;12081203 sci_out(port, SCSCR, ctrl);12091204}···1216120712171208 /* Set RIE (Receive Interrupt Enable) bit in SCSCR */12181209 ctrl |= sci_in(port, SCSCR);12101210+ if (port->type == PORT_SCIFA)12111211+ ctrl &= ~0x4000;12191212 sci_out(port, SCSCR, ctrl);12201213}12211214···1227121612281217 /* Clear RIE (Receive Interrupt Enable) bit in SCSCR */12291218 ctrl = sci_in(port, SCSCR);12191219+ if (port->type == PORT_SCIFA)12201220+ ctrl &= ~0x4000;12301221 ctrl &= ~(SCI_CTRL_FLAGS_RIE | SCI_CTRL_FLAGS_REIE);12311222 sci_out(port, SCSCR, ctrl);12321223}···12631250{12641251 struct sci_port *s = (struct sci_port *)arg;12651252 struct uart_port *port = &s->port;12661266-12671253 u16 scr = sci_in(port, SCSCR);12541254+12551255+ if (port->type == PORT_SCIFA) {12561256+ scr &= ~0x4000;12571257+ enable_irq(s->irqs[1]);12581258+ }12681259 sci_out(port, SCSCR, scr | SCI_CTRL_FLAGS_RIE);12691260 dev_dbg(port->dev, "DMA Rx timed out\n");12701261 schedule_work(&s->work_rx);···13551338 sg_init_table(sg, 1);13561339 sg_set_page(sg, virt_to_page(buf[i]), s->buf_len_rx,13571340 (int)buf[i] & ~PAGE_MASK);13581358- sg->dma_address = dma[i];13591359- sg->dma_length = sg->length;13411341+ sg_dma_address(sg) = dma[i];13601342 }1361134313621344 INIT_WORK(&s->work_rx, work_fn_rx);···14181402static void sci_set_termios(struct uart_port *port, struct ktermios *termios,14191403 struct ktermios *old)14201404{14051405+#ifdef CONFIG_SERIAL_SH_SCI_DMA14061406+ struct sci_port *s = to_sci_port(port);14071407+#endif14211408 unsigned int status, baud, smr_val, max_baud;14221409 int t = -1;14101410+ u16 scfcr = 0;1423141114241412 /*14251413 * earlyprintk comes here early on with port->uartclk set to zero.···14461426 sci_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */1447142714481428 if (port->type != PORT_SCI)14491449- sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);14291429+ sci_out(port, SCFCR, scfcr | SCFCR_RFRST | SCFCR_TFRST);1450143014511431 smr_val = sci_in(port, SCSMR) & 3;14521432 if ((termios->c_cflag & CSIZE) == CS7)···14771457 }1478145814791459 sci_init_pins(port, termios->c_cflag);14801480- sci_out(port, SCFCR, (termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0);14601460+ sci_out(port, SCFCR, scfcr | ((termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0));1481146114821462 sci_out(port, SCSCR, SCSCR_INIT(port));14631463+14641464+#ifdef CONFIG_SERIAL_SH_SCI_DMA14651465+ /*14661466+ * Calculate delay for 1.5 DMA buffers: see14671467+ * drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits14681468+ * (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function14691469+ * calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)."14701470+ * Then below we calculate 3 jiffies (12ms) for 1.5 DMA buffers (3 FIFO14711471+ * sizes), but it has been found out experimentally, that this is not14721472+ * enough: the driver too often needlessly runs on a DMA timeout. 20ms14731473+ * as a minimum seem to work perfectly.14741474+ */14751475+ if (s->chan_rx) {14761476+ s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /14771477+ port->fifosize / 2;14781478+ dev_dbg(port->dev,14791479+ "DMA Rx t-out %ums, tty t-out %u jiffies\n",14801480+ s->rx_timeout * 1000 / HZ, port->timeout);14811481+ if (s->rx_timeout < msecs_to_jiffies(20))14821482+ s->rx_timeout = msecs_to_jiffies(20);14831483+ }14841484+#endif1483148514841486 if ((termios->c_cflag & CREAD) != 0)14851487 sci_start_rx(port);···15941552#endif15951553};1596155415971597-static void __devinit sci_init_single(struct platform_device *dev,15981598- struct sci_port *sci_port,15991599- unsigned int index,16001600- struct plat_sci_port *p)15551555+static int __devinit sci_init_single(struct platform_device *dev,15561556+ struct sci_port *sci_port,15571557+ unsigned int index,15581558+ struct plat_sci_port *p)16011559{16021560 struct uart_port *port = &sci_port->port;16031561···16181576 }1619157716201578 if (dev) {16211621- sci_port->iclk = p->clk ? clk_get(&dev->dev, p->clk) : NULL;16221622- sci_port->dclk = clk_get(&dev->dev, "peripheral_clk");15791579+ sci_port->iclk = clk_get(&dev->dev, "sci_ick");15801580+ if (IS_ERR(sci_port->iclk)) {15811581+ sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");15821582+ if (IS_ERR(sci_port->iclk)) {15831583+ dev_err(&dev->dev, "can't get iclk\n");15841584+ return PTR_ERR(sci_port->iclk);15851585+ }15861586+ }15871587+15881588+ /*15891589+ * The function clock is optional, ignore it if we can't15901590+ * find it.15911591+ */15921592+ sci_port->fclk = clk_get(&dev->dev, "sci_fck");15931593+ if (IS_ERR(sci_port->fclk))15941594+ sci_port->fclk = NULL;15951595+16231596 sci_port->enable = sci_clk_enable;16241597 sci_port->disable = sci_clk_disable;16251598 port->dev = &dev->dev;···16611604#endif1662160516631606 memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs));16071607+ return 0;16641608}1665160916661610#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE···18111753 cpufreq_unregister_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER);1812175418131755 spin_lock_irqsave(&priv->lock, flags);18141814- list_for_each_entry(p, &priv->ports, node)17561756+ list_for_each_entry(p, &priv->ports, node) {18151757 uart_remove_one_port(&sci_uart_driver, &p->port);17581758+ clk_put(p->iclk);17591759+ clk_put(p->fclk);17601760+ }18161761 spin_unlock_irqrestore(&priv->lock, flags);1817176218181763 kfree(priv);···18411780 return 0;18421781 }1843178218441844- sci_init_single(dev, sciport, index, p);17831783+ ret = sci_init_single(dev, sciport, index, p);17841784+ if (ret)17851785+ return ret;1845178618461787 ret = uart_add_one_port(&sci_uart_driver, &sciport->port);18471788 if (ret)
+93-2
drivers/sh/intc.c
···4444 unsigned long handle;4545};46464747+struct intc_window {4848+ phys_addr_t phys;4949+ void __iomem *virt;5050+ unsigned long size;5151+};5252+4753struct intc_desc_int {4854 struct list_head list;4955 struct sys_device sysdev;···6357 unsigned int nr_prio;6458 struct intc_handle_int *sense;6559 unsigned int nr_sense;6060+ struct intc_window *window;6161+ unsigned int nr_windows;6662 struct irq_chip chip;6763};6864···454446 return 0;455447}456448449449+static unsigned long intc_phys_to_virt(struct intc_desc_int *d,450450+ unsigned long address)451451+{452452+ struct intc_window *window;453453+ int k;454454+455455+ /* scan through physical windows and convert address */456456+ for (k = 0; k < d->nr_windows; k++) {457457+ window = d->window + k;458458+459459+ if (address < window->phys)460460+ continue;461461+462462+ if (address >= (window->phys + window->size))463463+ continue;464464+465465+ address -= window->phys;466466+ address += (unsigned long)window->virt;467467+468468+ return address;469469+ }470470+471471+ /* no windows defined, register must be 1:1 mapped virt:phys */472472+ return address;473473+}474474+457475static unsigned int __init intc_get_reg(struct intc_desc_int *d,458458- unsigned long address)476476+ unsigned long address)459477{460478 unsigned int k;479479+480480+ address = intc_phys_to_virt(d, address);461481462482 for (k = 0; k < d->nr_reg; k++) {463483 if (d->reg[k] == address)···836800 unsigned int smp)837801{838802 if (value) {803803+ value = intc_phys_to_virt(d, value);804804+839805 d->reg[cnt] = value;840806#ifdef CONFIG_SMP841807 d->smp[cnt] = smp;···853815 generic_handle_irq((unsigned int)get_irq_data(irq));854816}855817856856-void __init register_intc_controller(struct intc_desc *desc)818818+int __init register_intc_controller(struct intc_desc *desc)857819{858820 unsigned int i, k, smp;859821 struct intc_hw_desc *hw = &desc->hw;860822 struct intc_desc_int *d;823823+ struct resource *res;861824862825 d = kzalloc(sizeof(*d), GFP_NOWAIT);826826+ if (!d)827827+ goto err0;863828864829 INIT_LIST_HEAD(&d->list);865830 list_add(&d->list, &intc_list);831831+832832+ if (desc->num_resources) {833833+ d->nr_windows = desc->num_resources;834834+ d->window = kzalloc(d->nr_windows * sizeof(*d->window),835835+ GFP_NOWAIT);836836+ if (!d->window)837837+ goto err1;838838+839839+ for (k = 0; k < d->nr_windows; k++) {840840+ res = desc->resource + k;841841+ WARN_ON(resource_type(res) != IORESOURCE_MEM);842842+ d->window[k].phys = res->start;843843+ d->window[k].size = resource_size(res);844844+ d->window[k].virt = ioremap_nocache(res->start,845845+ resource_size(res));846846+ if (!d->window[k].virt)847847+ goto err2;848848+ }849849+ }866850867851 d->nr_reg = hw->mask_regs ? hw->nr_mask_regs * 2 : 0;868852 d->nr_reg += hw->prio_regs ? hw->nr_prio_regs * 2 : 0;···892832 d->nr_reg += hw->ack_regs ? hw->nr_ack_regs : 0;893833894834 d->reg = kzalloc(d->nr_reg * sizeof(*d->reg), GFP_NOWAIT);835835+ if (!d->reg)836836+ goto err2;837837+895838#ifdef CONFIG_SMP896839 d->smp = kzalloc(d->nr_reg * sizeof(*d->smp), GFP_NOWAIT);840840+ if (!d->smp)841841+ goto err3;897842#endif898843 k = 0;899844···913848 if (hw->prio_regs) {914849 d->prio = kzalloc(hw->nr_vectors * sizeof(*d->prio),915850 GFP_NOWAIT);851851+ if (!d->prio)852852+ goto err4;916853917854 for (i = 0; i < hw->nr_prio_regs; i++) {918855 smp = IS_SMP(hw->prio_regs[i]);···926859 if (hw->sense_regs) {927860 d->sense = kzalloc(hw->nr_vectors * sizeof(*d->sense),928861 GFP_NOWAIT);862862+ if (!d->sense)863863+ goto err5;929864930865 for (i = 0; i < hw->nr_sense_regs; i++)931866 k += save_reg(d, k, hw->sense_regs[i].reg, 0);···1010941 /* enable bits matching force_enable after registering irqs */1011942 if (desc->force_enable)1012943 intc_enable_disable_enum(desc, d, desc->force_enable, 1);944944+945945+ return 0;946946+err5:947947+ kfree(d->prio);948948+err4:949949+#ifdef CONFIG_SMP950950+ kfree(d->smp);951951+err3:952952+#endif953953+ kfree(d->reg);954954+err2:955955+ for (k = 0; k < d->nr_windows; k++)956956+ if (d->window[k].virt)957957+ iounmap(d->window[k].virt);958958+959959+ kfree(d->window);960960+err1:961961+ kfree(d);962962+err0:963963+ pr_err("unable to allocate INTC memory\n");964964+965965+ return -ENOMEM;1013966}10149671015968static int intc_suspend(struct sys_device *dev, pm_message_t state)
+4
include/linux/device.h
···451451452452static inline const char *dev_name(const struct device *dev)453453{454454+ /* Use the init name until the kobject becomes available */455455+ if (dev->init_name)456456+ return dev->init_name;457457+454458 return kobject_name(&dev->kobj);455459}456460
···11+/*22+ * Header for the new SH dmaengine driver33+ *44+ * Copyright (C) 2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License version 2 as88+ * published by the Free Software Foundation.99+ */1010+#ifndef SH_DMA_H1111+#define SH_DMA_H1212+1313+#include <linux/list.h>1414+#include <linux/dmaengine.h>1515+1616+/* Used by slave DMA clients to request DMA to/from a specific peripheral */1717+struct sh_dmae_slave {1818+ unsigned int slave_id; /* Set by the platform */1919+ struct device *dma_dev; /* Set by the platform */2020+ struct sh_dmae_slave_config *config; /* Set by the driver */2121+};2222+2323+struct sh_dmae_regs {2424+ u32 sar; /* SAR / source address */2525+ u32 dar; /* DAR / destination address */2626+ u32 tcr; /* TCR / transfer count */2727+};2828+2929+struct sh_desc {3030+ struct sh_dmae_regs hw;3131+ struct list_head node;3232+ struct dma_async_tx_descriptor async_tx;3333+ enum dma_data_direction direction;3434+ dma_cookie_t cookie;3535+ size_t partial;3636+ int chunks;3737+ int mark;3838+};3939+struct sh_dmae_slave_config {4040+ unsigned int slave_id;4141+ dma_addr_t addr;4242+ u32 chcr;4343+ char mid_rid;4444+};4545+4646+struct sh_dmae_channel {4747+ unsigned int offset;4848+ unsigned int dmars;4949+ unsigned int dmars_bit;5050+};5151+5252+struct sh_dmae_pdata {5353+ struct sh_dmae_slave_config *slave;5454+ int slave_num;5555+ struct sh_dmae_channel *channel;5656+ int channel_num;5757+ unsigned int ts_low_shift;5858+ unsigned int ts_low_mask;5959+ unsigned int ts_high_shift;6060+ unsigned int ts_high_mask;6161+ unsigned int *ts_shift;6262+ int ts_shift_num;6363+ u16 dmaor_init;6464+};6565+6666+/* DMA register */6767+#define SAR 0x006868+#define DAR 0x046969+#define TCR 0x087070+#define CHCR 0x0C7171+#define DMAOR 0x407272+7373+/* DMAOR definitions */7474+#define DMAOR_AE 0x000000047575+#define DMAOR_NMIF 0x000000027676+#define DMAOR_DME 0x000000017777+7878+/* Definitions for the SuperH DMAC */7979+#define REQ_L 0x000000008080+#define REQ_E 0x000800008181+#define RACK_H 0x000000008282+#define RACK_L 0x000400008383+#define ACK_R 0x000000008484+#define ACK_W 0x000200008585+#define ACK_H 0x000000008686+#define ACK_L 0x000100008787+#define DM_INC 0x000040008888+#define DM_DEC 0x000080008989+#define DM_FIX 0x0000c0009090+#define SM_INC 0x000010009191+#define SM_DEC 0x000020009292+#define SM_FIX 0x000030009393+#define RS_IN 0x000002009494+#define RS_OUT 0x000003009595+#define TS_BLK 0x000000409696+#define TM_BUR 0x000000209797+#define CHCR_DE 0x000000019898+#define CHCR_TE 0x000000029999+#define CHCR_IE 0x00000004100100+101101+#endif