s390 patches for the 3.16-rc2
Subsystems (4)
Hi Linus,
please pull from the 'for-linus' branch of
git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git for-linus
to receive the following updates:
A couple of bug fixes, a debug change for qdio, an update for the default config, and one small extension.
The watchdog module based on diagnose 0x288 is converted to the watchdog API and it now works under LPAR as well.
Fabian Frederick (1):
s390/qdio: replace shift loop by ilog2
Heiko Carstens (1):
s390: update default configuration
Kees Cook (1):
s390: avoid format strings leaking into names
Martin Schwidefsky (2):
s390/uaccess: always load the kernel ASCE after task switch s390/compat: correct ucontext layout for high gprs
Michael Veigel (1):
s390/ap_bus: Make modules parameters visible in sysfs
Peter Oberparleiter (1):
s390/sclp_vt220: Enable ASCII console per default
Philipp Hachtmann (2):
s390/watchdog: use watchdog API s390/watchdog: add support for LPAR operation (diag288)
Sebastian Ott (6):
s390/cio: silence lockdep warning
s390/airq: silence lockdep warning
s390/cio: set device name as early as possible s390/ccwgroup: obtain extra reference for asynchronous processing s390/ccwgroup: fix an uninitialized return code s390/ccwgroup: use ccwgroup_ungroup wrapper
Stefan Raspl (1):
qdio: Keep device-specific dbf entries
arch/s390/configs/default_defconfig | 5 +- arch/s390/configs/gcov_defconfig | 5 +- arch/s390/configs/performance_defconfig | 5 +- arch/s390/configs/zfcpdump_defconfig | 3 +- arch/s390/defconfig | 8 +- arch/s390/include/asm/mmu_context.h | 33 ++- arch/s390/include/asm/switch_to.h | 4 - arch/s390/include/uapi/asm/ucontext.h | 8 +- arch/s390/kernel/compat_linux.h | 4 +- drivers/s390/block/dcssblk.c | 2 +- drivers/s390/char/Makefile | 1 - drivers/s390/char/sclp_vt220.c | 2 - drivers/s390/char/vmlogrdr.c | 2 +- drivers/s390/char/vmwatchdog.c | 338 ------------------------------- drivers/s390/cio/airq.c | 13 +- drivers/s390/cio/ccwgroup.c | 28 +-- drivers/s390/cio/cio.c | 2 + drivers/s390/cio/device.c | 71 +++---- drivers/s390/cio/qdio_debug.c | 79 +++++++- drivers/s390/cio/qdio_debug.h | 2 +- drivers/s390/cio/qdio_main.c | 16 +- drivers/s390/crypto/ap_bus.c | 4 +- drivers/s390/crypto/zcrypt_api.c | 2 +- drivers/watchdog/Kconfig | 7 +- drivers/watchdog/Makefile | 1 + drivers/watchdog/diag288_wdt.c | 316 +++++++++++++++++++++++++++++ 26 files changed, 505 insertions(+), 456 deletions(-) delete mode 100644 drivers/s390/char/vmwatchdog.c create mode 100644 drivers/watchdog/diag288_wdt.c
arch/s390/configs/default_defconfig +3 -2
@@ -45,7 +45,8 @@ CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_CFQ_GROUP_IOSCHED=y CONFIG_DEFAULT_DEADLINE=y -CONFIG_MARCH_Z9_109=y +CONFIG_MARCH_Z196=y +CONFIG_TUNE_ZEC12=y CONFIG_NR_CPUS=256 CONFIG_PREEMPT=y CONFIG_HZ_100=y
@@ -240,7 +241,6 @@ CONFIG_IP_VS_PE_SIP=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_CONNTRACK_PROC_COMPAT is not set CONFIG_NF_TABLES_IPV4=m -CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NF_TABLES_ARP=m
@@ -456,6 +456,7 @@ CONFIG_TN3270_FS=y CONFIG_WATCHDOG=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_SOFT_WATCHDOG=m +CONFIG_DIAG288_WATCHDOG=m # CONFIG_HID is not set # CONFIG_USB_SUPPORT is not set CONFIG_INFINIBAND=m
arch/s390/configs/gcov_defconfig +3 -2
@@ -45,7 +45,8 @@ CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_CFQ_GROUP_IOSCHED=y CONFIG_DEFAULT_DEADLINE=y -CONFIG_MARCH_Z9_109=y +CONFIG_MARCH_Z196=y +CONFIG_TUNE_ZEC12=y CONFIG_NR_CPUS=256 CONFIG_HZ_100=y CONFIG_MEMORY_HOTPLUG=y
@@ -238,7 +239,6 @@ CONFIG_IP_VS_PE_SIP=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_CONNTRACK_PROC_COMPAT is not set CONFIG_NF_TABLES_IPV4=m -CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NF_TABLES_ARP=m
@@ -453,6 +453,7 @@ CONFIG_TN3270_FS=y CONFIG_WATCHDOG=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_SOFT_WATCHDOG=m +CONFIG_DIAG288_WATCHDOG=m # CONFIG_HID is not set # CONFIG_USB_SUPPORT is not set CONFIG_INFINIBAND=m
arch/s390/configs/performance_defconfig +3 -2
@@ -43,7 +43,8 @@ CONFIG_SOLARIS_X86_PARTITION=y CONFIG_UNIXWARE_DISKLABEL=y CONFIG_CFQ_GROUP_IOSCHED=y CONFIG_DEFAULT_DEADLINE=y -CONFIG_MARCH_Z9_109=y +CONFIG_MARCH_Z196=y +CONFIG_TUNE_ZEC12=y CONFIG_NR_CPUS=256 CONFIG_HZ_100=y CONFIG_MEMORY_HOTPLUG=y
@@ -236,7 +237,6 @@ CONFIG_IP_VS_PE_SIP=m CONFIG_NF_CONNTRACK_IPV4=m # CONFIG_NF_CONNTRACK_PROC_COMPAT is not set CONFIG_NF_TABLES_IPV4=m -CONFIG_NFT_REJECT_IPV4=m CONFIG_NFT_CHAIN_ROUTE_IPV4=m CONFIG_NFT_CHAIN_NAT_IPV4=m CONFIG_NF_TABLES_ARP=m
@@ -451,6 +451,7 @@ CONFIG_TN3270_FS=y CONFIG_WATCHDOG=y CONFIG_WATCHDOG_NOWAYOUT=y CONFIG_SOFT_WATCHDOG=m +CONFIG_DIAG288_WATCHDOG=m # CONFIG_HID is not set # CONFIG_USB_SUPPORT is not set CONFIG_INFINIBAND=m
arch/s390/configs/zfcpdump_defconfig +2 -1
@@ -8,7 +8,8 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_PARTITION_ADVANCED=y CONFIG_IBM_PARTITION=y CONFIG_DEFAULT_DEADLINE=y -CONFIG_MARCH_Z9_109=y +CONFIG_MARCH_Z196=y +CONFIG_TUNE_ZEC12=y # CONFIG_COMPAT is not set CONFIG_NR_CPUS=2 # CONFIG_HOTPLUG_CPU is not set
arch/s390/defconfig +7 -1
@@ -135,8 +135,8 @@ CONFIG_PROVE_LOCKING=y CONFIG_LOCK_STAT=y CONFIG_DEBUG_LOCKDEP=y CONFIG_DEBUG_ATOMIC_SLEEP=y -CONFIG_DEBUG_WRITECOUNT=y CONFIG_DEBUG_LIST=y +CONFIG_DEBUG_PI_LIST=y CONFIG_DEBUG_SG=y CONFIG_DEBUG_NOTIFIERS=y CONFIG_PROVE_RCU=y
@@ -199,4 +199,10 @@ CONFIG_CRYPTO_SHA512_S390=m CONFIG_CRYPTO_DES_S390=m CONFIG_CRYPTO_AES_S390=m CONFIG_CRC7=m +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_IA64 is not set +# CONFIG_XZ_DEC_ARM is not set +# CONFIG_XZ_DEC_ARMTHUMB is not set +# CONFIG_XZ_DEC_SPARC is not set CONFIG_CMM=m
arch/s390/include/asm/mmu_context.h +16 -17
@@ -33,10 +33,9 @@ static inline int init_new_context(struct task_struct *tsk,static inline void set_user_asce (struct mm_struct *mm) { -pgd_t *pgd = mm->pgd; - - S390_lowcore.user_asce = mm->context.asce_bits |__pa (pgd); -set_fs (current->thread.mm_segment); + S390_lowcore.user_asce = mm->context.asce_bits |__pa (mm->pgd); +if (current->thread.mm_segment.ar4) +__ctl_load (S390_lowcore.user_asce,7 ,7 );set_cpu_flag (CIF_ASCE ); }
@@ -70,12 +69,11 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,/* Clear old ASCE by loading the kernel ASCE. */ __ctl_load (S390_lowcore.kernel_asce,1 ,1 );__ctl_load (S390_lowcore.kernel_asce,7 ,7 ); -/* Delay loading of the new ASCE to control registers CR1 & CR7 */ -set_cpu_flag (CIF_ASCE );atomic_inc (&next->context.attach_count);atomic_dec (&prev->context.attach_count);if (MACHINE_HAS_TLB_LC )cpumask_clear_cpu (cpu, &prev->context.cpu_attach_mask); + S390_lowcore.user_asce = next->context.asce_bits |__pa (next->pgd); }#define finish_arch_post_lock_switch finish_arch_post_lock_switch
@@ -84,17 +82,18 @@ static inline void finish_arch_post_lock_switch(void)struct task_struct *tsk = current;struct mm_struct *mm = tsk->mm; -if (!mm) -return ; -preempt_disable (); -while (atomic_read (&mm->context.attach_count) >>16 ) -cpu_relax (); - -cpumask_set_cpu (smp_processor_id (),mm_cpumask (mm)); -set_user_asce (mm); -if (mm->context.flush_mm) -__tlb_flush_mm (mm); -preempt_enable (); +load_kernel_asce (); +if (mm) { +preempt_disable (); +while (atomic_read (&mm->context.attach_count) >>16 ) +cpu_relax (); + +cpumask_set_cpu (smp_processor_id (),mm_cpumask (mm)); +if (mm->context.flush_mm) +__tlb_flush_mm (mm); +preempt_enable (); + } +set_fs (current->thread.mm_segment); }#define enter_lazy_tlb (mm,tsk) do { } while (0)
arch/s390/include/asm/switch_to.h +0 -4
@@ -134,8 +134,4 @@ static inline void restore_access_regs(unsigned int *acrs) prev =__switch_to (prev,next); \ } while (0) -#define finish_arch_switch (prev) do { \ - set_fs(current->thread.mm_segment); \ -} while (0) -#endif /* __ASM_SWITCH_TO_H */
arch/s390/include/uapi/asm/ucontext.h +6 -2
@@ -16,7 +16,9 @@ struct ucontext_extended {struct ucontext *uc_link;stack_t uc_stack;_sigregs uc_mcontext; -unsigned long uc_sigmask[2 ]; +sigset_t uc_sigmask; +/* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ +unsigned char __unused[128 -sizeof (sigset_t)];unsigned long uc_gprs_high[16 ]; };
@@ -27,7 +29,9 @@ struct ucontext {struct ucontext *uc_link;stack_t uc_stack;_sigregs uc_mcontext; - sigset_t uc_sigmask; /* mask last for extensibility */ +sigset_t uc_sigmask; +/* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ + unsigned char __unused[128 - sizeof(sigset_t)]; };#endif /* !_ASM_S390_UCONTEXT_H */
arch/s390/kernel/compat_linux.h +3 -1
@@ -69,7 +69,9 @@ struct ucontext32 {__u32 uc_link;/* pointer */ compat_stack_t uc_stack;_sigregs32 uc_mcontext; -compat_sigset_t uc_sigmask;/* mask last for extensibility */ +compat_sigset_t uc_sigmask; +/* Allow for uc_sigmask growth. Glibc uses a 1024-bit sigset_t. */ +unsigned char __unused[128 -sizeof (compat_sigset_t)]; };struct stat64_emu31 ;
drivers/s390/block/dcssblk.c +1 -1
@@ -593,7 +593,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char dev_info->start =dcssblk_find_lowest_addr (dev_info); dev_info->end =dcssblk_find_highest_addr (dev_info); -dev_set_name (&dev_info->dev, dev_info->segment_name); +dev_set_name (&dev_info->dev,"%s" , dev_info->segment_name); dev_info->dev.release = dcssblk_release_segment; dev_info->dev.groups = dcssblk_dev_attr_groups;INIT_LIST_HEAD (&dev_info->lh);
drivers/s390/char/Makefile +0 -1
@@ -19,7 +19,6 @@ obj-$(CONFIG_SCLP_VT220_TTY) += sclp_vt220.o obj-$(CONFIG_SCLP_CPI) += sclp_cpi.o obj-$(CONFIG_SCLP_ASYNC) += sclp_async.o -obj-$(CONFIG_ZVM_WATCHDOG) += vmwatchdog.o obj-$(CONFIG_VMLOGRDR) += vmlogrdr.o obj-$(CONFIG_VMCP) += vmcp.o
drivers/s390/char/sclp_vt220.c +0 -2
@@ -838,8 +838,6 @@ sclp_vt220_con_init(void) {int rc; -if (!CONSOLE_IS_SCLP ) -return 0 ; rc =__sclp_vt220_init (sclp_console_pages);if (rc)return rc;
drivers/s390/char/vmlogrdr.c +1 -1
@@ -761,7 +761,7 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv) dev =kzalloc (sizeof (struct device ),GFP_KERNEL );if (dev) { -dev_set_name (dev, priv->internal_name); +dev_set_name (dev,"%s" , priv->internal_name); dev->bus = &iucv_bus; dev->parent = iucv_root; dev->driver = &vmlogrdr_driver;
drivers/s390/char/vmwatchdog.c deleted +0 -338
338 lines not on this page · raw message
drivers/s390/cio/airq.c +6 -7
@@ -196,11 +196,11 @@ EXPORT_SYMBOL(airq_iv_release);*/ unsigned long airq_iv_alloc (struct airq_iv *iv,unsigned long num) { -unsigned long bit, i; +unsigned long bit, i, flags;if (!iv->avail || num ==0 )return -1UL ; -spin_lock (&iv->lock); +spin_lock_irqsave (&iv->lock, flags); bit =find_first_bit_inv (iv->avail, iv->bits);while (bit + num <= iv->bits) {for (i =1 ; i < num; i++)
@@ -218,9 +218,8 @@ unsigned long airq_iv_alloc(struct airq_iv *iv, unsigned long num) }if (bit + num > iv->bits) bit =-1UL ; -spin_unlock (&iv->lock); +spin_unlock_irqrestore (&iv->lock, flags);return bit; - }EXPORT_SYMBOL (airq_iv_alloc);
@@ -232,11 +231,11 @@ EXPORT_SYMBOL(airq_iv_alloc);*/ void airq_iv_free (struct airq_iv *iv,unsigned long bit,unsigned long num) { -unsigned long i; +unsigned long i, flags;if (!iv->avail || num ==0 )return ; -spin_lock (&iv->lock); +spin_lock_irqsave (&iv->lock, flags);for (i =0 ; i < num; i++) {/* Clear (possibly left over) interrupt bit */ clear_bit_inv (bit + i, iv->vector);
@@ -248,7 +247,7 @@ void airq_iv_free(struct airq_iv *iv, unsigned long bit, unsigned long num)while (iv->end >0 && !test_bit_inv (iv->end -1 , iv->avail)) iv->end--; } -spin_unlock (&iv->lock); +spin_unlock_irqrestore (&iv->lock, flags); }EXPORT_SYMBOL (airq_iv_free);
drivers/s390/cio/ccwgroup.c +11 -17
@@ -184,7 +184,7 @@ static ssize_t ccwgroup_ungroup_store(struct device *dev, const char *buf, size_t count) {struct ccwgroup_device *gdev =to_ccwgroupdev (dev); -int rc; +int rc =0 ;/* Prevent concurrent online/offline processing and ungrouping. */ if (atomic_cmpxchg (&gdev->onoff,0 ,1 ) !=0 )
@@ -196,11 +196,12 @@ static ssize_t ccwgroup_ungroup_store(struct device *dev,if (device_remove_file_self (dev, attr))ccwgroup_ungroup (gdev); +else + rc = -ENODEV ; out:if (rc) { -if (rc != -EAGAIN ) -/* Release onoff "lock" when ungrouping failed. */ -atomic_set (&gdev->onoff,0 ); +/* Release onoff "lock" when ungrouping failed. */ +atomic_set (&gdev->onoff,0 );return rc; }return count;
@@ -227,6 +228,7 @@ static void ccwgroup_ungroup_workfn(struct work_struct *work) container_of(work, struct ccwgroup_device, ungroup_work);ccwgroup_ungroup (gdev); +put_device (&gdev->dev); }static void ccwgroup_release (struct device *dev)
@@ -412,8 +414,10 @@ static int ccwgroup_notifier(struct notifier_block *nb, unsigned long action, {struct ccwgroup_device *gdev =to_ccwgroupdev (data); -if (action ==BUS_NOTIFY_UNBIND_DRIVER ) +if (action ==BUS_NOTIFY_UNBIND_DRIVER ) { +get_device (&gdev->dev);schedule_work (&gdev->ungroup_work); + }return NOTIFY_OK ; }
@@ -582,11 +586,7 @@ void ccwgroup_driver_unregister(struct ccwgroup_driver *cdriver) __ccwgroup_match_all))) {struct ccwgroup_device *gdev =to_ccwgroupdev (dev); -mutex_lock (&gdev->reg_mutex); -__ccwgroup_remove_symlinks (gdev); -device_unregister (dev); -__ccwgroup_remove_cdev_refs (gdev); -mutex_unlock (&gdev->reg_mutex); +ccwgroup_ungroup (gdev);put_device (dev); }driver_unregister (&cdriver->driver);
@@ -633,13 +633,7 @@ void ccwgroup_remove_ccwdev(struct ccw_device *cdev)get_device (&gdev->dev);spin_unlock_irq (cdev->ccwlock);/* Unregister group device. */ -mutex_lock (&gdev->reg_mutex); -if (device_is_registered (&gdev->dev)) { -__ccwgroup_remove_symlinks (gdev); -device_unregister (&gdev->dev); -__ccwgroup_remove_cdev_refs (gdev); - } -mutex_unlock (&gdev->reg_mutex); +ccwgroup_ungroup (gdev);/* Release ccwgroup device reference for local processing. */ put_device (&gdev->dev); }
drivers/s390/cio/cio.c +2 -0
@@ -602,6 +602,7 @@ void __init init_cio_interrupts(void)#ifdef CONFIG_CCW_CONSOLE static struct subchannel *console_sch; +static struct lock_class_key console_sch_key;/* * Use cio_tsch to update the subchannel status and call the interrupt handler
@@ -686,6 +687,7 @@ struct subchannel *cio_probe_console(void)if (IS_ERR (sch))return sch; +lockdep_set_class (sch->lock, &console_sch_key);isc_register (CONSOLE_ISC ); sch->config.isc =CONSOLE_ISC ; sch->config.intparm = (u32 )(addr_t )sch;
drivers/s390/cio/device.c +36 -35
136 lines not on this page · raw message
drivers/s390/cio/qdio_debug.c +72 -7
106 lines not on this page · raw message
drivers/s390/cio/qdio_debug.h +1 -1
@@ -75,7 +75,7 @@ static inline void DBF_DEV_HEX(struct qdio_irq *dev, void *addr, } } -void qdio_allocate_dbf (struct qdio_initialize *init_data, +int qdio_allocate_dbf (struct qdio_initialize *init_data,struct qdio_irq *irq_ptr);void qdio_setup_debug_entries (struct qdio_irq *irq_ptr,struct ccw_device *cdev);
drivers/s390/cio/qdio_main.c +7 -9
@@ -409,17 +409,16 @@ static inline void qdio_stop_polling(struct qdio_q *q)set_buf_state (q, q->u.in.ack_start,SLSB_P_INPUT_NOT_INIT ); } -static inline void account_sbals (struct qdio_q *q,int count) +static inline void account_sbals (struct qdio_q *q,unsigned int count) { -int pos =0 ; +int pos; q->q_stats.nr_sbal_total += count;if (count ==QDIO_MAX_BUFFERS_MASK ) { q->q_stats.nr_sbals[7 ]++;return ; } -while (count >>=1 ) - pos++; + pos =ilog2 (count); q->q_stats.nr_sbals[pos]++; }
@@ -1234,12 +1233,10 @@ int qdio_free(struct ccw_device *cdev)return -ENODEV ;DBF_EVENT ("qfree:%4x" , cdev->private->schid.sch_no); +DBF_DEV_EVENT (DBF_ERR , irq_ptr,"dbf abandoned" );mutex_lock (&irq_ptr->setup_mutex); -if (irq_ptr->debug_area !=NULL ) { -debug_unregister (irq_ptr->debug_area); - irq_ptr->debug_area =NULL ; - } + irq_ptr->debug_area =NULL ; cdev->private->qdio_data =NULL ;mutex_unlock (&irq_ptr->setup_mutex);
@@ -1276,7 +1273,8 @@ int qdio_allocate(struct qdio_initialize *init_data) goto out_err;mutex_init (&irq_ptr->setup_mutex); -qdio_allocate_dbf (init_data, irq_ptr); +if (qdio_allocate_dbf (init_data, irq_ptr)) + goto out_rel;/* * Allocate a page for the chsc calls in qdio_establish.
drivers/s390/crypto/ap_bus.c +2 -2
@@ -77,12 +77,12 @@ MODULE_ALIAS("z90crypt");* Module parameter */ int ap_domain_index =-1 ;/* Adjunct Processor Domain Index */ -module_param_named (domain, ap_domain_index, int,0000 ); +module_param_named (domain, ap_domain_index, int,S_IRUSR |S_IRGRP );MODULE_PARM_DESC (domain,"domain index for ap devices" );EXPORT_SYMBOL (ap_domain_index);static int ap_thread_flag =0 ; -module_param_named (poll_thread, ap_thread_flag, int,0000 ); +module_param_named (poll_thread, ap_thread_flag, int,S_IRUSR |S_IRGRP );MODULE_PARM_DESC (poll_thread,"Turn on/off poll thread, default is 0 (off)." );static struct device *ap_root_device =NULL ;
drivers/s390/crypto/zcrypt_api.c +1 -1
@@ -356,7 +356,7 @@ struct zcrypt_ops *zcrypt_msgtype_request(unsigned char *name, int variant) zops =__ops_lookup (name, variant);if (!zops) { -request_module (name); +request_module ("%s" , name); zops =__ops_lookup (name, variant); }if ((!zops) || (!try_module_get (zops->owner)))
drivers/watchdog/Kconfig +5 -2
@@ -1295,14 +1295,17 @@ config WATCHDOG_RTAS # S390 Architecture -config ZVM_WATCHDOG - tristate "z/VM Watchdog Timer" +config DIAG288_WATCHDOG + tristate "System z diag288 Watchdog" depends on S390 + select WATCHDOG_CORE help IBM s/390 and zSeries machines running under z/VM 5.1 or later provide a virtual watchdog timer to their guest that cause a user define Control Program command to be executed after a timeout. + LPAR provides a very similar interface. This driver handles + both. To compile this driver as a module, choose M here. The module will be called vmwatchdog.
drivers/watchdog/Makefile +1 -0
@@ -154,6 +154,7 @@ obj-$(CONFIG_MEN_A21_WDT) += mena21_wdt.o obj-$(CONFIG_WATCHDOG_RTAS) += wdrtas.o # S390 Architecture +obj-$(CONFIG_DIAG288_WATCHDOG) += diag288_wdt.o # SUPERH (sh + sh64) Architecture obj-$(CONFIG_SH_WDT) += shwdt.o
drivers/watchdog/diag288_wdt.c new file +316 -0
316 lines not on this page · raw message