From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758360AbbEaBVi (ORCPT ); Sat, 30 May 2015 21:21:38 -0400 Received: from kvm5.telegraphics.com.au ([98.124.60.144]:47144 "EHLO kvm5.telegraphics.com.au" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754515AbbEaBQ7 (ORCPT ); Sat, 30 May 2015 21:16:59 -0400 Message-Id: <20150531010133.389476177@telegraphics.com.au> User-Agent: quilt/0.50-1 Date: Sun, 31 May 2015 11:01:36 +1000 From: Finn Thain To: , , , Geert Uytterhoeven , Michael Schmitz , "James E.J. Bottomley" , linux-scsi@vger.kernel.org Subject: [RFC 04/24] m68k/atari: Replace nvram_{read,write}_byte with arch_nvram_ops References: <20150531010132.289674310@telegraphics.com.au> Content-Disposition: inline; filename=atari_scsi-convert-to-nvram_ops Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org By implementing an arch_nvram_ops struct, any platform can re-use the drivers/char/nvram module without needing any arch-specific code in that module. Atari does so here. Atari has one user of nvram_check_checksum() whereas the other platforms (i.e. x86 and ARM platforms) have none at all. Replace this validate-checksum-and-read-byte sequence with the equivalent rtc_nvram_ops.read() call and remove the now unused functions. Signed-off-by: Finn Thain --- The advantage of the new ops struct over the old global nvram_* functions is that the misc device module can be shared by different platforms without requiring every platform to implement every nvram_* function. E.g. only RTC "CMOS" NVRAMs have a checksum and only PowerPC platforms have a "sync" ioctl. --- arch/m68k/atari/nvram.c | 89 ++++++++++++++++++++++++++++------------------ drivers/scsi/atari_scsi.c | 8 ++-- include/linux/nvram.h | 9 ++++ 3 files changed, 70 insertions(+), 36 deletions(-) Index: linux/arch/m68k/atari/nvram.c =================================================================== --- linux.orig/arch/m68k/atari/nvram.c 2015-05-31 11:01:01.000000000 +1000 +++ linux/arch/m68k/atari/nvram.c 2015-05-31 11:01:03.000000000 +1000 @@ -38,33 +38,12 @@ unsigned char __nvram_read_byte(int i) return CMOS_READ(NVRAM_FIRST_BYTE + i); } -unsigned char nvram_read_byte(int i) -{ - unsigned long flags; - unsigned char c; - - spin_lock_irqsave(&rtc_lock, flags); - c = __nvram_read_byte(i); - spin_unlock_irqrestore(&rtc_lock, flags); - return c; -} -EXPORT_SYMBOL(nvram_read_byte); - /* This races nicely with trying to read with checksum checking */ void __nvram_write_byte(unsigned char c, int i) { CMOS_WRITE(c, NVRAM_FIRST_BYTE + i); } -void nvram_write_byte(unsigned char c, int i) -{ - unsigned long flags; - - spin_lock_irqsave(&rtc_lock, flags); - __nvram_write_byte(c, i); - spin_unlock_irqrestore(&rtc_lock, flags); -} - /* On Ataris, the checksum is over all bytes except the checksum bytes * themselves; these are at the very end. */ @@ -83,18 +62,6 @@ int __nvram_check_checksum(void) (__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff)); } -int nvram_check_checksum(void) -{ - unsigned long flags; - int rv; - - spin_lock_irqsave(&rtc_lock, flags); - rv = __nvram_check_checksum(); - spin_unlock_irqrestore(&rtc_lock, flags); - return rv; -} -EXPORT_SYMBOL(nvram_check_checksum); - static void __nvram_set_checksum(void) { int i; @@ -106,6 +73,62 @@ static void __nvram_set_checksum(void) __nvram_write_byte(sum, ATARI_CKS_LOC + 1); } +static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos) +{ + char *p = buf; + loff_t i; + + spin_lock_irq(&rtc_lock); + + if (!__nvram_check_checksum()) { + spin_unlock_irq(&rtc_lock); + return -EIO; + } + + for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p) + *p = __nvram_read_byte(i); + + spin_unlock_irq(&rtc_lock); + + *ppos = i; + return p - buf; +} + +static ssize_t nvram_write(char *buf, size_t count, loff_t *ppos) +{ + char *p = buf; + loff_t i; + + spin_lock_irq(&rtc_lock); + + if (!__nvram_check_checksum()) { + spin_unlock_irq(&rtc_lock); + return -EIO; + } + + for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p) + __nvram_write_byte(*p, i); + + __nvram_set_checksum(); + + spin_unlock_irq(&rtc_lock); + + *ppos = i; + return p - buf; +} + +static ssize_t nvram_get_size(void) +{ + return NVRAM_BYTES; +} + +const struct nvram_ops arch_nvram_ops = { + .read = nvram_read, + .write = nvram_write, + .get_size = nvram_get_size, +}; +EXPORT_SYMBOL(arch_nvram_ops); + #ifdef CONFIG_PROC_FS static struct { unsigned char val; Index: linux/drivers/scsi/atari_scsi.c =================================================================== --- linux.orig/drivers/scsi/atari_scsi.c 2015-05-31 11:01:00.000000000 +1000 +++ linux/drivers/scsi/atari_scsi.c 2015-05-31 11:01:03.000000000 +1000 @@ -880,13 +880,15 @@ static int __init atari_scsi_probe(struc #ifdef CONFIG_NVRAM else /* Test if a host id is set in the NVRam */ - if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) { - unsigned char b = nvram_read_byte(14); + if (ATARIHW_PRESENT(TT_CLK)) { + unsigned char b; + loff_t offset = 14; + ssize_t count = arch_nvram_ops.read(&b, 1, &offset); /* Arbitration enabled? (for TOS) * If yes, use configured host ID */ - if (b & 0x80) + if ((count == 1) && (b & 0x80)) atari_scsi_template.this_id = b & 7; } #endif Index: linux/include/linux/nvram.h =================================================================== --- linux.orig/include/linux/nvram.h 2015-05-31 11:00:59.000000000 +1000 +++ linux/include/linux/nvram.h 2015-05-31 11:01:03.000000000 +1000 @@ -10,4 +10,13 @@ extern void __nvram_write_byte(unsigned extern void nvram_write_byte(unsigned char c, int i); extern int __nvram_check_checksum(void); extern int nvram_check_checksum(void); + +struct nvram_ops { + ssize_t (*read)(char *, size_t, loff_t *); + ssize_t (*write)(char *, size_t, loff_t *); + ssize_t (*get_size)(void); +}; + +extern const struct nvram_ops arch_nvram_ops; + #endif /* _LINUX_NVRAM_H */ From mboxrd@z Thu Jan 1 00:00:00 1970 From: Finn Thain Subject: [RFC 04/24] m68k/atari: Replace nvram_{read, write}_byte with arch_nvram_ops Date: Sun, 31 May 2015 11:01:36 +1000 Message-ID: <20150531010133.389476177@telegraphics.com.au> References: <20150531010132.289674310@telegraphics.com.au> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline; filename=atari_scsi-convert-to-nvram_ops List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org Sender: "Linuxppc-dev" To: linux-kernel@vger.kernel.org, linux-m68k@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, Geert Uytterhoeven , Michael Schmitz , "James E.J. Bottomley" , linux-scsi@vger.kernel.org List-Id: linux-m68k@vger.kernel.org QnkgaW1wbGVtZW50aW5nIGFuIGFyY2hfbnZyYW1fb3BzIHN0cnVjdCwgYW55IHBsYXRmb3JtIGNh biByZS11c2UgdGhlCmRyaXZlcnMvY2hhci9udnJhbSBtb2R1bGUgd2l0aG91dCBuZWVkaW5nIGFu eSBhcmNoLXNwZWNpZmljIGNvZGUKaW4gdGhhdCBtb2R1bGUuIEF0YXJpIGRvZXMgc28gaGVyZS4K CkF0YXJpIGhhcyBvbmUgdXNlciBvZiBudnJhbV9jaGVja19jaGVja3N1bSgpIHdoZXJlYXMgdGhl IG90aGVyIHBsYXRmb3JtcwooaS5lLiB4ODYgYW5kIEFSTSBwbGF0Zm9ybXMpIGhhdmUgbm9uZSBh dCBhbGwuIFJlcGxhY2UgdGhpcwp2YWxpZGF0ZS1jaGVja3N1bS1hbmQtcmVhZC1ieXRlIHNlcXVl bmNlIHdpdGggdGhlIGVxdWl2YWxlbnQKcnRjX252cmFtX29wcy5yZWFkKCkgY2FsbCBhbmQgcmVt b3ZlIHRoZSBub3cgdW51c2VkIGZ1bmN0aW9ucy4KClNpZ25lZC1vZmYtYnk6IEZpbm4gVGhhaW4g PGZ0aGFpbkB0ZWxlZ3JhcGhpY3MuY29tLmF1PgoKLS0tCgpUaGUgYWR2YW50YWdlIG9mIHRoZSBu ZXcgb3BzIHN0cnVjdCBvdmVyIHRoZSBvbGQgZ2xvYmFsIG52cmFtXyogZnVuY3Rpb25zCmlzIHRo YXQgdGhlIG1pc2MgZGV2aWNlIG1vZHVsZSBjYW4gYmUgc2hhcmVkIGJ5IGRpZmZlcmVudCBwbGF0 Zm9ybXMKd2l0aG91dCByZXF1aXJpbmcgZXZlcnkgcGxhdGZvcm0gdG8gaW1wbGVtZW50IGV2ZXJ5 IG52cmFtXyogZnVuY3Rpb24uCkUuZy4gb25seSBSVEMgIkNNT1MiIE5WUkFNcyBoYXZlIGEgY2hl Y2tzdW0gYW5kIG9ubHkgUG93ZXJQQyBwbGF0Zm9ybXMKaGF2ZSBhICJzeW5jIiBpb2N0bC4KCi0t LQogYXJjaC9tNjhrL2F0YXJpL252cmFtLmMgICB8ICAgODkgKysrKysrKysrKysrKysrKysrKysr KysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYyB8ICAg IDggKystLQogaW5jbHVkZS9saW51eC9udnJhbS5oICAgICB8ICAgIDkgKysrKwogMyBmaWxlcyBj aGFuZ2VkLCA3MCBpbnNlcnRpb25zKCspLCAzNiBkZWxldGlvbnMoLSkKCkluZGV4OiBsaW51eC9h cmNoL202OGsvYXRhcmkvbnZyYW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaW51eC5vcmlnL2FyY2gvbTY4 ay9hdGFyaS9udnJhbS5jCTIwMTUtMDUtMzEgMTE6MDE6MDEuMDAwMDAwMDAwICsxMDAwCisrKyBs aW51eC9hcmNoL202OGsvYXRhcmkvbnZyYW0uYwkyMDE1LTA1LTMxIDExOjAxOjAzLjAwMDAwMDAw MCArMTAwMApAQCAtMzgsMzMgKzM4LDEyIEBAIHVuc2lnbmVkIGNoYXIgX19udnJhbV9yZWFkX2J5 dGUoaW50IGkpCiAJcmV0dXJuIENNT1NfUkVBRChOVlJBTV9GSVJTVF9CWVRFICsgaSk7CiB9CiAK LXVuc2lnbmVkIGNoYXIgbnZyYW1fcmVhZF9ieXRlKGludCBpKQotewotCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Ci0JdW5zaWduZWQgY2hhciBjOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2Nr LCBmbGFncyk7Ci0JYyA9IF9fbnZyYW1fcmVhZF9ieXRlKGkpOwotCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGM7Ci19Ci1FWFBPUlRfU1lNQk9MKG52 cmFtX3JlYWRfYnl0ZSk7Ci0KIC8qIFRoaXMgcmFjZXMgbmljZWx5IHdpdGggdHJ5aW5nIHRvIHJl YWQgd2l0aCBjaGVja3N1bSBjaGVja2luZyAqLwogdm9pZCBfX252cmFtX3dyaXRlX2J5dGUodW5z aWduZWQgY2hhciBjLCBpbnQgaSkKIHsKIAlDTU9TX1dSSVRFKGMsIE5WUkFNX0ZJUlNUX0JZVEUg KyBpKTsKIH0KIAotdm9pZCBudnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywgaW50IGkp Ci17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9j aywgZmxhZ3MpOwotCV9fbnZyYW1fd3JpdGVfYnl0ZShjLCBpKTsKLQlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOwotfQotCiAvKiBPbiBBdGFyaXMsIHRoZSBjaGVja3N1 bSBpcyBvdmVyIGFsbCBieXRlcyBleGNlcHQgdGhlIGNoZWNrc3VtIGJ5dGVzCiAgKiB0aGVtc2Vs dmVzOyB0aGVzZSBhcmUgYXQgdGhlIHZlcnkgZW5kLgogICovCkBAIC04MywxOCArNjIsNiBAQCBp bnQgX19udnJhbV9jaGVja19jaGVja3N1bSh2b2lkKQogCSAgICAgICAoX19udnJhbV9yZWFkX2J5 dGUoQVRBUklfQ0tTX0xPQyArIDEpID09IChzdW0gJiAweGZmKSk7CiB9CiAKLWludCBudnJhbV9j aGVja19jaGVja3N1bSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJ2Owot Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JcnYgPSBfX252cmFtX2No ZWNrX2NoZWNrc3VtKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdz KTsKLQlyZXR1cm4gcnY7Ci19Ci1FWFBPUlRfU1lNQk9MKG52cmFtX2NoZWNrX2NoZWNrc3VtKTsK LQogc3RhdGljIHZvaWQgX19udnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKIHsKIAlpbnQgaTsKQEAg LTEwNiw2ICs3Myw2MiBAQCBzdGF0aWMgdm9pZCBfX252cmFtX3NldF9jaGVja3N1bSh2b2lkKQog CV9fbnZyYW1fd3JpdGVfYnl0ZShzdW0sIEFUQVJJX0NLU19MT0MgKyAxKTsKIH0KIAorc3RhdGlj IHNzaXplX3QgbnZyYW1fcmVhZChjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9z KQoreworCWNoYXIgKnAgPSBidWY7CisJbG9mZl90IGk7CisKKwlzcGluX2xvY2tfaXJxKCZydGNf bG9jayk7CisKKwlpZiAoIV9fbnZyYW1fY2hlY2tfY2hlY2tzdW0oKSkgeworCQlzcGluX3VubG9j a19pcnEoJnJ0Y19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZm9yIChpID0gKnBwb3M7 IGNvdW50ID4gMCAmJiBpIDwgTlZSQU1fQllURVM7IC0tY291bnQsICsraSwgKytwKQorCQkqcCA9 IF9fbnZyYW1fcmVhZF9ieXRlKGkpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGNfbG9jayk7CisK KwkqcHBvcyA9IGk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG52cmFt X3dyaXRlKGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAq cCA9IGJ1ZjsKKwlsb2ZmX3QgaTsKKworCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKKworCWlm ICghX19udnJhbV9jaGVja19jaGVja3N1bSgpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xv Y2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmb3IgKGkgPSAqcHBvczsgY291bnQgPiAwICYm IGkgPCBOVlJBTV9CWVRFUzsgLS1jb3VudCwgKytpLCArK3ApCisJCV9fbnZyYW1fd3JpdGVfYnl0 ZSgqcCwgaSk7CisKKwlfX252cmFtX3NldF9jaGVja3N1bSgpOworCisJc3Bpbl91bmxvY2tfaXJx KCZydGNfbG9jayk7CisKKwkqcHBvcyA9IGk7CisJcmV0dXJuIHAgLSBidWY7Cit9CisKK3N0YXRp YyBzc2l6ZV90IG52cmFtX2dldF9zaXplKHZvaWQpCit7CisJcmV0dXJuIE5WUkFNX0JZVEVTOwor fQorCitjb25zdCBzdHJ1Y3QgbnZyYW1fb3BzIGFyY2hfbnZyYW1fb3BzID0geworCS5yZWFkICAg ICAgICAgICA9IG52cmFtX3JlYWQsCisJLndyaXRlICAgICAgICAgID0gbnZyYW1fd3JpdGUsCisJ LmdldF9zaXplICAgICAgID0gbnZyYW1fZ2V0X3NpemUsCit9OworRVhQT1JUX1NZTUJPTChhcmNo X252cmFtX29wcyk7CisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHN0cnVjdCB7CiAJ dW5zaWduZWQgY2hhciB2YWw7CkluZGV4OiBsaW51eC9kcml2ZXJzL3Njc2kvYXRhcmlfc2NzaS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIGxpbnV4Lm9yaWcvZHJpdmVycy9zY3NpL2F0YXJpX3Njc2kuYwkyMDE1 LTA1LTMxIDExOjAxOjAwLjAwMDAwMDAwMCArMTAwMAorKysgbGludXgvZHJpdmVycy9zY3NpL2F0 YXJpX3Njc2kuYwkyMDE1LTA1LTMxIDExOjAxOjAzLjAwMDAwMDAwMCArMTAwMApAQCAtODgwLDEz ICs4ODAsMTUgQEAgc3RhdGljIGludCBfX2luaXQgYXRhcmlfc2NzaV9wcm9iZShzdHJ1YwogI2lm ZGVmIENPTkZJR19OVlJBTQogCWVsc2UKIAkJLyogVGVzdCBpZiBhIGhvc3QgaWQgaXMgc2V0IGlu IHRoZSBOVlJhbSAqLwotCQlpZiAoQVRBUklIV19QUkVTRU5UKFRUX0NMSykgJiYgbnZyYW1fY2hl Y2tfY2hlY2tzdW0oKSkgewotCQkJdW5zaWduZWQgY2hhciBiID0gbnZyYW1fcmVhZF9ieXRlKDE0 KTsKKwkJaWYgKEFUQVJJSFdfUFJFU0VOVChUVF9DTEspKSB7CisJCQl1bnNpZ25lZCBjaGFyIGI7 CisJCQlsb2ZmX3Qgb2Zmc2V0ID0gMTQ7CisJCQlzc2l6ZV90IGNvdW50ID0gYXJjaF9udnJhbV9v cHMucmVhZCgmYiwgMSwgJm9mZnNldCk7CiAKIAkJCS8qIEFyYml0cmF0aW9uIGVuYWJsZWQ/IChm b3IgVE9TKQogCQkJICogSWYgeWVzLCB1c2UgY29uZmlndXJlZCBob3N0IElECiAJCQkgKi8KLQkJ CWlmIChiICYgMHg4MCkKKwkJCWlmICgoY291bnQgPT0gMSkgJiYgKGIgJiAweDgwKSkKIAkJCQlh dGFyaV9zY3NpX3RlbXBsYXRlLnRoaXNfaWQgPSBiICYgNzsKIAkJfQogI2VuZGlmCkluZGV4OiBs aW51eC9pbmNsdWRlL2xpbnV4L252cmFtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGludXgub3JpZy9pbmNs dWRlL2xpbnV4L252cmFtLmgJMjAxNS0wNS0zMSAxMTowMDo1OS4wMDAwMDAwMDAgKzEwMDAKKysr IGxpbnV4L2luY2x1ZGUvbGludXgvbnZyYW0uaAkyMDE1LTA1LTMxIDExOjAxOjAzLjAwMDAwMDAw MCArMTAwMApAQCAtMTAsNCArMTAsMTMgQEAgZXh0ZXJuIHZvaWQgX19udnJhbV93cml0ZV9ieXRl KHVuc2lnbmVkCiBleHRlcm4gdm9pZCBudnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywg aW50IGkpOwogZXh0ZXJuIGludCBfX252cmFtX2NoZWNrX2NoZWNrc3VtKHZvaWQpOwogZXh0ZXJu IGludCBudnJhbV9jaGVja19jaGVja3N1bSh2b2lkKTsKKworc3RydWN0IG52cmFtX29wcyB7CisJ c3NpemVfdCAgICAgICAgICgqcmVhZCkoY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6 ZV90ICAgICAgICAgKCp3cml0ZSkoY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6ZV90 ICAgICAgICAgKCpnZXRfc2l6ZSkodm9pZCk7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IG52 cmFtX29wcyBhcmNoX252cmFtX29wczsKKwogI2VuZGlmICAvKiBfTElOVVhfTlZSQU1fSCAqLwoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4cHBj LWRldiBtYWlsaW5nIGxpc3QKTGludXhwcGMtZGV2QGxpc3RzLm96bGFicy5vcmcKaHR0cHM6Ly9s aXN0cy5vemxhYnMub3JnL2xpc3RpbmZvL2xpbnV4cHBjLWRldg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from kvm5.telegraphics.com.au (kvm5.telegraphics.com.au [98.124.60.144]) by lists.ozlabs.org (Postfix) with ESMTP id DE7951A0CA3 for ; Sun, 31 May 2015 11:16:59 +1000 (AEST) Message-Id: <20150531010133.389476177@telegraphics.com.au> Date: Sun, 31 May 2015 11:01:36 +1000 From: Finn Thain To: , , , Geert Uytterhoeven , Michael Schmitz , "James E.J. Bottomley" , linux-scsi@vger.kernel.org Subject: [RFC 04/24] m68k/atari: Replace nvram_{read, write}_byte with arch_nvram_ops References: <20150531010132.289674310@telegraphics.com.au> List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , By implementing an arch_nvram_ops struct, any platform can re-use the drivers/char/nvram module without needing any arch-specific code in that module. Atari does so here. Atari has one user of nvram_check_checksum() whereas the other platforms (i.e. x86 and ARM platforms) have none at all. Replace this validate-checksum-and-read-byte sequence with the equivalent rtc_nvram_ops.read() call and remove the now unused functions. Signed-off-by: Finn Thain --- The advantage of the new ops struct over the old global nvram_* functions is that the misc device module can be shared by different platforms without requiring every platform to implement every nvram_* function. E.g. only RTC "CMOS" NVRAMs have a checksum and only PowerPC platforms have a "sync" ioctl. --- arch/m68k/atari/nvram.c | 89 ++++++++++++++++++++++++++++------------------ drivers/scsi/atari_scsi.c | 8 ++-- include/linux/nvram.h | 9 ++++ 3 files changed, 70 insertions(+), 36 deletions(-) Index: linux/arch/m68k/atari/nvram.c =================================================================== --- linux.orig/arch/m68k/atari/nvram.c 2015-05-31 11:01:01.000000000 +1000 +++ linux/arch/m68k/atari/nvram.c 2015-05-31 11:01:03.000000000 +1000 @@ -38,33 +38,12 @@ unsigned char __nvram_read_byte(int i) return CMOS_READ(NVRAM_FIRST_BYTE + i); } -unsigned char nvram_read_byte(int i) -{ - unsigned long flags; - unsigned char c; - - spin_lock_irqsave(&rtc_lock, flags); - c = __nvram_read_byte(i); - spin_unlock_irqrestore(&rtc_lock, flags); - return c; -} -EXPORT_SYMBOL(nvram_read_byte); - /* This races nicely with trying to read with checksum checking */ void __nvram_write_byte(unsigned char c, int i) { CMOS_WRITE(c, NVRAM_FIRST_BYTE + i); } -void nvram_write_byte(unsigned char c, int i) -{ - unsigned long flags; - - spin_lock_irqsave(&rtc_lock, flags); - __nvram_write_byte(c, i); - spin_unlock_irqrestore(&rtc_lock, flags); -} - /* On Ataris, the checksum is over all bytes except the checksum bytes * themselves; these are at the very end. */ @@ -83,18 +62,6 @@ int __nvram_check_checksum(void) (__nvram_read_byte(ATARI_CKS_LOC + 1) == (sum & 0xff)); } -int nvram_check_checksum(void) -{ - unsigned long flags; - int rv; - - spin_lock_irqsave(&rtc_lock, flags); - rv = __nvram_check_checksum(); - spin_unlock_irqrestore(&rtc_lock, flags); - return rv; -} -EXPORT_SYMBOL(nvram_check_checksum); - static void __nvram_set_checksum(void) { int i; @@ -106,6 +73,62 @@ static void __nvram_set_checksum(void) __nvram_write_byte(sum, ATARI_CKS_LOC + 1); } +static ssize_t nvram_read(char *buf, size_t count, loff_t *ppos) +{ + char *p = buf; + loff_t i; + + spin_lock_irq(&rtc_lock); + + if (!__nvram_check_checksum()) { + spin_unlock_irq(&rtc_lock); + return -EIO; + } + + for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p) + *p = __nvram_read_byte(i); + + spin_unlock_irq(&rtc_lock); + + *ppos = i; + return p - buf; +} + +static ssize_t nvram_write(char *buf, size_t count, loff_t *ppos) +{ + char *p = buf; + loff_t i; + + spin_lock_irq(&rtc_lock); + + if (!__nvram_check_checksum()) { + spin_unlock_irq(&rtc_lock); + return -EIO; + } + + for (i = *ppos; count > 0 && i < NVRAM_BYTES; --count, ++i, ++p) + __nvram_write_byte(*p, i); + + __nvram_set_checksum(); + + spin_unlock_irq(&rtc_lock); + + *ppos = i; + return p - buf; +} + +static ssize_t nvram_get_size(void) +{ + return NVRAM_BYTES; +} + +const struct nvram_ops arch_nvram_ops = { + .read = nvram_read, + .write = nvram_write, + .get_size = nvram_get_size, +}; +EXPORT_SYMBOL(arch_nvram_ops); + #ifdef CONFIG_PROC_FS static struct { unsigned char val; Index: linux/drivers/scsi/atari_scsi.c =================================================================== --- linux.orig/drivers/scsi/atari_scsi.c 2015-05-31 11:01:00.000000000 +1000 +++ linux/drivers/scsi/atari_scsi.c 2015-05-31 11:01:03.000000000 +1000 @@ -880,13 +880,15 @@ static int __init atari_scsi_probe(struc #ifdef CONFIG_NVRAM else /* Test if a host id is set in the NVRam */ - if (ATARIHW_PRESENT(TT_CLK) && nvram_check_checksum()) { - unsigned char b = nvram_read_byte(14); + if (ATARIHW_PRESENT(TT_CLK)) { + unsigned char b; + loff_t offset = 14; + ssize_t count = arch_nvram_ops.read(&b, 1, &offset); /* Arbitration enabled? (for TOS) * If yes, use configured host ID */ - if (b & 0x80) + if ((count == 1) && (b & 0x80)) atari_scsi_template.this_id = b & 7; } #endif Index: linux/include/linux/nvram.h =================================================================== --- linux.orig/include/linux/nvram.h 2015-05-31 11:00:59.000000000 +1000 +++ linux/include/linux/nvram.h 2015-05-31 11:01:03.000000000 +1000 @@ -10,4 +10,13 @@ extern void __nvram_write_byte(unsigned extern void nvram_write_byte(unsigned char c, int i); extern int __nvram_check_checksum(void); extern int nvram_check_checksum(void); + +struct nvram_ops { + ssize_t (*read)(char *, size_t, loff_t *); + ssize_t (*write)(char *, size_t, loff_t *); + ssize_t (*get_size)(void); +}; + +extern const struct nvram_ops arch_nvram_ops; + #endif /* _LINUX_NVRAM_H */